Բովանդակություն:

Neopixel- ի գլխիկով մատանի ժեստերի սենսորով կառավարելը. 3 քայլ (նկարներով)
Neopixel- ի գլխիկով մատանի ժեստերի սենսորով կառավարելը. 3 քայլ (նկարներով)

Video: Neopixel- ի գլխիկով մատանի ժեստերի սենսորով կառավարելը. 3 քայլ (նկարներով)

Video: Neopixel- ի գլխիկով մատանի ժեստերի սենսորով կառավարելը. 3 քայլ (նկարներով)
Video: Marlin Firmware 2.0.x Explained 2024, Նոյեմբեր
Anonim
Image
Image
Հավաքում և վերբեռնում
Հավաքում և վերբեռնում

Այս ձեռնարկում մենք խաղալու ենք ժեստերի ցուցիչով (APDS-9960) և նեոպիքսելային մատանիով ՝ սովորելու, թե ինչպես դրանք համատեղել Arduino UNO- ի միջոցով:

Վերջնական արտադրանքը կարձագանքի ձախ - աջ ժեստերին ՝ շարժելով աջ կամ ձախ շարժվող շարժումները, իսկ վերև -ներքև ժեստերը ՝ փոփոխելով լուսադիոդի գույնը:

Հաջորդ քայլերում դուք համառոտ կներկայացնեք մասերի ցանկը և բաղադրիչները միացնելու եղանակը: Եվ հետո մենք քայլ առ քայլ կվերանայենք կոդը ՝ իմանալու, թե ինչպես է այն աշխատում:

Քայլ 1: Բաղադրիչներ

1. Arduino UNO

2. USB մալուխ

