Senzor gestov, RGB a proximity APDS9960 pre Arduino
V tomto návode si ukážeme, ako používať modul snímača APDS9960, ktorý kombinuje detekciu gest, snímanie farieb RGB a snímanie blízkosti. Tento všestranný snímač dokáže detekovať pohyby v rôznych smeroch a možno ho integrovať do projektov na ovládanie motorov, svetiel alebo iných zariadení na základe gest rúk. Na konci tohto návodu budete rozumieť, ako zapojiť snímač a implementovať základnú detekciu gest vo vašich projektoch Arduino.

Modul APDS9960 je kompaktný a vyžaduje minimálne zapojenie, čo z neho robí vynikajúcu voľbu pre interaktívne projekty. Na programovanie snímača budeme používať Arduino IDE a zobrazenie detekovaných gest na sériovom monitore. Pre vizuálny návod si pozrite video (vo videu o 00:00).
Vysvetlenie hardvéru
Kľúčovým komponentom tohto projektu je modul snímača APDS9960. Tento modul dokáže detekovať gestá, ako je potiahnutie doľava, doprava, nahor a nadol. Taktiež meria hodnoty farieb RGB a blízkosť k blízkym objektom. Snímač komunikuje s Arduinom pomocou I2C, čo zjednodušuje proces zapojenia a kódovania.
APDS9960 obsahuje viacero vnútorných snímačov: snímač gest, snímač farieb RGB a snímač okolitého svetla. Snímač gest používa infračervenú LED a fotodetektor na detekciu pohybov rúk, zatiaľ čo RGB snímač meria intenzity červeného, zeleného a modrého svetla na identifikáciu farieb. Snímač blízkosti určuje, ako blízko je objekt k snímaču, čo môže byť užitočné v rôznych aplikáciách.
Podrobnosti z datasheetu
| Výrobca | Avago Technologies |
|---|---|
| Označenie dielu | APDS-9960 |
| Logické/IO napätie | 1,8 V až 3,6 V |
| Napájacie napätie | 3,3 V |
| Výstupný prúd (na kanál) | max. 20 mA |
| Špičkový prúd (na kanál) | 100 mA |
| Odporúčanie pre PWM frekvenciu | Neuplatňuje sa |
| Vstupné logické prahy | 0,3 V (nízka), 0,7 V (vysoká) |
| Pokles napätia / RDS(on) / saturácia | max. 0,5 V |
| Tepelné limity | -40 až 85 °C |
| Puzdro | 6-pinové LGA |
| Poznámky / varianty | Žiadne |
- APDS9960 vždy napájajte napätím 3,3 V; vyššie napätia môžu snímač poškodiť.
- Pri pripájaní viacerých zariadení zabezpečte správne pull-up rezistory na linkách I2C.
- Udržujte snímač mimo priameho slnečného svetla, aby ste predišli rušeniu.
- Pre stabilitu použite blokovací kondenzátor blízko napájacích pinov.
- Uvedomte si rozsah snímania pre detekciu blízkosti (zvyčajne okolo 20 cm).
Pokyny na zapojenie

Na zapojenie modulu snímača APDS9960 k Arduinu postupujte podľa týchto krokov:
- Pripojte pin
VCCmodulu APDS9960 na pin 3,3 V na Arduine. - Pripojte pin
GNDna jeden z pinov GND na Arduine. - Pripojte pin
SDAna pinA4Arduina (linka dát I2C). - Pripojte pin
SCLna pinA5Arduina (linka hodín I2C). - Pripojte pin
INTna digitálny pin2na Arduine na spracovanie prerušení.
Upozorňujeme, že ak používate iný model Arduina, piny SDA a SCL sa môžu líšiť (napr. na Arduino Mega použite SDA na pine 20 a SCL na pine 21). Skontrolujte konkrétne mapovanie pinov pre vašu dosku. Pre rôzne konfigurácie si pozrite video (vo videu o 02:30).
Príklady kódu a vysvetlenie
Vo funkcii setup inicializujeme sériovú komunikáciu a snímač APDS9960. Pin prerušenia je nastavený na počúvanie udalostí gest. Tu je ukážka kódu setup:
void setup() {
pinMode(APDS9960_INT, INPUT);
Serial.begin(9600);
Serial.println(F("APDS-9960 inicializácia..."));
if (apds.init()) {
Serial.println(F("Inicializácia dokončená"));
} else {
Serial.println(F("Inicializácia zlyhala"));
}
}
Tento kód nastaví potrebné konfigurácie, aby sa zabezpečilo, že snímač je pripravený na použitie, a poskytuje spätnú väzbu v sériovom monitore.
Ďalej definujeme, ako spracovať gestá detekované snímačom. Funkcia handleGesture používa príkaz switch na určenie smeru gesta. Tu je zameraný výňatok:
void handleGesture() {
if (apds.isGestureAvailable()) {
switch (apds.readGesture()) {
case DIR_UP:
Serial.println("HORE");
break;
case DIR_DOWN:
Serial.println("DOLU");
break;
// Ďalšie prípady pre doľava, doprava, blízko a ďaleko
}
}
}
Táto funkcia skontroluje, či je gesto dostupné, a prečíta jeho smer, pričom výsledok vytlačí do sériového monitora na spätnú väzbu. Pre úplnú implementáciu si pozrite celý kód načítaný nižšie pod článkom.
Demonštrácia / Čo očakávať
Keď spustíte program, mali by ste vidieť detekované gestá vytlačené na sériovom monitore, keď pohybujete rukou v rôznych smeroch. Napríklad potiahnutie nahor by malo zobraziť "HORE", zatiaľ čo potiahnutie nadol zobrazí "DOLU". Pri vykonávaní gest blízko a ďaleko držte ruku na sekundu stabilne (vo videu o 10:00).
Buďte opatrní s detekciou blízkosti snímača; ak pohybujete rukou príliš rýchlo alebo príliš ďaleko od snímača, nemusí gesto presne zaregistrovať. Toto je bežný problém, ktorý môže ovplyvniť výkon.
Časové značky videa
- 00:00 - Úvod do senzora APDS9960
- 02:30 - Pokyny na zapojenie
- 05:15 - Vysvetlenie kódu
- 10:00 - Ukážka rozpoznávania gest
++
/*
This is code for an APDS9960 Gesture, RGB, Proximity sensor module (6 pin).
* Watch the video on how to use APDS9960: https://youtu.be/jjXx0V13rNs
*/
/*
* This code has been modified from the Arduino library.
* Explained by Ahmad S. on March 25, 2018 at 21:19
* in Ajax, Ontario, Canada
* for Robojax.com
*
*/
/****************************************************************
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 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 above (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>
// 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
// Robojax Video Tutorial
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!"));
}
// Robojax Video Tutorial
// 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);
// Robojax Video Tutorial
}
}
void interruptRoutine() {
isr_flag = 1;
}
void handleGesture() {
if ( apds.isGestureAvailable() ) {
// Robojax Video Tutorial
switch ( apds.readGesture() ) {
case DIR_UP:
Serial.println("UP");
break;
case DIR_DOWN:
Serial.println("DOWN");
break;
case DIR_LEFT:
Serial.println("LEFT");
// Robojax Video Tutorial
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");
// Robojax Video Tutorial
}
}
}
Things you might need
-
Amazon
-
AliExpressPurchase AM2302 or DHT11 or DHT22 sensor from AliExpresss.click.aliexpress.com
Resources & references
-
ExternalAdafruit APDS9960 library (from GitHub)github.com
Files📁
Fritzing File
-
APDS 9960 rgb and gesture sensor
apds_9960_rgb_and_gesture_sensor.fzpz0.01 MB
Other files
-
APDS9960 Gesture Library from RobojaxThis library used for Gesture Sensor APDS9960 to detect movement of your hand and detect present color.
robojax-gesture-APDS9960-Library.zip0.30 MB -
APDS9960 Datasheetthis is the datasheet for APDS9960 chip. have a look at this file to learn more about it.
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