- Reikalingi komponentai
- APDS-9960 skaitmeninio artumo RGB ir gestų jutiklio įvadas
- Grandinės schema
- „Arduino“ programavimas gestams ir spalvų jutimui
Šiandien daugumoje telefonų yra gestų valdymo funkcija, leidžianti atidaryti ar uždaryti bet kurią programą, paleisti muziką, dalyvauti skambučiuose ir pan. Tai labai patogi funkcija, leidžianti sutaupyti laiko, be to, atrodo šaunu valdyti bet kurį įrenginį gestais. Anksčiau mes naudojome akselerometrą, kad sukurtume valdomą gestais valdomą robotą ir oro pele valdomą gestais. Bet šiandien mes mokomės sąveikauti gestų jutiklį APDS9960 su „Arduino“. Šis jutiklis taip pat turi RGB jutiklį spalvoms aptikti, kuris taip pat bus naudojamas šioje pamokoje. Taigi jums nereikia naudoti atskirų jutiklių gestams ir spalvoms aptikti, nors yra specialus jutiklis spalvų aptikimui - spalvų jutiklis TCS3200, kurį mes jau naudojome kartu su „Arduino“ spalvų rūšiavimo mašinai kurti.
Reikalingi komponentai
- „Arduino UNO“
- APDS9960 RGB ir gestų jutiklis
- 16x2 LCD ekranas
- DPDT jungiklis
- 100K puodas ir 10K rezistorius
- „Jumper“ kabeliai
APDS-9960 skaitmeninio artumo RGB ir gestų jutiklio įvadas
APDS9960 yra daugiafunkcinis jutiklis. Jis gali aptikti gestus, aplinkos šviesą ir RGB reikšmes šviesoje. Šis jutiklis taip pat gali būti naudojamas kaip artumo jutiklis ir dažniausiai naudojamas išmaniuosiuose telefonuose, norint išjungti jutiklinį ekraną dalyvaujant skambutyje.
Šis jutiklis susideda iš keturių fotodiodų. Šie fotodiodai aptinka atspindėtą IR energiją, kurią perduoda laive esantis šviesos diodas. Taigi, kai tik atliekamas koks nors gestas, ši IR energija trukdoma ir atsispindi jutiklyje, dabar jutiklis aptinka informaciją (kryptį, greitį) apie gestą ir paverčia ją skaitmenine. Šis jutiklis gali būti naudojamas matuojant kliūties atstumą, nustatant atspindėtą IR šviesą. Jis turi UV ir IR blokuojančius filtrus RGB spalvoms nustatyti ir kiekvienai spalvai sukuria 16 bitų duomenis.
APDS-9960 jutiklio prisegimas parodytas žemiau. Šis jutiklis veikia pagal I 2 C ryšio protokolą. Jis sunaudoja 1µA srovę ir maitina 3,3 V, todėl būkite atsargūs ir nejunkite jo su 5 V kaiščiu. INT kaištis yra pertraukimo kaištis, naudojamas valdyti I 2 C ryšį. VL kaištis yra pasirinktinis maitinimo kaištis vidiniam LED, jei PS jungiklis nėra prijungtas. Jei PS megztinis yra uždarytas, jums reikia maitinti tik VCC kaištį, jis tieks maitinimą tiek moduliui, tiek IR šviesos diodui.
Grandinės schema
APDS960 su „Arduino“ jungtys yra labai paprastos. Mes naudosime mygtuką DPDT, kad perjungtume vieną iš dviejų RGB jutimo ir gestų jutimo režimų. Pirma, APDS9960 I2C ryšio kaiščiai SDA ir SCL yra atitinkamai prijungti prie „Arduino“ kaiščių A4 ir A5. Kaip minėta anksčiau, jutiklio darbinė įtampa yra 3,3 V, todėl APDS9960 VCC ir GND yra prijungti prie „Arduino“ 3,3 V ir GND. APDS9960 pertraukimo kaištis (INT) yra prijungtas prie „Arduino“ D2 kaiščio.
Už LCD, duomenų kaiščiai (D4-D7) yra prijungta prie skaitmeninių kaiščių D6-D3 Arduino ir RS ir EN kaiščių yra prijungtas prie D6 ir D7 iš Arduino. V0 skystųjų kristalų ekranas yra prijungtas prie puodo, o skystųjų kristalų ryškumui reguliuoti naudojamas 100 tūkst. DPDT mygtukams naudojome tik 3 kaiščius. Antrasis kaištis yra prijungtas prie „Arduino“ D7 kaiščio įvesties tikslais, o kiti du yra prijungti prie GND ir VCC, o po to - 10K rezistorius.
„Arduino“ programavimas gestams ir spalvų jutimui
Programavimo dalis yra paprasta ir lengva, o visa programa su demonstraciniu vaizdo įrašu pateikiama šios pamokos pabaigoje.
Pirmiausia turime įdiegti „Sparkfun“ sukurtą biblioteką. Norėdami įdiegti šią biblioteką, eikite į „ Sketch-> Include Library-> Manage Libraries“.
Dabar paieškos juostoje įveskite „Sparkfun APDS9960“ ir pamatę biblioteką spustelėkite diegimo mygtuką.
Ir mes esame pasirengę eiti. Pradėkime.
Taigi pirmiausia turime įtraukti visus reikalingus antraštės failus. Pirmasis antraštės failas LiquidCrystal.h naudojamas LCD funkcijoms atlikti. Antra antraštės failą Wire.h naudojamas I 2 C bendravimo ir paskutinis SparkFun_APDS996.h naudojama APDS9960 jutikliu.
# įtraukti
Dabar kitose eilutėse mes nustatėme mygtukų ir LCD kaiščius.
const int mygtukasPin = 7; const int rs = 12, en = 11, d4 = 6, d5 = 5, d6 = 4, d7 = 3; „LiquidCrystal LCD“ (rs, en, d4, d5, d6, d7);
Kitoje dalyje mes apibrėžėme pertraukimo kaiščio, prijungto prie 2 skaitmeninio kaiščio, makrokomandą ir vieną kintamąjį mygtuką „State “ - dabartinę mygtuko būseną ir „ isr_flag“ , skirtą pertraukimo tarnybos rutinai.
#define APDS9960_INT 2 int buttonState; int isr_flag = 0;
Tada sukuriamas objektas „SparkFun_APDS9960“, kad galėtume pasiekti gestų judesius ir gauti RGB reikšmes.
„SparkFun_APDS9960 apds“ = „SparkFun_APDS9960“ (); uint16_t aplinkos_ šviesa = 0; uint16_t raudona šviesa = 0; uint16_t žalia_ šviesa = 0; uint16_t blue_light = 0;
Į sąrankos funkciją, pirmoji eilutė yra paimti vertę nuo mygtuko (Žemas / Aukštas), ir antra & trečioji eilutė apibrėžia, nutraukti ir mygtuką kaištį kaip įvesties. apds.init () inicijuoja jutiklį APDS9960, o lcd.begin (16,2) - LCD ekraną.
negaliojanti sąranka () { buttonState = digitalRead (buttonPin); „pinMode“ (APDS9960_INT, INPUT); pinMode (buttonPin, INPUT); apds.init (); lcd.begin (16, 2); }
Pagal ciklo funkciją pirmoji eilutė gauna reikšmes iš mygtuko ir išsaugo ją anksčiau apibrėžtame buttonState kintamajame. Dabar kitose eilutėse mes tikriname reikšmes iš mygtuko, jei jis yra didelis, mes įjungiame šviesos jutiklį ir, jei jis yra mažas, tada inicializuokite gestų jutiklį.
„ AttachInterrupt“) yra funkcija, naudojama išoriniam pertraukimui, kuris šiuo atveju yra jutiklio pertraukimas. Pirmasis šios funkcijos argumentas yra pertraukimo skaičius. „Arduino UNO“ yra du pertraukimo kaiščių skaitmeniniai kaiščiai - 2 ir 3, žymimi INT.0 ir INT.1. Ir mes prijungėme jį prie 2 kaiščio, todėl ten parašėme 0. Antrasis argumentas iškviečia funkciją pertrauktiRoutine (), kuri yra apibrėžta vėliau. Paskutinis argumentas yra KRITIMAS , kad sukeltų pertraukimą kai kaištis eis iš aukšto į žemą. Sužinokite daugiau apie „Arduino“ pertraukimus čia.
void loop () { buttonState = digitalRead (buttonPin); if (buttonState == HIGH) { apds.enableLightSensor (true); }
Kitoje dalyje patikriname, ar nėra mygtuko kaiščio. Jei jis didelis, pradėkite RGB jutiklio procesą. Tada patikrinkite, ar šviesos jutiklis nuskaito vertes, ar ne. Jei jis negali nuskaityti reikšmių, tokiu atveju atspausdinkite tą „ Klaida skaitant šviesos reikšmes“. Ir jei jis gali nuskaityti vertes, palyginkite trijų spalvų reikšmes ir, kas bus didžiausia, atspausdinkite tą spalvą į LCD.
if (buttonState == HIGH) { if (! apds.readAmbientLight (ambient_light) - ! apds.readRedLight (red_light) - ! apds.readGreenLight (green_light) - ! apds.readBlueLight (blue_light)) { lcd.print ("Klaida skaitant šviesos vertes"); } else { if (raudona_šviesa> žalia_žibra) { if (raudona_šviesa> mėlyna_žiburė) { lcd.print ("raudona"); vėlavimas (1000); lcd.clear (); } ……. ………..
Kitose eilutėse dar kartą patikrinkite, ar nėra mygtuko kaiščio, ir, jei jo yra mažai, apdorokite gestų jutiklį. Tada patikrinkite, ar nėra isr_flag, ir jei jis yra 1, iškviečiama funkcija detachInterrupt () . Ši funkcija naudojama pertraukimui išjungti. Kita eilutė iškviečia „ handGesture“ (), kuri yra funkcija, apibrėžta vėliau. Kitose kitose eilutėse apibrėžkite isr_flag iki nulio ir pridėkite pertraukimą.
else if (buttonState == LOW) { if (isr_flag == 1) { detachInterrupt (0); rankenaGestas (); isr_flag = 0; attachInterrupt (0, nutrauktiRoutine, FALLING); } }
Toliau - funkcija „ nutrumpuoti“ () . Ši funkcija naudojama kintamajam „ isr_flag“ pasukti 1, kad būtų galima inicijuoti pertraukimo paslaugą.
negaliojantis pertraukimas „Routine“ (). { isr_flag = 1; }
Funkcija „ handleGesture“ () apibrėžta kitoje dalyje. Ši funkcija pirmiausia patikrina, ar nėra gestų jutiklio. Jei jis yra, jis nuskaito gestų reikšmes ir patikrina, koks tai gestas (AUKŠTYN, ŽEMYN, Dešinėn, Kairėn, TOLIAI, ŠIAUR) ir išspausdina atitinkamas reikšmes LCD.
void handleGesture () { if (apds.isGestureAvailable ()) { switch (apds.readGesture ()) { case DIR_UP: lcd.print ("UP"); vėlavimas (1000); lcd.clear (); pertrauka; atvejis DIR_DOWN: lcd.print ("DOWN"); vėlavimas (1000); lcd.clear (); pertrauka; atvejis DIR_LEFT: lcd.print ("LEFT"); vėlavimas (1000); lcd.clear (); pertrauka; byla DIR_RIGHT: lcd.print ("Dešinė"); vėlavimas (1000); lcd.clear (); pertrauka; atvejis DIR_NEAR: lcd.print ("NEAR"); vėlavimas (1000); lcd.clear (); pertrauka; DIR_FAR atvejis: lcd.print („FAR“); vėlavimas (1000); lcd.clear (); pertrauka; numatytasis: lcd.print ("NĖRA"); vėlavimas (1000); lcd.clear (); } } }
Galiausiai įkelkite kodą į „Arduino“ ir palaukite, kol jutiklis bus inicijuotas. Dabar, kai mygtukas yra išjungtas, jis reiškia, kad jis veikia gestų režimu. Taigi pabandykite judinti rankas kairėn, dešinėn, aukštyn, žemyn. Jei norite toli gestą, 2-3 sekundes laikykite ranką 2–4 colių atstumu nuo jutiklio ir nuimkite. Jei norite, kad gestas būtų arti, laikykite ranką toli nuo jutiklio, tada priartinkite ir nuimkite.
Dabar įjunkite mygtuką „ĮJUNGTI“, kad įjungtumėte spalvų jutimo režimą, o šalia jutiklio paimkite raudonus, mėlynus ir žalius objektus. Tai atspausdins objekto spalvą.