Benvenuti su 9minuti.it, oggi vedremo insieme come utilizzare il sensore APDS 9960 con Arduino.
Il sensore APDS 9960 ha diverse funzionalità. Può essere usato con Arduino come sensore per le gesture, come sensore per il riconoscimento dei colori, come sensore di luminosità e come sensore di prossimità.
Fra tutte le funzionalità del sensore APDS 9960 quella sicuramente più interessante è il sensore delle gesture.
Esso dovrebbe permetterci di distinguere se la mano va da destra verso sinistra, da sinistra verso destra, dall’alto verso il basso o viceversa.
Indice
Dove Comprarlo
Vi consiglio di comprare qui i vostri sensori, così da supportare anche il blog.
Amazon (veloce e sicuro) —-> https://amzn.to/2RvPp3C
Aliexpress (lento ma economico) —-> http://s.click.aliexpress.com/e/bWzXf7gU
Bangood (lento ma economico) —-> https://www.banggood.com/custlink/3KGKdrd1FP
Il collegamento
Procediamo con il collegamento del sensore APDS 9960 con Arduino.
Possiamo, in alternativa, utilizzare i pin SDA e SCL che molti arduini hanno sopra al pin 13.
Il codice
Utilizzeremo la libreria di Adafruit per l’ADPS 9960 con Arduino. La potete scaricare direttamente dal gestore delle librerie, in questo articolo spiego come fare.
Esiste anche la libreria della Sparkfun ma ho riscontrato dei problemi con il modulo che ho utilizzato.
Vediamo ora l’esempio incluso nella libreria Adafruit relativo alle gesture.
/*************************************************************************** This is a library for the APDS9960 digital proximity, ambient light, RGB, and gesture sensor This sketch puts the sensor in gesture mode and decodes gestures. To use this, first put your hand close to the sensor to enable gesture mode. Then move your hand about 6" from the sensor in the up -> down, down -> up, left -> right, or right -> left direction. Designed specifically to work with the Adafruit APDS9960 breakout ----> http://www.adafruit.com/products/3595 These sensors use I2C to communicate. The device's I2C address is 0x39 Adafruit invests time and resources providing this open source code, please support Adafruit andopen-source hardware by purchasing products from Adafruit! Written by Dean Miller for Adafruit Industries. BSD license, all text above must be included in any redistribution ***************************************************************************/ #include "Adafruit_APDS9960.h" Adafruit_APDS9960 apds; // the setup function runs once when you press reset or power the board void setup() { Serial.begin(115200); if(!apds.begin()){ Serial.println("failed to initialize device! Please check your wiring."); } else Serial.println("Device initialized!"); //gesture mode will be entered once proximity mode senses something close apds.enableProximity(true); apds.enableGesture(true); } // the loop function runs over and over again forever void loop() { //read a gesture from the device uint8_t gesture = apds.readGesture(); if(gesture == APDS9960_DOWN) Serial.println("v"); if(gesture == APDS9960_UP) Serial.println("^"); if(gesture == APDS9960_LEFT) Serial.println("<"); if(gesture == APDS9960_RIGHT) Serial.println(">"); }
22 – Includiamo la librerie di Adafruit
23 – Creiamo il nostro oggetto apds di tipo Adafruit_APDS9960
27 – La solita chiamata del metodo begin dell’oggetto serial con baud rate di 115200
29, 30, 32 – Controllo che il sensore APDS 9960 sia collegato ad Arduino.
35 – Attivazione del sensore di prossimità (Il sensore delle gesture parte una volta che viene attivato quello di prossimità)
36 – Attivazione delle gesture
42 – Salvataggio della gesture nella variabile gesture
43, 44, 45, 46 – Serie di quattro inline if con conseguente stampa da seriale delle gesture identificate.
Riconoscimento dei colori
Come abbiamo detto funziona anche come riconoscitore dei colori. O meglio dovrebbe, perché anche qui ho ricontrato molta approssimazione.
/*************************************************************************** This is a library for the APDS9960 digital proximity, ambient light, RGB, and gesture sensor This sketch puts the sensor in color mode and reads the RGB and clear values. Designed specifically to work with the Adafruit APDS9960 breakout ----> http://www.adafruit.com/products/3595 These sensors use I2C to communicate. The device's I2C address is 0x39 Adafruit invests time and resources providing this open source code, please support Adafruit andopen-source hardware by purchasing products from Adafruit! Written by Dean Miller for Adafruit Industries. BSD license, all text above must be included in any redistribution ***************************************************************************/ #include "Adafruit_APDS9960.h" Adafruit_APDS9960 apds; void setup() { Serial.begin(115200); if(!apds.begin()){ Serial.println("failed to initialize device! Please check your wiring."); } else Serial.println("Device initialized!"); //enable color sensign mode apds.enableColor(true); } void loop() { //create some variables to store the color data in uint16_t r, g, b, c; //wait for color data to be ready while(!apds.colorDataReady()){ delay(5); } //get the data and print the different channels apds.getColorData(&r, &g, &b, &c); Serial.print("red: "); Serial.print(r); Serial.print(" green: "); Serial.print(g); Serial.print(" blue: "); Serial.print(b); Serial.print(" clear: "); Serial.println(c); Serial.println(); delay(500); }
31 – Attivazione del sensore in modalità colore
32 – Creazione di alcune variabili in cui contenere i valori letti
39 – Ciclo while che fa attendere 5 millisecondi se il sensore non è pronto
44 – Il sensore legge i dati
45 – 56 – Stampa dei valori
Dove Comprarlo
Vi consiglio di comprare qui i vostri sensori, così da supportare anche il blog.
Amazon (veloce e sicuro) —-> https://amzn.to/2RvPp3C
Aliexpress (lento ma economico) —-> http://s.click.aliexpress.com/e/bWzXf7gU
Bangood (lento ma economico) —-> https://www.banggood.com/custlink/3KGKdrd1FP
Sensore di prossimità
Attenzione che per questa modalità è necessario attaccare anche il PIN 3 di Arduino a INT del nostro sensore.
/*************************************************************************** This is a library for the APDS9960 digital proximity, ambient light, RGB, and gesture sensor This sketch puts the sensor in proximity mode and enables the interrupt to fire when proximity goes over a set value Designed specifically to work with the Adafruit APDS9960 breakout ----> http://www.adafruit.com/products/3595 These sensors use I2C to communicate. The device's I2C address is 0x39 Adafruit invests time and resources providing this open source code, please support Adafruit andopen-source hardware by purchasing products from Adafruit! Written by Dean Miller for Adafruit Industries. BSD license, all text above must be included in any redistribution ***************************************************************************/ #include "Adafruit_APDS9960.h" //the pin that the interrupt is attached to #define INT_PIN 3 //create the APDS9960 object Adafruit_APDS9960 apds; void setup() { Serial.begin(115200); pinMode(INT_PIN, INPUT_PULLUP); if(!apds.begin()){ Serial.println("failed to initialize device! Please check your wiring."); } else Serial.println("Device initialized!"); //enable proximity mode apds.enableProximity(true); //set the interrupt threshold to fire when proximity reading goes above 175 apds.setProximityInterruptThreshold(0, 175); //enable the proximity interrupt apds.enableProximityInterrupt(); } void loop() { //print the proximity reading when the interrupt pin goes low if(!digitalRead(INT_PIN)){ Serial.println(apds.readProximity()); //clear the interrupt apds.clearInterrupt(); } }
23 – Definiamo qual è il PIN dell’Arduino collegato all’INT del sensore
30 – Dichiariamo che il nosto pin precedentemente scelto verrà usato in modalità INPUT_PULLUP
38 – Abilitiamo la modalità sensore di prossimità
41, 44 – Questi due comandi non mi sono molto chiari, ho cercato più informazioni sul sito di Adafruit ma non ho trovato nulla. Se qualcuno dovesse scoprirlo gli chiedo gentilmente di segnalarlo.
50 – Se il pin INT è spento
51 – Stampa della distanza
54 – Cancella l’interrupt
Conclusioni
Il sensore ADPS 9960 con Arduino funziona bene ma non benissimo.
Mi riferisco alle gesture che funzionano una volta sì e una volta no e che lo rendono inutilizzabile per un progetto vero e proprio.
É possibile che sia il mio sensore difettoso e ne ho ordinate altre due tipologie che differiscono leggermente nella circuitazione, aggiornerò l’articolo non appena riuscirò a fare delle prove.
Grazie per l’attenzione e al prossimo articolo! Ovviamente in caso di problemi sono pronto ad aiutarvi, lasciatemi un messaggio qui sotto e vi risponderò al più presto.
Grazie,
Alessandro