Mérési útmutató a Mobil Kommunikáció és Kvantumtechnológiák Laboratórium méréseihez
Internet of Things, avagy a Dolgok Internete Bevezető mérés
Mérés helye: Hálózati Rendszerek és Szolgáltatások Tanszék Mobil Kommunikáció és Kvantumtechnológiák Laboratórium (MCL) I.B.113. Összeállította: Knapp Ádám A dokumentum utolsó módosítása: 2016. április 11.
1. Bevezetés A mérés célja, hogy megismertesse a hallgatókat a Dolgok Internete koncepció és a szenzorhálózatok alapjaival az Arduino kompatibilis Moteino szenzor node-ok használatával. A mérés során a hallgatók megtanulják felprogramozni az eszközöket, valamint a beépített szenzorok és perifériák segítségével egy egyszerű vezetéknélküli szenzorhálózatot alakítanak ki. A Dolgok Internete (angolul Internet of Things, IoT) az elmúlt néhány évben az infokommunikációs szektor egyik nagy hívószava lett, és szorosan összefonódik olyan más témákkal, mint az Okos Otthon (Smart Home), Okos Város (Smart City), gépek közötti kommunikáció (Machine to Machine/M2M Communication), valamint a mobil, vezetéknélküli és szenzorhálózatokkal. Az IoT lényege, hogy minden „dolgot” egy nagy hálózatba kapcsolunk össze. Ilyen „dolog” gyakorlatilag bármi lehet, viselhető eszközök, háztartási gépek, mérőeszközök, közlekedési eszközök, villanyoszlopok stb. Ezt különböző kommunikációs technológiák teszik lehetővé, akár vezetékes, akár vezetéknélküli kapcsolatról beszélünk. Egy fontos tényezőt érdemes kiemelni ezen a téren, mégpedig az IPv6 hálózati protokollt, amit egy közös platformként lehet elképzelni. Ezt az IPv6 óriási címtartománya és különböző felderítési, biztonsági és egyéb funkciói teszi lehetővé. Valójában az IoT arról szól, hogy kényelmesebbé és biztonságosabbá tegye a mindennapi életünk azáltal, hogy rengeteg kisebb-nagyobb tevékenységet automatizálunk. Ez a folyamat általában a környezet monitorozásával kezdődik, melyeket az eszközök a különböző szenzorok segítségével végeznek. Ezután a keletkezett adatokat összegyűjtik/feldolgozzák/elküldik attól függően, hogy éppen milyen az adott rendszer működése. Ezeket az adatokat végül arra használja a rendszer, hogy szükség esetén beavatkozhasson, illetve lehetőséget biztosítson manuális beavatkozásra. Az adatok feldolgozása történhet lokálisan vagy a keletkezési helyüktől távol is, pl. egy szerveren vagy felhőben, valamint a vezérlés is lehet helyből vagy távolról.
2. Felkészülés a mérésre
Figyelmesen olvasd el ezt a dokumentumot, melyben a méréssel kapcsolatos legfontosabb információkat találod! Elevenítsd fel a C programozási nyelvvel kapcsolatos tudásod [1]! Válaszold meg az ellenőrző kérdéseket!
3. Mérési elrendezés A hallgatók a mérést önállóan végzik. A méréshez rendelkezésére áll egy PC, egy Moteino szenzor node [2] és egy USB-UART átalakító. A mérés elvégzéséhez a PC-n használandó programok a következőek:
PuTTY kliens, Arduino IDE.
A PuTTY klienssel többek között a soros portra csatlakoztatott Moteino node-dal lehet kapcsolatot kialakítani. Az Arduino IDE az Arduino kompatibilis eszközök programozásához készített nyílt forráskódú fejlesztői környezet.
3.1. Moteino szenzor node – RFM69 RF chip Moteino egy olcsó, kis teljesítményű, nyílt forráskódú Arduino kompatibilis fejlesztő platform [2]. A panelje tartalmaz egy ATMega328-as mikroprocesszort, egy RFM69 RF chipet, illetve számos lábat, melyekre különféle szenzorok csatlakoztathatók. A mikrokontroller soros porton keresztül programozható egy USB-s interfész segítségével. Részletesebb leírások a szenzor node-ról [2]-ben, az RFM69 RF chipről [3] és [4]-ben található. A PC-vel való kommunikációhoz és a felprogramozáshoz egy USB-UART átalakítót használunk, ami a node működéséhez szükséges 5V-os tápfeszültséget is szolgáltatja. Az 1. ábra a Moteino szenzor node-ot ábrázolja alulról és felülről. A 2. ábra a részben hardveresen, részben az általunk is használt könyvtár által definiált csomag struktúrát mutatja.
1. ábra: Moteino szenzor node [2]
2. ábra: RFM69 csomag formátuma [4]
3.2. PuTTY kliens A PuTTY kliens egy ingyenes SSH és Telnet kliens. A mérés során a soros portra csatlakoztatott Moteino szenzor node-dal való kommunikációra használjuk. A 3. ábra a PuTTY alkalmazás felületét jeleníti meg.
3. ábra: PuTTY kliens felülete Csatlakozás lépései a Moteino-hoz: 1. Ellenőrizze melyik soros portra csatlakozik a Moteino! 2. A Terminal fülön állítsa át a Line discipline options alatt a Local echo és Local line editing opciókat Forced on beállításra! 3. A Session fülön állítsa át a Connection type opciót Serial-ra! 4. Írja be a soros port számát, illetve a megfelelő átviteli sebesség értéket a Serial line és Speed mezőkbe! 5. Kattintson az Open gombra!
3.3. Arduino IDE Az Arduino IDE az Arduino kompatibilis eszközök programozásához készített nyílt forráskódú fejlesztői környezet. Két alapvető funkciója van: egyrészt támogatja a C nyelvű forráskódok elkészítését, másrészt képes az eszközök számára értelmezhető gépi kódot előállítani és ezt nagyon egyszerűen feltölteni az eszközökre. Mielőtt lefordítanánk a forráskódot, ellenőrizzük a következő beállításokat (elég egyszer az Arduino IDE indítása után):
Tools/Board - Arduino Uno Tools/Port - a csatlakoztatott Moteino eszköz portja Tools/Programmer - AVRISP mkII
A program feltöltésének lépései (4. ábra): 1. Az elkészített forráskódot lefordítjuk/ellenőriztetjük az Arduino IDE-vel! Ehhez kattintsunk egyszerűen a Verify ikonra vagy használjuk a Ctrl+R billentyűkombinációt! 2. Ha sikeres volt a fordítás (lehetőség szerint a figyelmeztetések okait is szüntessük meg a forráskód módosításával), az Upload ikonra kattintva vagy a Ctrl+U billentyűkombináció segítségével tölthetjük fel a programot!
4. ábra: Arduino IDE Ezen kívül az Arduino IDE még egy funkcióját érdemes kiemelni, amit Serial Monitor-nak nevezünk. A Serial Monitor segítségével kapcsolatot lehet létrehozni a soros porton a felprogramozott eszközzel, gyakorlatilag ez a funkció megegyezik a PuTTY-éval. A Serial Monitor a Tools/Serial Monitor menüre kattintva vagy a Ctrl+Shift+M billentyűkombináció leütése után jelenik meg egy külön ablakban. Figyeljünk arra, hogy a megfelelő átviteli sebesség (baudrate) érték legyen kiválasztva a legördülő listából (5. ábra)!
5. ábra: Serial Monitor
4. Arduino programozás Az Arduino eszközöket beágyazott rendszerekként foghatjuk fel, azok minden előnyével és hátrányával együtt. A beágyazott rendszerek tulajdonságai közül kiemelnénk a korlátozott számítási- és memóriakapacitást, amiket figyelembe kell vennünk a programok elkészítése során. Szerencsére a mai fejlett fordítóknak köszönhetően nincs szükség arra, hogy gépi kódban készítsük el a programokat, ezért ezekhez az eszközökhöz uC nyelven lehet forráskódot írni, illetve annak egy speciális, Arduino-hoz kidolgozott változatán [1]. Ennek ellenére lehetőség szerint takarékoskodjunk a változókkal és próbáljuk meg úgy tömöríteni a forráskódot, hogy a funkcionalitás még ne szenvedjen kárt. Az alábbiakban áttekintjük azokat a nyelvi elemeket, függvényeket, könyvtárakat, amikkel a mérésen, illetve Moteino szenzor node használata során találkozhatunk. Részletesebb leírások [1] és [4]-ben találhatók.
4.1. Arduino programok felépítése Az Arduino forráskódot három fő szakaszra lehet felbontani. Az első szakasz az előfeldolgozónak (preprocessor) szóló utasításokat tartalmazza. Ez a szakasz nem kötelező, viszont a gyakorlatban szinte minden esetben be kell töltenünk az adott eszköz programozásához szükséges API-kat. A második szakasz az inicializáláshoz tartozó utasításokat tartalmazza. Ezek bekapcsolás (tápfeszültségre csatlakoztatás) után hajtódnak végre és az a feladatuk, hogy egy jól definiált alapállapotba állítsák az eszközt. Az inicializálást a void setup() prototípusú eljárásban kell kötelezően megadni. Végül a harmadik szakasz azokból az utasításokból áll, melyeket ismétlődően hajt végre az eszköz. Az utasításokat a void loop() deklarációjú eljárásban kell kötelezően megadni. Természetesen a kód egyszerűbb strukturálása és újrafelhasználhatósága érdekében létrehozhatunk egyéb függvényeket, eljárásokat, könyvtárakat a hagyományos C nyelvhez hasonlóan.
4.2. Előfeldolgozónak szóló utasítások Két általános és nagyon gyakran használt utasítással fogunk találkozni a mérés a során: #include
#define constantName value
függvénykönyvtárak, API-k betöltése konstans definiálása
4.3. Kommunikáció A Moteino eszközök RF chippel szereltek, illetve a felprogramozásukhoz egy USB-UART átalakítót használunk, ami biztosítja, hogy a soros porton kapcsolatot létesítsünk a PC-vel. Ezek miatt két interfészen is képesek kommunikálni az eszközök. A soros portot felprogramozásra, hibakeresésre, utasítások kiadására, illetve adatok megjelenítésére használjuk. Az alábbi táblázat a soros portos kommunikációhoz kapcsolódó fontosabb függvényeket tartalmazza: byte Serial.available() void Serial.begin(baudrate) byte Serial.print(val,format) byte Serial.println(val,format) byte Serial.read() long Serial.parseInt()
Soros portról olvasható bájtok száma Soros port inicializálás adott átviteli sebességre Szöveg vagy változó kiíratása a soros porton keresztül Ugyanaz, mint az előző, csak egy kocsivissza és egy újsor karaktert is kiír Egy bájt kiolvasása a soros portról A soros porton beolvasott szám long típusú változóba töltése
A rádiós interfészt az eszközök közötti kommunikációhoz használjuk. Az alábbi táblázat az RF kommunikációhoz kapcsolódó fontosabb utasításokat és függvényeket tartalmazza: RFM69 radio; bool radio.initialize( byte freqBand, byte ID, byte networkID=1); void radio.send( byte toAddress, const void* buffer, byte bufferSize, bool requestACK=false); bool radio.sendWithRetry( byte toAddress, const void* buffer, byte bufferSize, byte retries=2, byte retryWaitTime=15); bool radio.ACKReceived( byte fromNodeID); void radio.promiscuous( bool onOff=true); bool byte byte byte
radio.receiveDone(); radio.SENDERID; radio.DATALEN; radio.DATA[DATALEN];
RFM69 típusú rádió objektum példányosítása Rádió inicializálása; paraméterek: frekvenciasáv, azonosító, hálózatazonosító Adatcsomag küldése; paraméterek: címzett ID-ja, adat, az adat mérete, nyugta kérése
Adatcsomag küldése újraküldéssel; paraméterek: címzett ID-ja, adat, az adat mérete, újraküldések maximális száma, újraküldések közötti várakozási idő Nyugta vételének ellenőrzése; paraméter: eszköz ID-ja Minden rádiós csomag vétele és feldolgozása; paraméter: be-kikapcsolás Rádiós csomag vételének ellenőrzése Küldő címének tagváltozója Vett adatok hosszának tagváltozója (≤ 61) Vett adatokat tartalmazó tömb
4.4. Perifériák és szenzorok kezelése A mérés során a Moteino eszközön elérhető LED-et, az RF chip hőmérő szenzorát és a szintén az RF chipből kinyerhető RSSI adatokat használjuk. A Radio Signal Strenght Indicator (RSSI) a vett jel erősségét jellemző paraméter, amiből következtethetünk a rádiós csatorna minőségére. A LED-et a következő utasításokkal vezérelhetjük (a LED a 9-es PIN-en található): void delay(unsigned long ms) void digitalWrite(byte pin, value) void pinMode(byte pin, mode)
Késleltetés; paraméter: milliszekundum Magas vagy alacsony feszültségű állapotba állítja a PIN-t; paraméterek: PIN száma, érték: HIGH/LOW PIN konfigurálása ki-bemenetté; paraméterek: PIN száma, mód: INPUT/OUTPUT/INPUT_PULLUP
A hőmérőből az alábbi függvénnyel nyerhetjük ki a mért adatokat: byte readTemperature(byte calFactor=0);
Hőmérséklet kiolvasása; paraméter: felhasználó által megadott korrekciós tényező
Az RSSI értékeket a következő függvénnyel kérdezhetjük le az RF chiptől: int readRSSI(bool forceTrigger=false);
RSSI kiolvasása; paraméter: azonnali kiolvasás kényszerítése
5. Protokoll specifikáció A mérés egyik célja, hogy implementáljunk C nyelven egy egyszerű protokollt, mellyel vezérlőutasítások és adatok küldhetőek a Moteino eszközök alkotta szenzorhálózatban. A mérésen kialakítandó szenzorhálózatban három féle entitást különböztetünk meg, melyeket manuálisan konfigurálunk a felprogramozás során:
Szolga/Slave: feladata, hogy a szenzorjai által mért adatokat elküldje két másodpercenként (az első másodpercben az hőmérsékletet, a másodikban az RSSI-t), illetve reagáljon a vezérlő utasításokra Gyűjtő/Aggregator: hasonlóan működik, mint a szolga, csak összegyűjti a saját és a kapcsolódó szolgák mérési eredményeit és továbbítja a mester felé, illetve a mestertől jövő utasításokat továbbítja a megfelelő szolgának Mester/Master: hasonlóan működik, mint a gyűjtő, viszont a mérési adatok a soros porton keresztül megjeleníti a PC-n, valamint a PC-ről jövő vezérlő utasításokat továbbítja a megfelelő gyűjtő vagy szolga felé.
A protokoll csomagformátuma a következő: Fejléc 1 bájt
Célcím Adat Adat Adat 1 bájt 1. bájt 2. bájt 3. bájt 6. ábra: Saját protokoll csomagformátuma
Adat 4. bájt
Ezt a csomagot a 2. ábra adatmezőjébe ágyazva visszük át. A csomag 6 bájt hosszú fixen, ezért hosszúságot jelző bájtokra külön nincs szükségünk (egyébként a hordozó RFM69-es csomagban fejléce tartalmaz ilyen mező). Kétféle adat lehet adatmezőkben: hőmérséklet, illetve RSSI. A fejléc értéke az alábbi táblázat szerint befolyásolja a működést: Fejléc bájt értéke 1 2 10 11 12 20 21 22 23
Működés Adatmezőben hőmérséklet érték van Adatmezőben RSSI érték van LED folyamatosan ég (adatmező bájtjai 0 értékűek) LED nem ég (adatmező bájtjai 0 értékűek) LED villog fél másodpercenként (adatmező bájtjai 0 értékűek) Hőmérséklet szenzor bekapcsolása Hőmérséklet szenzor kikapcsolása (nem olvassuk ki az értékét) RSSI szenzor bekapcsolása RSSI szenzor kikapcsolása (nem olvassuk ki az értékét)
6. Mérési feladatok 1. feladat Ismerkedés a Moteino szenzor node-dal: csatlakoztatás PC-hez, az első program elkészítése és feltöltése. Portszám?
2. feladat Kommunikáció a soros porton a PC-vel: adatok bekérése és megjelenítése, utasítások bekérése.
3. feladat A Moteino-n elérhető LED és szenzorok kezelése: LED ki-bekapcsolás, ill. villogtatás; hőmérséklet és RSSI adatok kinyerése.
4. feladat a) Üzenetküldés a rádiós interfészen: rádiós interfész inicializálása; csomagküldés és -fogadás b) Egyszerű szenzorhálózati protokoll implementálása: csomagstruktúra összeállítása; csomagok küldése és fogadása a rádiós interfészen; csomagok kezelése, feldolgozása.
5. feladat Hálózat(ok) kialakítása és az implementált funkciók tesztelése.
7. Ellenőrző kérdések
Milyen modulációs eljárást (típus, állapotok száma, egyéb jellemzők) használ a Moteino szenzor node-hoz csatlakoztatott RFM69 rádiós chip? (RFM69 specifikációjában található) Milyen vivőfrekvenciákat támogat az RFM69 rádiós chip? (RFM69 specifikációjában található) Definiáljon C nyelven egy struktúrát, mely egy bájt fejlécből és 7 bájt adatmezőből áll! Milyen függvényekkel lehet lekérdezni a Moteino szenzor node RSSI és hőmérséklet értékeket? Mi az a két alapvető C függvény, melyeket Arduino alapú beágyazott rendszerek helyes működéséhez el kell készíteni?
Referenciák, további információk: [1] [2] [3] [4]
Arduino Language Reference, https://www.arduino.cc/en/Reference/HomePage All about Moteino, http://lowpowerlab.com/moteino/ RFM69 ISM TRANSCEIVER MODULE V1.3, http://mcl.hu/?q=hu/laboratory/usrp RFM69 library, http://lowpowerlab.com/blog/2013/06/20/rfm69-library/