Categories: Arduino

Sensore APDS 9960 con Arduino: Gesture – Colori – Distanza

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.

APDS 9960 con Arduino

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

Tutti i modelli a confronto

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

Alessandro Oppo

Alessandro è un milanese che vorrebbe scappare da Milano, è appassionato di informatica ma vorrebbe vivere senza telefono, è un artigiano eppure vorrebbe robotizzare tutto, impara una cosa e già vorrebbe studiare dell’altro. Autodidatta da sempre, gli piace sbattere la testa finché tutto non funziona come vuole lui, spesso ci riesce anche! Visita il suo blog personale alexoppo.com Il motto che si ripete dentro la testa è: “Se ci sono riusciti gli altri ci posso riuscire anche io”.

Recent Posts

Ponti sospesi: cosa abbiamo sbagliato? cosa si potrebbe fare?

Poco prima di Natale ho avuto la fortuna di poter partecipare a un evento chiamato…

11 mesi ago

Siamo quel che facciamo? – racconto breve

Armando quel giorno era particolarmente stanco. Tutto, per quanto andasse bene, sembrava metterlo sotto pressione.…

1 anno ago

Il limite è sempre la mente – Racconto breve

Armando guardò l’orologio e vide il proprio riflesso sul quadrante bianco. Il riflesso però non…

1 anno ago

L’ultimo giorno del carcere – Racconto breve

I muri sono muri, lo sono sempre, anche quando le porte sono aperte. Era la…

1 anno ago

Riflessioni sul carcere

Pochi di noi riflettono sull’esistenza nella nostra società del carcere. Il carcere è la concretizzazione…

1 anno ago

Come dovremmo dialogare secondo me

Spesso intraprendiamo delle conversazioni e delle chiacchierate piuttosto inconsapevolmente. Voglio dire che non siamo molto…

1 anno ago