Sensore di gesti APDS-9960 con Arduino
Il sensore di gesti APDS-9960 permette di rilevare gesti della mano come scorrimenti e la prossimità. In questo tutorial dimostreremo come collegare l'APDS-9960 a un Arduino e programmarlo per riconoscere i gesti. Il risultato sarà una configurazione semplice in grado di rilevare i movimenti e segnalarli tramite il monitor seriale. Questa guida ti aiuterà a comprendere il cablaggio e il codice necessari per iniziare con il sensore di gesti. (nel video a 00:30)

Hardware spiegato
L'APDS-9960 è un sensore versatile che combina il rilevamento del colore RGB, della luce ambientale, della prossimità e il rilevamento dei gesti. Comunica con Arduino tramite I2C, permettendo un'integrazione semplice con un cablaggio minimo. Il sensore funziona solo a 3.3V, quindi è essenziale garantire livelli di tensione adeguati per evitare di danneggiare il dispositivo. In questo progetto useremo Arduino per leggere i dati dei gesti. Il sensore fornisce le informazioni sui gesti tramite interruzioni, il che permette ad Arduino di rispondere prontamente ai movimenti della mano. L'integrazione dell'APDS-9960 con Arduino apre molte possibilità per progetti interattivi, inclusi dispositivi controllati tramite gesti.
Dettagli della scheda tecnica
| Produttore | Broadcom |
|---|---|
| Numero di parte | APDS-9960 |
| Tensione logica/IO | 2,7 - 3,6 V |
| Tensione di alimentazione | 3.3 V |
| Corrente d'uscita (per canale) | 1 mA |
| Corrente di picco (per canale) | 10 mA |
| Linee guida sulla frequenza PWM | 100 Hz |
| Soglie logiche di ingresso | 0.3 x VDD(basso), 0.7 x VDD(alto) |
| Caduta di tensione / RDS(on)/ saturazione | 0.5 V massimo |
| Limiti termici | da -40 a +85 °C |
| Pacchetto | LGA a 6 pin |
| Note / varianti | Supporta la comunicazione I2C |
- Assicurarsi che la tensione di alimentazione non superi 3,6 V per evitare danni.
- Usare resistori di pull-up sulle linee I2C per una comunicazione affidabile.
- Tieni il sensore lontano dalla luce solare diretta per letture accurate.
- Assicurati di inizializzare correttamente il sensore nel codice.
- Controllare i collegamenti del cablaggio per evitare ingressi flottanti.
Istruzioni di cablaggio

Per collegare l'APDS-9960 all'Arduino, inizia collegando l'alimentazione. Usa un filo rosso per collegare il pin VCC dell'APDS-9960 al pin 3.3V dell'Arduino. Poi, collega il pin GND del sensore a un pin di massa dell'Arduino usando un filo nero. Ora, per la comunicazione I2C, collega il pin SDA dell'APDS-9960 al pin A4 dell'Arduino. Allo stesso modo, collega il pin SCL al pin A5 dell'Arduino. Infine, collega il pin INT del sensore al pin 2 dell'Arduino. Questo permetterà all'Arduino di rispondere alle interruzioni generate dal sensore.
Esempi di codice e guida passo-passo
Il codice fornito inizializza il sensore APDS-9960 e configura l'Arduino per leggere i gesti. Ecco un breve estratto della funzione setup:
void setup() {
pinMode(APDS9960_INT, INPUT);
Serial.begin(9600);
attachInterrupt(0, interruptRoutine, FALLING);
if ( apds.init() ) {
Serial.println(F("APDS-9960 initialization complete"));
}
}In questo frammento, inizializziamo il monitor seriale e impostiamo il pin di interrupt. Il sensore viene inizializzato e un messaggio di conferma viene stampato sulla console. Successivamente, controlliamo i gesti nella funzione loop:
void loop() {
if( isr_flag == 1 ) {
detachInterrupt(0);
handleGesture();
isr_flag = 0;
attachInterrupt(0, interruptRoutine, FALLING);
}
}Qui, il ciclo controlla continuamente la presenza di gesti. Quando viene rilevato un gesto, l'interrupt viene disabilitato e la funzione `handleGesture` viene chiamata per elaborare il gesto. Infine, la funzione `handleGesture` elabora i gesti rilevati:
void handleGesture() {
if ( apds.isGestureAvailable() ) {
switch ( apds.readGesture() ) {
case DIR_UP:
Serial.println("UP");
break;
case DIR_DOWN:
Serial.println("DOWN");
break;
// Additional cases...
}
}
}In questa funzione il gesto viene letto e l'azione corrispondente viene eseguita in base alla direzione rilevata. Ciò consente il controllo interattivo basato sui movimenti della mano. Per una comprensione completa del codice, consultare il programma completo caricato sotto l'articolo.

