- Požadované komponenty
- Úvod do digitálneho snímača priblíženia RGB a gesta APDS-9960
- Schéma zapojenia
- Programovanie Arduina pre gestá a snímanie farieb
Dnes je väčšina telefónov vybavená funkciou ovládania gestami, pomocou ktorej môžete otvárať alebo zatvárať ľubovoľné aplikácie, spúšťať hudbu, zúčastňovať sa hovorov atď. Jedná sa o veľmi užitočnú funkciu, ktorá šetrí čas, a tiež vyzerá v pohode ovládanie ľubovoľného zariadenia gestami. Predtým sme na výrobu robota ovládaného gestami a myši Air ovládanej gestami používali akcelerometer. Ale dnes sa naučíme prepojiť snímač gest APDS9960 s Arduinom. Tento snímač má tiež snímač RGB na detekciu farieb, ktorý sa tiež použije v tomto návode. Na detekciu gest a farieb teda nemusíte používať samostatné senzory, aj keď je k dispozícii špeciálny senzor na detekciu farieb - farebný senzor TCS3200, ktorý sme už v Arduine použili na výrobu stroja na triedenie farieb.
Požadované komponenty
- Arduino UNO
- APDS9960 RGB a snímač gest
- 16x2 LCD
- Prepínač DPDT
- 100K hrniec a 10K odpor
- Prepojovacie káble
Úvod do digitálneho snímača priblíženia RGB a gesta APDS-9960
APDS9960 je multifunkčný snímač. Dokáže detekovať gestá, okolité svetlo a hodnoty RGB vo svetle. Tento senzor je možné použiť aj ako senzor priblíženia a väčšinou sa používa v smartfónoch na deaktiváciu dotykovej obrazovky počas hovoru.
Tento snímač pozostáva zo štyroch fotodiód. Tieto fotodiódy detekujú odrazenú IR energiu, ktorá sa prenáša palubnou LED. Takže kedykoľvek sa vykoná akékoľvek gesto, potom sa táto infračervená energia zablokuje a odrazí sa späť k senzoru. Teraz senzor detekuje informácie (smer, rýchlosť) o geste a prevádza ich na digitálne informácie. Tento senzor možno použiť na meranie vzdialenosti prekážky detekciou odrazeného IR svetla. Má UV a IR blokujúce filtre na snímanie farieb RGB a pre každú farbu produkuje 16-bitové údaje.
Vývod senzora APDS-9960 je zobrazený nižšie. Tento senzor pracuje na komunikačnom protokole I 2 C. Spotrebováva prúd 1 µA a je napájaný napätím 3,3 V, takže buďte opatrní a nepripájajte ho pomocou kolíka 5 V. PIN INT je tu prerušovací pin, ktorý sa používa na riadenie komunikácie I 2 C. A kolík VL je voliteľný napájací kolík pre palubnú LED diódu, ak nie je pripojená prepojka PS. Ak je prepojka PS zatvorená, stačí napájať iba kolík VCC, ktorý napája obidva moduly - IR aj IR.
Schéma zapojenia
Pripojenia pre APDS960 s Arduinom sú veľmi jednoduché. Na prepínanie medzi dvoma režimami RGB Sensing a Gesture Sensing použijeme tlačidlo DPDT. Najprv sú komunikačné piny I2C SDA a SCL APDS9960 pripojené k pinu Arduino A4 a A5. Ako už bolo uvedené, prevádzkové napätie snímača je 3,3 V, takže VCC a GND APDS9960 sú pripojené k 3,3 V a GND Arduina. Kolík prerušenia (INT) APDS9960 je pripojený k kolíku D2 Arduina.
V prípade LCD sú dátové piny (D4-D7) pripojené k digitálnym pinom D6-D3 Arduina a piny RS a EN sú pripojené k D6 a D7 Arduina. V0 LCD je pripojený k hrncu a 100K hrniec sa používa na riadenie jasu LCD. Pre tlačidlá DPDT sme použili iba 3 piny. Druhý pin je pripojený k D7 pinu Arduina pre vstup a ďalšie dva sú pripojené k GND a VCC, za ktorým nasleduje 10K odpor.
Programovanie Arduina pre gestá a snímanie farieb
Programovacia časť je jednoduchá a ľahká a kompletný program s ukážkovým videom je uvedený na konci tohto tutoriálu.
Najskôr musíme nainštalovať knižnicu od spoločnosti Sparkfun. Ak chcete nainštalovať túto knižnicu, prejdite na Skica-> Zahrnúť knižnicu-> Spravovať knižnice.
Teraz do vyhľadávacieho panela napíšte „Sparkfun APDS9960“ a keď uvidíte knižnicu, kliknite na tlačidlo inštalácie.
A sme pripravení vyraziť. Začnime.
Najprv teda musíme zahrnúť všetky požadované hlavičkové súbory. Prvý hlavičkový súbor LiquidCrystal.h sa používa pre funkcie LCD. Druhý hlavičkový súbor Wire.h sa používa na komunikáciu I 2 C a posledný SparkFun_APDS996.h sa používa pre senzor APDS9960.
#include
Teraz sme v ďalších riadkoch definovali kolíky pre tlačidlá a 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);
V ďalšej časti sme definovali makro pre prerušovací pin, ktorý je pripojený na digitálny pin 2, a jednu premennú buttonState pre aktuálny stav tlačidla a isr_flag pre rutinu obsluhy prerušenia.
#define APDS9960_INT 2 int buttonState; int isr_flag = 0;
Ďalej sa pre SparkFun_APDS9960 vytvorí objekt, aby sme mohli pristupovať k pohybom gest a načítať hodnoty RGB.
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;
Vo funkcii nastavenia je prvým riadkom načítanie hodnoty z tlačidla (nízke / vysoké) a druhý a tretí riadok definuje prerušenie a kolík tlačidla ako vstup. apds.init () inicializuje senzor APDS9960 a lcd.begin (16,2) inicializuje LCD.
void setup () { buttonState = digitalRead (buttonPin); pinMode (APDS9960_INT, INPUT); pinMode (buttonPin, INPUT); apds.init (); lcd.začiatok (16, 2); }
Vo funkcii loop získa prvý riadok hodnoty z buttonu a uloží ich do predtým definovanej premennej buttonState . Teraz v ďalších riadkoch kontrolujeme hodnoty z tlačidla, ak je vysoké, potom povolíme svetelný senzor a ak je nízke, inicializujeme senzor gest.
AttachInterrupt () je funkcia pre externé prerušenie, ktoré je v tomto prípade prerušenia senzoru. Prvým argumentom v tejto funkcii je číslo prerušenia. V Arduino UNO existujú dva digitálne piny prerušovacích pinov - 2 a 3 označené INT.0 a INT.1. A spojili sme to s pinom 2, takže sme tam napísali 0. Druhý argument volá funkciu interruptRoutine (), ktorá je definovaná neskôr. Posledný argument padá , aby spustil prerušenie, keď kolík klesne z vysokej na nízku. Viac informácií o prerušeniach Arduina sa dozviete tu.
void loop () { buttonState = digitalRead (buttonPin); if (buttonState == HIGH) { apds.enableLightSensor (true); }
V ďalšej časti skontrolujeme pin špendlíka. Ak je vysoká, spustite proces pre snímač RGB. Potom skontrolujte, či svetelný senzor sníma hodnoty alebo nie. Ak nie je schopný prečítať hodnoty, v takom prípade vytlačte „ Chyba pri čítaní svetelných hodnôt“. A ak dokáže načítať hodnoty, porovnajte hodnoty troch farieb a podľa toho, ktorá je vyššia, vytlačte túto farbu na LCD.
if (buttonState == HIGH) { if (! apds.readAmbientLight (ambient_light) - ! apds.readRedLight (red_light) - ! apds.readGreenLight (green_light) - ! apds.readBlueLight (blue_light)) { lcd.print ("Chyba pri čítaní svetelných hodnôt"); } else { if (red_light> green_light) { if (red_light> blue_light) { lcd.print ("Red"); oneskorenie (1 000); lcd.clear (); } ……. ………..
V ďalších riadkoch opäť skontrolujte pin pinov, a ak je nízky, spracujte snímač gest. Potom skontrolujte isr_flag a ak je 1, zavolá sa funkcia detachInterrupt () . Táto funkcia sa používa na vypnutie prerušenia. Nasledujúci riadok volá handleGesture (), čo je funkcia definovaná neskôr. V ďalších nasledujúcich riadkoch definujeme isr_flag na nulu a pripojíme prerušenie.
else if (buttonState == LOW) { if (isr_flag == 1) { detachInterrupt (0); handleGesture (); isr_flag = 0; attachInterrupt (0, interruptRoutine, FALLING); } }
Ďalšou je funkcia interruptRoutine () . Táto funkcia sa používa na otočenie premennej isr_flag 1, aby bolo možné inicializovať službu prerušenia.
void interruptRoutine (). { isr_flag = 1; }
Funkcia handleGesture () je definovaná v nasledujúcej časti. Táto funkcia najskôr skontroluje dostupnosť snímača gest. Ak je k dispozícii, načíta hodnoty gesta a skontroluje, o ktoré gesto ide (HORE, DOLE, VPRAVO, VĽAVO, Ďaleko, Blízko) a vytlačí príslušné hodnoty na LCD.
void handleGesture () { if (apds.isGestureAvailable ()) { switch (apds.readGesture ()) { case DIR_UP: lcd.print ("UP"); oneskorenie (1 000); lcd.clear (); prestávka; prípad DIR_DOWN: lcd.print ("DOWN"); oneskorenie (1 000); lcd.clear (); prestávka; prípad DIR_LEFT: lcd.print ("LEVÝ"); oneskorenie (1 000); lcd.clear (); prestávka; case DIR_RIGHT: lcd.print ("RIGHT"); oneskorenie (1 000); lcd.clear (); prestávka; prípad DIR_NEAR: lcd.print ("NEAR"); oneskorenie (1 000); lcd.clear (); prestávka; prípad DIR_FAR: lcd.print ("FAR"); oneskorenie (1 000); lcd.clear (); prestávka; predvolené: lcd.print ("ŽIADNE"); oneskorenie (1 000); lcd.clear (); } } }
Nakoniec nahrajte kód do Arduina a počkajte, kým sa senzor inicializuje. Keď je tlačidlo vypnuté, znamená to, že je v režime gest. Skúste teda rukami pohybovať doľava, doprava, hore, dole. Pri vzdialenejšom geste držte ruku vo vzdialenosti 2 až 4 palce od snímača po dobu 2 - 3 sekúnd a vyberte ju. A pokiaľ ide o gesto na blízko, držte ruku ďalej od senzora, potom ju vezmite blízko a vyberte ju.
Teraz zapnite tlačidlo, aby sa preplo do režimu snímania farieb, a snímajte červené, modré a zelené objekty jeden po druhom v blízkosti snímača. Vytlačí farbu objektu.