Tartalomjegyzék:

Nem blokkoló APDS9960 gesztusérzékelő megvalósítása: 5 lépés
Nem blokkoló APDS9960 gesztusérzékelő megvalósítása: 5 lépés

Videó: Nem blokkoló APDS9960 gesztusérzékelő megvalósítása: 5 lépés

Videó: Nem blokkoló APDS9960 gesztusérzékelő megvalósítása: 5 lépés
Videó: Radardetektorok - nem csak férfiaknak! 2024, Július
Anonim
Nem blokkoló APDS9960 gesztusérzékelő megvalósítása
Nem blokkoló APDS9960 gesztusérzékelő megvalósítása
Nem blokkoló APDS9960 gesztusérzékelő megvalósítása
Nem blokkoló APDS9960 gesztusérzékelő megvalósítása
Nem blokkoló APDS9960 gesztusérzékelő megvalósítása
Nem blokkoló APDS9960 gesztusérzékelő megvalósítása

Preambulum

Ez az útmutató leírja, hogyan hozhat létre blokkolásmentes megvalósítást az APDS9960 gesztusérzékelőből a SparkFun_APDS-9960_Sensor_Arduino_Library segítségével.

Bevezetés

Tehát valószínűleg azt kérdezi magától, hogy mi az, ami nem blokkol? Vagy akár blokkolni is?

Ennél is fontosabb, hogy miért fontos, hogy a blokkolásmentes minden rendben legyen?

Rendben, tehát amikor egy mikroprocesszor futtat egy programot, akkor sorban végrehajtja a kódsorokat, és ezzel hívásokat kezdeményez, és visszatér azokból a függvények szerint, ahogyan azokat írta.

A blokkoló hívás csak hívás bármilyen funkcióra, amely a végrehajtás leállítását okozza, vagyis olyan függvényhívást, amelyben a hívó nem folytatja a végrehajtást, amíg a hívott funkció végrehajtása befejeződik.

Akkor miért fontos ez?

Abban az esetben, ha olyan kódot írt, amelynek rendszeresen számos funkciót kell végrehajtania egymás után, mint például a hőmérséklet leolvasása, a gomb elolvasása és a kijelző frissítése, ha a kijelző frissítésére szolgáló kód blokkoló hívás, akkor a rendszer nem reagál gombnyomások és hőmérsékletváltozások, mivel a processzor minden idejét azzal várja, hogy a kijelző frissül, és nem olvassa le a gomb állapotát vagy a legújabb hőmérsékletet.

A magam részéről szeretnék létrehozni egy MQTT -t WiFi -n keresztül képes IoT asztali eszközön, amely leolvassa mind a helyi, mind a távoli hőmérséklet/páratartalom értékeket, a környezeti fényszintet, a légköri nyomást, nyomon követi az időt, megjeleníti ezeket a paramétereket egy LCD -n, bejelentkezik az uSD -re kártyát valós időben, olvassa be a gombok bemeneteit, írjon a kimeneti LED-ekhez és figyelje a gesztusokat az IoT infrastruktúrámban lévő dolgok vezérléséhez, és mindezt egy ESP8266-12 vezérli.

Sajnos csak az APDS9960 könyvtár két forrását találtam, amelyek a SparkFun és az AdaFruit könyvtárak voltak, mindkettő az Avago (az ADPS9960 gyártó) alkalmazáskódjából lett kitörve, és egy „readGesture” nevű hívást tartalmaz, amely egy ideig tartalmaz (1) {}; hurok, amely a fenti projektben való használatakor az ESP8266-12E alaphelyzetbe állítását eredményezi, amikor az ADPS9960 érzékelő telítődik (azaz amikor egy tárgy a közelben maradt, vagy ha az infravörös forrás megvilágította az érzékelőt).

Következésképpen ennek a viselkedésnek a kiküszöbölésére úgy döntöttem, hogy a gesztusok feldolgozását áthelyezem egy második processzorba, ahol az ESP8266-12E lett a fő mikrovezérlő, ez a rendszer pedig a szolga, amint azt a fenti 1. és 2. kép, a rendszer áttekintése és a rendszerösszetétel diagramja mutatja.. A 3. kép a prototípus áramkört mutatja.

Annak érdekében, hogy korlátozzam a meglévő kódomon végrehajtandó módosításokat, írtam egy csomagoló osztályt/könyvtárat is, fantáziadúsan „APDS9960_NonBlocking” néven.

Az alábbiakban részletesen ismertetjük a blokkolásmentes megoldást.

Milyen alkatrészekre van szükségem?

