- Nødvendige komponenter
- Introduksjon til APDS-9960 Digital Proximity RGB & Gesture Sensor
- Kretsdiagram
- Programmering Arduino for bevegelse og fargefølelse
I dag kommer de fleste av telefonene med gestkontrollfunksjon for å åpne eller lukke en hvilken som helst app, starte musikk, delta i samtaler osv. Dette er en veldig hendig funksjon for å spare tid, og det ser også kult ut å kontrollere enhver enhet med bevegelser. Vi brukte akselerometer tidligere til å bygge geststyrt robot og geststyrt luftmus. Men i dag lærer vi å grensesnitt en gestsensor APDS9960 med Arduino. Denne sensoren har også en RGB-sensor for å oppdage farger, som også vil bli brukt i denne opplæringen. Så du trenger ikke å bruke separate sensorer for bevegelse og fargedeteksjon, selv om en dedikert sensor for fargedeteksjon er tilgjengelig - TCS3200 fargesensor som vi allerede har brukt med Arduino for å bygge en fargesorteringsmaskin.
Nødvendige komponenter
- Arduino UNO
- APDS9960 RGB og gestesensor
- 16x2 LCD
- DPDT-bryter
- 100K potte og 10K motstand
- Jumperkabler
Introduksjon til APDS-9960 Digital Proximity RGB & Gesture Sensor
APDS9960 er en multifunksjons sensor. Den kan oppdage bevegelser, omgivelseslys og RGB-verdier i lys. Denne sensoren kan også brukes som nærhetssensor og brukes mest i smarttelefoner for å deaktivere berøringsskjermen mens du deltar i en samtale.
Denne sensoren består av fire fotodioder. Disse fotodiodene oppdager den reflekterte IR-energien som overføres av en innebygd LED. Så hver gang en gest utføres, blir denne IR-energien blokkert og reflekteres tilbake til sensoren. Nå oppdager sensoren informasjonen (retning, hastighet) om gesten og konverterer den til digital informasjon. Denne sensoren kan brukes til å måle hindringsavstanden ved å oppdage reflektert IR-lys. Den har UV- og IR-blokkeringsfiltre for å registrere RGB-farger, og den produserer 16-biters data for hver farge.
Pin-out av APDS-9960-sensoren er vist nedenfor. Denne sensoren fungerer på I 2 C kommunikasjonsprotokoll. Den bruker 1 µA strøm og drives av 3,3 V, så vær forsiktig og ikke koble den med 5 V-pinne. INT-pinnen her er avbruddspinne, som brukes til å drive I 2 C-kommunikasjonen. Og VL-pinne er valgfri strømpinne for innebygd LED hvis PS-jumperen ikke er koblet til. Hvis PS-jumperen er lukket, trenger du bare å koble til VCC-pinnen, den vil gi strøm til begge deler - modulen og IR-lysdioden.
Kretsdiagram
Tilkoblinger for APDS960 med Arduino er veldig enkle. Vi vil bruke en DPDT-knapp for å bytte mellom de to modusene RGB Sensing og Gesture Sensing. For det første er I2C-kommunikasjonspinnene SDA og SCL av APDS9960 koblet til henholdsvis Arduino-pin A4 og A5. Som nevnt tidligere er driftsspenningen for sensoren 3,3 v, så VCC og GND av APDS9960 er koblet til 3,3 V og GND av Arduino. Avbruddspinnen (INT) til APDS9960 er koblet til D2-pinnen på Arduino.
For LCD er datapinner (D4-D7) koblet til digitale pinner D6-D3 på Arduino og RS og EN-pinner er koblet til D6 og D7 i Arduino. V0 på LCD er koblet til potten og en 100K potten brukes til å kontrollere lysstyrken på LCD. For DPDT-knappene har vi bare brukt 3 pinner. Den andre pinnen er koblet til D7-pinnen på Arduino for inngang, og de to andre er koblet til GND og VCC etterfulgt av en 10K motstand.
Programmering Arduino for bevegelse og fargefølelse
Programmeringsdelen er enkel og enkel, og hele programmet med en demo-video er gitt på slutten av denne opplæringen.
Først må vi installere et bibliotek laget av Sparkfun. For å installere dette biblioteket, naviger til Skisse-> Inkluder bibliotek-> Administrer biblioteker.
Skriv nå “Sparkfun APDS9960” i søkefeltet, og klikk på installasjonsknappen når du ser biblioteket.
Og vi er klare til å dra. La oss komme i gang.
Så først må vi ta med alle nødvendige headerfiler. Den første toppfilen LiquidCrystal.h brukes til LCD-funksjoner. Andre topptekstfil Wire.h brukes til I 2 C-kommunikasjon og den siste SparkFun_APDS996.h brukes til APDS9960-sensoren.
#inkludere
Nå i neste linje har vi definert pinnene for knapp og LCD.
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);
I neste del har vi definert en makro for avbruddspinnen som er koblet til digital pinne 2 og en variabel knappStatus for den nåværende tilstanden til knappen og isr_flag for avbruddsrutinen.
#define APDS9960_INT 2 int buttonState; int isr_flag = 0;
Deretter opprettes et objekt for SparkFun_APDS9960, slik at vi kan få tilgang til bevegelsesbevegelsene og hente RGB-verdiene.
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 oppsettfunksjon er den første linjen å hente verdien fra knappen (lav / høy) og andre og tredje linje definerer avbrytelse og knappestift som inngang. apds.init () initialiserer APDS9960-sensoren og lcd.begin (16,2) initialiserer LCD-skjermen.
ugyldig oppsett () { buttonState = digitalRead (buttonPin); pinMode (APDS9960_INT, INPUT); pinMode (buttonPin, INPUT); apds.init (); lcd.begin (16, 2); }
I sløyfe -funksjon blir den første linjen verdiene fra knappen og lagrer den i buttonState variabel definert tidligere. Nå i neste linje sjekker vi verdiene fra knappen, hvis den er høy, aktiverer vi lyssensoren, og hvis den er lav, initialiserer du gestesensoren.
Den attachInterrupt () er en funksjon som brukes for ytre avbrudd som i dette tilfellet er sensoren avbruddet. Det første argumentet i denne funksjonen er interrupt number. I Arduino UNO er det to avbrytingspinner digitale pinner - 2 og 3 betegnet med INT.0 og INT.1. Og vi har koblet den til pin 2, så vi har skrevet 0 der. Det andre argumentet kaller funksjonen interruptRoutine () som blir definert senere. Det siste argumentet er FALLENDE slik at det vil utløse avbrudd når pinnen går fra høy til lav. Lær mer om Arduino Interrupts her.
ugyldig sløyfe () { buttonState = digitalRead (buttonPin); hvis (buttonState == HIGH) { apds.enableLightSensor (true); }
I neste del ser vi etter knappestift. Hvis den er høy, start deretter prosessen for RGB-sensoren. Sjekk deretter om lyssensoren leser verdier eller ikke. Hvis det ikke er i stand til å lese verdiene, kan du i så fall skrive ut " Feil ved å lese lysverdier". Og hvis den kan lese verdier, kan du sammenligne verdiene til de tre fargene og den som er høyest, skrive ut fargen på LCD-skjermen.
if (buttonState == HIGH) { if (! apds.readAmbientLight (ambient_light) - ! apds.readRedLight (red_light) - ! apds.readGreenLight (green_light) - ! apds.readBlueLight (blue_light)) { lcd.print ("Feil ved lesing av lysverdier"); } annet { if (rødlys> grønt lys) { hvis (rødlys> blålys) { lcd.print ("Rød"); forsinkelse (1000); lcd.clear (); } ……. ………..
I de neste linjene, sjekk igjen for knappestift, og hvis den er lav, prosess Gesture-sensoren. Sjekk deretter for isr_flag, og hvis det er 1, kalles en funksjon detachInterrupt () . Denne funksjonen brukes til å slå av avbruddet. Neste linje kaller handleGesture () som er funksjonsdefinert senere. I de neste neste linjene definerer isr_flag til null og fester avbruddet.
annet hvis (buttonState == LOW) { if (isr_flag == 1) { detachInterrupt (0); handleGesture (); isr_flag = 0; attachInterrupt (0, interruptRoutine, FALLING); } }
Den neste er interruptRoutine () -funksjonen. Denne funksjonen brukes til å snu isr_flag- variabelen 1, slik at avbruddstjenesten kan initialiseres.
void interruptRoutine (). { isr_flag = 1; }
Den handleGesture () funksjon som er angitt i den neste delen. Denne funksjonen sjekker først tilgjengeligheten av bevegelsessensoren. Hvis den er tilgjengelig, leser den gestverdiene og sjekker hvilken gest den er (OPP, NED, HØYRE, VENSTRE, LANGT, NÆR) og skriver ut de tilsvarende verdiene til LCD.
ugyldig handleGesture () { if (apds.isGestureAvailable ()) { switch (apds.readGesture ()) { case DIR_UP: lcd.print ("UP"); forsinkelse (1000); lcd.clear (); gå i stykker; sak DIR_DOWN: lcd.print ("NED"); forsinkelse (1000); lcd.clear (); gå i stykker; sak DIR_LEFT: lcd.print ("LEFT"); forsinkelse (1000); lcd.clear (); gå i stykker; sak DIR_RIGHT: lcd.print ("RIGHT"); forsinkelse (1000); lcd.clear (); gå i stykker; sak DIR_NEAR: lcd.print ("NÆR"); forsinkelse (1000); lcd.clear (); gå i stykker; sak DIR_FAR: lcd.print ("FAR"); forsinkelse (1000); lcd.clear (); gå i stykker; standard: lcd.print ("INGEN"); forsinkelse (1000); lcd.clear (); } } }
Til slutt laster du opp koden til Arduino og venter på at sensoren skal initialiseres. Nå som knappen er slått AV, betyr det at den er i gestmodus. Så prøv å bevege hendene i retning venstre, høyre, opp, ned. For langt gest, holde hånden i en avstand på 2-4 inches fra sensor i 2-3 sekunder og fjerne det. Og for nær gest holde hånden langt fra sensor så ta det nære og fjerne det.
Slå nå PÅ knappen for å sette den i fargemåling og ta røde, blå og grønne gjenstander en etter en nær sensoren. Det vil skrive ut fargen på objektet.