Czujnik gestów, RGB i zbliżeniowy APDS9960 dla Arduino
W tym samouczku dowiemy się, jak używać modułu czujnika APDS9960, który łączy w sobie wykrywanie gestów, pomiar kolorów RGB oraz wykrywanie odległości. Ten wszechstronny czujnik może wykrywać ruchy w różnych kierunkach i może być zintegrowany z projektami do sterowania silnikami, światłami lub innymi urządzeniami na podstawie gestów dłoni. Po ukończeniu tego samouczka zrozumiesz, jak podłączyć czujnik i zaimplementować podstawowe wykrywanie gestów w swoich projektach Arduino.

Moduł APDS9960 jest kompaktowy i wymaga minimalnego okablowania, co czyni go doskonałym wyborem do projektów interaktywnych. Do programowania czujnika użyjemy Arduino IDE, a wykryte gesty będą wyświetlane na monitorze szeregowym. Aby uzyskać wizualny przewodnik, zapoznaj się z filmem (na filmie w czasie 00:00).
Objaśnienie sprzętu
Kluczowym elementem tego projektu jest moduł czujnika APDS9960. Moduł ten jest w stanie wykrywać gesty, takie jak przesunięcie w lewo, w prawo, w górę i w dół. Mierzy również wartości kolorów RGB oraz odległość do pobliskich obiektów. Czujnik komunikuje się z Arduino za pomocą I2C, co upraszcza proces okablowania i kodowania.
APDS9960 zawiera wiele wewnętrznych czujników: czujnik gestów, czujnik kolorów RGB oraz czujnik światła otoczenia. Czujnik gestów wykorzystuje diodę podczerwieni i fotodetektor do wykrywania ruchów dłoni, podczas gdy czujnik RGB mierzy natężenie światła czerwonego, zielonego i niebieskiego w celu identyfikacji kolorów. Czujnik odległości określa, jak blisko obiektu znajduje się czujnik, co może być przydatne w różnych zastosowaniach.
Szczegóły z karty katalogowej
| Producent | Avago Technologies |
|---|---|
| Numer części | APDS-9960 |
| Napięcie logiczne/IO | 1,8 V do 3,6 V |
| Napięcie zasilania | 3,3 V |
| Prąd wyjściowy (na kanał) | 20 mA maks. |
| Prąd szczytowy (na kanał) | 100 mA |
| Zalecenia dotyczące częstotliwości PWM | Nie dotyczy |
| Progi logiczne wejściowe | 0,3 V (niski), 0,7 V (wysoki) |
| Spadek napięcia / RDS(on) / nasycenie | 0,5 V maks. |
| Limity termiczne | -40 do 85 °C |
| Obudowa | 6-pinowa LGA |
| Uwagi / warianty | Brak |
- Zawsze zasilaj APDS9960 napięciem 3,3 V; wyższe napięcia mogą uszkodzić czujnik.
- Zapewnij odpowiednie rezystory podciągające na liniach I2C, jeśli podłączasz wiele urządzeń.
- Trzymaj czujnik z dala od bezpośredniego światła słonecznego, aby uniknąć zakłóceń.
- Użyj kondensatora odsprzęgającego blisko pinów zasilania dla stabilności.
- Zwracaj uwagę na zakres wykrywania dla detekcji odległości (zazwyczaj około 20 cm).
Instrukcje okablowania