3. APDS9960 ժեստերի ցուցիչ (https://www.sparkfun.com/products/12787)

4. 24 led neopixel led մատանի (https://www.adafruit.com/product/1586)

5. արական-իգական, արական-արական սեռի մալուխներ

6. գրատախտակ

7. 5 վ լարման օղակի համար (ես 4 մարտկոցով հետ եմ օգտագործում)

8. Նեոպիքսելային օղակը տախտակին ամրացնելու համար հարկավոր է երեք արական կապում ամրացնել դրան ՝ GND, PWR և կառավարման քորոց: Դրա համար ձեզ հարկավոր է եռակցման երկաթ և հոսք

Այստեղ հիմնական բաղադրիչներն են APDS-9960 ժեստերի ցուցիչը և 24 նեոպիքսել մատանին: Դուք կարող եք միացնել տարբեր arduinos, USB մալուխների սնուցման աղբյուրներ և տախտակներ, ինչպես ցանկանում եք:

Քայլ 2: Հավաքում և վերբեռնում

Ժողով

Նախքան սկսելը, համոզվեք, որ սեղանի վրա ունեք բոլոր բաղադրիչները: Մեզ սպասվում են մի քանի գեղեցիկ քայլեր:): Ես կցել եմ նաև Ֆրիտզինգի սխեման որպես նկար և նաև ցնցող ձևաչափով:

1. maleոդեք 3 արական կապում նեոպիքսելային օղակին (GND, PWR, կառավարման քորոց)

2. ամրացրեք նեոպիքսելային օղակը հացատախտակին

3. կցեք APDS9960 սենսորը հացատախտակին

4. միացրեք հիմքերը ՝ մարտկոցի տուփը, arduino UNO, APDS9960 և neopixel հացահատիկի գետնին

5. միացրեք հոսանքը. Arduino UNO 3V- ը APDS9960 հոսանքի քորոցին, նեոպիքսել ՝ մարտկոցի տուփին

6. միացրեք neopixel- ի կառավարման քորոցը arduino D6 քորոցին

7. միացրեք APDS9960- ի SDA- ն և SCL- ը համապատասխանաբար A4 և A5- ին

8. միացրեք APDS9960 ընդհատման քորոցը arduino D2- ին

Կոդի վերբեռնում

Առաջին հերթին ձեզ հարկավոր է ներբեռնել և տեղադրել անհրաժեշտ arduino գրադարանները.

1. Neopixel օղակների գրադարան ՝

2. Gեստերի ցուցիչների գրադարան ՝

Եթե չգիտեք, թե ինչպես տեղադրել arduino գրադարանները, դիտեք այս ձեռնարկը:

Վերևի գրադարանները ներբեռնելուց և տեղադրելուց հետո կարող եք կլոնավորել կամ ներբեռնել այստեղ տեղադրված իմ arduino պահեստը ՝ https://github.com/danionescu0/arduino, և մենք կօգտագործենք այս ուրվագիծը ՝ https://github.com/danionescu0 /arduino/tree/master/projects/neopixel_ring_gestures

Հաջորդ բաժնում ես անմիջապես կներդնեմ կոդը այս ձեռնարկի մեջ, այնպես որ, եթե ցանկանում եք, կարող եք պատճենել և տեղադրել այն այնտեղից:

Վերջապես միացրեք arduino- ն համակարգչին `օգտագործելով USB մալուխը, մարտկոցի տուփի մեջ դրեք 1.5 վ մարտկոց և տեղադրեք էսքիզը arduino- ում:

Քայլ 3: Ինչպե՞ս է այն աշխատում:

Այս վերջին մասում մենք կսովորենք, թե ինչպես են այս բաղադրիչները համակցված, ինչպես օգտագործել դրանց գրադարանները և ինչպես եմ կառուցել իմ կոդը.

Նախ եկեք արագ հայացք գցենք սենսորի և neopixel գրադարանի API մեթոդների միջոցով, որոնք մենք կօգտագործենք

1. Neopixel API adafruit- ից

Այս գրադարանից մենք կօգտագործենք այն մեթոդները, որոնք վերահսկում են անհատական led- ի գույնը և կիրառում դրանք

- ներառում է գրադարանը.

#ներառում

- հայտարարեք գրադարան

#սահմանեք NEOPIXED_CONTROL_PIN 6

#սահմանել NUM_LEDS 24 Adafruit_NeoPixel շերտ = Adafruit_NeoPixel (NUM_LEDS, NEOPIXED_CONTROL_PIN, NEO_RBG + NEO_KHZ800);

- նախաստորագրել

#սովորաբար տեղադրման բլոկի ներսում

void setup () {strip.begin (); # գուցե այստեղ այլ իրեր #… }

- լուսավորեք առանձին պիքսելներ, ապա կիրառեք բոլոր փոփոխությունները շերտի վրա (մի կերպ մատուցեք այն)

# պիքսել 0 -ը կարմիր դնելու համար

strip.setPixelColor (0, շերտագիծ. գույն (255, 0, 0)); # կարգավորեք պիքսել 1 -ը, որպեսզի լինի կանաչ շերտ. setPixelColor (1, շերտ. գույն (0, 255, 0)); # կարգավորեք պիքսել 2 -ը `կապույտ ժապավեն: setPixelColor (2, շերտագիծ: Գույն (0, 0 255)); strip.show ();

2. APDS 9960 ժեստերի ցուցիչ

Այս գրադարանից մենք կօգտագործենք «կարդալ ժեստ» գործառույթը: Այս գործառույթը կկարողանա տարբերակել ձախ-աջ, վերև-ներքև, մոտ-հեռու հրամանները: Այստեղ հնարք կա, մենք չենք պատրաստվում անընդհատ սենսորից հարցնել վերջին ընկալվող ժեստը: Տախտակը հնարավորություն ունի «պինգ» անել մի ժեստի գտած ընդհատման միջոցով:

- ներառել գրադարանը, որը նման է նեոպիքսելին

- գրադարանին հայտարարեք ընդհատման քորոց և ընդհատման դրոշակ

#սահմանեք APDS9960_INT 2

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

- սկզբնականացնել գրադարանը, սովորաբար տեղադրման գործառույթի ներսում

դատարկ կարգավորում ()

{ # հայտարարեք ընդհատման քորոցը որպես INPUT և դրան կցեք գործառույթ pinMode (APDS9960_INT, INPUT); attachInterrupt (0, interruptRoutine, FALLING); if (apds.init () && apds.enableGestureSensor (ճշմարիտ)) {Serial.println ("APDS-9960 նախնական պատրաստումն ավարտված է"); } else {Serial.println («Սխալ առաջացավ APDS-9960 init- ի ընթացքում»); } # նախաստորագրել այլ բաներ գուցե}

- սահմանեք ընդհատման գործառույթը, այստեղ մենք միայն դրոշ ենք դնում

void interruptRoutine () {

isr_flag = 1; }

- օղակի գործառույթի ներսում պարբերաբար ստուգեք դրոշը ՝ տեսնելու, թե արդյոք ժեստ է հայտնաբերվել

դատարկ շրջան ()

{ # ստուգեք դրոշը, եթե (isr_flag == 1) { # եթե դրոշը դրված է, հեռացրեք ընդհատումը, կատարեք անհրաժեշտ մշակումը handleGesture () գործառույթի # ներսում, այնուհետև վերակայեք դրոշը և նորից միացրեք ընդհատման detachInterrupt (0); handleGesture (); isr_flag = 0; attachInterrupt (0, interruptRoutine, FALLING); } # այստեղ միգուցե այլ կոդ}

- սահմանել handleGesture () գործառույթը, որտեղ մենք կարող ենք խնդրել վերջին ժեստը

void handleGesture () {

# եթե ոչ մի ժեստ հնարավոր չէ վերադառնալ, սա միայն անվտանգ ստուգում է, եթե (! apds.isGestureAvailable ()) {վերադառնա; } # կարդում է վերջին ժեստը, համեմատում հայտնիների հետ և տպում հաղորդագրությունների անջատիչ (apds.readGesture ()) {case DIR_UP: Serial.println ("UP"); ընդմիջում; գործ DIR_DOWN: Serial.println ("DOWN"); ընդմիջում; գործ DIR_LEFT: Serial.println ("LEFT"); ընդմիջում; գործ DIR_RIGHT: Serial.println ("RIGHT"); ընդմիջում; գործ DIR_FAR: Serial.println ("FAR"); ընդմիջում; }}

Այժմ եկեք տեսնենք ամբողջ կոդը գործողության մեջ

Այսպիսով, ես բացատրեցի ժեստերի սենսորի և նեոպիքսելային մատանու հիմնական API- ն, այժմ եկեք միասին դասավորենք.

Ալգորիթմը գործում է այսպես.

- սկզբնականացնել գրադարանները (տես վերը նշված կոդը)

- ստեղծել առաջնորդվող ինտենսիվությունների զանգված, որը կոչվում է «ledStates»: Այս զանգվածը կպարունակի 24 առաջնորդվող ինտենսիվություն, որոնք դասավորված են 150 -ից 2 -ի նվազման եղանակով

- հիմնական հանգույցի ներսում ստուգեք ՝ արդյոք ընդհատման քորոցը փոփոխվե՞լ է, եթե այդպես է, ժամանակն է փոխել led- ի անիմացիան կամ գույնը

- "handleGesture ()" ֆունկցիան ստուգում է վերջին ժեստը և գործառույթը կոչում է "toggleColor" UP -DOWN ժեստերի համար կամ սահմանել գլոբալ փոփոխական "ledDirection" ՁԱՅՆ - ԱIGHԻ gest ժեստերի համար

- «toggleColor ()» գործառույթը պարզապես փոխում է «colorSelection» անունով գլոբալ փոփոխականը ՝ 0, 1, 2 արժեքներից մեկով

- նաև հիմնական օղակի գործառույթի ներսում կա մեկ այլ գործառույթ ՝ «animateLeds () անունով;» կոչվում է. Այս գործառույթը ստուգում է, թե արդյոք անցել է 100 միլիվայրկյան, և եթե այո, այն պտտում է led- ները ՝ օգտագործելով «rotateLeds ()» գործառույթը, այնուհետև դրանք վերագծում է

- «rotateLeds ()» - ը «պտտելու» է led- ները առաջ կամ հետ ՝ օգտագործելով մեկ այլ զանգված, որը կոչվում է «intermediateLedStates»:

Պտտման «էֆեկտը» այսպիսի տեսք կունենա.

# նախաստորագրումից հետո

{150, 100, 70, 50, 40, 30, 10, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; # հետո rotateLeds () կոչվում է {0, 150, 100, 70, 50, 40, 30, 10, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; # հետո rotateLeds () -ը նորից կանչվում է {0, 0, 150, 100, 70, 50, 40, 30, 10, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; # և այլն

Դրա համար առաջինը ստեղծում է նոր զանգված և պատճենում է նոր դիրքերի հին led լարվածությունը (ավելացրեք դիրքը կամ նվազեցրեք այն): Դրանից հետո այն փոխարինում է «ledStates» զանգվածը «intermediateLedStates» - ի հետ, ուստի գործընթացը կշարունակվի ևս 100 միլիվայրկյան հետո:

#ներառել «SparkFun_APDS9960.h»

#ներառել «Adafruit_NeoPixel.h»

#ներառել «Wire.h» #սահմանել NEOPIXED_CONTROL_PIN 6 #սահմանել NUM_LEDS 24 #սահմանել APDS9960_INT 2 #սահմանել LED_SPEED_STEP_INTERVAL 100 Adafruit_NeoPixel ժապավեն = Adafruit_NeoPixel (NEOPLEX), NEO_LEG SparkFun_APDS9960 apds = SparkFun_APDS9960 (); անստորագիր long lastLedChangeTime = 0; կարճ ledDirection = 0; կարճ գույնի ընտրություն = 0; բայթ 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, 0}; int isr_flag = 0; void setup () {Serial.begin (9600); Serial.println («startedրագիրը մեկնարկեց»); strip.begin (); pinMode (APDS9960_INT, INPUT); attachInterrupt (0, interruptRoutine, FALLING); if (apds.init () && apds.enableGestureSensor (ճշմարիտ)) {Serial.println ("APDS-9960 նախնական պատրաստումն ավարտված է"); } else {Serial.println («Սխալ առաջացավ APDS-9960 init- ի ընթացքում»); } lastLedChangeTime = millis (); Serial.println («Հաջողությամբ սկսել»); } void loop () {if (isr_flag == 1) {detachInterrupt (0); handleGesture (); isr_flag = 0; attachInterrupt (0, interruptRoutine, FALLING); } animateLeds (); } void interruptRoutine () {isr_flag = 1; }); } անջատիչ (apds.readGesture ()) {case DIR_UP: Serial.println ("UP"); toggleColor (); ընդմիջում; գործ DIR_DOWN: Serial.println ("DOWN"); toggleColor (); ընդմիջում; պատյան DIR_LEFT: ledDirection = 1; Serial.println («ՄՆԱ»); ընդմիջում; պատյան DIR_RIGHT: ledDirection = -1; Serial.println («IGHԻՇՏ»); ընդմիջում; գործ DIR_FAR: ledDirection = 0; Serial.println ("FAR"); ընդմիջում; }} / ** * Փոխել ընթացիկ լուսարձակների գույնը * Ամեն անգամ, երբ այս գործառույթը կանչվի, կփոխվի led- ների վիճակը * / void toggleColor () {if (colorSelection == 0) {colorSelection = 1; } else if (colorSelection == 1) {colorSelection = 2; } else {colorSelection = 0; }} / ** * Շարժապատկերումը գործարկվելու է LED_SPEED_STEP_INTERVAL միլիլարից հետո * Նախ կանչվում է rotateLeds գործառույթը, այնուհետև leds- ի գույները սահմանվում են ՝ օգտագործելով api * / void animateLeds () {if (millis () - lastLedChangeTime <LED_SPEED_STEP_INTERVAL) {վերադարձ; } rotateLeds (); համար (int i = 0; i <NUM_LEDS; i ++) {strip.setPixelColor (i, getColor (ledStates ))); strip.show (); } lastLedChangeTime = millis (); } /** * Օգտագործելով «intermediateLedStates» երկրորդական զանգվածը ՝ led- ների ինտենսիվությունը անիմացիոն է * Նախ «ledStates» - ի արժեքները պատճենված են «intermediateLedStates» - ում, այսպես * եկեք նստենք «ledStates» զանգվածը ՝ {100, 80, 60, 0, 0, 0} և ledDirection- ը 1 * է, ապա այս գործառույթը «ledStates» կոչվելուց հետո զանգվածը {0, 100, 80, 60, 0, 0} ռոտացիայի էֆեկտ է */ void rotateLeds () {բայթ intermediateLedStates [NUM_LEDS]; համար (int i = 0; i <NUM_LEDS; i ++) {intermediateLedStates = 0; } (int i = 0; i <NUM_LEDS; i ++) {if (ledDirection == 1) {if (i == NUM_LEDS -1) {intermediateLedStates [0] = ledStates ; } else {intermediateLedStates [i + 1] = ledStates ; }} else {if (i == 0) {intermediateLedStates [NUM_LEDS - 1] = ledStates ; } else {intermediateLedStates [i - 1] = ledStates ; }}} (int i = 0; i <NUM_LEDS; i ++) {ledStates = intermediateLedStates ; }} uint32_t getColor (int ինտենսիվություն) {switch (colorSelection) {case 0: return strip. Color (intensity, 0, 0); գործ 1: վերադարձի ժապավեն: Գույն (0, ինտենսիվություն, 0); լռելյայն. վերադարձի ժապավեն: Գույն (0, 0, ինտենսիվություն); }}

Հուսով եմ, որ ձեզ դուր եկավ սա, կարող եք օգտագործել մեկնաբանությունների բաժինը `ինձ հարցեր տալու համար:

Խորհուրդ ենք տալիս: