APDS-9960 Gestensensor mit Arduino
Der Gestensensor APDS-9960 ermöglicht die Erkennung von Handgesten wie Wischbewegungen und die Näherungserkennung. In diesem Tutorial zeigen wir, wie man den APDS-9960 an einen Arduino anschließt und ihn so programmiert, dass er Gesten erkennt. Das Ergebnis ist ein einfaches Setup, das Bewegungen erfassen und diese über den seriellen Monitor melden kann. Diese Anleitung hilft Ihnen, die Verkabelung und den Code zu verstehen, die nötig sind, um mit dem Gestensensor zu beginnen. (im Video bei 00:30)

Hardware erklärt
Der APDS-9960 ist ein vielseitiger Sensor, der RGB-Farberkennung, Umgebungslichtmessung, Näherungserkennung und Gestenerkennung kombiniert. Er kommuniziert mit dem Arduino über I2C, was eine einfache Integration bei minimaler Verkabelung ermöglicht. Der Sensor arbeitet nur mit 3.3V, daher ist es wichtig, die korrekten Spannungspegel sicherzustellen, um eine Beschädigung des Geräts zu vermeiden. In diesem Aufbau verwenden wir den Arduino, um Gestendaten auszulesen. Der Sensor gibt Gesteninformationen über Interrupts aus, wodurch der Arduino schnell auf Handbewegungen reagieren kann. Die Integration des APDS-9960 mit dem Arduino eröffnet viele Möglichkeiten für interaktive Projekte, einschließlich gestensteuerter Geräte.
Details zum Datenblatt
| Hersteller | Broadcom |
|---|---|
| Teilenummer | APDS-9960 |
| Logik-/I/O-Spannung | 2.7 - 3.6 V |
| Versorgungsspannung | 3.3 V |
| Ausgangsstrom (pro Kanal) | 1 mA |
| Spitzenstrom (pro Kanal) | 10 mA |
| Empfehlungen zur PWM-Frequenz | 100 Hz |
| Schwellenwerte der Eingangslogik | 0.3 x VDD(niedrig), 0.7 x VDD(hoch) |
| Spannungsabfall / RDS(on)/ Sättigung | 0.5 V max |
| Thermische Grenzwerte | -40 bis +85 °C |
| Paket | 6-poliges LGA |
| Notizen / Varianten | Unterstützt I2C-Kommunikation |
- Stellen Sie sicher, dass die Versorgungsspannung 3.6 V nicht überschreitet, um Schäden zu vermeiden.
- Verwenden Sie Pull-up-Widerstände an den I2C-Leitungen für eine zuverlässige Kommunikation.
- Halten Sie den Sensor von direktem Sonnenlicht fern, um genaue Messwerte zu erhalten.
- Stellen Sie sicher, dass der Sensor im Code korrekt initialisiert wird.
- Überprüfen Sie die Kabelverbindungen, um schwebende Eingänge zu vermeiden.
Verdrahtungsanleitung

Beginnen Sie damit, die Stromversorgung anzuschließen. Verwenden Sie ein rotes Kabel, um den VCC-Pin des APDS-9960 mit dem 3.3V-Pin des Arduino zu verbinden. Als Nächstes verbinden Sie den GND-Pin des Sensors mit einem GND-Pin des Arduino mithilfe eines schwarzen Kabels. Für die I2C-Kommunikation verbinden Sie den SDA-Pin des APDS-9960 mit dem A4-Pin des Arduino. Ebenso verbinden Sie den SCL-Pin mit dem A5-Pin des Arduino. Schließlich verbinden Sie den INT-Pin des Sensors mit Pin 2 am Arduino. Dadurch kann der Arduino auf vom Sensor ausgelöste Interrupts reagieren.
Codebeispiele & Schritt-für-Schritt-Anleitung
Der bereitgestellte Code initialisiert den APDS-9960-Sensor und richtet das Arduino so ein, dass Gesten erkannt werden. Hier ist ein kurzer Auszug der Setup-Funktion:
void setup() {
pinMode(APDS9960_INT, INPUT);
Serial.begin(9600);
attachInterrupt(0, interruptRoutine, FALLING);
if ( apds.init() ) {
Serial.println(F("APDS-9960 initialization complete"));
}
}In diesem Ausschnitt initialisieren wir den seriellen Monitor und setzen den Interrupt-Pin. Der Sensor wird initialisiert und eine Bestätigungsmeldung auf der Konsole ausgegeben. Als Nächstes prüfen wir in der loop()-Funktion auf Gesten:
void loop() {
if( isr_flag == 1 ) {
detachInterrupt(0);
handleGesture();
isr_flag = 0;
attachInterrupt(0, interruptRoutine, FALLING);
}
}Hier überprüft die Schleife kontinuierlich auf Gesten. Wenn eine Geste erkannt wird, wird der Interrupt deaktiviert und die Funktion `handleGesture` aufgerufen, um die Geste zu verarbeiten. Schließlich verarbeitet die Funktion `handleGesture` die erkannten Gesten:
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 dieser Funktion wird die Geste gelesen und entsprechend der erkannten Richtung die passende Aktion ausgeführt. Dies ermöglicht eine interaktive Steuerung anhand von Handbewegungen. Für ein vollständiges Verständnis des Codes beachten Sie bitte das vollständige Programm, das unterhalb des Artikels geladen ist.