Aby podłączyć moduł czujnika APDS9960 do Arduino, wykonaj następujące kroki:
- Podłącz pin
VCCmodułu APDS9960 do pinu 3,3 V na Arduino. - Podłącz pin
GNDdo jednego z pinów GND na Arduino. - Podłącz pin
SDAdo pinuA4na Arduino (linia danych I2C). - Podłącz pin
SCLdo pinuA5na Arduino (linia zegara I2C). - Podłącz pin
INTdo pinu cyfrowego2na Arduino do obsługi przerwań.
Należy pamiętać, że jeśli używasz innego modelu Arduino, piny SDA i SCL mogą się różnić (np. w Arduino Mega użyj SDA na pinie 20 i SCL na pinie 21). Upewnij się, że sprawdziłeś konkretne przypisania pinów dla swojej płytki. W przypadku różnych konfiguracji zapoznaj się z filmem (na filmie w czasie 02:30).
Przykłady kodu i omówienie
W funkcji setup inicjalizujemy komunikację szeregową oraz czujnik APDS9960. Pin przerwania jest skonfigurowany do nasłuchiwania zdarzeń gestów. Oto fragment kodu setup:
void setup() {
pinMode(APDS9960_INT, INPUT);
Serial.begin(9600);
Serial.println(F("Inicjalizacja APDS-9960..."));
if (apds.init()) {
Serial.println(F("Inicjalizacja zakończona"));
} else {
Serial.println(F("Inicjalizacja nie powiodła się"));
}
}
Ten kod konfiguruje niezbędne ustawienia, aby zapewnić gotowość czujnika do użycia i zapewnia informacje zwrotne na monitorze szeregowym.
Następnie definiujemy, jak obsługiwać gesty wykryte przez czujnik. Funkcja handleGesture używa instrukcji switch do określenia kierunku gestu. Oto odpowiedni fragment:
void handleGesture() {
if (apds.isGestureAvailable()) {
switch (apds.readGesture()) {
case DIR_UP:
Serial.println("GÓRA");
break;
case DIR_DOWN:
Serial.println("DÓŁ");
break;
// Dodatkowe przypadki dla lewo, prawo, blisko i daleko
}
}
}
Ta funkcja sprawdza, czy gest jest dostępny, i odczytuje jego kierunek, wyświetlając wynik na monitorze szeregowym w celu uzyskania informacji zwrotnej. Pełny kod znajduje się poniżej artykułu i zawiera szczegóły implementacji.
Demonstracja / Czego się spodziewać
Po uruchomieniu programu powinieneś zobaczyć wykryte gesty wyświetlane na monitorze szeregowym podczas poruszania dłonią w różnych kierunkach. Na przykład przesunięcie w górę powinno wyświetlić "GÓRA", a przesunięcie w dół "DÓŁ". Podczas wykonywania gestów blisko i daleko przytrzymaj dłoń nieruchomo przez sekundę (na filmie w czasie 10:00).
Zachowaj ostrożność w przypadku detekcji odległości czujnika; jeśli poruszysz dłonią zbyt szybko lub zbyt daleko od czujnika, gest może nie zostać zarejestrowany dokładnie. To częsty problem, który może wpływać na wydajność.
Znaczniki czasu w filmie
- 00:00 - Wprowadzenie do czujnika APDS9960
- 02:30 - Instrukcje podłączenia
- 05:15 - Wyjaśnienia dotyczące kodu
- 10:00 - Demonstracja rozpoznawania gestów
++
/*
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
}
}
}
Rzeczy, których możesz potrzebować
-
Amazon
-
AliExpressPurchase AM2302, DHT11, or DHT22 sensor from AliExpresss.click.aliexpress.com
Zasoby i odniesienia
-
ZewnętrznyAdafruit APDS9960 library (from GitHub)github.com
Pliki📁
Plik Fritzing
-
APDS 9960 rgb and gesture sensor
apds_9960_rgb_and_gesture_sensor.fzpz0.01 MB
Inne pliki
-
Biblioteka gestów APDS9960 od RobojaxTa biblioteka jest używana do czujnika gestów APDS9960, aby wykrywać ruch twojej ręki i rozpoznawać obecny kolor.
robojax-gesture-APDS9960-Library.zip0.30 MB -
APDS9960 Karta katalogowato jest karta katalogowa układu APDS9960. zapoznaj się z tym plikiem, aby dowiedzieć się więcej na jego temat.
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