Ha az AP29960_NonBlocking könyvtárral működő I2C megoldást kívánja létrehozni, akkor a következő alkatrészekre lesz szüksége.

  1. 1 kedvezmény az ATMega328P -ről itt
  2. 1 kedvezmény PCF8574P -ről itt
  3. 6 off 10K ellenállás itt
  4. 4 off 1K ellenállás itt
  5. 1 ki 1N914 dióda itt
  6. 1 kedvezmény PN2222 NPN tranzisztor itt
  7. Itt 1 db 16MHz -es kristály
  8. 2 ki 0,1uF kondenzátor itt
  9. Itt 1 db 1000uF elektrolit kondenzátor
  10. 1 off 10uF elektrolit kondenzátor itt
  11. 2 db 22pF kondenzátor itt

Ha le szeretné olvasni a gesztusérzékelő kimenetét a párhuzamos interfészen keresztül, akkor elengedheti a PCF8574P -t és három 10K -s ellenállást.

Milyen szoftverre van szükségem?

Arduino IDE 1.6.9

Milyen készségekre van szükségem?

A rendszer beállításához használja a (mellékelt) forráskódot, és hozza létre a szükséges áramkört, a következőkre lesz szüksége;

  • Minimális elektronikai ismeretek,
  • Az Arduino és az IDE ismerete,
  • A beágyazott Arduino programozásának megértése (lásd az utasításokat „Az ATTiny85, ATTiny84 és ATMega328P programozása: Arduino mint ISP”)
  • Némi türelem.

Érintett témák

  • Az áramkör rövid áttekintése
  • A szoftver rövid áttekintése
  • Az APDS9960 gesztusérzékelő eszközének tesztelése
  • Következtetés
  • Hivatkozások

1. lépés: Áramkör áttekintése

Áramkör áttekintés
Áramkör áttekintés

Az áramkör két részre van osztva;

  • Az első a soros I2C párhuzamos átalakítás, amelyet az R8… 10 és IC1 ellenállásokon keresztül hajtanak végre. Itt R8… R10 állítsa be az IC2 és a NXP PCF8574A 8 bites I/O bővítő chip I2C címét. Az eszköz érvényes címtartományai 0x38… 0x3F. Az „I2C_APDS9960_TEST.ino” I2C szoftver példában a #define GESTURE_SENSOR_I2C_ADDRESS címet kell módosítani, hogy megfeleljen ennek a címtartománynak.
  • Az összes többi összetevő egy slave beágyazott Arduino Uno -t alkot, és a következő funkciókkal rendelkezik:

    • Az R1, T1, R2 és D1 slave eszköz reset bemenetet biztosít. Itt az IC1 - P7 aktív magas impulzusa kényszeríti az U1 alaphelyzetbe állítását.
    • Az R3, R4 áramkorlátozó ellenállások a TX/RX vonalakat programozó beágyazott eszközhöz.
    • A C5 és az R7 lehetővé teszi, hogy az Arduino IDE automatikusan programozza az U1 -et egy csatlakoztatott FTDI eszköz DTR vonalán lévő impulzuson keresztül.
    • Az R5 és R6 I2C felhúzó ellenállások az APDS9960 készülékhez, a C6 pedig a helyi tápcsatornák leválasztását biztosítja.
    • U1, C1, C2 és Q1 képezik a beágyazott Arduino Uno -t és az órát.
    • Végül a C3 és C4 biztosítja az U1 helyi ellátó sín leválasztását.

2. lépés: A szoftver áttekintése

Szoftver áttekintés
Szoftver áttekintés
Szoftver áttekintés
Szoftver áttekintés
Szoftver áttekintés
Szoftver áttekintés

Preambulum

A forráskód sikeres lefordításához a következő kiegészítő könyvtárakra lesz szüksége a beágyazott Arduino Uno U1 programozásához;

SparkFun_APDS9960.h

  • Szerző: Steve Quinn
  • Cél: Ez a SparkFun APDS9960 érzékelő villás változata a jonn26/SparkFun_APDS-9960_Sensor_Arduino_Library forrásból. Néhány módosítással segíti a hibakeresést, és érzéketlenített érzékelővel rendelkezik a hamis indítás csökkentése érdekében.
  • Innen:

APDS9960_NonBlocking.h

  • Szerző: Steve Quinn
  • Cél: Tiszta felületet biztosít az APDS9960 gesztusérzékelő nem blokkoló megvalósításának beágyazásához az Arduino kódjába.
  • Innen:

A beágyazott Arduino Uno (ATMega328P) mikrovezérlő programozásáról lásd az alábbi útmutatót, ha nem ismeri ennek elérését;