Demonstration / Was Sie erwartet
Wenn die Einrichtung abgeschlossen ist, können Sie erwarten, dass der Arduino Gesten erkennt und die erkannte Richtung im seriellen Monitor anzeigt. Einfache Tests sind, die Hand vor dem Sensor nach oben, unten, links oder rechts zu bewegen. Wenn alles richtig verdrahtet ist, sollten Sie die entsprechende Ausgabe im seriellen Monitor sehen, die die Gestenerkennung bestätigt. Achten Sie auf schwebende Eingänge, da diese zu inkonsistenten Messwerten führen können (im Video bei 05:20).
Video-Zeitstempel
- 00:00- Einführung
- 01:15- Hardware-Übersicht
- 03:00- Verdrahtungsanleitung
- 04:30- Code-Durchgang
- 06:15- Demonstration
/*
* Code für den APDS-9960 Gestensensor für Arduino
* Dieser Code dient dazu, Gesten Ihrer Hand zu erkennen, entweder indem Sie sie nach oben, unten, links oder rechts bewegen; andere Gesten können erkannt und verwendet werden, um etwas anderes zu steuern.
*
* Sehen Sie sich das Video zum APDS-9960 Gestensensor an https://youtu.be/qzSgZV_fbxI
* Holen Sie sich diesen Code von https://robojax.com
*
* Code, der im Video von Ahmad Shamshiri für Robojax.com verwendet wurde
* am 31. Dezember 2016 um 6:53 Uhr in Ajax, Ontario, Kanada
* Erlaubnis zur Weitergabe dieses Codes wurde erteilt, vorausgesetzt, diese
* Notiz bleibt zusammen mit dem Code.
* Haftungsausschluss: Dieser Code ist "WIE BESEHEN" und nur zu Bildungszwecken gedacht.
*
* GestureTest.ino
* APDS-9960 RGB und Gestensensor
* Shawn Hymel @ SparkFun Electronics
* 30. Mai 2014
* https://github.com/sparkfun/APDS-9960_RGB_and_Gesture_Sensor
*
* Testet die Gestenwahrnehmungsfähigkeiten des APDS-9960. Konfiguriert
* den APDS-9960 über I2C und wartet auf Gestenereignisse. Berechnet
* die Richtung des Wischens (oben, unten, links, rechts) und zeigt sie
* auf einer seriellen Konsole an.
*
* Um eine NAHE-Geste auszuführen, halten Sie Ihre Hand
* hoch über dem Sensor und bewegen Sie sie nahe an den Sensor (innerhalb von 5 cm). Halten Sie Ihre Hand dort für mindestens 1 Sekunde und bewegen Sie sie dann weg.
*
* Um eine FERNE-Geste auszuführen, halten Sie Ihre Hand innerhalb von 5 cm vom
* Sensor für mindestens 1 Sekunde und bewegen Sie sie dann weg (außerhalb
* des Bereichs) vom Sensor.
*
* Hardwareverbindungen:
*
* WICHTIG: Der APDS-9960 kann nur 3,3 V akzeptieren!
*
* Arduino-Pin APDS-9960 Board-Funktion
*
* 3,3 V VCC Stromversorgung
* GND GND Erde
* A4 SDA I2C-Daten
* A5 SCL I2C-Takt
* 2 INT Interrupt
*
* Ressourcen:
* Include Wire.h und SparkFun_APDS-9960.h
*
* Spezifisches Entwicklungsumfeld:
* Geschrieben in Arduino 1.0.5
* Getestet mit SparkFun Arduino Pro Mini 3,3 V
*
* Dieser Code ist Bierware; wenn Sie mich (oder einen anderen Mitarbeiter von SparkFun) in der Nähe sehen und unser Code hilfreich war, kaufen Sie uns bitte eine Runde!
*
* Verbreitet wie vorliegend; es wird keine Garantie gegeben.
*/
#include <Wire.h>
#include <SparkFun_APDS9960.h>
Servo myservo; // Erstelle ein Servo-Objekt, um ein Servo zu steuern.
// Stifte
#define APDS9960_INT 2 // Muss ein Interrupt-Pin sein
// Konstanten
// Globale Variablen
SparkFun_APDS9960 apds = SparkFun_APDS9960();
int isr_flag = 0;
void setup() {
// Setze den Interrupt-Pin als Eingang.
pinMode(APDS9960_INT, INPUT);
// Seriellen Port initialisieren
Serial.begin(9600);
Serial.println();
Serial.println(F("--------------------------------"));
Serial.println(F("SparkFun APDS-9960 - GestureTest"));
Serial.println(F("--------------------------------"));
// Initialisieren Sie die Interrupt-Service-Routine
attachInterrupt(0, interruptRoutine, FALLING);
// APDS-9960 initialisieren (I2C und Anfangswerte konfigurieren)
if ( apds.init() ) {
Serial.println(F("APDS-9960 initialization complete"));
} else {
Serial.println(F("Something went wrong during APDS-9960 init!"));
}
// Starten Sie den Gestensensor-Engine 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");
}
}
}
/*
* Modifiziert für RoboJax von A.B.S. am 09. Mai 2017 in Ajax, Ontario, Kanada. www.RoboJax.com
*
* Ursprüngliche Quelle: APDS-9960 RGB- und Gestensensor Shawn Hymel @ SparkFun Electronics 30. Mai 2014 https://github.com/sparkfun/APDS-9960_RGB_and_Gesture_Sensor
*
* Verbreitet wie besehen; keine Garantie wird gegeben.
*/
#include <Wire.h>
// hinzugefügt von RoboJax
#include <Servo.h>
#include <SparkFun_APDS9960.h>
Servo myservo; // Servo-Objekt erstellen, um einen Servo zu steuern // hinzugefügt von RoboJax
// Pins
#define APDS9960_INT 2 // Muss ein Interrupt-Pin sein
// Konstanten
// Globale Variablen
SparkFun_APDS9960 apds = SparkFun_APDS9960();
int isr_flag = 0;
void setup() {
myservo.attach(9); // fügt den Servo an Pin 9 dem Servo-Objekt hinzu
// Setzen Sie den Interrupt-Pin als Eingang.
pinMode(APDS9960_INT, INPUT);
// Serielle Schnittstelle initialisieren
Serial.begin(9600);
Serial.println();
Serial.println(F("--------------------------------"));
Serial.println(F("SparkFun APDS-9960 - GestureTest"));
Serial.println(F("--------------------------------"));
// Initialisiere Interruptservice-Routine
attachInterrupt(0, interruptRoutine, FALLING);
// APDS-9960 initialisieren (I2C und Anfangswerte konfigurieren)
if ( apds.init() ) {
Serial.println(F("APDS-9960 initialization complete"));
} else {
Serial.println(F("Something went wrong during APDS-9960 init!"));
}
// Starte den APDS-9960 Gestensensormotor.
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); // hinzugefügt von RoboJax
break;
case DIR_RIGHT:
Serial.println("RIGHT");
myservo.write(0); // hinzugefügt von RoboJax
break;
case DIR_NEAR:
Serial.println("NEAR");
break;
case DIR_FAR:
Serial.println("FAR");
break;
default:
Serial.println("NONE");
}
}
}
Ressourcen & Referenzen
Noch keine Ressourcen vorhanden.