- Szükséges alkatrészek
- Bevezetés az APDS-9960 digitális közelségi RGB és gesztusérzékelőhöz
- Kördiagramm
- Az Arduino programozása a gesztushoz és a színérzékeléshez
Ma a legtöbb telefon gesztusvezérlő funkcióval rendelkezik bármely alkalmazás megnyitásához vagy bezárásához, zenék indításához, hívásokon való részvételhez stb. Ez nagyon hasznos funkció az időmegtakarítás érdekében, és nagyon jónak tűnik bármilyen eszköz kézmozdulatokkal történő irányítása is. Korábban gyorsulásmérőt használtunk gesztusvezérelt robot és gesztusvezérelt Air egér felépítéséhez. De ma megtanuljuk összekapcsolni az APDS9960 gesztusérzékelőt az Arduinóval. Ez az érzékelő egy RGB érzékelővel is rendelkezik a színek észleléséhez, amelyet ebben az oktatóanyagban is használni fogunk. Tehát nem kell külön érzékelőket használni a gesztusok és a színérzékeléshez, bár rendelkezésre áll egy külön érzékelő a színfelismeréshez - TCS3200 színérzékelő, amelyet az Arduino-val már használtunk egy színválogató gép felépítéséhez.
Szükséges alkatrészek
- Arduino UNO
- APDS9960 RGB és gesztusérzékelő
- 16x2 LCD
- DPDT kapcsoló
- 100K pot és 10K ellenállás
- Jumper kábelek
Bevezetés az APDS-9960 digitális közelségi RGB és gesztusérzékelőhöz
Az APDS9960 egy többfunkciós érzékelő. Felismerheti a gesztusokat, a környezeti fényt és az RGB értékeket. Ez az érzékelő használható közelségi érzékelőként is, és leginkább okostelefonokban használják, hogy az érintőképernyőt hívás közben letiltsák.
Ez az érzékelő négy fotodiódából áll. Ezek a fotodiódák érzékelik a visszavert IR energiát, amelyet egy fedélzeti LED továbbít. Tehát, amikor bármilyen gesztust végrehajtanak, ez az IR-energia akadályozódik és visszatükröződik az érzékelő felé, most az érzékelő észleli a gesztusról szóló információt (irányt, sebességet) és átalakítja digitális információvá. Ez az érzékelő használható az akadály távolságának mérésére a visszavert IR fény érzékelésével. UV és IR blokkoló szűrőkkel rendelkezik az RGB színek érzékeléséhez, és minden színhez 16 bites adatokat állít elő.
Az APDS-9960 érzékelő kihúzása az alábbiakban látható. Ez az érzékelő az I 2 C kommunikációs protokollon működik. 1µA áramot fogyaszt és 3,3 V-ot táplál, ezért legyen óvatos, és ne csatlakoztassa 5 V-os csatlakozóval. Az INT pin itt megszakító pin, amelyet az I 2 C kommunikáció meghajtására használnak. Ha a PS-jumper nincs csatlakoztatva, a VL-tű opcionális tápkábel a fedélzeti LED-hez. Ha a PS jumper zárva van, akkor csak a VCC csapot kell táplálnia, ez energiát szolgáltat mind a modulnak, mind az IR LED-nek.
Kördiagramm
Az APDS960 és az Arduino összekapcsolása nagyon egyszerű. DPDT gombbal válthatunk az RGB érzékelés és a Gesztus érzékelés két mód között. Először az APDS9960 I2C kommunikációs érintkezői, az SDA és az SCL csatlakoznak az Arduino A4 és A5 tűhöz. Mint korábban említettük, az érzékelő működési feszültsége 3,3 V, így az APDS9960 VCC-je és GND-je az Arduino 3,3 V-jához és GND-jéhez csatlakozik. Az APDS9960 megszakító tűje (INT) az Arduino D2 tűjéhez csatlakozik.
Mert LCD adatokat csapok (D4-D7) is csatlakozik a digitális csapok D6-D3 Arduino és az RS és az EN csapok vannak kötve D6 és D7 Arduino. Az LCD V0-ja csatlakozik az edényhez, és egy 100K-os potot használnak az LCD fényerejének szabályozásához. A DPDT gombokhoz csak 3 csapot használtunk. A második tű az Arduino D7-es csatlakozójához van csatlakoztatva a bemenethez, a másik kettő pedig a GND-hez és a VCC-hez, majd egy 10K-os ellenálláshoz.
Az Arduino programozása a gesztushoz és a színérzékeléshez
A programozási rész egyszerű és egyszerű, és a bemutató videóval ellátott teljes program a bemutató végén található.
Először telepítenünk kell egy Sparkfun által készített könyvtárat. A könyvtár telepítéséhez keresse meg a Vázlat-> Könyvtár befogadása-> Könyvtárak kezelése menüpontot.
Most írja be a keresősávba a „Sparkfun APDS9960” szót, és kattintson a telepítés gombra, amikor megjelenik a könyvtár.
És készek vagyunk indulni. Kezdjük el.
Tehát először be kell vonnunk az összes szükséges fejlécfájlt. Az első LiquidCrystal.h fejlécfájlt az LCD funkciókhoz használják. Második fejlécfájl Wire.h használják I 2 C kommunikáció és utoljára SparkFun_APDS996.h használják APDS9960 érzékelőt.
#include
A következő sorokban meghatároztuk a gombok és az LCD csapjait.
const int gombPin = 7; const int rs = 12, en = 11, d4 = 6, d5 = 5, d6 = 4, d7 = 3; LiquidCrystal lcd (rs, en, d4, d5, d6, d7);
A következő részben meghatároztunk egy makrót a megszakítási tűhöz, amely a 2. digitális érintkezőhöz van csatlakoztatva, és egy változó buttonState- t a gomb és az isr_flag jelenlegi állapotához a megszakítási szolgáltatási rutinhoz.
#define APDS9960_INT 2 int buttonState; int isr_flag = 0;
Ezután egy objektum jön létre a SparkFun_APDS9960 számára, hogy hozzáférhessünk a mozdulatokhoz és lehívjuk az RGB értékeket.
SparkFun_APDS9960 apds = SparkFun_APDS9960 (); uint16_t környezeti fény = 0; uint16_t piros_fény = 0; uint16_t zöld_fény = 0; uint16_t kék_fény = 0;
A beállítási funkcióban az első sor az érték lekérése a gombból (alacsony / magas), a második és harmadik sor pedig a megszakítást és a gomb rögzítését adja meg bemenetként. A apds.init () inicializálja az APDS9960 érzékelőt, az lcd.begin (16,2) pedig az LCD-t.
void setup () { buttonState = digitalRead (buttonPin); pinMode (APDS9960_INT, INPUT); pinMode (buttonPin, INPUT); apds.init (); lcdbegin (16, 2); }
A loop funkció az első sorban kapja az értékeket gombot, és tárolja azt buttonState definiált változó korábban. Most a következő sorokban ellenőrizzük az értékeket a gombról, ha magas, akkor engedélyezzük a fényérzékelőt, és ha alacsony, akkor inicializáljuk a gesztusérzékelőt.
Az attachInterrupt () a külső megszakításhoz használt funkció, amely ebben az esetben az érzékelő megszakítása. A függvény első argumentuma a megszakítás száma. Az Arduino UNO-ban két megszakítótűs digitális érintkező van - 2 és 3, amelyeket INT.0 és INT.1 jelöl. És csatlakoztattuk a 2. tűhöz, így 0-t írtunk oda. A második argumentum a később definiált pertRoutine () függvényt hívja meg. Az utolsó argumentum a FALLING, így kiváltja a megszakítást, amikor a pin magasról alacsonyra megy. Tudjon meg többet az Arduino megszakításokról itt.
void loop () { buttonState = digitalRead (buttonPin); if (buttonState == HIGH) { apds.enableLightSensor (true); }
A következő részben ellenőrizzük a gombostűt. Ha magas, akkor indítsa el az RGB érzékelő folyamatát. Ezután ellenőrizze, hogy a fényérzékelő értékeket olvas-e vagy sem. Ha nem képes beolvasni az értékeket, akkor ebben az esetben nyomtassa ki a " Hiba a fényértékek olvasásakor" c. Ha pedig le tudja olvasni az értékeket, hasonlítsa össze a három szín értékét, és amelyik a legmagasabb, nyomtassa ki ezt a színt az LCD-re.
if (buttonState == HIGH) { if (! apds.readAmbientLight (ambient_light) - ! apds.readRedLight (red_light) - ! apds.readGreenLight (green_light) - ! apds.readBlueLight (blue_light)) { lcd.print ("Hiba a fényértékek olvasásakor"); } else { if (vörös_fény> zöld_fény) { if (vörös_fény> kék_fény) { lcd.print ("piros"); késés (1000); lcd.clear (); } ……. ………..
A következő sorokban ismét ellenőrizze, hogy nincs-e gombostű, és ha alacsony, dolgozza fel a Gesztus érzékelőt. Ezután ellenőrizze, hogy van- e az isr_flag, és ha 1, akkor a detachInterrupt () függvény meghívásra kerül. Ez a funkció a megszakítás kikapcsolására szolgál. A következő sor meghívja a handleGesture () függvényt, amelyet később definiálunk. A következő következő sorokban definiálja az isr_flag értéket nullára, és csatolja a megszakítást.
else if (buttonState == LOW) { if (isr_flag == 1) { detachInterrupt (0); handleGesture (); isr_flag = 0; attachInterrupt (0,ruptRoutine, FALLING); } }
A következő aruptRoutine () függvény. Ez a függvény az isr_flag 1 változó elfordítására szolgál , hogy a megszakítási szolgáltatás inicializálható legyen.
érvénytelen megszakításRutin (). { isr_flag = 1; }
A handleGesture () függvény a következő részben kerül meghatározásra. Ez a funkció először a gesztusérzékelő elérhetőségét ellenőrzi. Ha elérhető, akkor kiolvassa a gesztusértékeket és ellenőrzi, hogy melyik gesztusról van szó (FEL, LE, JOBB, BAL, FAR, KÖZEL), és kinyomtatja a megfelelő értékeket az LCD-re.
void handleGesture () { if (apds.isGestureAvailable ()) { switch (apds.readGesture ()) { eset DIR_UP: lcd.print ("UP"); késés (1000); lcd.clear (); szünet; eset DIR_DOWN: lcd.print ("DOWN"); késés (1000); lcd.clear (); szünet; eset DIR_LEFT: lcd.print ("BAL"); késés (1000); lcd.clear (); szünet; eset DIR_RIGHT: lcd.print ("JOBB"); késés (1000); lcd.clear (); szünet; DIR_NEAR eset: lcd.print ("NEAR"); késés (1000); lcd.clear (); szünet; eset DIR_FAR: lcd.print ("FAR"); késés (1000); lcd.clear (); szünet; alapértelmezett: lcd.print ("NINCS"); késés (1000); lcd.clear (); } } }
Végül töltse fel a kódot az Arduino-ra, és várja meg, amíg az érzékelő inicializálódik. A gomb kikapcsolt állapotában most azt jelenti, hogy gesztus módban van. Tehát próbáld meg balra, jobbra, felfelé, lefelé irányban mozgatni a kezed. Mert messze gesztus, kezét tartsa a parttól 2-4 centiméterre érzékelő 2-3 másodpercig, majd távolítsa el. És közel gesztus kezét tartsa távol érzékelő majd vegyük közeli és távolítsa el.
Most kapcsolja BE a gombot, hogy színérzékelési üzemmódba kapcsolja, és vörös, kék és zöld tárgyakat egyenként vigyen az érzékelő közelébe. Ez kinyomtatja az objektum színét.