A Grid-EYE szenzor
Mint azt már az olvasó tudja, a Panasonic Grid-EYE eszköze egy 8×8-as MEMS-technológiára épülő hőelemmátrix, azaz 64 különálló szenzorral képes abszolút hőmérsékletet detektálni az objektum által kibocsátott infravörös sugárzás érzékelésével.
A Grid-EYE képes a hőmérséklet és a hőmérsékleti gradiens észlelésére és egyszerű, kis felbontású (8×8=64 pixeles) hőkép felvételére is.
A végtermékfejlesztés megkönnyítésére készített, a szenzort és soros kommunikációs interfészt tartalmazó kártya kialakítása alkalmassá teszi az ARDUINO DUE miniszámítógéphez illeszkedő „shield”-ként való használatára.
Fontos felhívnunk a figyelmet arra, hogy a Grid-EYE kiértékelőkit 3,3 V-os kártya, így csak az Arduino DUE számítógépekkel működik. Az UNO-hoz már csak fizikai kialakítása miatt sem alkalmazható, a MEGA verziók, bár rendelkeznek a megfelelő csatlakozókkal, melyek látszólag illeszkednek is a kártya fizikai csatlakozásaihoz, azok 5 V-os feszültségszintje miatt nem kompatibilisek a 3,3 V-os Grid-EYE Evaluation kittel.
A feladat
A megvalósítandó szimulációs feladat során az Arduino számítógéppel az I2C buszon keresztül kiolvassuk a 64 pixel hőmérsékleti adatait.
A lapon található egy termisztor is, mely a NYÁK környezeti hőmérsékletét méri, természetesen ennek adatára is szükség van. A kéz érzékelését az egyszerűség kedvéért úgy végezzük, hogy azon pixelek hőmérsékletadatait, melyek a szenzor környezeti hőmérsékleténél nagyobb értékkel rendelkeznek, összeátlagoljuk, és amennyiben ez az érték 5 °C-kal meghaladja a szoba hőmérsékletétől függően beállított határértéket, úgy feltételezzük a hőforrás jelenlétét, és egy digitális kimenet logikai magas szintre állításával egy relét kapcsolunk.
Az Arduino DUE számítógép
Az Arduino Due az Atmel SAM3X8E ARM Cortex-M3 CPU-ra épülő mikrokontrollerlap. Ez az Arduino-család első, 32 bit ARM magra épülő tagja. 54 digitális I/O porttal rendelkezik, melyek közül 12 PWM-kimenetként is használható. Meghajthatunk vele például egy szervomotort, melynek segítségével követhetjük a hőforrás mozgását. Mint említettük, a korábbi verzióktól eltérően a DUE 3,3 V-os kártya, mely azt is eredményezi, hogy az I/O pinek maximális jelszintje is csak 3,3 V. Emiatt gondoskodni kell a TTL-szinthez való illesztésről, például SN74HC125N vonalmeghajtó alkalmazásával, mely kétirányú feszültségillesztést tesz lehetővé (3,3–5 V).
A Panasonic Grid-EYE könyvtár
A Panasonic támogatói oldaláról letölthető a Grid-EYE Evaluation Kit V1.0 számára szükséges Arduino Library, melyet az Arduino IDE számára úgy tehetünk elérhetővé, hogy bemásoljuk azt a /libraries helyre. Az IDE újraindításával hivatkozhatunk a GridEye.h, a GE_SoftUart.h és a GE_SoftUartParse.h állományra.
A Grid-EYE szenzor adatstruktúrája
A soros porton másodpercenként tíz alkalommal érkező nyers adatok első ránézésre ijesztőek, azonban a struktúra ismeretében könnyen feldolgozhatóak. A soros port terminálprogrammal (pl. PuTTY) való vizsgálata az alábbi eredményt mutatja:
135 bájt adat érkezik másodpercenként tízszer, melyből néhány vezérlőkarakter kiszűrése után a 64 pixel és a termisztor hőmérsékleti adata is kinyerhető, az alábbi adatstruktúra szerint:
- 3 bájt fejléc ***
- 2 bájt NTC hőmérséklet HL, HH (12 bites előjeles)
- 64×2 bájt (HL, HH) 128 bájt (12 bites kettes komplementer kódú)
- CR LF (\r \n)
A feladat így már nem is annyira bonyolult, az adatstruktúra nagyon logikus. Arra kell csak odafigyelnünk, hogy az alsó (HL) és a felső (HH) bájtok felcserélt sorrendben érkeznek (HL, HH).
A hőmérsékleti adatok meghatározásához szükséges konverzió az alábbiak alapján lehetséges:
Az NTC 12 bites előjeles ábrázolása:
- XXXX S _ _ _ _ _ _ _ _ _ _ _
- Ha S=1, akkor a hőmérséklet negatív, ha S=0, akkor pedig pozitív
- A 12 biten tárolt bináris értéke decimálissá alakítás után a 0,0625 oC felbontással felszorozva alakítható valós hőmérsékleti adattá:
11 bit = 1024 (211), így a teljes tartományban (-1023 ... +1024) -63 ... +64 °C közti hőmérséklet ábrázolását teszi lehetővé.
- Példa: HH = 0×01 HL = 2A → bináris konverzió → 0000 0001 0010 1010 → + hőmérséklet
1*2+1*8+1*32+1*256= 298 (decimális). Hőmérséklet = 298*0,0625 = 18,6 °C - A pixeladatok kettes komplementer kódban érkeznek, kicsit más a feldolgozás menete:
- XXXX S _ _ _ _ _ _ _ _ _ _ _
- A 12. bit itt is az előjelre utal, azonban nemcsak előjelként funkcionál, hanem értéke is részt vesz a kalkulációban: amikor értéke = 1, akkor negatív a hőmérséklet, ilyenkor tehát a decimális érték 2048 helyett -2048 lesz: (-212).
A megvalósításhoz szükséges ARDUINO mintakód az alábbi címen elérhető:
http://www.endrich.hu/mintaprogram/ENDRICH_ARDUINO_GRIDEYE_Elektronet.ino
A program másodpercenként egy vagy akár tíz alkalommal beolvassa a szenzorról érkező adatokat az I2C buszon keresztül, és ezeket hőmérsékleti adatokká alakítja. A könnyebb áttekinthetőség érdekében a virtuális soros (esetünkben COM14) porton keresztül íratjuk ezeket, és az Arduino IDE beépített terminálján meg is jelenítjük.
Amennyiben a szenzor 64 pixelének hőmérsékleti átlagértéke meghaladja az előre beállított küszöbértéket (a programban temperature_treshold = 25 °C), akkor a szenzor látóterében jelen van egy hősugárzó tárgy, jelen esetben a kezünk. (Nem szükséges a mozgás, elég a jelenlét, ez a nagy előnye a Grid-EYE szenzornak pl. a PIR vagy a radar-szenzortechnológiával szemben.) Tovább árnyalható az algoritmus azzal, hogy csak azok a pixelek vesznek részt az átlagolásban, melyek hőmérsékletértéke meghaladja a Grid-EYE beépített termisztorának mért értékét.
Amennyiben pozitív eseményt érzékelünk, az Arduino egyik szabadon használható digitális I/O portjára logikai „1” értéket írunk ki (GPIO 53 a mintaprogramban). Ezzel tesztelés közben egy, a GPIO63- és a GND-lábak közé illesztett LED-del ellenőrizhetjük a helyes működést.
Fentebb említettük, hogy az Arduino DUE 3GPIO-lábai 3,3 V-os kimeneti jelszintet adnak ki logikai „1 – HIGH” állapotban. Mivel ez általában nem elegendő a kereskedelmi forgalomban leginkább elérhető 5 V-os relék vezérlésére, egy vonali 3,3–5 V-os szintkonverter beépítése ajánlott.
Egyik lehetséges megoldás a SN74HC125N logikai szintillesztő IC-vel, mely egy 14 lábú tokban 4 csatornás megoldást ad, melyből a mintapéldában csak egyet használunk. Egy relé meghajtásához általában elegendő az Arduino DUE által szolgáltatott teljesítmény, azonban több relé egyidejű használatakor ezek külső táplálása szükséges: ekkor ne feledkezünk el a tápegység és az ARDUINO „GND”-lábak közösítéséről és esetleges túlfeszültségvédő dióda alkalmazásáról sem! A bemutatott megoldással tehát egy 64 pixeles felbontású minihőkamera jelenlét-érzékelésére és ennek alapján egy – akár hálózati feszültségű – külső áramkör relén keresztüli vezérlésére adtunk megoldást.
A Grid-EYE evaluation kit PC-vel való használata
A Grid-EYE Evaluation kit nemcsak Arduino Shieldként, hanem USB portján keresztül PC-vel összekötve is használható. Ilyenkor a megfelelő device driver alkalmazásával az USB-re csatlakoztatott eszköz virtuális COM (soros) porton keresztül érhető el. Az adatstruktúra fenti leírása itt is érvényes, valamilyen PC-s fejlesztőeszközzel megírható az adatok vizualizációját szolgáló szoftver. Egy ilyen megoldás készen letölthető a Panasonic honlapjáról is, de akár mi, magunk is készíthetünk egyet. Én a Lazarus Free Pascal-rendszert használtam, ingyenessége és a Delphi-környezet kényelmi funkcióinak elérhetősége okán. A teljes szoftvert nem célom bemutatni, azonban néhány szóban összefoglalnám.
Az alkalmazás, amit ilyen módon készíthetünk, egy mozgáskövető (lámpa)kapcsoló. A környezeti hőmérséklettől eltérő pixelek kiszűrésével a jelenlét és a mozgás érzékelhető, a helyzetét változtató „hot-spot”-ot követjük 8 digitális relé kapcsolgatásával. Ily módon elérhetjük, hogy a fény kövesse a mozgó céltárgyat, például egy emberi kezet (gesztusvezérlés).
Példák:
Nincs semmi a szenzor előtt:
Kéz a szenzor előtt (bal oldalon a szenzor egyszerűsített hőképe, jobbra a kiemelt céltárgy képe):
A teljes rendszer blokkdiagramja az ábrán látható. A nyolc függőleges LED-csík fénye követi a kézmozgást vagy a szenzor előtt elhaladó emberek mozgását.
Cikksorozatunk harmadik, egyben befejező részében a Grid-EYE szenzorral megvalósítunk egy önállóan futó Arduino Due-alkalmazást, mely a minihőkamera képét egy 8×8-as RGB LED-mátrixon jeleníti meg, miközben a céltárgy mozgását egy szervomotorral igyekszünk követni.