Orodha ya maudhui:

Kudhibiti Gonga la Neopixel Iliyoongozwa na Sura ya Ishara: Hatua 3 (na Picha)
Kudhibiti Gonga la Neopixel Iliyoongozwa na Sura ya Ishara: Hatua 3 (na Picha)

Video: Kudhibiti Gonga la Neopixel Iliyoongozwa na Sura ya Ishara: Hatua 3 (na Picha)

Video: Kudhibiti Gonga la Neopixel Iliyoongozwa na Sura ya Ishara: Hatua 3 (na Picha)
Video: ESP32 Tutorial 31 - Project LED Strip with Obstacle Avoidance | SunFounder's ESP32 IoT Learnig kit 2024, Novemba
Anonim
Image
Image
Kusanya na Kupakia
Kusanya na Kupakia

Katika mafunzo haya tutacheza na sensorer ya ishara (APDS-9960) na pete ya neopixel ili kujifunza jinsi ya kuzichanganya zote mbili kwa kutumia Arduino UNO.

Bidhaa ya mwisho itajibu ishara za kushoto-kulia kwa kuchangamsha harakati iliyoongozwa kulia au kushoto, na ishara-juu-chini kwa kubadilisha rangi ya vipuli.

Katika hatua zifuatazo, utaangalia kwa kifupi orodha ya sehemu na jinsi ya kuunganisha vifaa. Na kisha tutapitia nambari hatua kwa hatua ili kujifunza jinsi inavyofanya kazi.

Hatua ya 1: Vipengele

1. Arduino UNO

2. kebo ya usb

