Senzor de gesturi APDS-9960 cu Arduino
Senzorul de gesturi APDS-9960 permite detectarea gesturilor mâinii, cum ar fi mișcările de glisare și proximitatea. În acest tutorial, vom demonstra cum să conectăm APDS-9960 la un Arduino și să-l programăm pentru a recunoaște gesturile. Rezultatul va fi o configurație simplă care poate detecta mișcări și le poate raporta prin monitorul serial. Acest ghid vă va ajuta să înțelegeți cablarea și codul necesare pentru a începe cu senzorul de gesturi. (în video la 00:30)
Hardware Explicat
APDS-9960 este un senzor versatil care combină detectarea culorilor RGB, detectarea luminii ambientale, detectarea proximității și capacități de detectare a gesturilor. Acesta comunică cu Arduino prin I2C, ceea ce permite integrarea ușoară cu un minim de cabluri. Senzorul funcționează doar la 3.3V, fiind esențial să asigurați niveluri de tensiune corecte pentru a evita deteriorarea dispozitivului. În această construcție, vom folosi Arduino pentru a citi datele de gest. Senzorul emite informații despre gesturi prin întreruperi, ceea ce permite Arduino să răspundă prompt la mișcările mâinii. Integrarea APDS-9960 cu Arduino deschide multe posibilități pentru proiecte interactive, inclusiv dispozitive controlate prin gesturi.Detalii din Fișa Tehnică
| Producător | Broadcom |
|---|---|
| Număr de piesă | APDS-9960 |
| Tensiune logică/IO | 2.7 - 3.6 V |
| Tensiune de alimentare | 3.3 V |
| Curent de ieșire (pe canal) | 1 mA |
| Curent de vârf (pe canal) | 10 mA |
| Ghid frecvență PWM | 100 Hz |
| Praguri logice de intrare | 0.3 x VDD (jos), 0.7 x VDD (sus) |
| Cădere de tensiune / RDS(on) / saturație | 0.5 V max |
| Limite termice | -40 până la +85 °C |
| Pachet | LGA cu 6 pini |
| Note / variante | Suportă comunicare I2C |
- Asigurați-vă că tensiunea de alimentare nu depășește 3.6 V pentru a preveni deteriorarea.
- Folosiți rezistențe de pull-up pe liniile I2C pentru o comunicare fiabilă.
- Păstrați senzorul departe de lumina directă a soarelui pentru citiri precise.
- Asigurați-vă că inițializați corect senzorul în cod.
- Verificați conexiunile de cablare pentru a evita intrările flotante.
Instrucțiuni de Cablare

Exemple de Cod și Explicații
Codul furnizat inițializează senzorul APDS-9960 și configurează Arduino pentru a citi gesturile. Iată un scurt extras din funcția de configurare:void setup() {
pinMode(APDS9960_INT, INPUT);
Serial.begin(9600);
attachInterrupt(0, interruptRoutine, FALLING);
if ( apds.init() ) {
Serial.println(F("Inițializare APDS-9960 completă"));
}
}
În acest fragment, inițializăm monitorul serial și setăm pinul de întrerupere. Senzorul este inițializat, iar un mesaj de confirmare este afișat în consolă.
Apoi, verificăm gesturile în funcția loop:
void loop() {
if( isr_flag == 1 ) {
detachInterrupt(0);
handleGesture();
isr_flag = 0;
attachInterrupt(0, interruptRoutine, FALLING);
}
}
Aici, bucla verifică continuu gesturile. Când este detectat un gest, întreruperea este dezactivată, iar funcția `handleGesture` este apelată pentru a procesa gestul.
În cele din urmă, funcția `handleGesture` procesează gesturile detectate:
void handleGesture() {
if ( apds.isGestureAvailable() ) {
switch ( apds.readGesture() ) {
case DIR_UP:
Serial.println("SUS");
break;
case DIR_DOWN:
Serial.println("JOS");
break;
// Cazuri suplimentare...
}
}
}
În această funcție, gestul este citit, iar acțiunea corespunzătoare este luată pe baza direcției detectate. Acest lucru permite controlul interactiv bazat pe mișcările mâinii.
Pentru o înțelegere completă a codului, vă rugăm să consultați programul complet încărcat mai jos în articol.
Demonstrație / Ce să Vă Așteptați
Când configurația este completă, vă puteți aștepta ca Arduino să citească gesturile și să afișeze direcția detectată pe monitorul serial. Testele simple includ mișcarea mâinii în sus, jos, stânga sau dreapta în fața senzorului. Dacă totul este cablat corect, ar trebui să vedeți ieșirea corespunzătoare pe monitorul serial, confirmând recunoașterea gesturilor. Fiți atenți la intrările flotante, deoarece acestea pot duce la citiri inconsistente (în video la 05:20).Marcaje Video
- 00:00 - Introducere
- 01:15 - Prezentare Hardware
- 03:00 - Instrucțiuni de Cablare
- 04:30 - Explicația Codului
- 06:15 - Demonstrație

1-Code for an APDS-9960 gesture sensor for Arduino
Limba: C++
/*
* Code for APDS-9960 Gesture sensor for Arduino
* This code is to detect gestures of your hand, either moving it up, down, left, or right; other gestures.
* can be detected and used to control something else.
* Watch the APDS-9960 Gesture sensor video https://youtu.be/qzSgZV_fbxI
* Get this code from https://robojax.com
* Code used in video by Ahmad Shamshiri for Robojax.com
* on December 31, 2016, at 6:53 AM in Ajax, Ontario, Canada
* Permission granted to share this code, given that this
* note is kept with the code.
* Disclaimer: this code is "AS IS" and for educational purposes only.
GestureTest.ino
APDS-9960 RGB and Gesture Sensor
Shawn Hymel @ SparkFun Electronics
May 30, 2014
https://github.com/sparkfun/APDS-9960_RGB_and_Gesture_Sensor
Tests the gesture sensing abilities of the APDS-9960. Configures
APDS-9960 over I2C and waits for gesture events. Calculates the
direction of the swipe (up, down, left, right) and displays it
on a serial console.
To perform a NEAR gesture, hold your hand
far above the sensor and move it close to the sensor (within 2
inches). Hold your hand there for at least 1 second and then move it
away.
To perform a FAR gesture, hold your hand within 2 inches of the
sensor for at least 1 second and then move it away (out of
range) of the sensor.
Hardware Connections:
IMPORTANT: The APDS-9960 can only accept 3.3V!
Arduino Pin APDS-9960 Board Function
3.3V VCC Power
GND GND Ground
A4 SDA I2C Data
A5 SCL I2C Clock
2 INT Interrupt
Resources:
Include Wire.h and SparkFun_APDS-9960.h
Development environment specifics:
Written in Arduino 1.0.5
Tested with SparkFun Arduino Pro Mini 3.3V
This code is beerware; if you see me (or any other SparkFun
employee) at the local, and you've found our code helpful, please
buy us a round!
Distributed as-is; no warranty is given.
***************************************************************
*/
#include <Wire.h>
#include <SparkFun_APDS9960.h>
Servo myservo; // create servo object to control a servo
// Pins
#define APDS9960_INT 2 // Needs to be an interrupt pin
// Constants
// Global Variables
SparkFun_APDS9960 apds = SparkFun_APDS9960();
int isr_flag = 0;
void setup() {
// Set interrupt pin as input
pinMode(APDS9960_INT, INPUT);
// Initialize Serial port
Serial.begin(9600);
Serial.println();
Serial.println(F("--------------------------------"));
Serial.println(F("SparkFun APDS-9960 - GestureTest"));
Serial.println(F("--------------------------------"));
// Initialize interrupt service routine
attachInterrupt(0, interruptRoutine, FALLING);
// Initialize APDS-9960 (configure I2C and initial values)
if ( apds.init() ) {
Serial.println(F("APDS-9960 initialization complete"));
} else {
Serial.println(F("Something went wrong during APDS-9960 init!"));
}
// Start running the APDS-9960 gesture sensor engine
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");
}
}
}
2-Source code for controlling a servo with your hand
Limba: C++
/****************************************************************
Modified for RoboJax by A.B.S. on May 09, 2017
in Ajax, Ontario, Canada. www.RoboJax.com
Original Source:
APDS-9960 RGB and Gesture Sensor
Shawn Hymel @ SparkFun Electronics
May 30, 2014
https://github.com/sparkfun/APDS-9960_RGB_and_Gesture_Sensor
Distributed as-is; no warranty is given.
****************************************************************/
#include <Wire.h>
// added by RoboJax
#include <Servo.h>
#include <SparkFun_APDS9960.h>
Servo myservo; // create servo object to control a servo // added by RoboJax
// Pins
#define APDS9960_INT 2 // Needs to be an interrupt pin
// Constants
// Global Variables
SparkFun_APDS9960 apds = SparkFun_APDS9960();
int isr_flag = 0;
void setup() {
myservo.attach(9); // attaches the servo on pin 9 to the servo object
// Set interrupt pin as input
pinMode(APDS9960_INT, INPUT);
// Initialize Serial port
Serial.begin(9600);
Serial.println();
Serial.println(F("--------------------------------"));
Serial.println(F("SparkFun APDS-9960 - GestureTest"));
Serial.println(F("--------------------------------"));
// Initialize interrupt service routine
attachInterrupt(0, interruptRoutine, FALLING);
// Initialize APDS-9960 (configure I2C and initial values)
if ( apds.init() ) {
Serial.println(F("APDS-9960 initialization complete"));
} else {
Serial.println(F("Something went wrong during APDS-9960 init!"));
}
// Start running the APDS-9960 gesture sensor engine
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); // added by RoboJax
break;
case DIR_RIGHT:
Serial.println("RIGHT");
myservo.write(0); // added by RoboJax
break;
case DIR_NEAR:
Serial.println("NEAR");
break;
case DIR_FAR:
Serial.println("FAR");
break;
default:
Serial.println("NONE");
}
}
}
Lucruri de care ai putea avea nevoie
-
Amazon
-
eBay
-
AliExpressPurchase APDS-9960 gesture sensor from AliExpresss.click.aliexpress.com
Resurse și referințe
Încă nu sunt resurse.
Fișiere📁
Alte fișiere
-
Foaie de date APDS9960acesta este fișa tehnică pentru cipul APDS9960. aruncă o privire asupra acestui fișier pentru a învăța mai multe despre el.
robojax-gesture-APDS9960_datasheet.pdf0.89 MB -
APDS9960 Gesture LibraryArduino library for the APDS9960 gesture, proximity, and color sensor. Provides functions to initialize the sensor, read gesture data, and configure detection thresholds. Supports I2C interface and operates at 3.3V.
robojax-APDS9960-gesture-library.zip0.30 MB -
APDS9960 Gesture DatasheetDatasheet for the APDS9960 digital proximity, ambient light, RGB and gesture sensor. Features I2C interface, gesture detection with directional output, and operates at 2.4-3.6V.
robojax-APDS9960-gesture-datasheet.pdf0.89 MB -