- Vereiste componenten
- Inleiding tot APDS-9960 Digital Proximity RGB & Gesture Sensor
- Schakelschema
- Arduino programmeren voor gebaren en kleurdetectie
Tegenwoordig worden de meeste telefoons geleverd met een gebarenbedieningsfunctie om een app te openen of te sluiten, muziek te starten, oproepen bij te wonen, enz. Dit is een erg handige functie om tijd te besparen en het ziet er ook gaaf uit om elk apparaat met gebaren te bedienen. We hebben eerder een versnellingsmeter gebruikt om een gebarengestuurde robot en een gebarengestuurde luchtmuis te bouwen. Maar vandaag leren we een gebarensensor APDS9960 met Arduino te verbinden. Deze sensor heeft ook een RGB-sensor om kleuren te detecteren, die ook in deze tutorial zal worden gebruikt. U hoeft dus geen aparte sensoren te gebruiken voor gebaren- en kleurdetectie, hoewel er wel een speciale sensor voor kleurdetectie beschikbaar is: de TCS3200-kleurensensor die we al hebben gebruikt met Arduino om een kleursorteermachine te bouwen.
Vereiste componenten
- Arduino UNO
- APDS9960 RGB- en bewegingssensor
- 16x2 LCD
- DPDT-schakelaar
- 100K pot en 10K weerstand
- Startkabels
Inleiding tot APDS-9960 Digital Proximity RGB & Gesture Sensor
APDS9960 is een multifunctionele sensor. Het kan gebaren, omgevingslicht en RGB-waarden in licht detecteren. Deze sensor kan ook worden gebruikt als naderingssensor en wordt vooral gebruikt in smartphones om het touchscreen uit te schakelen tijdens het bijwonen van een oproep.
Deze sensor bestaat uit vier fotodiodes. Deze fotodiodes detecteren de gereflecteerde IR-energie die wordt uitgezonden door een ingebouwde LED. Dus telkens wanneer een gebaar wordt uitgevoerd, wordt deze IR-energie belemmerd en weerkaatst naar de sensor, nu detecteert de sensor de informatie (richting, snelheid) over het gebaar en zet deze om in digitale informatie. Deze sensor kan worden gebruikt om de afstand van een obstakel te meten door gereflecteerd IR-licht te detecteren. Het heeft UV- en IR-blokkeerfilters voor het detecteren van RGB-kleuren en produceert 16-bits gegevens voor elke kleur.
De pin-out van de APDS-9960-sensor wordt hieronder weergegeven. Deze sensor werkt op het I 2 C communicatieprotocol. Hij verbruikt 1 µA stroom en wordt gevoed door 3.3V, dus wees voorzichtig en sluit hem niet aan met een 5V-pin. De INT-pin hier is de interrupt-pin, die wordt gebruikt om de I 2 C-communicatie aan te sturen. En VL-pin is een optionele voedingspin voor de ingebouwde LED als de PS-jumper niet is aangesloten. Als de PS-jumper gesloten is, hoeft u alleen de VCC-pin van stroom te voorzien, deze levert stroom aan zowel de module als de IR-LED.
Schakelschema
Verbindingen voor APDS960 met Arduino zijn heel eenvoudig. We zullen een DPDT-knop gebruiken om te schakelen tussen de twee modi RGB Sensing en Gesture Sensing. Ten eerste zijn de I2C-communicatiepinnen SDA en SCL van APDS9960 verbonden met respectievelijk Arduino-pin A4 en A5. Zoals eerder vermeld, is de bedrijfsspanning voor de sensor 3.3V, dus VCC en GND van APDS9960 zijn verbonden met 3.3V en GND van Arduino. De interrupt pin (INT) van APDS9960 is verbonden met pin D2 van Arduino.
Voor LCD zijn datapinnen (D4-D7) verbonden met digitale pinnen D6-D3 van Arduino en RS- en EN-pinnen zijn verbonden met D6 en D7 van Arduino. V0 van LCD is verbonden met pot en een 100K pot wordt gebruikt om de helderheid van LCD te regelen. Voor de DPDT-knoppen hebben we slechts 3 pinnen gebruikt. De tweede pin is verbonden met de D7-pin van Arduino voor invoer en de andere twee zijn verbonden met GND en VCC, gevolgd door een 10K-weerstand.
Arduino programmeren voor gebaren en kleurdetectie
Het programmeergedeelte is eenvoudig en gemakkelijk en het complete programma met een demovideo wordt aan het einde van deze tutorial gegeven.
Eerst moeten we een bibliotheek installeren die is gemaakt door Sparkfun. Om deze bibliotheek te installeren, navigeert u naar Sketch-> Bibliotheek opnemen-> Bibliotheken beheren.
Typ nu in de zoekbalk "Sparkfun APDS9960" en klik op de installatieknop als je de bibliotheek ziet.
En we zijn er klaar voor. Laten we beginnen.
Dus eerst moeten we alle vereiste header-bestanden opnemen. Het eerste header-bestand LiquidCrystal.h wordt gebruikt voor LCD-functies. Het tweede headerbestand Wire.h wordt gebruikt voor I 2 C-communicatie en de laatste SparkFun_APDS996.h wordt gebruikt voor de APDS9960-sensor.
# omvatten
Nu hebben we in de volgende regels de pinnen voor knop en LCD gedefinieerd.
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);
In het volgende gedeelte hebben we een macro gedefinieerd voor de interrupt-pin die is aangesloten op digitale pin 2 en een variabele buttonState voor de huidige status van de knop en isr_flag voor de interrupt-serviceroutine.
#define APDS9960_INT 2 int buttonState; int isr_flag = 0;
Vervolgens wordt een object gemaakt voor de SparkFun_APDS9960, zodat we toegang hebben tot de bewegingsbewegingen en de RGB-waarden kunnen ophalen.
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 de setup- functie is de eerste regel om de waarde op te halen van de knop (laag / hoog) en de tweede en derde regel definieert interrupt en knoppen als invoer. apds.init () initialiseert de APDS9960-sensor en de lcd.begin (16,2) initialiseert de LCD.
void setup () { buttonState = digitalRead (buttonPin); pinMode (APDS9960_INT, INPUT); pinMode (buttonPin, INPUT); apds.init (); lcd.begin (16, 2); }
In loop- functie haalt de eerste regel de waarden van button en slaat deze op in de eerder gedefinieerde variabele buttonState . Nu controleren we in de volgende regels de waarden van de knop, als deze hoog is, schakelen we de lichtsensor in en als deze laag is, initialiseren we de bewegingssensor.
De attachInterrupt () is een functie die wordt gebruikt voor externe interrupt, in dit geval de interrupt van de sensor. Het eerste argument in deze functie is het interruptnummer. In Arduino UNO zijn er twee digitale pinnen voor interrupt-pinnen - 2 en 3 aangegeven met INT.0 en INT.1. En we hebben het verbonden met pin 2, dus we hebben daar 0 geschreven. Het tweede argument roept de functie interruptRoutine () aan die later wordt gedefinieerd. Het laatste argument is FALLING, zodat het de interrupt activeert wanneer de pin van hoog naar laag gaat. Lees hier meer over Arduino Interrupts.
void loop () { buttonState = digitalRead (buttonPin); if (buttonState == HIGH) { apds.enableLightSensor (true); }
In het volgende gedeelte controleren we op knoppen. Als het hoog is, start dan het proces voor de RGB-sensor. Controleer vervolgens of de lichtsensor waarden leest of niet. Als het de waarden niet kan lezen, print dan die " Fout bij lezen lichtwaarden". En als het dan waarden kan lezen, vergelijk dan de waarden van de drie kleuren en welke de hoogste is, druk die kleur dan af op het LCD-scherm.
if (buttonState == HIGH) { if (! apds.readAmbientLight (ambient_light) - ! apds.readRedLight (red_light) - ! apds.readGreenLight (green_light) - ! apds.readBlueLight (blue_light)) { lcd.print ("Fout bij lezen lichtwaarden"); } else { if (rood_licht> groen_licht) { if (rood_licht> blauw_licht) { lcd.print ("Rood"); vertraging (1000); lcd.clear (); } ……. ………..
Controleer in de volgende regels opnieuw op knoppin en als deze laag is, voert u de bewegingssensor uit. Controleer vervolgens op isr_flag en als het 1 is, wordt een functie detachInterrupt () aangeroepen. Deze functie wordt gebruikt om de onderbreking uit te schakelen. De volgende regel roept de handleGesture () aan, welke functie later wordt gedefinieerd. Definieer in de volgende regels isr_flag op nul en koppel de interrupt.
anders if (buttonState == LOW) { if (isr_flag == 1) { detachInterrupt (0); handleGesture (); isr_flag = 0; attachInterrupt (0, interruptRoutine, FALLING); } }
De volgende is de functie interruptRoutine () . Deze functie wordt gebruikt om de isr_flag variabele 1 te draaien, zodat de interrupt-service kan worden geïnitialiseerd.
leegte interruptRoutine (). { isr_flag = 1; }
De functie handleGesture () wordt in het volgende deel gedefinieerd. Deze functie controleert eerst of er een bewegingssensor beschikbaar is. Als het beschikbaar is, leest het de bewegingswaarden en controleert welk gebaar het is (OMHOOG, OMLAAG, RECHTS, LINKS, VER, DICHTBIJ) en drukt de bijbehorende waarden af op het LCD-scherm.
void handleGesture () { if (apds.isGestureAvailable ()) { switch (apds.readGesture ()) { case DIR_UP: lcd.print ("UP"); vertraging (1000); lcd.clear (); breken; geval DIR_DOWN: lcd.print ("DOWN"); vertraging (1000); lcd.clear (); breken; geval DIR_LEFT: lcd.print ("LEFT"); vertraging (1000); lcd.clear (); breken; geval DIR_RIGHT: lcd.print ("RIGHT"); vertraging (1000); lcd.clear (); breken; case DIR_NEAR: lcd.print ("NEAR"); vertraging (1000); lcd.clear (); breken; geval DIR_FAR: lcd.print ("FAR"); vertraging (1000); lcd.clear (); breken; standaard: lcd.print ("GEEN"); vertraging (1000); lcd.clear (); } } }
Upload ten slotte de code naar Arduino en wacht tot de sensor is geïnitialiseerd. Terwijl de knop is uitgeschakeld, betekent dit dat deze zich in de gebarenmodus bevindt. Dus probeer uw handen naar links, rechts, omhoog, omlaag te bewegen. Houd voor verre bewegingen uw hand 2-3 seconden op een afstand van 2-4 inch van de sensor en verwijder deze. En voor een gebaar van dichtbij houdt u uw hand ver van de sensor, neemt u deze dichtbij en verwijdert u deze.
Draai nu de knop AAN om hem in de kleurwaarnemingsmodus te zetten en neem een voor een rode, blauwe en groene objecten in de buurt van de sensor. Het zal de kleur van het object afdrukken.