- Nödvändiga komponenter
- Introduktion till APDS-9960 Digital Proximity RGB & Gest Sensor
- Kretsschema
- Programmering av Arduino för gest- och färgavkänning
Idag har de flesta telefoner en gestkontrollfunktion för att öppna eller stänga någon app, starta musik, delta i samtal etc. Detta är en mycket praktisk funktion för att spara tid och det ser också coolt ut att styra alla enheter med gester. Vi använde tidigare accelerometer för att bygga geststyrd robot och geststyrd luftmus. Men idag lär vi oss att koppla ihop en gestsensor APDS9960 med Arduino. Denna sensor har också en RGB-sensor för att upptäcka färger, som också kommer att användas i denna handledning. Så du behöver inte använda separata sensorer för gest- och färgdetektering, även om det finns en dedikerad sensor för färgdetektering - TCS3200 färgsensor som vi redan har använt med Arduino för att bygga en färgsorteringsmaskin.
Nödvändiga komponenter
- Arduino UNO
- APDS9960 RGB och gestsensor
- 16x2 LCD
- DPDT-omkopplare
- 100K potten och 10K motstånd
- Startkablar
Introduktion till APDS-9960 Digital Proximity RGB & Gest Sensor
APDS9960 är en multifunktionssensor. Den kan upptäcka gester, omgivande ljus och RGB-värden i ljus. Denna sensor kan också användas som närhetssensor och används mest i smartphones för att inaktivera pekskärmen medan du deltar i ett samtal.
Denna sensor består av fyra fotodioder. Dessa fotodioder detekterar den reflekterade IR-energin som sänds av en inbyggd lysdiod. Så när någon gest utförs så hindras denna IR-energi och reflekteras tillbaka till sensorn, nu upptäcker sensorn informationen (riktning, hastighet) om gesten och omvandlar den till digital information. Denna sensor kan användas för att mäta hinderavståndet genom att detektera reflekterat IR-ljus. Den har UV- och IR-blockeringsfilter för att känna av RGB-färger och den producerar 16-bitars data för varje färg.
Pin-out på APDS-9960-sensorn visas nedan. Denna sensor fungerar på I 2 C kommunikationsprotokoll. Den förbrukar 1 μA ström och drivs av 3,3 V, så var försiktig och anslut den inte med 5 V-stift. INT-stiftet här är avbrottsstift, som används för att driva I 2 C-kommunikationen. Och VL-stift är en extra stift för den inbyggda lysdioden om PS-bygeln inte är ansluten. Om PS-bygeln är stängd behöver du bara driva VCC-stift, det kommer att ge ström till båda - modulen och IR-lysdioden.
Kretsschema
Anslutningar för APDS960 med Arduino är mycket enkla. Vi använder en DPDT-knapp för att växla mellan de två lägena RGB Sensing och Gesting Sensing. För det första är I2C-kommunikationsstift SDA och SCL för APDS9960 anslutna till Arduino-stift A4 respektive A5. Som tidigare nämnts är driftspänningen för sensorn 3,3 v, så VCC och GND för APDS9960 är anslutna till 3,3 V och GND för Arduino. Avbrottsstiftet (INT) på APDS9960 är anslutet till D2-stiftet i Arduino.
För LCD är datapinnar (D4-D7) anslutna till digitala stift D6-D3 på Arduino och RS och EN-stiften är anslutna till D6 och D7 i Arduino. LCD-skärmens V0 är ansluten till potten och en 100K-kruka används för att kontrollera LCD-skärmens ljusstyrka. För DPDT-knapparna har vi endast använt 3 stift. Den andra stiften är ansluten till D7-stiftet i Arduino för ingång och de andra två är anslutna till GND och VCC följt av ett 10K-motstånd.
Programmering av Arduino för gest- och färgavkänning
Programmeringsdelen är enkel och enkel och hela programmet med en demo-video ges i slutet av denna handledning.
Först måste vi installera ett bibliotek från Sparkfun. För att installera detta bibliotek, navigera till Skiss-> Inkludera bibliotek-> Hantera bibliotek.
Skriv nu “Sparkfun APDS9960” i sökfältet och klicka på installationsknappen när du ser biblioteket.
Och vi är redo att gå. Låt oss börja.
Så först måste vi inkludera alla nödvändiga rubrikfiler. Den första rubrikfilen LiquidCrystal.h används för LCD-funktioner. Den andra rubrikfilen Wire.h används för I 2 C-kommunikation och den sista SparkFun_APDS996.h används för APDS9960-sensorn.
#omfatta
Nu i nästa rad har vi definierat stiften för knapp och LCD.
const int buttonPin = 7; konst int rs = 12, en = 11, d4 = 6, d5 = 5, d6 = 4, d7 = 3; LiquidCrystal lcd (rs, en, d4, d5, d6, d7);
I nästa del har vi definierat ett makro för avbrottsstiftet som är anslutet på den digitala stiftet 2 och en variabelknapp Status för det aktuella tillståndet för knappen och isr_flag för avbrottsrutinen.
#define APDS9960_INT 2 int buttonState; int isr_flag = 0;
Därefter skapas ett objekt för SparkFun_APDS9960, så att vi kan komma åt geströrelserna och hämta RGB-värdena.
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;
I installationsfunktionen är den första raden att hämta värdet från knappen (låg / hög) och andra och tredje raden definierar avbrott och knappstift som ingång. apds.init () initialiserar APDS9960-sensorn och lcd.begin (16,2) initialiserar LCD-skärmen.
ogiltig installation () { buttonState = digitalRead (buttonPin); pinMode (APDS9960_INT, INPUT); pinMode (buttonPin, INPUT); apds.init (); lcd.begin (16, 2); }
I loop -funktionen första raden blir värdena från knappen och lagrar det i buttonState variabel definierade tidigare. Nu i nästa rad kontrollerar vi värdena från knappen, om den är hög aktiverar vi ljussensorn och om den är låg, initiera gestsensorn.
Den attachInterrupt () är en funktion som används för externa avbrottet som i detta fall är sensorns avbrott. Det första argumentet i denna funktion är interrupt number. I Arduino UNO finns det två avbrottsstift digitala stift - 2 och 3 betecknade med INT.0 och INT.1. Och vi har kopplat den till stift 2 så vi har skrivit 0 där. Det andra argumentet kallar funktionen interruptRoutine () som definieras senare. Det sista argumentet FALLS så att det kommer att utlösa avbrottet när stiftet går från hög till låg. Läs mer om Arduino-avbrott här.
void loop () { buttonState = digitalRead (buttonPin); if (buttonState == HIGH) { apds.enableLightSensor (true); }
I nästa del kontrollerar vi efter knappnål. Om den är hög startar du processen för RGB-sensorn. Kontrollera sedan om ljussensorn avläser värden eller inte. Om den inte kan läsa värdena, skriv i så fall ut " Fel vid läsning av ljusvärden". Och om den kan läsa värden, jämför värdena för de tre färgerna och det som är högst, skriv ut den färgen till LCD-skärmen.
if (buttonState == HIGH) { if (! apds.readAmbientLight (ambient_light) - ! apds.readRedLight (red_light) - ! apds.readGreenLight (green_light) - ! apds.readBlueLight (blue_light)) { lcd.print ("Fel vid läsning av ljusvärden"); } annat { if (red_light> green_light) { if (red_light> blue_light) { lcd.print ("Red"); fördröjning (1000); lcd.clear (); } ……. ………..
I nästa rader kontrollerar du igen om knappstiftet är, och om det är lågt, bearbeta gestsensorn. Sök sedan efter isr_flag och om det är 1 kallas en funktion detachInterrupt () . Denna funktion används för att stänga av avbrottet. Nästa rad anropar handleGesture () som är funktionsdefinierad senare. I de nästa nästa raderna definierar isr_flag till noll och bifogar avbrottet.
annars om (buttonState == LOW) { if (isr_flag == 1) { detachInterrupt (0); handleGesture (); isr_flag = 0; attachInterrupt (0, interruptRoutine, FALLING); } }
Nästa är interruptRoutine () -funktion. Denna funktion används för att vrida isr_flag- variabeln 1, så att avbrottstjänsten kan initieras.
void interruptRoutine (). { isr_flag = 1; }
Den handleGesture () funktion är definierad i nästa del. Den här funktionen kontrollerar först om det finns en gestsensor. Om den är tillgänglig läser den gestvärdena och kontrollerar vilken gest den är (UPP, NED, HÖGER, VÄNSTER, LÅNG, NÄR) och skriver ut motsvarande värden till LCD.
ogiltig handleGesture () { if (apds.isGestureAvailable ()) { switch (apds.readGesture ()) { case DIR_UP: lcd.print ("UP"); fördröjning (1000); lcd.clear (); ha sönder; fall DIR_DOWN: lcd.print ("DOWN"); fördröjning (1000); lcd.clear (); ha sönder; fall DIR_LEFT: lcd.print ("LEFT"); fördröjning (1000); lcd.clear (); ha sönder; fall DIR_RIGHT: lcd.print ("RIGHT"); fördröjning (1000); lcd.clear (); ha sönder; fall DIR_NEAR: lcd.print ("NEAR"); fördröjning (1000); lcd.clear (); ha sönder; fall DIR_FAR: lcd.print ("FAR"); fördröjning (1000); lcd.clear (); ha sönder; standard: lcd.print ("INGEN"); fördröjning (1000); lcd.clear (); } } }
Slutligen laddar du upp koden till Arduino och väntar på att sensorn initialiseras. Medan knappen är avstängd betyder det att den är i gestläge. Så försök att flytta händerna åt vänster, höger, uppåt, nedåt. För långt gest, hålla handen på ett avstånd av 2-4 inches från sensor i 2-3 sekunder och ta bort den. Och för nära gest hålla handen långt ifrån sensorn sedan ta det nära och ta bort den.
Slå nu på knappen för att sätta den i färgavkänningsläge och ta röda, blå och gröna föremål en efter en nära sensorn. Det kommer att skriva ut objektets färg.