Բովանդակություն:
Video: Neopixel- ի գլխիկով մատանի ժեստերի սենսորով կառավարելը. 3 քայլ (նկարներով)
2024 Հեղինակ: John Day | [email protected]. Վերջին փոփոխված: 2024-01-30 09:49
Այս ձեռնարկում մենք խաղալու ենք ժեստերի ցուցիչով (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, ինտենսիվություն); }}
Հուսով եմ, որ ձեզ դուր եկավ սա, կարող եք օգտագործել մեկնաբանությունների բաժինը `ինձ հարցեր տալու համար:
Խորհուրդ ենք տալիս:
Հեռավորության հարևանության չափում ժեստերի սենսորով APDS9960: 6 քայլ
Հեռավորության հարևանության չափում ժեստերի ցուցիչով APDS9960. Այս ձեռնարկում մենք կսովորենք, թե ինչպես չափել հեռավորությունը ՝ օգտագործելով ժեստերի ցուցիչ APDS9960, arduino և Visuino: Դիտեք տեսանյութը:
Minecraft ժեստերի վերահսկիչ. 10 քայլ (նկարներով)
Minecraft Gesture Controller. Տեղափոխեք ձեր մարմինը Minecraft խաղալու համար: Ինչ!! Այո Ստուգեք ցուցադրման տեսանյութը. Տեղափոխեք ձեր ձեռքը (ները) քայլելու/վազելու/ցատկելու համար, նայեք արա
Երկգույն 5 մմ գլխիկով մատանի (DIY) ՝ 4 քայլ (նկարներով)
Երկգույն 5 մմ լուսադիոդով մատանի (DIY). Ահա երկգույն լուսադիոդային մատանի պատրաստելու հրահանգները:
Ուլտրաձայնային Pi դաշնամուր `ժեստերի վերահսկմամբ: 10 քայլ (նկարներով)
Ուլտրաձայնային Pi դաշնամուր `ժեստերի վերահսկմամբ. , որտեղ երաժշտությունը
PSP- ի օգտագործումը որպես համակարգչային ջոյստիկ և այնուհետև ձեր համակարգիչը PSP- ով կառավարելը. 5 քայլ (նկարներով)
PSP- ի օգտագործումը որպես համակարգչային ջոյսթիք և այնուհետև ձեր համակարգիչը PSP- ով կառավարելը. Դուք կարող եք շատ հիանալի բաներ անել PSP homebrew- ի հետ, և այս ուսանելի ուսուցողական խցիկում ես կսովորեցնեմ ձեզ, թե ինչպես օգտագործել ձեր PSP- ն որպես խաղ խաղալու ջոյսթիք, բայց կա նաև ծրագիր, որը թույլ է տալիս օգտագործել ձեր ջոյսթիկը որպես մկնիկ: Ահա մայրիկը