- Nødvendige komponenter
- Introduktion til APDS-9960 Digital Proximity RGB & Gesture Sensor
- Kredsløbsdiagram
- Programmering af Arduino til gestus- og farvesensing
I dag kommer de fleste telefoner med en gestusstyringsfunktion til at åbne eller lukke enhver app, starte musik, deltage i opkald osv. Dette er en meget praktisk funktion for at spare tid, og det ser også sejt ud at styre enhver enhed med bevægelser. Vi har tidligere brugt accelerometer til at bygge gestusstyret robot og gestusstyret luftmus. Men i dag lærer vi at interface en gestus sensor APDS9960 med Arduino. Denne sensor har også en RGB-sensor til at detektere farver, som også vil blive brugt i denne vejledning. Så du behøver ikke bruge separate sensorer til gestus- og farvedetektion, selvom der er en dedikeret sensor til farvedetektion - TCS3200-farvesensor, som vi allerede har brugt sammen med Arduino til at bygge en farvesorteringsmaskine.
Nødvendige komponenter
- Arduino UNO
- APDS9960 RGB og gestusføler
- 16x2 LCD
- DPDT-switch
- 100K pot og 10K modstand
- Jumperkabler
Introduktion til APDS-9960 Digital Proximity RGB & Gesture Sensor
APDS9960 er en multifunktionsføler. Det kan registrere bevægelser, omgivende lys og RGB-værdier i lys. Denne sensor kan også bruges som nærhedsføler og bruges mest i smartphones til at deaktivere berøringsskærmen, mens du deltager i et opkald.
Denne sensor består af fire fotodioder. Disse fotodioder registrerer den reflekterede IR-energi, der transmitteres af en indbygget LED. Så når der udføres en bevægelse, bliver denne IR-energi blokeret og reflekteres tilbage til sensoren, nu registrerer sensoren informationen (retning, hastighed) om gesten og konverterer den til digital information. Denne sensor kan bruges til at måle afstanden til forhindring ved at registrere reflekteret IR-lys. Det har UV- og IR-blokerende filtre til registrering af RGB-farver, og det producerer 16-bit data for hver farve.
Pin-out på APDS-9960-sensoren er vist nedenfor. Denne sensor fungerer på I 2 C kommunikationsprotokol. Det bruger 1 µA strøm og drives af 3,3 V, så vær forsigtig og tilslut den ikke med 5 V-ben. INT-stiften her er afbrydestift, som bruges til at drive I 2 C-kommunikationen. Og VL-pin er valgfri power pin til den indbyggede LED, hvis PS-jumperen ikke er tilsluttet. Hvis PS-jumperen er lukket, behøver du kun at tænde for VCC-pin, det vil give strøm til begge dele - modulet og IR-LED'en.
Kredsløbsdiagram
Forbindelser til APDS960 med Arduino er meget enkle. Vi bruger en DPDT-knap til at skifte mellem de to tilstande RGB Sensing og Gesture Sensing. For det første er I2C-kommunikationsstifterne SDA og SCL på APDS9960 tilsluttet henholdsvis Arduino-pin A4 og A5. Som tidligere nævnt er driftsspændingen for sensoren 3,3 v, så VCC og GND af APDS9960 er forbundet til 3,3 V og GND af Arduino. Afbrydelsesstiften (INT) på APDS9960 er tilsluttet D2-stiften på Arduino.
Til LCD er datapindene (D4-D7) tilsluttet til de digitale pinde D6-D3 på Arduino og RS, og EN-pinde er tilsluttet til D6 og D7 i Arduino. V0 på LCD er tilsluttet potten, og en 100K pot bruges til at kontrollere lysstyrken på LCD. Til DPDT-knapperne har vi kun brugt 3 ben. Den anden pin er tilsluttet D7 pin i Arduino til input, og de to andre er forbundet til GND og VCC efterfulgt af en 10K modstand.
Programmering af Arduino til gestus- og farvesensing
Programmeringsdelen er enkel og nem, og det komplette program med en demo-video gives i slutningen af denne vejledning.
Først skal vi installere et bibliotek lavet af Sparkfun. For at installere dette bibliotek skal du navigere til Skitse-> Inkluder bibliotek-> Administrer biblioteker.
Skriv nu “Sparkfun APDS9960” i søgefeltet, og klik på installationsknappen, når du ser biblioteket.
Og vi er klar til at gå. Lad os komme igang.
Så først skal vi inkludere alle de nødvendige headerfiler. Den første headerfil LiquidCrystal.h bruges til LCD-funktioner. Anden headerfil Wire.h bruges til I 2 C-kommunikation, og den sidste SparkFun_APDS996.h bruges til APDS9960-sensoren.
#omfatte
Nu i de næste linjer har vi defineret benene til knap og 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 den næste del, har vi defineret en makro til interrupt pin, som er forbundet på digital ben 2 og en variabel buttonState for den aktuelle tilstand af knappen og isr_flag for interrupt service rutine.
#definer APDS9960_INT 2 int buttonState; int isr_flag = 0;
Dernæst oprettes et objekt til SparkFun_APDS9960, så vi kan få adgang til gestusbevægelser og hente RGB-værdier.
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 opsætningsfunktion er den første linje at hente værdien fra knappen (lav / høj) og anden og tredje linje definerer afbrydelse og knapstift som input. apds.init () initialiserer APDS9960-sensoren og lcd.begin (16,2) initialiserer LCD'et.
ugyldig opsætning () { buttonState = digitalRead (buttonPin); pinMode (APDS9960_INT, INPUT); pinMode (buttonPin, INPUT); apds.init (); lcd.begin (16, 2); }
I loop- funktion får den første linje værdierne fra knappen og gemmer den i buttonState- variabel defineret tidligere. Nu i de næste linjer kontrollerer vi værdierne fra knappen. Hvis den er høj, aktiverer vi lyssensoren, og hvis den er lav, initialiser du derefter gestus-sensoren.
Den attachInterrupt () er en funktion, der anvendes til eksterne afbryder som i dette tilfælde er sensorens interrupt. Det første argument i denne funktion er interrupt number. I Arduino UNO er der to afbrydelsesstifter digitale stifter - 2 og 3 betegnet med INT.0 og INT.1. Og vi har forbundet det til pin 2, så vi har skrevet 0 der. Det andet argument kalder funktionen interruptRoutine (), som defineres senere. Det sidste argument FALDER, så det vil udløse afbrydelsen, når stiften går fra høj til lav. Lær mere om Arduino Interrupts her.
ugyldig sløjfe () { buttonState = digitalRead (buttonPin); hvis (buttonState == HIGH) { apds.enableLightSensor (true); }
I den næste del kontrollerer vi for knapnål. Hvis den er høj, skal du starte processen for RGB-sensoren. Kontroller derefter, om lyssensoren læser værdier eller ej. Hvis det ikke er i stand til at læse værdierne, skal du i så fald udskrive " Fejl ved læsning af lysværdier". Og hvis den kan læse værdier, skal du sammenligne værdierne for de tre farver og alt efter hvad der er højst, udskrive den farve til LCD'et.
if (buttonState == HIGH) { if (! apds.readAmbientLight (ambient_light) - ! apds.readRedLight (red_light) - ! apds.readGreenLight (green_light) - ! apds.readBlueLight (blue_light)) { lcd.print ("Fejl ved læsning af lysværdier"); } ellers { if (rød_lys> grøn_lys) { hvis (rød_lys> blå_lys) { lcd.print ("Rød"); forsinkelse (1000); lcd.clear (); } ……. ………..
I de næste linjer skal du igen kontrollere for knapnål, og hvis den er lav , skal du bevæge sensoren. Kontroller derefter for isr_flag, og hvis det er 1, kaldes en funktion detachInterrupt () . Denne funktion bruges til at slukke for afbrydelsen. Den næste linje kalder handleGesture (), som er funktionsdefineret senere. I de næste næste linjer definerer isr_flag til nul og vedhæfter afbrydelsen.
ellers hvis (buttonState == LOW) { hvis (isr_flag == 1) { detachInterrupt (0); handleGesture (); isr_flag = 0; attachInterrupt (0, interruptRoutine, FALLING); } }
Den næste er interruptRoutine () -funktion. Denne funktion bruges til at dreje isr_flag- variablen 1, så interrupt-tjenesten kan initialiseres.
void interruptRoutine (). { isr_flag = 1; }
Funktionen handleGesture () defineres i den næste del. Denne funktion kontrollerer først, om der er en bevægelsessensor. Hvis det er tilgængeligt, læser det gestusværdierne og kontrollerer, hvilken gestus det er (OP, NED, HØJRE, VENSTRE, FAR, NÆR) og udskriver de tilsvarende værdier til LCD.
ugyldig handleGesture () { if (apds.isGestureAvailable ()) { switch (apds.readGesture ()) { case DIR_UP: lcd.print ("UP"); forsinkelse (1000); lcd.clear (); pause; sag DIR_DOWN: lcd.print ("NED"); forsinkelse (1000); lcd.clear (); pause; sag DIR_LEFT: lcd.print ("LEFT"); forsinkelse (1000); lcd.clear (); pause; sag DIR_RIGHT: lcd.print ("RIGHT"); forsinkelse (1000); lcd.clear (); pause; sag DIR_NEAR: lcd.print ("NÆR"); forsinkelse (1000); lcd.clear (); pause; sag DIR_FAR: lcd.print ("FAR"); forsinkelse (1000); lcd.clear (); pause; standard: lcd.print ("INGEN"); forsinkelse (1000); lcd.clear (); } } }
Endelig upload koden til Arduino og vent på, at sensoren initialiseres. Mens knappen nu er slukket, betyder det, at den er i gestus-tilstand. Så prøv at bevæge dine hænder i retning mod venstre, højre, op, ned. For langt gestus, holde din hånd i en afstand af 2-4 inches fra sensor til 2-3 sekunder og fjern det. Og for nær gestus holde hånden langt fra sensoren derefter tage det nær og fjern det.
Tænd nu knappen for at sætte den i farvefølsom tilstand og tage røde, blå og grønne objekter en efter en tæt på sensoren. Det udskriver objektets farve.