- Potrebne komponente
- Uvod u APDS-9960 Digitalni blizinski RGB i senzor gesta
- Kružni dijagram
- Programiranje Arduina za gestove i prepoznavanje boja
Danas većina telefona dolazi sa značajkom upravljanja gestama za otvaranje ili zatvaranje bilo koje aplikacije, pokretanje glazbe, prisustvovanje pozivima itd. Ovo je vrlo zgodna značajka za uštedu vremena, a čini se i super upravljati bilo kojim uređajem gestama. Prije smo koristili akcelerometar za izradu robota kojim se upravlja gestama i zračnog miša kontroliranog gestama. Ali danas učimo povezivati senzor gesta APDS9960 s Arduinom. Ovaj senzor također ima RGB senzor za otkrivanje boja, koji će se također koristiti u ovom vodiču. Dakle, ne trebate koristiti zasebne senzore za detekciju gesta i boja, iako je dostupan namjenski senzor za detekciju boja - TCS3200 senzor u boji koji smo već koristili s Arduinom za izradu stroja za razvrstavanje boja.
Potrebne komponente
- Arduino UNO
- APDS9960 RGB i senzor geste
- LCD 16x2
- DPDT prekidač
- Pot 100K i otpornik 10K
- Jumper kabeli
Uvod u APDS-9960 Digitalni blizinski RGB i senzor gesta
APDS9960 je višenamjenski senzor. Može otkriti geste, ambijentalno svjetlo i RGB vrijednosti u svjetlu. Ovaj se senzor može koristiti i kao senzor blizine, a uglavnom se koristi u pametnim telefonima kako bi onemogućio zaslon osjetljiv na dodir tijekom sudjelovanja u pozivu.

Ovaj se senzor sastoji od četiri fotodiode. Te fotodiode otkrivaju reflektiranu IR energiju koju prenosi ugrađena LED dioda. Dakle, kad god se izvodi bilo koja gesta, tada se ova IR energija ometa i reflektira natrag na senzor, sada senzor otkriva informacije (smjer, brzinu) o gesti i pretvara ih u digitalne informacije. Ovaj senzor može se koristiti za mjerenje udaljenosti prepreke otkrivanjem reflektirane IR svjetlosti. Ima UV i IR filtre za blokiranje za osjet RGB boja i proizvodi 16-bitne podatke za svaku boju.
Isječak APDS-9960 senzora prikazan je u nastavku. Ovaj senzor radi na komunikacijskom protokolu I 2 C. Troši struju od 1µA i napaja se od 3,3 V, zato budite oprezni i nemojte je spajati 5V pinom. INT pin ovdje je prekidni pin koji se koristi za pogon I 2 C komunikacije. A VL pin je opcionalni pin za napajanje za ugrađenu LED diodu ako PS kratkospojnik nije spojen. Ako je PS kratkospojnik zatvoren, tada trebate napajati samo VCC pin, on će osigurati napajanje i modula i IR LED-a.

Kružni dijagram
Veze za APDS960 s Arduinom vrlo su jednostavne. Upotrijebit ćemo DPDT tipku za prebacivanje između dva načina RGB Sensing i Gesture Sensing. Prvo su I2C komunikacijski pinovi SDA i SCL APDS9960 povezani na Arduino pin A4 i A5. Kao što je ranije rečeno, radni napon senzora je 3,3 v, tako da su VCC i GND APDS9960 povezani na 3,3 V i GND Arduina. Prekidni pin (INT) APDS9960 spojen je na D2 pin Arduina.
Za LCD, podatkovne igle (D4-D7) spojene su na digitalne igle D6-D3 Arduina, a RS i EN pinovi povezani su na D6 i D7 Arduina. V0 LCD-a povezan je s loncem, a 100K lonac koristi se za kontrolu svjetline LCD-a. Za DPDT tipke koristili smo samo 3 pina. Drugi pin spojen je na D7 pin Arduina za ulaz, a druga dva su spojena na GND i VCC nakon čega slijedi 10K otpornik.


Programiranje Arduina za gestove i prepoznavanje boja
Programski dio je jednostavan i lagan, a cjelovit program s demo videom dan je na kraju ovog vodiča.
Prvo moramo instalirati biblioteku koju je izradio Sparkfun. Da biste instalirali ovu knjižnicu, idite na Skica-> Uključi biblioteku-> Upravljanje knjižnicama.

Sada u traku za pretraživanje upišite “Sparkfun APDS9960” i kliknite gumb za instalaciju kad vidite biblioteku.

I mi smo spremni za polazak. Započnimo.
Dakle, prvo moramo uključiti sve potrebne datoteke zaglavlja. Prva datoteka zaglavlja LiquidCrystal.h koristi se za LCD funkcije. Druga datoteka zaglavlja Wire.h koristi se za I 2 C komunikaciju, a zadnja SparkFun_APDS996.h koristi se za APDS9960 senzor.
#include
Sada smo u sljedećim redovima definirali pribadače za gumb i 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);
U sljedećem smo dijelu definirali makronaredbu za pin prekida koji je povezan na digitalni pin 2 i jednu varijablu buttonState za trenutno stanje gumba i isr_flag za rutinu usluge prekida.
#define APDS9960_INT 2 int buttonState; int isr_flag = 0;
Dalje se stvara objekt za SparkFun_APDS9960, tako da možemo pristupiti pokretima gesta i dohvatiti RGB vrijednosti.
SparkFun_APDS9960 apds = SparkFun_APDS9960 (); uint16_t ambijentalno svjetlo = 0; uint16_t crveno_ svjetlo = 0; uint16_t green_light = 0; uint16_t blue_light = 0;
U funkciji postavljanja , prvi redak je dohvat vrijednosti s gumba (niski / visoki), a drugi i treći redak definiraju prekid i pin gumba kao ulaz. apds.init () inicijalizira APDS9960 senzor, a lcd.begin (16,2) inicijalizira LCD.
void setup () { buttonState = digitalRead (buttonPin); pinMode (APDS9960_INT, INPUT); pinMode (buttonPin, INPUT); apds.init (); lcd.begin (16, 2); }
U funkciji petlje prvi redak dobiva vrijednosti s gumba i pohranjuje ih u prethodno definiranu varijablu buttonState . Sada u sljedećim redovima provjeravamo vrijednosti s gumba, ako je visoka, omogućujemo senzor svjetla, a ako je nizak, inicijaliziramo senzor gesta.
AttachInterrupt () je funkcija se koristi za vanjski prekid koji je u ovom slučaju prekida senzora. Prvi argument u ovoj funkciji je broj prekida. U Arduinu UNO postoje dvije digitalne iglice za prekide - 2 i 3 označene s INT.0 i INT.1. I spojili smo ga na pin 2 pa smo tamo napisali 0. Drugi argument poziva funkciju interruptRoutine () koja je kasnije definirana. Posljednji je argument PAD, tako da će pokrenuti prekid kada pin pređe s visokog na niži nivo. Ovdje saznajte više o Arduino prekidima.
void loop () { buttonState = digitalRead (buttonPin); if (buttonState == HIGH) { apds.enableLightSensor (true); }
U sljedećem dijelu provjeravamo je li igla gumba. Ako je visoka, pokrenite postupak za RGB senzor. Zatim provjerite čita li osjetnik svjetlosti vrijednosti ili ne. Ako ne može pročitati vrijednosti, u tom slučaju ispišite onu " Pogreška pri čitanju svjetlosnih vrijednosti". A ako tada može očitati vrijednosti, usporedite vrijednosti tri boje i ovisno o tome što je najviše, ispišite tu boju na LCD.
if (buttonState == HIGH) { if (! apds.readAmbientLight (ambient_light) - ! apds.readRedLight (red_light) - ! apds.readGreenLight (green_light) - ! apds.readBlueLight (blue_light)) { lcd.print ("Pogreška pri čitanju svjetlosnih vrijednosti"); } else { if (red_light> green_light) { if (red_light> blue_light) { lcd.print ("Red"); kašnjenje (1000); lcd.clear (); } ……. ………..
U sljedećim redovima ponovno provjerite ima li zatik gumba, a ako je nizak, obradite senzor pokreta. Zatim provjerite je li isr_flag i ako je 1 tada se poziva funkcija detachInterrupt () . Ova se funkcija koristi za isključivanje prekida. Sljedeći redak poziva handleGesture () koji je funkcija definirana kasnije. U daljnjim sljedećim redovima definirajte isr_flag na nulu i priložite prekid.
inače if (buttonState == LOW) { if (isr_flag == 1) { detachInterrupt (0); handleGesture (); isr_flag = 0; attachInterrupt (0, interruptRutine, FALLING); } }
Sljedeća je funkcija interruptRoutine () . Ova se funkcija koristi za okretanje varijable isr_flag 1, tako da se usluga prekida može pokrenuti.
void interruptRutine (). { isr_flag = 1; }
Funkcija handleGesture () definirana je u sljedećem dijelu. Ova funkcija prvo provjerava dostupnost senzora gesta. Ako je dostupan, tada čita vrijednosti gesta i provjerava koja je to gesta (GORE, DOLJE, DESNO, LIJEVO, DALEKO, BLIZINA) i ispisuje odgovarajuće vrijednosti na LCD.
void handleGesture () { if (apds.isGestureAvailable ()) { switch (apds.readGesture ()) { case DIR_UP: lcd.print ("UP"); kašnjenje (1000); lcd.clear (); pauza; slučaj DIR_DOWN: lcd.print ("DOLJE"); kašnjenje (1000); lcd.clear (); pauza; slučaj DIR_LEFT: lcd.print ("LIJEVO"); kašnjenje (1000); lcd.clear (); pauza; slučaj DIR_RIGHT: lcd.print ("DESNO"); kašnjenje (1000); lcd.clear (); pauza; slučaj DIR_NEAR: lcd.print ("NEAR"); kašnjenje (1000); lcd.clear (); pauza; slučaj DIR_FAR: lcd.print ("FAR"); kašnjenje (1000); lcd.clear (); pauza; zadana vrijednost: lcd.print ("NONE"); kašnjenje (1000); lcd.clear (); } } }
Konačno, prenesite kod na Arduino i pričekajte da se senzor pokrene. Sada, dok je gumb ISKLJUČEN, znači da je u načinu gesta. Pokušajte pomicati ruke u smjeru lijevo, desno, gore, dolje. Za daljnju gestu držite ruku na udaljenosti od 2-4 inča od senzora 2-3 sekunde i uklonite je. A za blisku gestu držite ruku daleko od senzora, a zatim je priklonite i uklonite.

Sada UKLJUČITE gumb da biste ga prebacili u način osjetljivosti boja i uzmite crvene, plave i zelene predmete jedan po jedan u blizini senzora. Ispisat će boju predmeta.

