- Components necessaris
- Introducció a l'APDS-9960 de proximitat digital RGB i sensor de gest
- Esquema de connexions
- Programació d'Arduino per a la detecció de gestos i colors
Avui en dia la majoria dels telèfons tenen la funció de control de gestos per obrir o tancar qualsevol aplicació, iniciar música, atendre trucades, etc. Aquesta és una característica molt útil per estalviar temps i també sembla fantàstic controlar qualsevol dispositiu amb gestos. Anteriorment hem utilitzat l’acceleròmetre per construir un robot controlat per gestos i un ratolí Air controlat per gestos. Però avui aprenem a relacionar un sensor de gest APDS9960 amb Arduino. Aquest sensor també té un sensor RGB per detectar colors, que també s’utilitzarà en aquest tutorial. Per tant, no cal que utilitzeu sensors separats per a la detecció de gestos i colors, tot i que hi ha un sensor dedicat per a la detecció de color: sensor de color TCS3200 que ja hem utilitzat amb Arduino per construir una màquina de classificació de colors.
Components necessaris
- Arduino UNO
- APDS9960 RGB i sensor de gest
- LCD de 16x2
- Commutador DPDT
- Pot de 100K i resistència de 10K
- Cables de pont
Introducció a l'APDS-9960 de proximitat digital RGB i sensor de gest
APDS9960 és un sensor multifunció. Pot detectar gestos, llum ambiental i valors RGB a la llum. Aquest sensor també es pot utilitzar com a sensor de proximitat i s’utilitza principalment en telèfons intel·ligents per desactivar la pantalla tàctil mentre assistiu a una trucada.

Aquest sensor consta de quatre fotodíodes. Aquests fotodíodes detecten l'energia IR reflectida que es transmet mitjançant un LED incorporat. Per tant, sempre que es realitza qualsevol gest, aquesta energia IR s’obstrueix i es reflecteix cap al sensor, ara el sensor detecta la informació (direcció, velocitat) sobre el gest i la converteix en informació digital. Aquest sensor es pot utilitzar per mesurar la distància de l'obstacle detectant la llum IR reflectida. Té filtres de bloqueig d’UV i IR per detectar colors RGB i produeix dades de 16 bits per a cada color.
A continuació es mostra el pin-out del sensor APDS-9960. Aquest sensor funciona amb el protocol de comunicació I 2 C. Consumeix 1µA de corrent i funciona amb 3,3V, així que aneu amb compte i no el connecteu amb pin de 5V. El pin INT aquí és el pin d'interrupció, que s'utilitza per conduir la comunicació I 2 C. I el pin VL és un pin d'alimentació opcional per al LED integrat si el pont PS no està connectat. Si el pont PS està tancat, només haureu d’alimentar el pin VCC, que proporcionarà energia a tots dos: el mòdul i el LED IR.

Esquema de connexions
Les connexions per a APDS960 amb Arduino són molt senzilles. Utilitzarem un botó DPDT per canviar entre els dos modes RGB Sensing i Gesture Sensing. En primer lloc, els pins de comunicació I2C SDA i SCL d’APDS9960 estan connectats als pins A4 d’Aduino i A5 respectivament. Com s’ha dit anteriorment, la tensió de funcionament del sensor és de 3,3 v, de manera que VCC i GND d’APDS9960 estan connectats a 3,3 V i GND d’Arduino. El pin d'interrupció (INT) d'APDS9960 està connectat al pin D2 d'Arduino.
Per a LCD, els pins de dades (D4-D7) es connecten als pins digitals D6-D3 d’Arduino i els pins RS i EN es connecten a D6 i D7 d’Arduino. El V0 de la pantalla LCD està connectat al pot i s’utilitza un pot de 100 K per controlar la brillantor de la pantalla LCD. Per als botons DPDT, només hem utilitzat 3 pins. El segon pin està connectat al pin D7 d'Arduino per a l'entrada i els altres dos estan connectats a GND i VCC seguits d'una resistència de 10K.


Programació d'Arduino per a la detecció de gestos i colors
La part de programació és senzilla i senzilla i el programa complet amb un vídeo de demostració es dóna al final d’aquest tutorial.
Primer hem d’ instal·lar una biblioteca creada per Sparkfun. Per instal·lar aquesta biblioteca, aneu a Sketch-> Inclou biblioteca-> Gestiona les biblioteques.

Ara, a la barra de cerca, escriviu "Sparkfun APDS9960" i feu clic al botó d'instal·lació quan vegeu la biblioteca.

I ja estem preparats. Comencem.
Per tant, en primer lloc hem d’incloure tots els fitxers de capçalera necessaris. El primer fitxer de capçalera LiquidCrystal.h s’utilitza per a funcions LCD. El segon fitxer de capçalera Wire.h s'utilitza per a la comunicació I 2 C i l'últim SparkFun_APDS996.h s'utilitza per al sensor APDS9960.
#incloure
Ara a les properes línies hem definit els pins per al botó i la pantalla 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);
A la següent part, hem definit una macro per al pin d'interrupció que es connecta al pin digital 2 i un buttonState variable per a l'estat actual del botó i isr_flag per a la rutina del servei d'interrupcions.
#define APDS9960_INT 2 int buttonState; int isr_flag = 0;
A continuació, es crea un objecte per a SparkFun_APDS9960, de manera que puguem accedir als moviments gestuals i obtenir els valors RGB.
SparkFun_APDS9960 apds = SparkFun_APDS9960 (); uint16_t ambient_light = 0; uint16_t vermell_llum = 0; uint16_t green_light = 0; uint16_t blue_light = 0;
A la funció de configuració , la primera línia és obtenir el valor del botó (baix / alt) i la segona i tercera línia defineixen la interrupció i el botó com a entrada. apds.init () inicialitza el sensor APDS9960 i el lcd.begin (16,2) inicialitza la pantalla LCD.
void setup () { buttonState = digitalRead (buttonPin); pinMode (APDS9960_INT, INPUT); pinMode (buttonPin, INPUT); apds.init (); lcd.begin (16, 2); }
En funció de bucle , la primera línia obté els valors del botó i els emmagatzema a la variable buttonState definida anteriorment. Ara, a les properes línies, comprovem els valors del botó; si és alt, activem el sensor de llum i, si és baix, inicialitzeu el sensor de gest.
El attachInterrupt () és una funció que s’utilitza per a una interrupció externa que en aquest cas és la interrupció del sensor. El primer argument d'aquesta funció és el número d'interrupció. A Arduino UNO, hi ha dos pins digitals d’interrupció: 2 i 3 denotats per INT.0 i INT.1. I l’hem connectat al pin 2, de manera que hi hem escrit 0. El segon argument crida la funció interruptRoutine () que es defineix més endavant. L'últim argument és FALLING, de manera que desencadenarà la interrupció quan el passador vagi de més alt a més baix. Obteniu més informació sobre Arduino Interrupts aquí.
bucle buit () { buttonState = digitalRead (buttonPin); if (buttonState == HIGH) { apds.enableLightSensor (true); }
A la següent part, comprovem si hi ha un botó. Si és alt, inicieu el procés per al sensor RGB. A continuació, comproveu si el sensor de llum està llegint valors o no. Si no és capaç de llegir els valors, en aquest cas, imprimiu " Error en llegir els valors de llum". I si pot llegir valors, compareu els valors dels tres colors i el que sigui més alt, imprimiu aquest color a la pantalla LCD.
if (buttonState == HIGH) { if (! apds.readAmbientLight (ambient_light) - ! apds.readRedLight (red_light) - ! apds.readGreenLight (green_light) - ! apds.readBlueLight (blue_light)) { lcd.print ("Error en llegir els valors de llum"); } else { if (llum_ vermella> llum_verda) { if (llum_ vermella> llum_blava) { lcd.print ("Vermell"); retard (1000); lcd.clear (); } …… ………..
A les següents línies, torneu a comprovar si hi ha cap botó i, si és baix, el procés del sensor de gest. A continuació, comproveu si isr_flag i si és 1, es crida una funció detachInterrupt () . Aquesta funció s’utilitza per desactivar la interrupció. La següent línia crida a handleGesture (), que es definirà més endavant. A les següents línies, definiu isr_flag a zero i adjunteu la interrupció.
else if (buttonState == LOW) { if (isr_flag == 1) { detachInterrupt (0); handleGesture (); isr_flag = 0; attachInterrupt (0, interruptRoutine, FALLING); } }
El següent és la funció interruptRoutine () . Aquesta funció s'utilitza per convertir la variable isr_flag 1, de manera que es pot inicialitzar el servei d'interrupció.
void interruptRoutine (). { isr_flag = 1; }
La funció handleGesture () es defineix a la part següent. Aquesta funció comprova en primer lloc la disponibilitat del sensor de gestos. Si està disponible, llegeix els valors del gest i comprova quin és el gest (AMUNT, ABAIX, DRETA, ESQUERRA, FAR, PROP) i imprimeix els valors corresponents a la pantalla LCD.
void handleGesture () { if (apds.isGestureAvailable ()) { switch (apds.readGesture ()) { case DIR_UP: lcd.print ("UP"); retard (1000); lcd.clear (); trencar; cas DIR_DOWN: lcd.print ("DOWN"); retard (1000); lcd.clear (); trencar; cas DIR_LEFT: lcd.print ("ESQUERRA"); retard (1000); lcd.clear (); trencar; cas DIR_RIGHT: lcd.print ("DRETA"); retard (1000); lcd.clear (); trencar; cas DIR_NEAR: lcd.print ("PROP"); retard (1000); lcd.clear (); trencar; cas DIR_FAR: lcd.print ("FAR"); retard (1000); lcd.clear (); trencar; per defecte: lcd.print ("CAP"); retard (1000); lcd.clear (); } } }
Finalment, pengeu el codi a Arduino i espereu a que s’inicialitzi el sensor. Ara, mentre el botó està desactivat, vol dir que està en mode gestual. Així que proveu de moure les mans en direccions esquerra, dreta, amunt, avall. Per fer un gest llunyà , mantingueu la mà a una distància de 2-4 polzades del sensor durant 2-3 segons i traieu-la. I per fer un gest proper, mantingueu la mà lluny del sensor i, a continuació, acosteu-la i traieu-la.

Ara activeu el botó per posar-lo al mode de detecció de color i agafeu objectes vermells, blaus i verds un a un a prop del sensor. Imprimirà el color de l'objecte.