ATTINY85, ATTINY84 ÉS ATMEGA328P PROGRAMOZÁSA: ARDUINO ISP

Funkcionális áttekintés

Az ATMega328P beágyazott szolga mikrovezérlő lekérdezi az INT vonalat az ADPS9960 -ból. Amikor ez a sor lecsökken, a mikrokontroller beolvassa az ADPS9960 regisztereket, és megállapítja, hogy érvényes gesztusérzékelés történt -e. Ha érvényes gesztust észlelt, ennek a gesztusnak a kódja 0x0… 0x6, 0xF kerül a B portra, és az „nGestureAvailable” érték alacsony.

Amikor a mester eszköz aktívnak látja az „nGestureAvailable” értéket, akkor beolvassa a B porton lévő értéket, majd ideiglenesen alacsony ngestureclear impulzust jelez az adatok fogadásának megerősítésére.

A szolga eszköz ezután megszünteti az „nGestureAvailable” értékét, és törli az adatokat a B porton. A fenti 5. ábrán egy logikai elemzőből vett képernyőrablás látható a teljes észlelési/olvasási ciklus során.

Kód áttekintés

A fenti 1. kép részletezi, hogyan működik az U1 -ben található szoftver, a beágyazott szolga Arduino Uno, valamint a 2. kép, hogyan hat a két háttér/előtér feladat. A 3. kép egy kódrészlet, amely az APDS9960_NonBlockinglibrary használatát mutatja be. A 4. kép feltérképezi az Arduino Uno Digital Pins és az ATMega328P valódi hardvertűit.

Az alaphelyzetbe állítást követően a beágyazott szolga mikrokontroller inicializálja az APDS9960 -at, lehetővé téve a gesztusérzékelésnek az INT kimenet aktiválását, és konfigurálja az I/O -t, csatolva a megszakítási szolgáltatási rutinot (ISR) 'GESTURE_CLEAR ()' az INT0 vektor megszakításához (2. digitális tű, hardver IC 4. tű), konfigurálása leeső élű triggerhez. Ez képezi a nGestureClear bemenetet a fő eszközről.

Az APDS9960 „INT” megszakító kimeneti csapja a Digital Digital 4, Hardware IC Pin 6 csatlakozóhoz van csatlakoztatva, amely U1 bemenetként van konfigurálva.

Az „nGestureAvailable” jelvonal a 7. számú digitális tűn, a hardver IC 13. tűjén kimenetként van konfigurálva, és magas, inaktív (nincs érvényesítve).

Végül a B port 0… 3 bitjei kimenetként vannak konfigurálva, és alacsonyra vannak állítva. Ezek alkotják az adatrágást, amely a különböző észlelt gesztustípusokat reprezentálja; Nincs = 0x0, hiba = 0xF, fel = 0x1, le = 0x2, bal = 0x3, jobb = 0x4, közel = 0x5 és távol = 0x6.

A „Hurok” háttérfeladat ütemezése megtörténik, amely folyamatosan lekérdezi az APDS9960 megszakítás INT kimenetét a 4. digitális tűn. Ha az APDS9960 INT kimenete alacsony szintre lép, jelezve, hogy az érzékelő aktiválódott, a mikrokontroller megpróbálja értelmezni a gesztusokat a „readGesture () 'with while (1) {}; végtelen hurok.

Ha érvényes gesztust észlelt, akkor ezt az értéket a B portba írja, érvényesíti az „nGestureAvailable” kimenetet, és beállítja a „bGestureAvailable” logikai szemaforot, megakadályozva a további gesztusok naplózását.

Miután a mester észleli az aktív „nGestureAvailable” kimenetet, beolvassa ezt az új értéket, és impulzusként „nGestureClear” impulzust küld. Ez a csökkenő él elindítja az „ISR GESTURE_CLEAR ()” előtérbeli feladat ütemezését, amely felfüggeszti a „Loop” háttérfeladat végrehajtását, törli a B portot, a „bGestureAvailable” szemaforot és az „nGestureAvailable” kimenetet.

A „GESTURE_CLEAR ()” előtérbeli feladat most fel van függesztve, és a „Hurok” háttérfeladat ütemezett. Az APDS9960 további gesztusai most érzékelhetők.

A megszakítás által kiváltott előtér/háttér feladatok ilyen módon történő használatával a slave eszköz „readGesture ()” lehetséges végtelen ciklusa nem befolyásolja a master eszköz működését, és nem akadályozza a slave eszköz végrehajtását sem. Ez egy nagyon egyszerű valós idejű operációs rendszer (RTOS) alapját képezi.

Megjegyzés: Az „n” előtag aktív alacsony vagy azt jelenti, hogy az „nGestureAvailable”

3. lépés: A nem blokkoló APDS9960 gesztusérzékelő eszköz tesztelése

A blokkolásmentes APDS9960 gesztusérzékelő eszköz tesztelése
A blokkolásmentes APDS9960 gesztusérzékelő eszköz tesztelése
A blokkolásmentes APDS9960 gesztusérzékelő eszköz tesztelése
A blokkolásmentes APDS9960 gesztusérzékelő eszköz tesztelése
A blokkolásmentes APDS9960 gesztusérzékelő eszköz tesztelése
A blokkolásmentes APDS9960 gesztusérzékelő eszköz tesztelése
A blokkolásmentes APDS9960 gesztusérzékelő eszköz tesztelése
A blokkolásmentes APDS9960 gesztusérzékelő eszköz tesztelése

Preambulum

Annak ellenére, hogy az APDS9960 modult +5 V tápfeszültséggel szállítják, beépített +3v3 szabályozót használ, ami azt jelenti, hogy az I2C vonalak +3v3 kompatibilisek, és nem +5v. Ezért úgy döntöttem, hogy a +3v3 -kompatibilis Arduino Due -t használom teszt mikrovezérlőként, hogy elkerüljem a szintváltók szükségességét.

Ha azonban tényleges Arduino Uno -t szeretne használni, akkor az I2C vonalakat szintre kell tolnia U1 -re. Lásd az alábbi Instructable alkalmazást, ahol egy hasznos diakészletet csatoltam (I2C_LCD_With_Arduino), amely sok praktikus tippet ad az I2C használatához.

I2C interfész tesztelés

A fenti 1. és 2. kép bemutatja, hogyan kell beállítani és programozni a rendszert az I2C interfészhez. Először le kell töltenie és telepítenie kell az APDS9960_NonBlocking könyvtárat. itt

Párhuzamos interfész tesztelés

A 3. és 4. kép ugyanazt mutatja a párhuzamos felületen

4. lépés: Következtetés

Következtetés
Következtetés

Tábornok

A kód jól működik, és érzékenyen érzékeli a gesztusokat, hamis pozitív eredmények nélkül. Néhány hete működik és működik, mint rabszolga eszköz a következő projektemben. Sok különböző hibamódot kipróbáltam (és a kíváncsi Quinn háztartási moggie is), amelyek korábban ESP8266-12 visszaállítást eredményeztek, negatív hatás nélkül.

Lehetséges fejlesztések

  • A nyílvánvaló. Írja át újra az APDS9960 gesztusérzékelő könyvtárát, hogy ne legyen blokkoló.

    Valójában kapcsolatba léptem a Broadcom -tal, aki egy helyi forgalmazóhoz fordított, aki azonnal figyelmen kívül hagyta a támogatási kérelmemet, azt hiszem, nem vagyok SparkFun vagy AdaFruit. Tehát erre valószínűleg még várni kell egy darabig

  • Portolja át a kódot egy kisebb szolga mikrovezérlőbe. Az ATMega328P használata egy feladathoz kissé túlzás. Bár kezdetben megnéztem az ATTiny84 -et, abbahagytam annak használatát, mivel úgy éreztem, hogy a kód összeállított mérete határvonalra illeszkedik. Az APDS9960 könyvtárat úgy kell módosítani, hogy egy másik I2C könyvtárral működjön.

5. lépés: Hivatkozások

A beágyazott arduino programozásához szükséges (ATMega328P - U1)

SparkFun_APDS9960.h

  • Szerző: Steve Quinn
  • Cél: Ez a SparkFun APDS9960 érzékelő villás változata a jonn26/SparkFun_APDS-9960_Sensor_Arduino_Library forrásból. Néhány módosítással segíti a hibakeresést, és érzéketlenített érzékelővel rendelkezik a hamis indítás csökkentése érdekében.
  • Innen:

Szükséges, hogy ezt a nem blokkoló funkciót beágyazza az arduino kódjába, és dolgozzon példákat

APDS9960_NonBlocking.h

  • Szerző: Steve Quinn
  • Cél: Tiszta felületet biztosít az APDS9960 gesztusérzékelő nem blokkoló megvalósításának beágyazásához az Arduino kódjába.
  • Innen:

Valós idejű operációs rendszer

https://en.wikipedia.org/wiki/Real-time_operating_system

APDS9960 Adatlap

https://cdn.sparkfun.com/assets/learn_tutorials/3/2/1/Avago-APDS-9960-datasheet.pdf

Ajánlott: