- Componente necesare
- Introducere în APDS-9960 Digital RX de proximitate și senzor de gest
- Diagrama circuitului
- Programarea Arduino pentru Gesture și Color Sensing
Astăzi, majoritatea telefoanelor sunt dotate cu funcția de control al gesturilor pentru a deschide sau închide orice aplicație, a porni muzică, a participa la apeluri etc. Aceasta este o caracteristică foarte utilă pentru a economisi timp și, de asemenea, arată minunat pentru a controla orice dispozitiv cu gesturi. Am folosit anterior accelerometru pentru a construi robot controlat prin gesturi și mouse-ul Air controlat prin gesturi. Dar astăzi învățăm să interfațăm un senzor de gest APDS9960 cu Arduino. Acest senzor are și un senzor RGB pentru detectarea culorilor, care va fi folosit și în acest tutorial. Deci nu este nevoie să utilizați senzori separați pentru detectarea gesturilor și culorilor, deși este disponibil un senzor dedicat pentru detectarea culorii - senzor de culoare TCS3200 pe care l-am folosit deja cu Arduino pentru a construi o mașină de sortare a culorilor.
Componente necesare
- Arduino UNO
- APDS9960 RGB și senzor de gesturi
- 16x2 LCD
- Comutator DPDT
- Oală de 100K și rezistor de 10K
- Cabluri jumper
Introducere în APDS-9960 Digital RX de proximitate și senzor de gest
APDS9960 este un senzor multifuncțional. Poate detecta gesturi, lumină ambientală și valori RGB în lumină. Acest senzor poate fi folosit și ca senzor de proximitate și este utilizat în cea mai mare parte pe smartphone-uri, pentru a dezactiva ecranul tactil în timp ce participați la un apel.
Acest senzor este format din patru fotodioduri. Aceste fotodiode detectează energia IR reflectată care este transmisă de un LED de la bord. Deci, ori de câte ori se efectuează orice gest, această energie IR este obstrucționată și se reflectă înapoi la senzor, acum senzorul detectează informațiile (direcția, viteza) despre gest și le convertește în informații digitale. Acest senzor poate fi utilizat pentru a măsura distanța obstacolului prin detectarea luminii IR reflectate. Are filtre de blocare UV și IR pentru detectarea culorilor RGB și produce date pe 16 biți pentru fiecare culoare.
Pin-out-ul senzorului APDS-9960 este prezentat mai jos. Acest senzor funcționează pe protocolul de comunicație I 2 C. Consumă curent de 1µA și este alimentat de 3,3V, deci aveți grijă și nu-l conectați cu pinul de 5V. Pinul INT aici este pinul de întrerupere, care este utilizat pentru a conduce comunicația I 2 C. Și pinul VL este pinul de alimentare opțional pentru LED-ul de la bord, dacă jumperul PS nu este conectat. Dacă jumperul PS este închis, atunci trebuie doar să alimentați pinul VCC, acesta va furniza energie ambelor - modulului și LED-ului IR.
Diagrama circuitului
Conexiunile pentru APDS960 cu Arduino sunt foarte simple. Vom folosi un buton DPDT pentru a comuta între cele două moduri RGB Sensing și Gesture Sensing. În primul rând pinii de comunicație I2C SDA și SCL ai APDS9960 sunt conectați la pinul Arduino A4 și respectiv A5. După cum sa menționat mai devreme, tensiunea de funcționare a senzorului este de 3,3 v, astfel încât VCC și GND din APDS9960 sunt conectate la 3,3 V și GND din Arduino. Pinul de întrerupere (INT) al APDS9960 este conectat la pinul D2 al Arduino.
Pentru LCD, pinii de date (D4-D7) sunt conectați la pinii digitali D6-D3 din Arduino, iar pinii RS și EN sunt conectați la D6 și D7 din Arduino. V0 LCD este conectat la pot și un pot 100K este utilizat pentru a controla luminozitatea LCD. Pentru butoanele DPDT am folosit doar 3 pini. Al doilea pin este conectat la pinul D7 al Arduino pentru intrare și ceilalți doi sunt conectați la GND și VCC urmat de un rezistor de 10K.
Programarea Arduino pentru Gesture și Color Sensing
Partea de programare este simplă și ușoară, iar programul complet cu un videoclip demonstrativ este dat la sfârșitul acestui tutorial.
Mai întâi trebuie să instalăm o bibliotecă realizată de Sparkfun. Pentru a instala această bibliotecă navigați la Schiță-> Includeți bibliotecă-> Gestionați bibliotecile.
Acum, în bara de căutare, tastați „Sparkfun APDS9960” și faceți clic pe butonul de instalare când vedeți biblioteca.
Și suntem gata să plecăm. Să începem.
Deci, mai întâi trebuie să includem toate fișierele antet necesare. Primul fișier antet LiquidCrystal.h este utilizat pentru funcțiile LCD. Al doilea fișier antet Wire.h este utilizat pentru comunicarea I 2 C și ultimul SparkFun_APDS996.h este utilizat pentru senzorul APDS9960.
#include
Acum, în rândurile următoare, am definit pinii pentru buton și LCD.
const int buttonPin = 7; const int rs = 12, en = 11, d4 = 6, d5 = 5, d6 = 4, d7 = 3; LiquidCrystal lcd (rs, en, d4, d5, d6, d7);
În următoarea porțiune, am definit o macro pentru pinul de întrerupere care este conectat pe pinul digital 2 și un buton variabil State pentru starea curentă a butonului și isr_flag pentru rutina de servicii de întrerupere.
#define APDS9960_INT 2 int buttonState; int isr_flag = 0;
Apoi se creează un obiect pentru SparkFun_APDS9960, astfel încât să putem accesa mișcările gestuale și să preluăm valorile RGB.
SparkFun_APDS9960 apds = SparkFun_APDS9960 (); uint16_t ambient_light = 0; uint16_t red_light = 0; uint16_t green_light = 0; uint16_t blue_light = 0;
În funcția de configurare , prima linie este de a prelua valoarea de la buton (scăzut / înalt), iar a doua și a treia linie definește întreruperea și pinul butonului ca intrare. apds.init () inițializează senzorul APDS9960 și lcd.begin (16,2) inițializează LCD-ul.
void setup () { buttonState = digitalRead (buttonPin); pinMode (APDS9960_INT, INPUT); pinMode (buttonPin, INPUT); apds.init (); lcd.inceput (16, 2); }
În funcția de buclă , prima linie obține valorile de la buton și le stochează în variabila buttonState definită anterior. Acum, în rândurile următoare, verificăm valorile din buton, dacă este ridicat, atunci activăm senzorul de lumină și, dacă este scăzut, inițializați senzorul de gest.
AttachInterrupt () este o funcție utilizată pentru întrerupere externă care în acest caz este de întrerupere senzorului. Primul argument din această funcție este numărul de întrerupere. În Arduino UNO, există doi pini digitali de întrerupere - 2 și 3 notați cu INT.0 și INT.1. Și l-am conectat la pinul 2, așa că am scris 0 acolo. Al doilea argument apelează funcția interruptRoutine () care este definită ulterior. Ultimul argument este FALLING, astfel încât să declanșeze întreruperea atunci când pinul trece de la mare la minim. Aflați mai multe despre întreruperile Arduino aici.
bucla void () { buttonState = digitalRead (buttonPin); if (buttonState == HIGH) { apds.enableLightSensor (true); }
În următoarea porțiune, verificăm dacă există un buton. Dacă este mare, porniți procesul pentru senzorul RGB. Apoi verificați dacă senzorul de lumină citește sau nu valorile. Dacă nu este capabil să citească valorile, atunci, în acest caz, tipăriți „ Eroare la citirea valorilor luminii”. Și dacă poate citi valorile, comparați valorile celor trei culori și oricare dintre acestea este cea mai mare, imprimați acea culoare pe ecranul LCD.
if (buttonState == HIGH) { if (! apds.readAmbientLight (ambient_light) - ! apds.readRedLight (red_light) - ! apds.readGreenLight (green_light) - ! apds.readBlueLight (blue_light)) { lcd.print („Eroare la citirea valorilor luminii”); } else { if (lumină_roșie> lumină_verdă) { if (lumină_roșie> lumină_ albastră) { lcd.print („Roșu”); întârziere (1000); lcd.clear (); } ……. ………..
În rândurile următoare verificați din nou pinul butonului și, dacă este scăzut, procesați senzorul Gest. Apoi verificați dacă isr_flag și dacă este 1 atunci se apelează o funcție detachInterrupt () . Această funcție este utilizată pentru a opri întreruperea. Următoarea linie apelează handleGesture (), care este definită mai târziu. În rândurile următoare, definiți isr_flag la zero și atașați întreruperea.
else if (buttonState == LOW) { if (isr_flag == 1) { detachInterrupt (0); handleGesture (); isr_flag = 0; attachInterrupt (0, interruptRoutine, FALLING); } }
Următorul este funcția interruptRoutine () . Această funcție este utilizată pentru a transforma variabila isr_flag 1, astfel încât serviciul de întrerupere să poată fi inițializat.
void interruptRoutine (). { isr_flag = 1; }
Funcția handleGesture () este definită în partea următoare. Această funcție verifică mai întâi disponibilitatea senzorului de gesturi. Dacă este disponibil, citește valorile gestului și verifică ce gest este (SUS, JOS, DREAPTA, STÂNGA, FAR, NEAR) și imprimă valorile corespunzătoare pe LCD.
void handleGesture () { if (apds.isGestureAvailable ()) { switch (apds.readGesture ()) { case DIR_UP: lcd.print ("UP"); întârziere (1000); lcd.clear (); pauză; caz DIR_DOWN: lcd.print ("JOS"); întârziere (1000); lcd.clear (); pauză; cazul DIR_LEFT: lcd.print ("STÂNGA"); întârziere (1000); lcd.clear (); pauză; carcasa DIR_RIGHT: lcd.print ("DREAPTA"); întârziere (1000); lcd.clear (); pauză; caz DIR_NEAR: lcd.print ("NEAR"); întârziere (1000); lcd.clear (); pauză; cazul DIR_FAR: lcd.print ("FAR"); întârziere (1000); lcd.clear (); pauză; implicit: lcd.print ("NONE"); întârziere (1000); lcd.clear (); } } }
În cele din urmă, încărcați codul pe Arduino și așteptați inițializarea senzorului. Acum, în timp ce butonul este oprit înseamnă că este în modul gest. Deci, încercați să vă mișcați mâinile în direcțiile stânga, dreapta, sus, jos. Pentru gesturi îndepărtate , țineți mâna la o distanță de 2-4 inci de senzor timp de 2-3 secunde și scoateți-o. Și pentru un gest aproape , țineți mâna departe de senzor, apoi luați-o aproape și scoateți-o.
Acum, porniți butonul pentru al pune în modul de detectare a culorilor și luați obiecte roșii, albastre și verzi unul câte unul lângă senzor. Se va imprima culoarea obiectului.