Multifunktionales Modul APDS-9960

Modul APDS-9960

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.

Sensor APDS-9960
Abb.: Der Sensor-Chip APDS-9960
Vergrößerte Ansicht des Sensors APDS-9960
Abb.: Vergrößerte Ansicht des Sensors APDS-9960
Vergrößerte Ansicht des Sensors APDS-9960
Abb.: Vergrößerte Ansicht des Sensors APDS-9960

Technische Daten laut Hersteller:

Verwendete Bauteile

Anschlüsse

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:

Programmierung

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.

Versuch I.: Farberkennung

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);
}
Ausgabe auf der seriellen Konsole
Abb.: Ausgabe auf der seriellen Konsole

Versuch II.: Abstandserkennung

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();
    }
}
Ausgabe auf der seriellen Konsole
Abb.: Ausgabe auf der seriellen Konsole

Versuch III.: Gestenerkennung

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");
}
Ausgabe auf der seriellen Konsole
Abb.: Ausgabe auf der seriellen Konsole

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