- Zahtevane komponente
- Uvod v digitalni senzor bližine RGB in kretnje APDS-9960
- Shema vezja
- Programiranje Arduina za zaznavanje kretenj in barv
Danes ima večina telefonov funkcijo za upravljanje s kretnjami za odpiranje ali zapiranje katere koli aplikacije, zagon glasbe, udeležbo na klicih itd. To je zelo priročna funkcija za prihranek časa, prav tako pa je videti dobro, če s kretnjami upravljate katero koli napravo. Pred tem smo merilnik pospeška uporabljali za izdelavo robota, ki je nadzorovan s kretnjami, in miške Air Control. Toda danes se naučimo povezati senzor kretenj APDS9960 z Arduinom. Ta senzor ima tudi senzor RGB za zaznavanje barv, ki bo uporabljen tudi v tej vadnici. Zato vam ni treba uporabljati ločenih senzorjev za zaznavanje kretenj in barv, čeprav je na voljo namenski senzor za zaznavanje barv - barvni senzor TCS3200, ki smo ga že uporabili z Arduino za izdelavo stroja za razvrščanje barv.
Zahtevane komponente
- Arduino UNO
- APDS9960 RGB in senzor kretnje
- 16x2 LCD
- Stikalo DPDT
- 100K lonec in 10K upor
- Jumper kabli
Uvod v digitalni senzor bližine RGB in kretnje APDS-9960
APDS9960 je večnamenski senzor. V svetlobi lahko zazna kretnje, svetlobo okolice in vrednosti RGB. Ta senzor se lahko uporablja tudi kot senzor bližine in se večinoma uporablja v pametnih telefonih, da onemogoči zaslon na dotik med udeležbo na klicu.
Ta senzor je sestavljen iz štirih fotodiod. Te fotodiode zaznajo odbojno IR energijo, ki jo oddaja vgrajena LED. Torej, kadar se izvede katera koli gesta, se ta IR energija ovira in se odbije nazaj na senzor, zdaj pa senzor zazna informacije (smer, hitrost) o gesti in jih pretvori v digitalne informacije. Ta senzor lahko uporabite za merjenje razdalje ovire z zaznavanjem odbite IR svetlobe. Ima UV in IR blokirne filtre za zaznavanje barv RGB in za vsako barvo ustvari 16-bitne podatke.
Izhod senzorja APDS-9960 je prikazan spodaj. Ta senzor deluje na komunikacijskem protokolu I 2 C. Porablja 1µA toka in se napaja s 3,3V, zato bodite previdni in ga ne povezujte s 5V zatičem. Tu je zatič INT prekinitveni zatič, ki se uporablja za pogon komunikacije I 2 C. VL zatič je izbirni napajalni zatič za vgrajeno LED, če mostiček PS ni priključen. Če je mostiček PS zaprt, morate napajati samo zatič VCC, ki bo napajal oba - modul in IR LED.
Shema vezja
Povezave za APDS960 z Arduinom so zelo preproste. Za preklop med obema načinoma RGB Sensing in Gesture Sensing bomo uporabili gumb DPDT. Najprej sta komunikacijski zatiča I2C SDA in SCL APDS9960 priključena na Arduino pin A4 in A5. Kot smo že omenili, je delovna napetost senzorja 3,3 v, zato sta VCC in GND APDS9960 priključena na 3,3 V in GND Arduina. Prekinitveni zatič (INT) APDS9960 je povezan z zatičem D2 Arduina.
Za LCD so podatkovni zatiči (D4-D7) povezani z digitalnimi zatiči D6-D3 Arduina, RS in EN zatiči pa D6 in D7 Arduino. V0 LCD je povezan z loncem, 100K lonec pa se uporablja za nadzor svetlosti LCD. Za gumbe DPDT smo uporabili le 3 nožice. Drugi zatič je za vhod povezan z zatičem D7 Arduina, druga dva pa sta priključena na GND in VCC, čemur sledi upor 10K.
Programiranje Arduina za zaznavanje kretenj in barv
Programski del je preprost in enostaven, celoten program z predstavitvenim videoposnetkom pa je podan na koncu te vadnice.
Najprej moramo namestiti knjižnico Sparkfuna. Če želite namestiti to knjižnico, pojdite na Skica-> Vključi knjižnico-> Upravljanje knjižnic.
Zdaj v iskalno vrstico vnesite "Sparkfun APDS9960" in kliknite gumb za namestitev, ko vidite knjižnico.
In pripravljeni smo iti. Začnimo.
Najprej moramo torej vključiti vse zahtevane datoteke z glavo. Prva datoteka glave LiquidCrystal.h se uporablja za funkcije LCD. Druga datoteka glave Wire.h se uporablja za komunikacijo I 2 C, zadnja SparkFun_APDS996.h pa za senzor APDS9960.
#include
Zdaj v naslednjih vrsticah smo določili nožice za gumb in LCD.
const int buttonPin = 7; const int rs = 12, en = 11, d4 = 6, d5 = 5, d6 = 4, d7 = 3; LCD LiquidCrystal (rs, en, d4, d5, d6, d7);
V naslednjem delu smo definirali makro za prekinitveni zatič, ki je povezan na digitalni zatič 2 in eno spremenljivo buttonState za trenutno stanje gumba in isr_flag za prekinitveno rutino.
#define APDS9960_INT 2 int buttonState; int isr_flag = 0;
Nato se ustvari objekt za SparkFun_APDS9960, tako da lahko dostopamo do gibov in pridobimo vrednosti RGB.
SparkFun_APDS9960 apds = SparkFun_APDS9960 (); uint16_t ambient_light = 0; uint16_t rdeča luč = 0; uint16_t green_light = 0; uint16_t blue_light = 0;
V nastavitveni funkciji je prva vrstica za pridobitev vrednosti z gumba (nizka / visoka), druga in tretja vrstica pa kot vhod definirata prekinitev in zatič gumba. apds.init () inicializira senzor APDS9960, lcd.begin (16,2) pa LCD.
void setup () { buttonState = digitalRead (buttonPin); pinMode (APDS9960_INT, INPUT); pinMode (buttonPin, INPUT); apds.init (); lcd.begin (16, 2); }
V funkciji zanke prva vrstica dobi vrednosti iz gumba in jih shrani v prej definirano spremenljivko buttonState . Zdaj v naslednjih vrsticah preverjamo vrednosti iz gumba, če je visok, omogočimo svetlobni senzor in če je nizek, inicializiramo senzor geste.
AttachInterrupt () je funkcija, ki se uporablja za zunanjo prekinitev, ki je v tem primeru prekinitev senzorja. Prvi argument v tej funkciji je številka prekinitve. V Arduinu UNO sta dva digitalna zatiča prekinjevalnika - 2 in 3, označena z INT.0 in INT.1. In priklopili smo ga na pin 2, zato smo tam zapisali 0. Drugi argument pokliče funkcijo interruptRoutine (), ki je definirana pozneje. Zadnji argument je FALLING, tako da bo sprožil prekinitev, ko se pin premakne z visoko na nizko. Več o prekinitvah Arduino preberite tukaj.
void loop () { buttonState = digitalRead (buttonPin); if (buttonState == HIGH) { apds.enableLightSensor (true); }
V naslednjem delu preverimo zatič gumba. Če je visoka, zaženite postopek za RGB senzor. Nato preverite, ali senzor svetlobe bere vrednosti ali ne. Če vrednosti ne more prebrati, v tem primeru natisnite tisto " Napaka pri branju vrednosti luči". In če potem lahko bere vrednosti, primerjajte vrednosti treh barv in kar koli je najvišje, tiskajte to barvo na LCD.
if (buttonState == HIGH) { if (! apds.readAmbientLight (ambient_light) - ! apds.readRedLight (red_light) - ! apds.readGreenLight (green_light) - ! apds.readBlueLight (blue_light)) { lcd.print ("Napaka pri branju vrednosti svetlobe"); } else { if (red_light> green_light) { if (red_light> blue_light) { lcd.print ("Red"); zamuda (1000); lcd.clear (); } ……. ………..
V naslednjih vrsticah ponovno preverite, ali je gumb zatič, in če je nizek, obdelajte senzor gesta. Nato preverite, ali je isr_flag, in če je enak 1, se pokliče funkcija detachInterrupt () . Ta funkcija se uporablja za izklop prekinitve. Naslednja vrstica pokliče handleGesture (), ki je pozneje definirana funkcija. V naslednjih vrsticah določite isr_flag na nič in priložite prekinitev.
sicer če (buttonState == LOW) { if (isr_flag == 1) { detachInterrupt (0); handleGesture (); isr_flag = 0; attachInterrupt (0, interruptRoutine, FALLING); } }
Naslednja je funkcija interruptRoutine () . Ta funkcija se uporablja za obračanje spremenljivke isr_flag 1, tako da je mogoče storitev prekinitve inicializirati.
void interruptRoutine (). { isr_flag = 1; }
Funkcija handleGesture () je definirana v naslednjem delu. Ta funkcija najprej preveri razpoložljivost senzorja kretenj. Če je na voljo, nato prebere vrednosti kretenj in preveri, za katero potezo gre (GOR, DOL, DESNO, LEVO, DALJ, BLIŽINA) in ustrezne vrednosti natisne na LCD.
void handleGesture () { if (apds.isGestureAvailable ()) { switch (apds.readGesture ()) { case DIR_UP: lcd.print ("UP"); zamuda (1000); lcd.clear (); odmor; primer DIR_DOWN: lcd.print ("DOL"); zamuda (1000); lcd.clear (); odmor; primer DIR_LEFT: lcd.print ("LEVO"); zamuda (1000); lcd.clear (); odmor; primer DIR_RIGHT: lcd.print ("DESNO"); zamuda (1000); lcd.clear (); odmor; primer DIR_NEAR: lcd.print ("NEAR"); zamuda (1000); lcd.clear (); odmor; primer DIR_FAR: lcd.print ("FAR"); zamuda (1000); lcd.clear (); odmor; privzeto: lcd.print ("NONE"); zamuda (1000); lcd.clear (); } } }
Končno naložite kodo v Arduino in počakajte, da se senzor inicializira. Zdaj, ko je gumb izklopljen, pomeni, da je v načinu potez. Poskusite torej premikati roke v levo, desno, gor, dol. Za daljšo gesto držite roko 2-3 sekunde od senzorja 2-3 sekunde in jo odstranite. In za bližnjo gesto držite roko daleč od senzorja, nato jo primite blizu in odstranite.
Zdaj gumb VKLOPITE, da ga preklopite v način zaznavanja barv in v bližini senzorja vzemite rdeče, modre in zelene predmete enega za drugim. Natisnil bo barvo predmeta.