Das hier verwendete Modul (Bezeichnung z.B. "GY-APDS9960-3.3") benutzt den weitverbreiteten Sensor APDS-9960 zur Erkennung von Handgesten oder bestimmter Farben. Weiterhin können Abstände vom Sensor sowie eine Umgebungslichtmessung durchgeführt werden.
APDS-9960 | Arduino Uno |
---|---|
VL (opt. 3,3V-Spannungsversorgung für IR-LED) | 3,3V (wenn Jumper PS offen) |
GND | GND |
VCC | 3,3V (einige Module können auch mit 5V betrieben werden) |
SDA (I²C-Data) | A4 (Spannungsteiler bzw. Logiklevel-Konverter für 3,3V verwenden!) |
SCL (I²C-Clock) | A5 (Spannungsteiler bzw. Logiklevel-Konverter für 3,3V verwenden!) |
INT (interrupt) | D7 (beliebiger digitaler Pin) |
Auf vielen dieser Module gibt es noch zwei Jumper-Pads, die bei Auslieferung sowohl offen als auch geschlossen (verlötet) sein können:
VL
-Eingang
separat versorgt werden. Schließt man den Kontakt, so wird die IR-LED über den VCC-Eingang
mitversorgt. Es kann in manchen Fällen sinnvoll sein, die IR-LED separat zu versorgen, da
im Datenblatt steht, dass u.U. die Farb- und Lichtmessung durch die IR-LED gestört werden könnte.
Für die folgenden Versuche mit dem APDS-9960-Modul habe ich die Library Adafruit_APDS9960 verwendet. Es gibt jedoch auch noch einige Alternativen dazu, z.B. die Library SparkFun APDS-9960.
Dieser erste Versuch schaltet das Modul in den Farberkennungsmodus und gibt die momentan gemessenen Farbwerte über dem Sensor aus. Dafür wurde ein Beispiel der Library etwas abgewandelt und vereinfacht.
#include "Adafruit_APDS9960.h"
Adafruit_APDS9960 apds;
void setup()
{
Serial.begin(9600);
if(!apds.begin()){
Serial.println("Cannot init APDS9960 module!");
while(1);
}
apds.enableColor(true);
}
void loop()
{
uint16_t r, g, b, c;
while(!apds.colorDataReady()){
delay(5);
}
apds.getColorData(&r, &g, &b, &c);
Serial.print("R=" + String(r));
Serial.print(" G=" + String(g));
Serial.print(" B=" + String(b));
Serial.println(" Clear=" + String(c));
delay(1000);
}
In diesem Versuch wird der Modus für den Näherungssensor aktiviert. Der Sketch ist wiederum
ein leicht modifiziertes Beispiel der Adafruit-Library.
Bei meinen Versuchen ist die Näherungs-Erkennung allerdings erst bei sehr kurzen Distanzen
~1cm-2cm angesprungen.
#include "Adafruit_APDS9960.h"
#define INT_PIN 3
Adafruit_APDS9960 apds;
void setup()
{
Serial.begin(9600);
pinMode(INT_PIN, INPUT_PULLUP);
if (!apds.begin()) {
Serial.println("Cannot init APDS9960 module!");
while (1);
}
apds.enableProximity(true);
//set the interrupt threshold to fire when proximity reading goes above 175
apds.setProximityInterruptThreshold(0, 175);
//enable the proximity interrupt
apds.enableProximityInterrupt();
}
void loop()
{
//print the proximity reading when the interrupt pin goes low
if (!digitalRead(INT_PIN)) {
Serial.println(apds.readProximity());
//clear the interrupt
apds.clearInterrupt();
}
}
Im dritten Versuch wird die Gestenerkennung des Moduls getestet. Hierbei sind vier verschiedene
(Hand-)gesten möglich. Links nach rechts
, recht nach links
,
oben nach unten
und unten nach oben
.
Im folgenden Sketch werden erkannte Gesten auf der seriellen Konsole ausgegeben. Dadurch, dass
hierbei der Näherungssensor benutzt wird, konnten meine Gesten nur direkt über dem Sensor erkannt
werden. Evtl. lohnt es sich, die teureren Module von SparkFun oder Adafruit zu erwerben, um so
bessere Präzision zu erreichen.
#include "Adafruit_APDS9960.h"
Adafruit_APDS9960 apds;
void setup()
{
Serial.begin(9600);
if (!apds.begin()) {
Serial.println("Cannot init APDS9960 module!");
while (1);
}
// gesture mode will be entered once proximity mode senses something close
apds.enableProximity(true);
apds.enableGesture(true);
}
void loop()
{
uint8_t gesture = apds.readGesture();
if (gesture == APDS9960_DOWN)
Serial.println("DOWN");
if (gesture == APDS9960_UP)
Serial.println("UP");
if (gesture == APDS9960_LEFT)
Serial.println("LEFT");
if (gesture == APDS9960_RIGHT)
Serial.println("RIGHT");
}
Für das APDS-9960-Modul gibt es auch noch einen ausführlichen Beitrag unter Wolles Elektronikkiste - APDS-9960. Dort gibt es auch Beispiele/Sketches mit der Library von SparkFun.
zurück