3. sensorer ya ishara ya APDS9960 (https://www.sparkfun.com/products/12787)

4. pete 24 iliyoongozwa na neopixel iliyoongozwa (https://www.adafruit.com/product/1586)

5. nyaya za kiume na za kike, za kiume na za kiume

6. ubao wa mkate

7. 5 V usambazaji wa umeme kwa pete iliyoongozwa (ninatumia betri 4 nyuma)

8. Ili kushikamana na pete ya neopikseli kwenye ubao wa mkate utahitaji kuchapa pini tatu za kiume: GND, PWR, na pini ya kudhibiti. Kwa hili utahitaji chuma cha kutengeneza na mtiririko

Sehemu kuu hapa ni sensorer ya ishara ya APDS-9960 na pete 24 ya neopixel. Unaweza kubadili arduinos tofauti, vifaa vya umeme vya kebo na ubao wa mkate kama unavyotaka.

Hatua ya 2: Kusanya na Kupakia

Mkutano

Kabla ya kuanza kuanza hakikisha una vifaa vyote kwenye meza yako. Tutakuwa na hatua nzuri za kufuata:). Nimeambatanisha pia muundo wa Fritzing kama picha na pia katika muundo wa fritzing.

1. Solder pini 3 za kiume kwa pete ya neopixel (GND, PWR, pini ya kudhibiti)

2. ambatisha pete ya neopixel kwenye ubao wa mkate

3. ambatisha sensor ya APDS9960 kwenye ubao wa mkate

4. unganisha viwanja: pakiti ya betri, arduino UNO, APDS9960 na neopixel kwenye uwanja wa mkate

5. unganisha nguvu: arduino UNO 3V na pini ya nguvu ya APDS9960, neopixel kwa nguvu ya pakiti ya betri

6. unganisha pini ya kudhibiti neopixel kwa pini ya arduino D6

7. unganisha SDA na SCL ya APDS9960 kwa A4 na A5 mtawaliwa

8. unganisha pini ya kukatiza ya APDS9960 na arduino D2

Kupakia msimbo

Kwanza kabisa utahitaji kupakua na kusanikisha maktaba muhimu za arduino:

1. Maktaba ya pete ya Neopixel:

2. Maktaba ya sensa ya ishara:

Ikiwa haujui jinsi ya kusanikisha maktaba za arduino angalia mafunzo haya.

Baada ya kupakua na kusanikisha maktaba hapo juu, unaweza kushikilia au kupakua hazina yangu ya arduino iliyoko hapa: https://github.com/danionescu0/arduino, na tutatumia mchoro huu: https://github.com/danionescu0 / arduino / mti / bwana / miradi / neopixel_ring_gestures

Katika sehemu inayofuata nitapachika nambari moja kwa moja kwenye mafunzo haya, kwa hivyo ukipenda unaweza kunakili na kubandika kutoka hapo.

Mwishowe unganisha arduino kompyuta kwa kutumia kebo ya usb, weka betri za 1.5 v kwenye kifurushi cha betri, na upakie mchoro kwenye arduino.

Hatua ya 3: Inafanyaje Kazi?

Katika sehemu hii ya mwisho tutajifunza jinsi vifaa hivi vimejumuishwa pamoja, jinsi ya kutumia maktaba zao na jinsi nimepanga nambari yangu:

Kwanza wacha tupate mtazamo wa haraka kupitia sensa na njia za maktaba ya neopixel ambazo tutatumia

1. API ya Neopixel kutoka kwa matunda

Kutoka kwa maktaba hii tutatumia njia zinazodhibiti rangi ya mtu binafsi na kuzitumia

- ni pamoja na maktaba:

# pamoja

- tangaza maktaba

#fafanua NEOPIXED_CONTROL_PIN 6

#fafanua NUM_LEDS 24 Adafruit_NeoPixel strip = Adafruit_NeoPixel (NUM_LEDS, NEOPIXED_CONTROL_PIN, NEO_RBG + NEO_KHZ800);

- Anzisha

# kawaida ndani ya kizuizi cha usanidi

kuanzisha batili () {strip.begin (); # labda vitu vingine hapa #…. }

- washa saizi za kibinafsi kisha utumie marekebisho yote kwenye ukanda (toa kwa njia)

# weka pikseli 0 kuwa nyekundu

mkanda.setPixelColor (0, strip. Color (255, 0, 0)); # kuanzisha pixel 1 kuwa strip ya kijani.setPixelColor (1, strip. Color (0, 255, 0)); # weka pikseli 2 kuwa strip ya bluu.setPixelColor (2, strip. Color (0, 0 255)); onyesha ();

2. Sensor ya ishara ya APDS 9960

Kutoka kwa maktaba hii tutatumia kazi ya "kusoma ishara". Kazi hii itaweza kutofautisha kati ya kushoto-kulia, juu-chini, amri za karibu. Kuna ujanja hapa, hatutauliza sensor kila wakati kwa ishara ya mwisho inayoonekana. Bodi ina uwezo wa "ping" kupitia kukatiza kwamba ishara imepatikana.

- pamoja na maktaba, sawa na neopixel

- tangaza maktaba pini ya kukatiza, na bendera ya kukatiza

#fafanua APDS9960_INT 2

SparkFun_APDS9960 apds = SparkFun_APDS9960 (); int isr_flag = 0;

- Anzisha maktaba, kawaida ndani ya usanidi wa kazi

kuanzisha batili ()

{# tangaza pini ya kukatiza kama INPUT na ambatanisha kazi nayo pinMode (APDS9960_INT, INPUT); ambatisha Kukatiza (0, kukatiza Njia, Kuanguka); ikiwa (apds.init () && apds.enableGestureSensor (kweli)) {Serial.println ("Uanzishaji wa APDS-9960 umekamilika"); } mwingine {Serial.println ("Kuna kitu kilienda vibaya wakati wa init ya APDS-9960!"); } # anzisha vitu vingine labda}

- fafanua kazi ya usumbufu, hapa tutaweka bendera tu

batili interruptRoutine () {

isr_flag = 1; }

- ndani ya kazi ya kitanzi angalia bendera mara kwa mara ili uone ikiwa ishara imeonekana

kitanzi batili ()

. kushughulikiaGesture (); isr_flag = 0; ambatisha Kukatiza (0, kukatiza Njia, Kuanguka); } # nambari nyingine hapa labda}

- fafanua kazi ya kushughulikiaGesture () ambapo tunaweza kuuliza ishara ya mwisho

kitambulisho batili Ishara () {

# ikiwa hakuna ishara isiyoweza kurudi, hii ni kuangalia salama tu ikiwa (! apds.isGestureAvailable ()) {kurudi; } # inasoma ishara ya mwisho, ikilinganishwa na zile zinazojulikana na chapisha ubadilishaji wa ujumbe (apds.readGesture ()) {kesi DIR_UP: Serial.println ("UP"); kuvunja; kesi DIR_DOWN: Serial.println ("CHINI"); kuvunja; kesi DIR_LEFT: Serial.println ("LEFT"); kuvunja; kesi DIR_RIGHT: Serial.println ("KULIA"); kuvunja; kesi DIR_FAR: Serial.println ("FAR"); kuvunja; }}

Sasa wacha tuone msimbo wote ukifanya kazi:

Kwa hivyo nimeelezea API ya msingi ya sensorer ya ishara na pete ya neopixel, sasa wacha tuweke mambo pamoja:

Algorithm inaendesha hivi:

- Anzisha maktaba (angalia nambari hapo juu)

- tengeneza safu ya nguvu zilizoongozwa zinazoitwa "ledStates". Safu hii itakuwa na nguvu 24 zilizoongozwa ambazo zimepangwa kwa njia ya kushuka kutoka 150 hadi 2

- ndani ya hundi kuu ya kitanzi ikiwa pini ya usumbufu imebadilishwa ikiwa ni wakati wa kubadilisha uhuishaji au rangi iliyoongozwa

- kazi ya "handleGesture ()" inakagua ishara ya mwisho na inaita kazi hiyo "toggleColor" kwa ishara za UP -DOWN au weka utofauti wa kimataifa "ledDirection" kwa ishara za KUSHOTO - KULIA

- kazi ya "toggleColor ()" hubadilisha tu ubadilishaji wa ulimwengu unaoitwa "ColourSelection" na moja ya maadili 0, 1, 2

- pia ndani ya kazi kuu ya kitanzi kazi nyingine inayoitwa "animateLeds ();" inaitwa. Kazi hii inakagua ikiwa millisekunde 100 zimepita, na ikiwa ni hivyo huzunguka viongo kwa kutumia "rotateLeds ()" kazi na kisha kuzipaka tena

- "ZungushaLeds ()" "itazunguka" mbele mbele au nyuma kwa kutumia safu nyingine inayoitwa "katiLedStates".

"Athari" ya kuzunguka itaonekana kama hii:

# baada ya kuanza

{150, 100, 70, 50, 40, 30, 10, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; # baada ya kuzungukaLeds () inaitwa {0, 150, 100, 70, 50, 40, 30, 10, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; # baada ya kuzungukaLeds () inaitwa tena {0, 0, 150, 100, 70, 50, 40, 30, 10, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; # Nakadhalika

Kwa hili kwanza huunda safu mpya na kunakili nguvu za zamani zilizoongozwa kwenye nafasi mpya (ongeza nafasi au kuipunguza). Baada ya hapo inaandika safu ya "ledStates" na "intermediateLedStates" kwa hivyo mchakato utaendelea baada ya milliseconds nyingine 100.

# pamoja na "SparkFun_APDS9960.h"

# pamoja na "Adafruit_NeoPixel.h"

# pamoja na "Wire.h" #fasili NEOPIXED_CONTROL_PIN 6 #fafanua NUM_LEDS 24 #fafanua APDS9960_INT 2 #fafanua LED_SPEED_STEP_INTERVAL 100 Adafruit_NeoPixel strip = Adafruit_NeoPixel (NUM_LEDS, NEOPIXED_CONTROL_PIN, NEO_NOO_NOO_NEO_NOO_NEO_NEO_NOO_ SparkFun_APDS9960 apds = SparkFun_APDS9960 (); unsigned longLedChangeTime = 0; leddirection fupi = 0; rangi fupiSelection = 0; byte ledStates = {150, 100, 70, 50, 40, 30, 10, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; int isr_flag = 0; kuanzisha batili () {Serial.begin (9600); Serial.println ("Programu imeanza"); strip. kuanza (); pinMode (APDS9960_INT, INPUT); ambatisha Kukatiza (0, kukatiza Njia, Kuanguka); ikiwa (apds.init () && apds.enableGestureSensor (kweli)) {Serial.println ("Uanzishaji wa APDS-9960 umekamilika"); } mwingine {Serial.println ("Kuna kitu kilienda vibaya wakati wa init ya APDS-9960!"); } mwishoLedChangeTime = millis (); Serial.println ("Init inafanikiwa"); } kitanzi batili () {if (isr_flag == 1) {detachInterrupt (0); kushughulikiaGesture (); isr_flag = 0; ambatisha Kukatiza (0, kukatiza Njia, Kuanguka); } uhuishajiLeds (); } batili interruptRoutine () {isr_flag = 1; } / ** * Hii itashughulikia ishara kutoka kwa sensorer ya APDS9960 * Ishara za Juu na Chini zitaita toggleColor function * Ishara za kushoto na kulia zitabadilisha uhuishaji ulioongozwa * / batili handleGesture () {if (! Apds.isGestureAvailable ()) {kurudi; } kubadili (apds.readGesture ()) {kesi DIR_UP: Serial.println ("UP"); toggleColor (); kuvunja; kesi DIR_DOWN: Serial.println ("CHINI"); toggleColor (); kuvunja; kesi DIR_LEFT: ledDirection = 1; Serial.println ("KUSHOTO"); kuvunja; kesi DIR_RIGHT: ledDirection = -1; Serial.println ("HAKI"); kuvunja; kesi DIR_FAR: ledDirection = 0; Serial.println ("FAR"); kuvunja; }} / ** * Badilisha rangi ya vipuli vya sasa * Kila wakati kazi hii inaitwa itabadilisha hali ya leds * / batili toggleColor () {if (colorSelection == 0) {colorSelection = 1; } mwingine ikiwa (colorSelection == 1) {colorSelection = 2; } mwingine {colorSelection = 0; }} / ** * Uhuishaji utaendelea baada ya milimita ya LED_SPEED_STEP_INTERVAL * Kwanza kazi ya kuzungushaLeds inaitwa, kisha rangi za leds zimewekwa kwa kutumia strip api * / void animateLeds () {if (millis () - lastLedChangeTime <LED_SPEED_STEP_INTERVAL) {return; } ZungushaLeds (); kwa (int i = 0; i <NUM_LEDS; i ++) {strip.setPixelColor (i, getColor (ledStates )); onyesha (); } mwishoLedChangeTime = millis (); } / ** * Kutumia safu ya sekondari "katiLedStates", nguvu za leds zimehuishwa * Kwanza maadili kutoka "ledStates" yanakiliwa kwenye "katiLedStates" kama hivyo * wacha tuketi safu ya "ledStates" ni {100, 80, 60, 0, 0, 0} na ledDirection ni 1 * kisha baada ya kazi hii kuitwa "ledStates" safu ni {0, 100, 80, 60, 0, 0} kuiga athari ya kuzunguka]; kwa (int i = 0; i <NUM_LEDS; i ++) {katiLedStates = 0; } kwa (int i = 0; i <NUM_LEDS; i ++) {if (ledDirection == 1) {if (i == NUM_LEDS -1) {intermediateLedStates [0] = ledStates ; } mwingine {intermediateLedStates [i + 1] = ledStates ; }} mwingine {if (i == 0) {intermediateLedStates [NUM_LEDS - 1] = ledStates ; } mwingine {intermediateLedStates [i - 1] = ledStates ; }}} kwa ajili ya (int i = 0; i <NUM_LEDS; i ++) {ledStates = katiLedStates ; }} uint32_t getColor (intensiteten) {switch (colorSelection) {kesi 0: strip strip. Color (intensitet, 0, 0); kesi 1: ukanda wa kurudi. Rangi (0, kiwango, 0); chaguo-msingi: ukanda wa kurudi. Rangi (0, 0, kiwango); }}

Natumai ulifurahiya hii, unaweza kutumia sehemu ya maoni kuniuliza maswali.

Ilipendekeza: