- Componenti richiesti
- Introduzione al sensore di gesti e RGB di prossimità digitale APDS-9960
- Schema elettrico
- Programmazione di Arduino per il rilevamento dei gesti e del colore
Oggi la maggior parte dei telefoni è dotata di funzionalità di controllo dei gesti per aprire o chiudere qualsiasi app, avviare la musica, partecipare alle chiamate, ecc. Questa è una funzione molto utile per risparmiare tempo ed è anche interessante controllare qualsiasi dispositivo con i gesti. In precedenza abbiamo utilizzato l'accelerometro per costruire robot controllati tramite gesti e mouse Air controllati tramite gesti. Ma oggi impariamo a interfacciare un sensore di gesti APDS9960 con Arduino. Questo sensore ha anche un sensore RGB per rilevare i colori, che verrà utilizzato anche in questo tutorial. Quindi non è necessario utilizzare sensori separati per il rilevamento dei gesti e del colore, sebbene sia disponibile un sensore dedicato per il rilevamento del colore: il sensore di colore TCS3200 che abbiamo già utilizzato con Arduino per costruire una macchina selezionatrice di colori.
Componenti richiesti
- Arduino UNO
- APDS9960 RGB e sensore di gesti
- LCD 16x2
- Interruttore DPDT
- Potenziometro da 100K e resistenza da 10K
- Cavi jumper
Introduzione al sensore di gesti e RGB di prossimità digitale APDS-9960
APDS9960 è un sensore multifunzione. Può rilevare gesti, luce ambientale e valori RGB alla luce. Questo sensore può essere utilizzato anche come sensore di prossimità e viene utilizzato principalmente negli smartphone, per disabilitare il touchscreen durante una chiamata.
Questo sensore è composto da quattro fotodiodi. Questi fotodiodi rilevano l'energia IR riflessa che viene trasmessa da un LED a bordo. Quindi, ogni volta che viene eseguito un gesto, questa energia IR viene ostruita e si riflette sul sensore, ora il sensore rileva le informazioni (direzione, velocità) sul gesto e le converte in informazioni digitali. Questo sensore può essere utilizzato per misurare la distanza dell'ostacolo rilevando la luce IR riflessa. Dispone di filtri di blocco UV e IR per il rilevamento dei colori RGB e produce dati a 16 bit per ogni colore.
Il pin-out del sensore APDS-9960 è mostrato di seguito. Questo sensore funziona sul protocollo di comunicazione I 2 C. Consuma 1 µA di corrente ed è alimentato a 3,3 V, quindi fai attenzione e non collegarlo con pin da 5 V. Il pin INT qui è il pin di interrupt, che viene utilizzato per guidare la comunicazione I 2 C. E il pin VL è il pin di alimentazione opzionale per il LED integrato se il jumper PS non è collegato. Se il jumper PS è chiuso, è sufficiente alimentare il pin VCC, che fornirà alimentazione a entrambi: il modulo e il LED IR.
Schema elettrico
I collegamenti per APDS960 con Arduino sono molto semplici. Useremo un pulsante DPDT per passare tra le due modalità Rilevamento RGB e Rilevamento gestuale. In primo luogo i pin di comunicazione I2C SDA e SCL di APDS9960 sono collegati rispettivamente ai pin A4 e A5 di Arduino. Come affermato in precedenza, la tensione operativa per il sensore è 3,3 V, quindi VCC e GND di APDS9960 sono collegati a 3,3 V e GND di Arduino. Il pin di interrupt (INT) di APDS9960 è collegato al pin D2 di Arduino.
Per LCD, i pin dati (D4-D7) sono collegati ai pin digitali D6-D3 di Arduino e i pin RS ed EN sono collegati a D6 e D7 di Arduino. V0 dell'LCD è collegato alla pentola e una pentola da 100K viene utilizzata per controllare la luminosità dell'LCD. Per i pulsanti DPDT abbiamo utilizzato solo 3 pin. Il secondo pin è collegato al pin D7 di Arduino per l'ingresso e gli altri due sono collegati a GND e VCC seguiti da una resistenza da 10K.
Programmazione di Arduino per il rilevamento dei gesti e del colore
La parte di programmazione è semplice e facile e il programma completo con un video dimostrativo è fornito alla fine di questo tutorial.
Per prima cosa dobbiamo installare una libreria creata da Sparkfun. Per installare questa libreria vai a Schizzo-> Includi libreria- > Gestisci librerie.
Ora nella barra di ricerca digita "Sparkfun APDS9960" e fai clic sul pulsante di installazione quando vedi la libreria.
E siamo pronti per partire. Iniziamo.
Quindi in primo luogo dobbiamo includere tutti i file di intestazione richiesti. Il primo file di intestazione LiquidCrystal.h viene utilizzato per le funzioni LCD. Il secondo file di intestazione Wire.h viene utilizzato per la comunicazione I 2 C e l'ultimo SparkFun_APDS996.h viene utilizzato per il sensore APDS9960.
#includere
Ora nelle righe successive abbiamo definito i pin per pulsante e 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);
Nella parte successiva, abbiamo definito una macro per il pin di interrupt che è collegato al pin digitale 2 e una variabile buttonState per lo stato corrente del pulsante e isr_flag per la routine del servizio di interrupt.
#define APDS9960_INT 2 int buttonState; int isr_flag = 0;
Successivamente viene creato un oggetto per SparkFun_APDS9960, in modo che possiamo accedere ai movimenti dei gesti e recuperare i valori 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;
Nella funzione di configurazione , la prima riga serve per recuperare il valore dal pulsante (basso / alto) e la seconda e terza riga definisce l'interrupt e il pin del pulsante come input. apds.init () inizializza il sensore APDS9960 e lcd.begin (16,2) inizializza l'LCD.
void setup () { buttonState = digitalRead (buttonPin); pinMode (APDS9960_INT, INPUT); pinMode (buttonPin, INPUT); apds.init (); lcd.begin (16, 2); }
Nella funzione loop la prima riga ottiene i valori da button e li memorizza nella variabile buttonState definita in precedenza. Ora nelle righe successive stiamo controllando i valori dal pulsante, se è alto abilitiamo il sensore di luce e se è basso inizializziamo il sensore di gesti.
L'attachInterrupt () è una funzione utilizzata per l'allarme esterno che in questo caso è interrupt del sensore. Il primo argomento in questa funzione è il numero di interrupt. In Arduino UNO, ci sono due pin digitali di interrupt pin - 2 e 3 indicati da INT.0 e INT.1. E l'abbiamo collegato al pin 2, quindi abbiamo scritto 0 lì. Il secondo argomento chiama la funzione interruptRoutine () definita successivamente. L'ultimo argomento è FALLING in modo che attiverà l'interrupt quando il pin passa da alto a basso. Scopri di più sugli interrupt Arduino qui.
void loop () { buttonState = digitalRead (buttonPin); if (buttonState == HIGH) { apds.enableLightSensor (true); }
Nella parte successiva, controlliamo il pin del pulsante. Se è alto, avviare il processo per il sensore RGB. Quindi controlla se il sensore di luce sta leggendo i valori o meno. Se non è in grado di leggere i valori, in tal caso, stampare " Errore durante la lettura dei valori della luce". E se è in grado di leggere i valori, confronta i valori dei tre colori e, a seconda di quale è il più alto, stampa quel colore sul display LCD.
if (buttonState == HIGH) { if (! apds.readAmbientLight (ambient_light) - ! apds.readRedLight (red_light) - ! apds.readGreenLight (green_light) - ! apds.readBlueLight (blue_light)) { lcd.print ("Errore durante la lettura dei valori di luce"); } else { if (red_light> green_light) { if (red_light> blue_light) { lcd.print ("Red"); ritardo (1000); lcd.clear (); } ……. ………..
Nelle righe successive controlla di nuovo il pin del pulsante e, se è basso, il processo il sensore di gesti. Quindi controlla isr_flag e se è 1 viene chiamata una funzione detachInterrupt () . Questa funzione viene utilizzata per disattivare l'interrupt. La riga successiva chiama handleGesture () che è la funzione definita in seguito. Nelle righe successive definisci isr_flag a zero e allega l'interrupt.
else if (buttonState == LOW) { if (isr_flag == 1) { detachInterrupt (0); handleGesture (); isr_flag = 0; attachInterrupt (0, interruptRoutine, FALLING); } }
Il prossimo è la funzione interruptRoutine () . Questa funzione viene utilizzata per attivare la variabile isr_flag 1, in modo che il servizio di interrupt possa essere inizializzato.
void interruptRoutine (). { isr_flag = 1; }
La funzione handleGesture () è definita nella parte successiva. Questa funzione verifica innanzitutto la disponibilità del sensore di gesti. Se è disponibile, legge i valori del gesto e controlla di quale gesto si tratta (SU, GIÙ, DESTRA, SINISTRA, LONTANO, VICINO) e stampa i valori corrispondenti sul display LCD.
void handleGesture () { if (apds.isGestureAvailable ()) { switch (apds.readGesture ()) { case DIR_UP: lcd.print ("UP"); ritardo (1000); lcd.clear (); rompere; case DIR_DOWN: lcd.print ("DOWN"); ritardo (1000); lcd.clear (); rompere; case DIR_LEFT: lcd.print ("LEFT"); ritardo (1000); lcd.clear (); rompere; case DIR_RIGHT: lcd.print ("RIGHT"); ritardo (1000); lcd.clear (); rompere; case DIR_NEAR: lcd.print ("NEAR"); ritardo (1000); lcd.clear (); rompere; caso DIR_FAR: lcd.print ("FAR"); ritardo (1000); lcd.clear (); rompere; predefinito: lcd.print ("NONE"); ritardo (1000); lcd.clear (); } } }
Infine, carica il codice su Arduino e attendi che il sensore si inizializzi. Ora, mentre il pulsante è spento significa che è in modalità gestuale. Quindi prova a muovere le mani nelle direzioni sinistra, destra, su, giù. Per il gesto lontano , tieni la mano a una distanza di 2-4 pollici dal sensore per 2-3 secondi e rimuovila. E per il gesto vicino , tieni la mano lontana dal sensore, quindi avvicinala e rimuovila.
Ora accendi il pulsante per metterlo in modalità di rilevamento del colore e prendi gli oggetti rossi, blu e verdi uno per uno vicino al sensore. Stamperà il colore dell'oggetto.