- Erforderliche Komponenten
- Einführung in APDS-9960 Digital Proximity RGB & Gestensensor
- Schaltplan
- Programmieren von Arduino für Gesten- und Farberkennung
Heutzutage verfügen die meisten Telefone über eine Gestensteuerungsfunktion zum Öffnen oder Schließen einer App, zum Starten von Musik, zum Anwenden von Anrufen usw. Dies ist eine sehr praktische Funktion, um Zeit zu sparen, und es sieht auch cool aus, jedes Gerät mit Gesten zu steuern. Wir haben zuvor einen Beschleunigungsmesser verwendet, um einen gestengesteuerten Roboter und eine gestengesteuerte Luftmaus zu bauen. Aber heute lernen wir, einen Gestensensor APDS9960 mit Arduino zu verbinden. Dieser Sensor verfügt auch über einen RGB-Sensor zur Erkennung von Farben, der auch in diesem Lernprogramm verwendet wird. Sie müssen also keine separaten Sensoren für die Gesten- und Farberkennung verwenden, obwohl ein dedizierter Sensor für die Farberkennung verfügbar ist - der TCS3200-Farbsensor, den wir bereits mit Arduino zum Bau einer Farbsortiermaschine verwendet haben.
Erforderliche Komponenten
- Arduino UNO
- APDS9960 RGB und Gestensensor
- 16x2 LCD
- DPDT-Schalter
- 100K Topf und 10K Widerstand
- Überbrückungskabel
Einführung in APDS-9960 Digital Proximity RGB & Gestensensor
APDS9960 ist ein Multifunktionssensor. Es kann Gesten, Umgebungslicht und RGB-Werte im Licht erkennen. Dieser Sensor kann auch als Näherungssensor verwendet werden und wird hauptsächlich in Smartphones verwendet, um den Touchscreen während eines Anrufs zu deaktivieren.
Dieser Sensor besteht aus vier Fotodioden. Diese Fotodioden erfassen die reflektierte IR-Energie, die von einer integrierten LED übertragen wird. Wenn also eine Geste ausgeführt wird, wird diese IR-Energie blockiert und zum Sensor zurückreflektiert. Jetzt erkennt der Sensor die Informationen (Richtung, Geschwindigkeit) über die Geste und wandelt sie in digitale Informationen um. Dieser Sensor kann verwendet werden, um die Entfernung des Hindernisses zu messen, indem reflektiertes IR-Licht erfasst wird. Es verfügt über UV- und IR-Sperrfilter zum Erfassen von RGB-Farben und erzeugt 16-Bit-Daten für jede Farbe.
Die Pinbelegung des APDS-9960-Sensors ist unten dargestellt. Dieser Sensor arbeitet mit dem I 2 C-Kommunikationsprotokoll. Es verbraucht 1µA Strom und wird mit 3,3V versorgt. Seien Sie also vorsichtig und verbinden Sie es nicht mit einem 5V-Pin. Der INT-Pin ist hier der Interrupt-Pin, mit dem die I 2 C-Kommunikation angesteuert wird. Der VL-Pin ist ein optionaler Power-Pin für die integrierte LED, wenn der PS-Jumper nicht angeschlossen ist. Wenn der PS-Jumper geschlossen ist, müssen Sie nur den VCC-Pin mit Strom versorgen. Er versorgt sowohl das Modul als auch die IR-LED mit Strom.
Schaltplan
Die Verbindungen für APDS960 mit Arduino sind sehr einfach. Wir werden eine DPDT-Taste verwenden, um zwischen den beiden Modi RGB-Erkennung und Gestenerkennung zu wechseln. Zunächst werden die I2C-Kommunikationspins SDA und SCL des APDS9960 mit dem Arduino-Pin A4 bzw. A5 verbunden. Wie bereits erwähnt, beträgt die Betriebsspannung für den Sensor 3,3 V, sodass VCC und GND von APDS9960 mit 3,3 V und GND von Arduino verbunden sind. Der Interrupt-Pin (INT) des APDS9960 ist mit dem D2-Pin von Arduino verbunden.
Bei LCD sind die Datenpins (D4-D7) mit den digitalen Pins D6-D3 von Arduino und die RS- und EN-Pins mit D6 und D7 von Arduino verbunden. V0 des LCD ist mit dem Poti verbunden und ein 100K-Poti wird verwendet, um die Helligkeit des LCD zu steuern. Für die DPDT-Tasten haben wir nur 3 Pins verwendet. Der zweite Pin ist zur Eingabe mit dem D7-Pin von Arduino verbunden, und die anderen beiden sind mit GND und VCC verbunden, gefolgt von einem 10K-Widerstand.
Programmieren von Arduino für Gesten- und Farberkennung
Der Programmierteil ist einfach und unkompliziert. Das vollständige Programm mit einem Demo-Video finden Sie am Ende dieses Tutorials.
Zuerst müssen wir eine Bibliothek von Sparkfun installieren. Um diese Bibliothek zu installieren, navigieren Sie zu Skizze-> Bibliothek einschließen-> Bibliotheken verwalten.
Geben Sie nun in der Suchleiste "Sparkfun APDS9960" ein und klicken Sie auf die Schaltfläche "Installieren", wenn Sie die Bibliothek sehen.
Und wir sind bereit zu gehen. Lass uns anfangen.
Also müssen wir zuerst alle erforderlichen Header-Dateien einschließen. Die erste Header-Datei LiquidCrystal.h wird für LCD-Funktionen verwendet. Die zweite Header-Datei Wire.h wird für die I 2 C-Kommunikation verwendet und die letzte SparkFun_APDS996.h wird für den APDS9960-Sensor verwendet.
#einschließen
Jetzt haben wir in den nächsten Zeilen die Pins für Taste und LCD definiert.
const int buttonPin = 7; const int rs = 12, en = 11, d4 = 6, d5 = 5, d6 = 4, d7 = 3; LiquidCrystal lcd (rs, en, d4, d5, d6, d7);
Im nächsten Abschnitt haben wir ein Makro für den Interrupt-Pin definiert, der an den digitalen Pin 2 angeschlossen ist, und eine Variable buttonState für den aktuellen Status der Taste und isr_flag für die Interrupt-Serviceroutine.
#define APDS9960_INT 2 int buttonState; int isr_flag = 0;
Als nächstes wird ein Objekt für SparkFun_APDS9960 erstellt, damit wir auf die Gestenbewegungen zugreifen und die RGB-Werte abrufen können.
SparkFun_APDS9960 apds = SparkFun_APDS9960 (); uint16_t ambient_light = 0; uint16_t red_light = 0; uint16_t green_light = 0; uint16_t blue_light = 0;
In der Setup- Funktion wird in der ersten Zeile der Wert von der Taste (niedrig / hoch) abgerufen, und in der zweiten und dritten Zeile werden Interrupt und Tastenstift als Eingang definiert. apds.init () initialisiert den APDS9960-Sensor und lcd.begin (16,2) initialisiert das LCD.
void setup () { buttonState = digitalRead (buttonPin); pinMode (APDS9960_INT, INPUT); pinMode (buttonPin, INPUT); apds.init (); lcd.begin (16, 2); }}
In Schleifenfunktion erhält die erste Linie, die die Werte von Taste und speichert sie in Buttonstate Variable zuvor definiert sind. In den nächsten Zeilen überprüfen wir nun die Werte von der Schaltfläche. Wenn sie hoch ist, aktivieren wir den Lichtsensor. Wenn sie niedrig ist, initialisieren wir den Gestensensor.
Die attachInterrupt () ist eine Funktion zum externen Interrupt verwendet, die in diesem Fall Interrupt des Sensors. Das erste Argument in dieser Funktion ist die Interruptnummer. In Arduino UNO gibt es zwei digitale Interrupt-Pins - 2 und 3, die mit INT.0 und INT.1 bezeichnet sind. Und wir haben es mit Pin 2 verbunden, also haben wir dort 0 geschrieben. Das zweite Argument ruft die später definierte Funktion InterruptRoutine () auf . Das letzte Argument ist FALLING , damit der Interrupt ausgelöst wird, wenn der Pin von hoch nach niedrig wechselt. Erfahren Sie hier mehr über Arduino Interrupts.
void loop () { buttonState = digitalRead (buttonPin); if (buttonState == HIGH) { apds.enableLightSensor (true); }}
Im nächsten Teil prüfen wir, ob der Knopfstift vorhanden ist. Wenn es hoch ist, starten Sie den Prozess für den RGB-Sensor. Überprüfen Sie dann, ob der Lichtsensor Werte anzeigt oder nicht. Wenn die Werte nicht gelesen werden können, drucken Sie in diesem Fall den " Fehler beim Lesen der Lichtwerte". Und wenn es dann Werte lesen kann, vergleichen Sie die Werte der drei Farben und drucken Sie diese Farbe auf das LCD, je nachdem, welche am höchsten ist.
if (buttonState == HIGH) { if (! apds.readAmbientLight (ambient_light) - ! apds.readRedLight (red_light) - ! apds.readGreenLight (green_light) - ! apds.readBlueLight (blue_light)) { lcd.print ("Fehler beim Lesen der Lichtwerte"); } else { if (rotes Licht> grünes Licht) { if (rotes Licht> blaues Licht) { lcd.print ("Rot"); Verzögerung (1000); lcd.clear (); } ……. ………..
Überprüfen Sie in den nächsten Zeilen erneut, ob der Tastenstift niedrig ist, und führen Sie den Gestensensor aus, wenn er niedrig ist. Suchen Sie dann nach isr_flag und wenn es 1 ist, wird eine Funktion attachInterrupt () aufgerufen. Mit dieser Funktion wird der Interrupt ausgeschaltet. In der nächsten Zeile wird handleGesture () aufgerufen , eine Funktion, die später definiert wird. In den nächsten Zeilen definieren Sie isr_flag auf Null und fügen den Interrupt hinzu.
sonst if (buttonState == LOW) { if (isr_flag == 1) { attachInterrupt (0); handleGesture (); isr_flag = 0; attachInterrupt (0, interruptRoutine, FALLING); } }
Die nächste ist die Funktion interruptRoutine () . Mit dieser Funktion wird die Variable isr_flag 1 gedreht, damit der Interrupt-Service initialisiert werden kann.
void InterruptRoutine (). { isr_flag = 1; }}
Die Funktion handleGesture () wird im nächsten Teil definiert. Diese Funktion prüft zunächst die Verfügbarkeit des Gestensensors. Wenn es verfügbar ist, liest es die Gestenwerte und prüft, um welche Geste es sich handelt (AUF, AB, RECHTS, LINKS, FERN, NAHE) und druckt die entsprechenden Werte auf das LCD.
void handleGesture () { if (apds.isGestureAvailable ()) { switch (apds.readGesture ()) { case DIR_UP: lcd.print ("UP"); Verzögerung (1000); lcd.clear (); Unterbrechung; case DIR_DOWN: lcd.print ("DOWN"); Verzögerung (1000); lcd.clear (); Unterbrechung; case DIR_LEFT: lcd.print ("LEFT"); Verzögerung (1000); lcd.clear (); Unterbrechung; case DIR_RIGHT: lcd.print ("RIGHT"); Verzögerung (1000); lcd.clear (); Unterbrechung; case DIR_NEAR: lcd.print ("NEAR"); Verzögerung (1000); lcd.clear (); Unterbrechung; case DIR_FAR: lcd.print ("FAR"); Verzögerung (1000); lcd.clear (); Unterbrechung; Standard: lcd.print ("NONE"); Verzögerung (1000); lcd.clear (); } } }
Laden Sie abschließend den Code auf Arduino hoch und warten Sie, bis der Sensor initialisiert ist. Wenn die Taste jetzt ausgeschaltet ist, befindet sie sich im Gestenmodus. Bewegen Sie also Ihre Hände nach links, rechts, oben und unten. Für weit Geste, halten Sie Ihre Hand in einem Abstand von 2-4 Zoll vom Sensor für 2-3 Sekunden und entfernen. Halten Sie Ihre Hand für eine nahe Geste fern vom Sensor, nehmen Sie sie in die Nähe und entfernen Sie sie.
Schalten Sie nun die Taste ein, um sie in den Farberkennungsmodus zu versetzen, und nehmen Sie nacheinander rote, blaue und grüne Objekte in der Nähe des Sensors auf. Es wird die Farbe des Objekts gedruckt.