GPS adatgyűjtő fejlesztése kültéri járművekhez Önálló laboratórium dokumentáció
Készítette:
Beke András HZO018
Konzulens:
Kis László
2014. május 17.
Beke András 1
Tartalom 1.
Bevezetés ............................................................................................................................ 2
2.
A korábban elkészült kód áttekintése ................................................................................. 2
3.
4.
5.
6.
2.1.
Érzékelőpanel .............................................................................................................. 2
2.2.
Mikrokontrolleren futó program ................................................................................. 3
2.3.
Számítógépen futó program ........................................................................................ 3
Szenzorpanel bővítése GPS-el ............................................................................................. 4 3.1.
Csatlakoztatás a panelhez ........................................................................................... 4
3.2.
GPS konfigurálása, adatok felépítése .......................................................................... 5
Mikrokontrolleren futó program ........................................................................................ 6 4.1.
GPS adatok fogadása ................................................................................................... 6
4.2.
Cirkuláris puffer ........................................................................................................... 8
4.3.
Szenzorok mintavételezése ......................................................................................... 8
Számítógépen futó program ............................................................................................. 10 5.1.
Program működése.................................................................................................... 10
5.2.
Tesztelés .................................................................................................................... 11
Összegzés .......................................................................................................................... 13
Források .................................................................................................................................... 14
Beke András 2
1. Bevezetés Az önálló laboratórium során egy RC autó szenzorrendszerét fejlesztettem tovább. Ehhez a kiindulópontot egy korábbi szakdolgozat1 során elkészült, egy robotvezérlő panelhez kapcsolódó szenzorpanel, vonalérzékelő, az ezek által mért adatokat megjelenítő LabVIEW kód jelentette. Az autóra szerelt érzékelőket egy GPS vevővel egészítettem ki. A GPS alapú helymeghatározás előnye, hogy abszolút információt szolgáltat az autó pozíciójáról, viszont hátránya, hogy csak kültéren használható. Az általam végzett fejlesztést a következő lépésekben hajtottam végre. A munkám a szenzorpanel és a mikrokontrolleren futó (korábban elkészült) kód megismerésével kezdtem. Megvizsgáltam, hogy a GPS csatlakoztatható-e a panelhez. Annak érdekében, hogy a mikrokontroller alkalmas legyen a GPS által küldött adatok fogadására, módosítottam a mikrokontrolleren futó kódot. Megváltoztattam a szenzorok adatait beolvasó és azt továbbküldő
függvényeket,
így
lehetővé
téve
az
eltérő
frekvenciával
történő
mintavételezést. Az adatokat számítógépen LabVIEW szoftver segítségével dolgoztam fel és jelenítettem meg. A dokumentáció ezeket a munkafázisokat mutatja be részletesen.
2. A korábban elkészült szenzorpanel és programok 2.1. Érzékelőpanel Az érzékelőpanel egy ARM7-es mikrokontroller (AT91SAM7XC256) alapú robotvezérlő panelhez csatlakozik. Közvetlenül a szenzorpanel NYÁK-jára forrasztva kapott helyet egy MMA8451-es 3 tengelyes gyorsulásmérő és egy MAG3110 típusszámú szintén 3 tengelyes gyorsulásmérő. Mindkét szenzor közös I2C buszon kommunikál a mikrokontrollerrel. A gyorsulásmérő a jelenlegi beállításokkal +/-2g tartományban mér, de ez növelhető +/-8g-ig. Az autón rajtam kívül más hallgatók is dolgoztak a félévben, így rögzítésre került az autó elejére egy proximity szenzor és a vonalérzékelő. A jobb hátsó kerékhez felszereltek egy digitális hall-szenzort, ami a küllőkre rögzített mágneseket érzékeli.
1
Varga Zsolt Márton (2013): Érzékelőpanel tervezése mobilis robotikai alkalmazásokhoz.
Beke András 3
Az infravörös távolságérzékelő GP2Y0A41SK0F típusú analóg kimenetű szenzor. Ebből a szenzorpanel 4 darabot képes kezelni. A vonalérzékelő 16 darab reflexiós optokaput tartalmaz. Az optokapuk analóg kimenetét digitális jellé alakítja. Így minden optokapuhoz tartozik egy bit a mikrokontrollernek SPI buszon küldött 2 bájt adatból. Digitális hall-szenzorból a panelre összesen 8 darab csatlakoztatható. Az autóra 1 került felszerelésre. Az autó kerekének 7 küllője van, de a szenzor bipoláris, ezért ezek közül, csak 6-ra került mágnes, felváltva észak-dél polaritással. Így a kerékforgás irányát nem lehet, sebességét pedig csak pontatlanul lehet meghatározni.
2.2. Mikrokontrolleren futó program A kód lefordulásának egyes részei feltételhez kötöttek. A target.h fájlban lehet engedélyezni és letiltani a szenzorokat. A kódnak csak az engedélyezett szenzorhoz tartozó részei fordulnak le. A vezérlőpanelen futó program a szenzorok lekérdezését és az adatok továbbküldését végzi a számítógép felé. Az adatok küldése vezeték nélkül, Xbee-n keresztül történik. A hibás adatok kiszűrésére minden üzenet végére egy 16 bites ellenőrző összeg kerül, ami az adatbitek összegével egyenlő.
2.3. Számítógépen futó program Az adatokat egy Xbee fogadja, mely UART-USB átalakítóval a számítógép USB bemenetére van csatlakoztatva. A program a soros porton érkező adatokat kiolvassa, megjeleníti és lehetőség van azok TDMS fájlba történő mentésére is. A futtatás kezdetekor a felhasználónak kell beállítani az Xbee soros portját: ugyanazokat a szenzorokat engedélyeznie kell, mint ami a target.h fájlban engedélyezve van. Az ellenőrző értéket a program újraszámolja és ha nem egyezik a fogadottal, akkor azt a csomagot figyelmen kívül hagyja. A hibák számát a megjeleníti a felhasználó számára is.
Beke András 4
3. Szenzorpanel bővítése GPS-el Egy u-blox LEA-6T-0 GPS vevő állt rendelkezésemre, ami egy külön NYÁK-on kapott helyet egy külön tápegységgel és a külső antenna csatlakoztatására szolgáló SMA csatlakozóval. A GPS műholdakról érkező jel alacsony jelszintje miatt az antennának tiszta rálátásra van szüksége az égre. A LEA-6T vevő jellegzetessége, hogy rendelkezik két konfigurálható, nagyon pontos referencia frekvenciát biztosító kimenettel és képes a nyers mérési adatok küldésére. Más eszközökkel kommunikálni UART, SPI, DDC interfészekkel képes, utóbbi I2C kompatibilis. Ezek mindegyike támogatja a NMEA és UBX prtokollokat. A vevő képes fogadni RTCM protokoll szerinti differenciális korrekciós adatokat.
3.1. Csatlakoztatás a panelhez Megvizsgáltam,
hogy
a
GPS-el
való
kommunikációhoz
rendelkezésre
áll-e
a
mikrokontrolleren még egy szabad UART, így összegyűjtöttem a többi szenzor által használt I/O vonalakat, amit az alábbi táblázatban foglaltam össze. Szenzor Gyorsulásmérő
Magnetometer
Vonalérzékelő
Proximity Hall Xbee GPS
I/0 vonal
Funkció
PA10
TWD
PA11
TWCK
PB1
ETXEN
PA10
TWD
PA11
TWCK
PB2
ETX0
PA12
SPI_NPCS0
PA16
SPI0_MISO
PA17
SPI0_MOSI
PA18 analóg bemenetek PB27-PB30
SPI0_SPCK
PB4-PB7
általános célú bemenetek
PA0
RXD0
PA1
TXD0
PA5
RXD1
PA6
TXD1
AD4-AD7 AD0-AD3
Beke András 5
Az Xbee-re is UART csatornán keresztül küldjük az adatokat, de UART kommunikációra alkalmas a mikrokontroller a PA5 (RXD1) és PA6 (TXD1) vonalon, így a GPS-t ide csatlakoztathatjuk.
3.2. GPS konfigurálása, adatok felépítése Lehetőség van a GPS vevő számítógépes felületen történő konfigurációjára, ahol lehetőség van többek között az UART kommunikációparamétereinek módosítására és az elküldött adatok típusát is be lehet állítani, ami már korábban megtörtént. A beállított értékek a következők: Sebesség
115200 bps
Adat hossza
8 bit
Paritás
Nincs
Stop bitek száma
1
Adatküldés frekvenciája
5 Hz
A vevő a jelengi beállításokkal ún. UBX protokoll szerint küldi a GPS adatokat a mikrokontroller felé. UBX csomag felépítése következő: SYNC CHAR 1
SYNC CHAR 2
CLASS
ID
LENGTH
PAYLOAD
CK_A
CK_B
Két szinkronizációs bájttal kezdődik, melyek értéke az üzenet típusától független, a csomag elejének megtalálásában segítenek. Az első két bájt értéke 0xB5 és 0x62. Ezt követi az üzenet típusát jelző két bájt. A következő két byte tartalmazza a payload hosszát little-endian bájtsorrendben. Az ellenőrző összeg CLASS, ID, LENGHT, PAYLOAD mezőkre vonatkozik, 8 bites Fletcher algoritmussal számítható.
Beke András 6
4. Mikrokontrolleren futó program A mikrokontroller programozását C nyelven Eclipse-ben végeztem. A szenzorpanelhez korábban készített kódot módosítottam.
4.1. GPS adatok fogadása Első lépésként a kódot úgy egészítettem ki, hogy a mikrokontroller képes legyen a GPS adatok fogadására. Ehhez konfigurálnom kellet USART1-et a 3.2-es részben lévő táblázat szerint. Ha adat érkezik USART1-re az interrupt-ot generál, így meghívva a Read_GPS_Data függvényt, ami beolvassa USART1-re érkező 1 bájtnyi adatot egy külön GPS adatoknak létrehozott pufferbe. Ennek a puffernek a méretét 512 bájtnak választottam, hogy biztosan beleférjen. Az interrupt generálására azért volt szükség, mert a kommunikáció aszinkron zajlik, a beérkezett adatot azonnal ki kell olvasnunk, mielőtt felülírja azt az utána érkező. Az adatok beolvasását végző függvény működése leírható egy állapotgéppel (ld. következő oldal). Az első állapotban megvizsgáljuk a beolvasott bájtot. Ha ennek értéke megegyezik az UBX protokoll szerinti SYNC 1 értékével, akkor a második állapotban megvizsgáljuk, hogy a második beolvasott bájt értéke megegyezik-e SYNC 2-vel. Ezt a másodikként vizsgált bájtot el is mentjük egy változó értékeként, mert ha a második állapotban a feltétel nem teljesül a továbblépéshez, akkor visszaugrunk az első állapotba, ahol megvizsgáljuk, hogy ez a változóként eltárolt bájt megegyezik-e SYNC 1-el. Egyezés estén tovább léphetünk a következő állapotba. A harmadik állapotban a LENGTH bájtok végéig olvassuk az érkező adatokat. LENGHT bájtjainak értékéből számítható, hogy hány bájtot kell még beolvasnunk az üzenet végéig. Ha végeztünk az üzenet beolvasásával, akkor meghívódik a cheksum-ot ellenőrző függvény. Ha számolt ellenőrző összeg értéke megegyezik az üzenet végén lévő értékkel, akkor az adatokat egy cirkuláris pufferbe töltjük. A GPS több különböző adatot küld, a függvény, ami a két puffer közti áttöltést végzi, a CLASS és ID bájtok alapján, csak a NAVSOL üzeneteket tölti át. Az eredeti üzenet szinkronizációs bájtjait nem menti el, helyette egy ’H’ és ’G’ ASCII karakternek megfelelő bájtot illeszt az üzenet elejére. Az ellenőrző összeget lecseréli az eredeti két bájtosról egy bájtosra.
Beke András 7
SYNC 1 beolvasása
Beolvasott bájt !== SYNC 2
Beolvasott bájt == SYNC 1 vagy 2. Álapotban korábban már vizsgált bájt == SYNC1
SYNC 2 beolvasása
Beolvasott bájt =SYNC 2
Beolvasás LENGTH végéig
Bájtok beolvasva
Még hátra lévő bájtok beolvasása
Adatok beolvasva
Üzenet checksum !== számított checksum
Checkcum ellenőrzés
Üzenet checksum == számított checksum
Adatok betöltése cirkuláris bufferbe
Beke András 8
4.2. Cirkuláris puffer Mivel a szenzorok mintavételezési frekvenciája eltér a GPS adatok fogadásának sebességétől és a mikrokontrollerrel feldolgozott adatok küldése aszinkron módon történik, ezért létrehoztam egy cirkuláris buffert az adatok átmeneti tárolására. A puffer méretét 768 bájtra választottam, így még a leghosszabb GPS adat is belefér és a szenzor adatoknak is marad elegendő hely. A puffer használatához tudnunk kell, hogy melyik bájtjai foglaltak és melyikek szabadok, ezért három változót hoztam létre, amelyek értékéből ez kiszámítható. A ’c_head’ változó jelzi az első olyan helyet a pufferben, ahol még el nem küldött adatt van, a ’c_tail’ a foglalt terület utáni első szabad hely sorszáma, a ’c_count’ a pufferben lévő bájtokat számolja. c_count
c_head
c_tail
A cirkuláris pufferbe adatot betöltő és onnan kiolvasó függvényeket úgy írtam meg, hogy azok kezeljék a puffer végén a túlcsordulást ’c_head’ és
’c_tail’ változók esetén is,
megfelelően változtatassák ’c_count’ értékét is. Új adat beírása nem történik meg, ha annak mérete meghaladja a puffer szabad helyének méretét. Az adatokat a pufferbe olyan formában kell betölteni, ahogy az UART-on keresztül küldeni szeretnénk.
4.3. Szenzorok mintavételezése Az eredeti kód nem támogatta, hogy a szenzorokat eltérő frekvenciával mintavételezzük, minden szenzor adatát egyszerre kérdezte le a program. A szenzorok maximális mintavételezése frekvenciája nagymértékben eltér, magnetométer esetében 80Hz, gyorsulásmérőnél 1kHz. A lassabb szenzort felesleges a maximális mintavételezési frekvenciájánál gyorsabban lekérdezni, új információt úgy sem kapunk tőle. Ebben az esetben az UART-on is változatlan adatokat küldünk néhány szenzor esetében, ezzel feleslegesen foglalva a sávszélességet.
Beke András 9
A kódot ezért úgy módosítottam, hogy a szenzoradatokat különböző frekvenciákkal is be lehessen olvasni. Minden szenzor adatát külön pufferbe olvasok be, aminek tartalmát a megfelelő fejléccel és ellenőrző összeggel bővítve áttöltök az cirkuláris pufferbe. Ezért feleslegessé vált a korábban használt puffer, melynek mérete a használni kívánt szenzorok számához igazodott. A target.h beállítása a kódrészletek lefordulásra van hatással, csak az ott beállított szenzorhoz tartozó kód fordul le. Elküldött üzenet szerkezete: Header
ID
#
Payload
Checksum
Minden üzenet egy szinkronizációs célokat szolgáló bájttal kezdődik. Ezt követi egy bájtnyi szenzorspecifikus karakter, ami alapján azonosítani lehet, hogy melyik szenzor adatait tartalmazza az üzenet. Mivel proxymity és analóg Hall szenzorból 4-4 csatlakoztatható a panelre, ezért azok azonosításához egy extra mező szükséges, ami a szenzor sorszámát tartalmazza. Az üzenet utolsó bájtja egy ellenőrző összeg, ami a küldés alatt bekövetkező esetleges jeltorzulások detektálására használható.
Gyorsulásmérő
Header (HEX, ASCII) 0x48, 'H'
ID (HEX, ASCII) 0x41, 'A'
#
Üzenet hossza
-
9 bájt
Mintavételezési frekvencia 160Hz
Magnetométer
0x48, 'H'
0x4D, 'M'
-
9 bájt
80Hz
Vonalérzékelő
0x48, 'H'
0x4C, 'L'
-
5 bájt
20Hz
Távolság érzékelő
0x48, 'H'
0x50, 'P'
0…3
6 bájt
80Hz
Digitális Hall
0x48, 'H'
0x44, 'D'
-
11 bájt
160Hz
Analóg Hall
0x48, 'H'
0x68, 'h'
0...3
6 bájt
80Hz
GPS
0x48, 'H'
0x47, 'G'
-
59 bájt
5Hz
Szenzor
Ha a fenti táblázatban szereplő szenzorokat egyszerre használjuk a megadott mintavételezési paraméterek mellett, akkor az UART-on történő küldésükhöz 1 start- és egy stopbit minimálisan 81550 bps sebességű kapcsolatra van szükség. Az UART-ot 115200 bps-ra konfiguráltam, így a cirkuláris buffer nem fog telítődni, mivel az adatokat gyorsabban vagyunk képes belőle elküldeni, mint ahogy azt beleírjuk.
Beke András 10
5. Számítógépen futó program A számítógépen futó programot LabVIEW környezetben fejlesztettem.
A program a
számítógép USB bemenetére csatlakoztatott Xbee által fogadott adatokat dolgozza fel. Megjeleníti a szenzorpanelről érkező adatokat és lehetőség biztosít a GPS adatok mentésére. A
fogadott
üzenetek
szerkezete
nagymértékben
változott
a
korábban
készült
szakdolgozatban szereplőhöz képest, így nem a már elkészült LabVIEW kódot módosítottam, hanem egy új kódot készítettem.
5.1. Program működése A felhasználói felületen a korábbihoz képest nem kell kiválasztani a target.h-ban is beállított szenzorokat, a program az üzenet alapján képes megkülönböztetni, hogy az adatok melyik érzékelőhöz tartoznak, és ennek megfelelően kezeli őket. A korábbiakban a szinkronizáció sem volt megoldott, ha a kommunikáció elcsúszott, a programot és az autón lévő mikrokontrollert is újra kellett indítani, hogy újra szinkronba kerüljenek. Programomban a szinkronizáció ugyan úgy történik, mint a korábban leírt GPS – szenzorpanel közötti kommunikációnál, annyi különbséggel, hogy itt az üzenet második bájtja a szenzortól függ. Az üzenet nem tartalmaz a hosszára utaló mezőt, de minden szenzorhoz fix méretű üzenet tartozik, ezért a második bájt alapján meghatározható, hogy a programnak hány bájtot kell beolvasnia az üzenet végéig. A felhasználónak kell beállítani a soros kommunikáció paraméterit, választhat, hogy a GPS adatokat szeretné-e menteni. Az adatok mentése bináris fájlba történik, melynek neve automatikusan generálódik a mérés indításakor GPS_data_ÉÉÉÉ.HH.NN._ÓÓ_PP_MM formátumban.
Beke András 11
A felhasználói felület a következőképp néz ki:
5.2. Tesztelés Teszteléskor a szenzorpanelen lévő gyorsulásmérő, magnetométer, 1 darab Digitális Hall szenzor, ami a Hall 4 bemenetre volt kötve, egy darab távolságérzékelő, ami a Hall 0 analóg bemenetre volt kötve és a vonalérzékelő állt rendelkezésemre. Gyorsulásmérő és magnetométer az autó forgatásakor kapott mérési eredményei az alábbi ábrán láthatók.
Beke András 12
A digitális Hall szenzor az autó egyik kerékagyára van rögzítve, a küllőkön lévő mágneseket érzékeli. Mivel a szenzor bipoláris, a kerék 7 küllős, így csak 6-ra került mágnes. A kerék egyszeri körbefordulásakor 6-tal növekszik a LabVIEW-ban látható érték. A mérési eredmény a kerék párszori körbefordítása után az alábbi ábra mutatja.
Az infravörös távolságérzékelő tesztelésekor, az érzékelőhöz egy fehér lapot közelítettem, majd távolítottam. Így a következő eredményt kaptam.
A vonalérzékelő teszteléséhez is egy fehér lapot használtam. Ha a vonalérzékelőn lévő reflexiós optokapu visszaverődést érzékel, akkor a program a hozzá tartozó led elalszik. Világos felületre téve az autót az összes led világít, tehát nem érzékel visszaverődést. Egy fehér lapot kell az érzékelőhöz pár milliméteres közelségbe tenni, hogy reflexiót érzékeljen. A lap sarkát az érzékelő alá helyezve a következő eredményt kaptam:
Beke András 13
Amikor az egész lapot az érzékelő alá helyeztem feltűnik, hogy az egyik optokapu nem működik, a hozzá tartozó led világít.
A GPS adatok mentése egy bináris fájlba történik, a felhasználó adhatja meg a mentés helyét, de a fájl neve automatikusan generálódik. A fájlban az első négy bájt a fájl hosszát jelzi, ezután következnek a mentett adatok, melyek az első két szinkronizációs karakter és az ellenőrző összeg nélkül kerülnek lementésre.
6. Összegzés Az önálló laboratóriumom során megismerkedtem a mikrokontrollerhez történő szenzor illesztésének módjaival, szenzorok kiválasztásának szempontjaival. Egy már meglévő szenzorrendszerhez illesztettem GPS vevőt. Az érzékelő adatainak megjelenítéséhez, mentéséhez LabVIEW környezetben programot készítettem.
Munkám eredménye
megkönnyítheti a robotvezérlő panel további érzékelőkkel történő bővítését, valamint a jelenlegi szenzorok másikra cserélését, mivel lehetőség van a szenzorok eltérő frekvenciájával történő mintavételezésre; a korábbihoz képest az érzékelők adatait a mikrokontrolleren és a számítógépen futó program egymástól jobban elkülönítve kezeli.
Beke András 14
Források Varga Zsolt Márton (2013): Érzékelőpanel tervezése mobilis robotikai alkalmazásokhoz. Kiss Bálint (2012). Mobilis robot pályatervezése és irányítása. PIR laboratórium mérési segédlet (2013). Segédlet a LabVIEW alapú virtuális műszerezés méréshez. SAM7XC series data sheet. Forrás: http://www.atmel.com/Images/Atmel_6209_32-bit-ARM7TDMIMicrocontroller_SAM7XC_Datasheet.pdf u-blox 6 receiver description
Xtrinsic MMA8451Q 3-Axis, 14-bit/8-bit Digital Accelerometer Data Sheet. Forrás: http://www.freescale.com/files/sensors/doc/data_sheet/MMA8451Q.pdf Xtrinsic MAG3110 Three-Axis, Digital Magnetometer Data Sheet. Forrás: http://www.farnell.com/datasheets/1684415.pdf