Dimostrazione / Cosa aspettarsi
Quando la configurazione è completa, puoi aspettarti che l'Arduino rilevi i gesti e mostri la direzione rilevata sul monitor seriale. Test semplici includono muovere la mano verso l'alto, verso il basso, a sinistra o a destra davanti al sensore. Se tutto è collegato correttamente, dovresti vedere l'output corrispondente sul monitor seriale, confermando il riconoscimento del gesto. Fai attenzione agli ingressi flottanti, poiché possono causare letture incoerenti (nel video a 05:20).
Marcatori temporali del video
- 00:00- Introduzione
- 01:15- Panoramica dell'hardware
- 03:00- Istruzioni di cablaggio
- 04:30- Analisi guidata del codice
- 06:15- Dimostrazione
/*
* Codice per il sensore di gesti APDS-9960 per Arduino
* Questo codice serve per rilevare i gesti della tua mano, sia muovendola su, giù, a sinistra o a destra; altri gesti possono essere rilevati e utilizzati per controllare qualcos'altro.
*
* Guarda il video del sensore di gesti APDS-9960 https://youtu.be/qzSgZV_fbxI
* Ottieni questo codice da https://robojax.com
*
* Codice usato nel video da Ahmad Shamshiri per Robojax.com
* il 31 dicembre 2016, alle 6:53 AM ad Ajax, Ontario, Canada
* Autorizzazione concessa per condividere questo codice, a condizione che questa
* nota venga mantenuta con il codice.
* Disclamer: questo codice è "COSÌ COM'È" e solo a scopo educativo.
*
* GestureTest.ino
* Sensore RGB e di Gestione APDS-9960
* Shawn Hymel @ SparkFun Electronics
* 30 maggio 2014
* https://github.com/sparkfun/APDS-9960_RGB_and_Gesture_Sensor
*
* Testa le capacità di rilevamento dei gesti dell'APDS-9960. Configura
* l'APDS-9960 tramite I2C e attende eventi di gesto. Calcola la
* direzione dello swipe (su, giù, sinistra, destra) e la visualizza
* su un console seriale.
*
* Per eseguire un gesto VICINO, tieni la mano
* lontana dal sensore e poi avvicinala al sensore (entro 2
* pollici). Tieni la mano lì per almeno 1 secondo e poi allontanala.
*
* Per eseguire un gesto LONTANO, tieni la mano entro 2 pollici dal
* sensore per almeno 1 secondo e poi allontanala (fuori
* portata) dal sensore.
*
* Collegamenti hardware:
*
* IMPORTANTE: L'APDS-9960 può accettare solo 3.3V!
*
* Pina Arduino Funzione scheda APDS-9960
*
* 3.3V VCC Alimentazione
* GND GND Terra
* A4 SDA Dati I2C
* A5 SCL Orologio I2C
* 2 INT Interruzione
*
* Risorse:
* Includi Wire.h e SparkFun_APDS-9960.h
*
* Specifiche dell'ambiente di sviluppo:
* Scritto in Arduino 1.0.5
* Testato con SparkFun Arduino Pro Mini 3.3V
*
* Questo codice è beerware; se mi vedi (o qualsiasi altro
* dipendente di SparkFun) al locale, e hai trovato utile il nostro
* codice, per favore compraci un giro!
*
* Distribuito così com'è; non viene fornita alcuna garanzia.
*/
#include <Wire.h>
#include <SparkFun_APDS9960.h>
Servo myservo; // crea un oggetto servo per controllare un servo
// Spilli
#define APDS9960_INT 2 // Deve essere un pin di interruzione.
// Costanti
// Variabili Globali
SparkFun_APDS9960 apds = SparkFun_APDS9960();
int isr_flag = 0;
void setup() {
// Imposta il pin di interruzione come ingresso
pinMode(APDS9960_INT, INPUT);
// Inizializza la porta seriale
Serial.begin(9600);
Serial.println();
Serial.println(F("--------------------------------"));
Serial.println(F("SparkFun APDS-9960 - GestureTest"));
Serial.println(F("--------------------------------"));
// Inizializza la routine di servizio di interruzione
attachInterrupt(0, interruptRoutine, FALLING);
// Inizializza APDS-9960 (configura I2C e valori iniziali)
if ( apds.init() ) {
Serial.println(F("APDS-9960 initialization complete"));
} else {
Serial.println(F("Something went wrong during APDS-9960 init!"));
}
// Inizia a far funzionare il motore del sensore di gesture APDS-9960.
if ( apds.enableGestureSensor(true) ) {
Serial.println(F("Gesture sensor is now running"));
} else {
Serial.println(F("Something went wrong during gesture sensor init!"));
}
}
void loop() {
if( isr_flag == 1 ) {
detachInterrupt(0);
handleGesture();
isr_flag = 0;
attachInterrupt(0, interruptRoutine, FALLING);
}
}
void interruptRoutine() {
isr_flag = 1;
}
void handleGesture() {
if ( apds.isGestureAvailable() ) {
switch ( apds.readGesture() ) {
case DIR_UP:
Serial.println("UP");
break;
case DIR_DOWN:
Serial.println("DOWN");
break;
case DIR_LEFT:
Serial.println("LEFT");
break;
case DIR_RIGHT:
Serial.println("RIGHT");
break;
case DIR_NEAR:
Serial.println("NEAR");
break;
case DIR_FAR:
Serial.println("FAR");
break;
default:
Serial.println("NONE");
}
}
}
/*
* Modificato per RoboJax da A.B.S. il 9 maggio 2017 a Ajax, Ontario, Canada. www.RoboJax.com
*
* Fonte originale:
* Sensore RGB e di gesto APDS-9960
* Shawn Hymel @ SparkFun Electronics
* 30 maggio 2014
* https://github.com/sparkfun/APDS-9960_RGB_and_Gesture_Sensor
*
* Distribuito così com'è; non viene fornita alcuna garanzia.
*/
#include <Wire.h>
// aggiunto da RoboJax
#include <Servo.h>
#include <SparkFun_APDS9960.h>
Servo myservo; // crea un oggetto servo per controllare un servo // aggiunto da RoboJax
// Spiagge
#define APDS9960_INT 2 // Deve essere un pin di interruzione
// Costanti
// Variabili Globali
SparkFun_APDS9960 apds = SparkFun_APDS9960();
int isr_flag = 0;
void setup() {
myservo.attach(9); // collega il servo al pin 9 all'oggetto servo
// Imposta il pin di interrupt come ingresso
pinMode(APDS9960_INT, INPUT);
// Inizializza la porta seriale
Serial.begin(9600);
Serial.println();
Serial.println(F("--------------------------------"));
Serial.println(F("SparkFun APDS-9960 - GestureTest"));
Serial.println(F("--------------------------------"));
// Inizializzare la routine di servizio di interruzione
attachInterrupt(0, interruptRoutine, FALLING);
// Inizializza APDS-9960 (configura I2C e valori iniziali)
if ( apds.init() ) {
Serial.println(F("APDS-9960 initialization complete"));
} else {
Serial.println(F("Something went wrong during APDS-9960 init!"));
}
// Inizia a eseguire il motore del sensore di gesti APDS-9960
if ( apds.enableGestureSensor(true) ) {
Serial.println(F("Gesture sensor is now running"));
} else {
Serial.println(F("Something went wrong during gesture sensor init!"));
}
}
void loop() {
if( isr_flag == 1 ) {
detachInterrupt(0);
handleGesture();
isr_flag = 0;
attachInterrupt(0, interruptRoutine, FALLING);
}
}
void interruptRoutine() {
isr_flag = 1;
}
void handleGesture() {
if ( apds.isGestureAvailable() ) {
switch ( apds.readGesture() ) {
case DIR_UP:
Serial.println("UP");
break;
case DIR_DOWN:
Serial.println("DOWN");
break;
case DIR_LEFT:
Serial.println("LEFT");
myservo.write(180); // aggiunto da RoboJax
break;
case DIR_RIGHT:
Serial.println("RIGHT");
myservo.write(0); // aggiunto da RoboJax
break;
case DIR_NEAR:
Serial.println("NEAR");
break;
case DIR_FAR:
Serial.println("FAR");
break;
default:
Serial.println("NONE");
}
}
}
Risorse e riferimenti
Nessuna risorsa ancora.