- Požadované komponenty
- Úvod do APDS-9960 Digital Proximity RGB & Gesture Sensor
- Kruhový diagram
- Programování Arduina pro gesta a snímání barev
Dnes je většina telefonů vybavena funkcí ovládání gesty pro otevírání nebo zavírání jakékoli aplikace, spouštění hudby, účast na hovorech atd. Jedná se o velmi užitečnou funkci, která šetří čas a také vypadá skvěle ovládat jakékoli zařízení pomocí gest. Dříve jsme akcelerometr používali k výrobě robota ovládaného gesty a myši Air ovládané gesty. Ale dnes se učíme propojovat snímač gest APDS9960 s Arduino. Tento snímač má také snímač RGB pro detekci barev, který bude také použit v tomto výukovém programu. Pro detekci gest a barev tedy nemusíte používat samostatné senzory, ačkoli je k dispozici vyhrazený senzor pro detekci barev - barevný senzor TCS3200, který jsme již v Arduinu použili k výrobě stroje na třídění barev.
Požadované komponenty
- Arduino UNO
- APDS9960 RGB a snímač gest
- 16x2 LCD
- Přepínač DPDT
- 100K pot a 10K rezistor
- Propojovací kabely
Úvod do APDS-9960 Digital Proximity RGB & Gesture Sensor
APDS9960 je multifunkční senzor. Dokáže detekovat gesta, okolní světlo a hodnoty RGB ve světle. Tento senzor lze také použít jako senzor přiblížení a používá se většinou v chytrých telefonech k deaktivaci dotykové obrazovky během hovoru.
Tento senzor se skládá ze čtyř fotodiod. Tyto fotodiody detekují odraženou IR energii, která je přenášena palubní LED. Takže kdykoli je provedeno jakékoli gesto, pak se tato infračervená energie zablokuje a odráží se zpět k senzoru, nyní senzor detekuje informace (směr, rychlost) o gestu a převádí je na digitální informace. Tento senzor lze použít k měření vzdálenosti překážky detekcí odraženého IR světla. Má UV a IR blokovací filtry pro snímání barev RGB a pro každou barvu produkuje 16bitová data.
Vývod snímače APDS-9960 je uveden níže. Tento senzor pracuje na komunikačním protokolu I 2 C. Spotřebovává proud 1µA a je napájen 3,3V, takže buďte opatrní a nepřipojujte jej kolíkem 5V. Pin INT je zde přerušovací pin, který se používá k řízení komunikace I 2 C. Pin VL je volitelný napájecí pin pro palubní LED, pokud není připojena propojka PS. Pokud je propojka PS sepnuta, stačí napájet pouze kolík VCC, který bude napájet oba - modul i IR LED.
Kruhový diagram
Připojení pro APDS960 s Arduino je velmi jednoduché. K přepínání mezi dvěma režimy RGB Sensing a Sensing Gesture použijeme tlačítko DPDT. Nejprve jsou komunikační piny I2C SDA a SCL APDS9960 připojeny k pinům Arduino A4 a A5. Jak již bylo uvedeno výše, provozní napětí snímače je 3,3 V, takže VCC a GND APDS9960 jsou připojeny k 3,3 V a GND Arduina. Přerušovací kolík (INT) APDS9960 je připojen k D2 kolíku Arduina.
U LCD jsou datové piny (D4-D7) připojeny k digitálním piny D6-D3 Arduina a piny RS a EN jsou připojeny k D6 a D7 Arduina. V0 LCD je připojen k hrnci a 100K hrnec se používá k ovládání jasu LCD. U tlačítek DPDT jsme použili pouze 3 piny. Druhý pin je připojen k D7 pinu Arduina pro vstup a další dva jsou připojeny k GND a VCC následovaným 10K odporem.
Programování Arduina pro gesta a snímání barev
Programovací část je jednoduchá a snadná a kompletní program s ukázkovým videem je uveden na konci tohoto tutoriálu.
Nejprve musíme nainstalovat knihovnu od Sparkfunu. Chcete-li nainstalovat tuto knihovnu, přejděte na Skica-> Zahrnout knihovnu- > Spravovat knihovny.
Nyní do vyhledávacího pole zadejte „Sparkfun APDS9960“ a po zobrazení knihovny klikněte na tlačítko instalace.
A jsme připraveni jít. Začněme.
Nejprve tedy musíme zahrnout všechny požadované hlavičkové soubory. První záhlaví souboru LiquidCrystal.h se používá pro funkce LCD. Druhý hlavičkový soubor Wire.h se používá pro komunikaci I 2 C a poslední SparkFun_APDS996.h se používá pro senzor APDS9960.
#zahrnout
Nyní jsme v dalších řádcích definovali piny pro tlačítko 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 další části jsme definovali makro pro pin přerušení, který je připojen na digitální pin 2 a jednu proměnnou buttonState pro aktuální stav tlačítka a isr_flag pro rutinu služby přerušení.
#define APDS9960_INT 2 int buttonState; int isr_flag = 0;
Dále je pro SparkFun_APDS9960 vytvořen objekt, abychom mohli přistupovat k pohybům gest a načíst 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;
Ve funkci nastavení je prvním řádkem načtení hodnoty z tlačítka (nízká / vysoká) a druhý a třetí řádek definuje přerušení a pin tlačítka jako 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.begin (16, 2); }
Ve funkci smyčky první řádek získá hodnoty z tlačítka a uloží je do dříve definované proměnné buttonState . Nyní v dalších řádcích kontrolujeme hodnoty z tlačítka, pokud je vysoké, povolíme světelný senzor a pokud je nízké, inicializujeme senzor gest.
AttachInterrupt () je funkce pro externí přerušení, které je v tomto případě přerušení senzoru. Prvním argumentem v této funkci je číslo přerušení. V Arduino UNO existují dva digitální piny pro přerušení - 2 a 3 označené INT.0 a INT.1. A připojili jsme to k pinu 2, takže jsme tam napsali 0. Druhý argument volá funkci interruptRoutine (), která je definována později. Posledním argumentem je PÁD , aby spustil přerušení, když kolík poklesne z vysoké na nízkou. Další informace o přerušení Arduino naleznete zde.
void loop () { buttonState = digitalRead (buttonPin); if (buttonState == HIGH) { apds.enableLightSensor (true); }
V další části zkontrolujeme pin tlačítka. Pokud je vysoká, spusťte proces pro snímač RGB. Poté zkontrolujte, zda světelný senzor čte hodnoty nebo ne. Pokud není schopen číst hodnoty, v takovém případě vytiskněte „ Chyba při čtení hodnot světla“. A pokud dokáže číst hodnoty, porovnejte hodnoty tří barev a podle toho, která je nejvyšší, vytiskněte tuto barvu 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 při čtení hodnot světla"); } else { if (red_light> green_light) { if (red_light> blue_light) { lcd.print ("Red"); zpoždění (1000); lcd.clear (); } ……. ………..
V dalších řádcích znovu zkontrolujte pin tlačítka a pokud je nízký, zpracovejte snímač gest. Pak zkontrolujte isr_flag a pokud je 1, je volána funkce detachInterrupt () . Tato funkce se používá k vypnutí přerušení. Další řádek volá handleGesture (), což je funkce definovaná později. V dalších následujících řádcích definujte isr_flag na nulu a připojte přerušení.
else if (buttonState == LOW) { if (isr_flag == 1) { detachInterrupt (0); handleGesture (); isr_flag = 0; attachInterrupt (0, interruptRoutine, FALLING); } }
Další je funkce interruptRoutine () . Tato funkce se používá k otočení proměnné isr_flag 1, aby bylo možné inicializovat službu přerušení.
void interruptRoutine (). { isr_flag = 1; }
Funkce handleGesture () je definována v další části. Tato funkce nejprve zkontroluje dostupnost snímače gest. Pokud je k dispozici, přečte hodnoty gesta a zkontroluje, o jaké gesto se jedná (NAHORU, DOLŮ, VPRAVO, VLEVO, Daleko, NEAR) a vytiskne odpovídající hodnoty na LCD.
void handleGesture () { if (apds.isGestureAvailable ()) { switch (apds.readGesture ()) { case DIR_UP: lcd.print ("UP"); zpoždění (1000); lcd.clear (); přestávka; případ DIR_DOWN: lcd.print ("DOWN"); zpoždění (1000); lcd.clear (); přestávka; případ DIR_LEFT: lcd.print ("VLEVO"); zpoždění (1000); lcd.clear (); přestávka; případ DIR_RIGHT: lcd.print ("RIGHT"); zpoždění (1000); lcd.clear (); přestávka; případ DIR_NEAR: lcd.print ("NEAR"); zpoždění (1000); lcd.clear (); přestávka; případ DIR_FAR: lcd.print ("FAR"); zpoždění (1000); lcd.clear (); přestávka; výchozí: lcd.print ("ŽÁDNÝ"); zpoždění (1000); lcd.clear (); } } }
Nakonec nahrajte kód do Arduina a počkejte, až se senzor inicializuje. Když je tlačítko VYPNUTO, znamená to, že je v režimu gest. Zkuste tedy pohybovat rukama doleva, doprava, nahoru, dolů. U vzdáleného gesta držte ruku ve vzdálenosti 2–4 palců od snímače po dobu 2–3 sekund a sundejte ji. A pokud jde o gesto na blízko, držte ruku daleko od senzoru, poté ji přiblížte a odeberte.
Nyní zapněte tlačítko a přepněte jej do režimu snímání barev a pořiďte červené, modré a zelené objekty jeden po druhém poblíž senzoru. Vytiskne barvu objektu.