2015-09-30

Pozicijos nustatymas su uBlox GPS imtuvu

Įvairių objektų pozicijos nustatymui pasaulio žemėlapyje labai plačiai naudojamas GPS (global positioning system). GPS imtuvą turi kiekvienas išmanusis telefonas tai - tikrai ne naujiena. Sistema populiari, sukurta JAV ir 1994 m. pilnai paleista viešam naudojimui. Remiasi palydovinio ryšio principais koordinačių nustatymui. Yra ir daugiau pozicionavimo sistemų kaip GLONASS (Rusija), GALILEO (Europa), BeiDou (Kinija) ir pan. Nors viešai gaunamas pozicionavimo tikslumas nėra idealus >2m, tačiau nepreciziniam naudojimui yra tinkamas. GPS ryšio imtuvai gana pigūs, tad šiandien bet kas gali naudotis teikiamomis vietos nustatymo paslaugomis. Gavau panagrinėti populiarų ir vieną pigiausių imtuvų - uBlox 6M GPS, tad šiame straipsniuke aiškinsimės, kaip su juo tinkamai elgtis. Skaitom toliau!






I. Pradžia

GPS moduliukų apstu kiekvienoje elektronikos parduotuvėje. Priklausomai nuo palaikomų galimybių ir kaina atitinkama, tačiau ne kosminė. Analizuojamasis - Šveicarų  uBlox AG firmos "uBlox 6M" modulis pagamintas Kinijoje. Nors jau yra ir 7N bei 8N serijos šios kartos modulių, pakrapštymui puikiai tinka ir senesnis atstovas. Gautas moduliukas susideda iš dviejų dalių - keraminės antenos prijungtos bei pagrindinio procesoriuko praplėtimo plokštės (breakout board). Gan patogu, jeigu norima atskirti šias dalis. Kadangi aš to nesiruošiau daryti, tai anteną prilitavau iš šonų prie GND - specialiai tam paliktų vietų. Maitinimas 5V ir tradicinė RS232 UART RX/TX sąsaja valdymui - nieko sudėtingo. Svarbu turėti kokį USB-2-TTL modulį patestavimui ir RealTerm ar kitą konsolės emuliatorių. Taip pat palaikomas ir SPI bei I2C, jeigu reikalinga, tačiau jų sąsaja į plokštę neišvesta, tad reikalui esant galima prisilituoti laidus. Prijungiame UART prie kompiuterio USB ir bandome!



II. NMEA 

Kadangi GPS yra rimta sistema, kuri atitinka galybę įvairių standartų (t.y. komunikavimo ir techninės įrangos), tai bendravimas su GPS moduliu yra gana lengvas. Svarbiausias protokolas darbui su bet kokiu GPS moduliu tai - NMEA. Jis aprašo aibę tekstinių komandų, kurias suprantant galima gauti svarbiausią buvimo vietos informaciją. Pagrindinių komandų, kurias reikia žinoti viso labo trys - GGA, GSA ir RMC. Žinoma, jeigu norite detalių ar konfigūruoti modulį, tai teks pakrapšyti ir oficialią protokolo dokumentaciją. Prie NMEA formato gamintojas taip pat palaiko ir savo sukurtą dvejetainį UBX komunikacijos formatą įvairiems modulio nustatymams koreguoti. Reikia paminėti ir tai, jog kiekvienas save gerbiantis GPS imtuvas, vos tik įjungtas, bando ieškoti palydovų ir siųsti informacinius pranešimus į valdantįjį įrenginį, tad konfigūruoti gali iš viso ir neprireikti. Jeigu randama pakankamai palydovų ir pozicijos informacija užfiksuojama (t.y. gaunamas fix'as), tai pradeda mirksėti žalias LED'as. Prijungtas modulis tradiciškai siunčia informaciją apie save 9600 baud greičiu po 8 bitus ir be lygiškumo (parity=No). Gautos informacijos fragmentas, kai modulis startuoja ir nemato palydovų, pateiktas žemiau:

$GPTXT,01,01,02,u-blox ag - www.u-blox.com*50
$GPTXT,01,01,02,HW  UBX-G60xx  00040007 FF7FFFFFp*53
$GPTXT,01,01,02,ROM CORE 7.03 (45969) Mar 17 2011 16:18:34*59
$GPTXT,01,01,02,ANTSUPERV=AC SD PDoS SR*20
$GPTXT,01,01,02,ANTSTATUS=DONTKNOW*33
$GPRMC,,V,,,,,,,,,,N*53
$GPVTG,,,,,,,,,N*30
$GPGGA,,,,,,0,00,99.99,,,,,,*48
$GPGSA,A,1,,,,,,,,,,,,,99.99,99.99,99.99*30
$GPGSV,1,1,00*79
$GPGLL,,,,,,V,N*64
$GPRMC,,V,,,,,,,,,,N*53
$GPVTG,,,,,,,,,N*30
$GPGGA,,,,,,0,00,99.99,,,,,,*48
$GPGSA,A,1,,,,,,,,,,,,,99.99,99.99,99.99*30
$GPGSV,1,1,00*79
$GPGLL,,,,,,V,N*64

Jame pradžioje matyti modulio informacija GPTXT, kiekvienas pranešimas prasideda $ ženklu ir baigiasi *XX, kur XX - yra kontrolinė suma. Kontrolinė suma paskaičiuojama gana paprastai, ji lygi visų baitų, esančių tarp $ ir *XX, sumos moduliu-2 operacijai, t.y. XOR. Gautas rezultatas (baitas) GPS eilutės pabaigoje rašomas hex (šešioliktainiu) pavidalu.

unsigned byte checksum = 0;

for i=1 to payloadSize do
     checksum = checksum ^ payload[i]

Pateikiu ir Python kodą, kuris patikrina eilutės kontrolinę sumą:

Kadangi veikiantis modulis nuolat spjaudosi informacija, tuo pačiu ir reikalingais GGA, GSA bei RMC pranešimais, tai belieka tik ištraukti reikalingus duomenis iš jų. Šių eilučių formatai aprašyti jau anksčiau minėtame dokumente, tačiau pateikiu dar ir žemiau.

$GPGSA,Smode,FS{,sv},PDOP,HDOP,VDOP*cs
$GPRMC,hhmmss,status,latitude,N,longitude,E,spd,cog,ddmmyy,mv,mvE,mode*cs
$GPGGA,hhmmss.ss,Latitude,N,Longitude,E,FS,NoSV,HDOP,msl,m,Altref,m,DiffAge,DiffStation*cs

Nuskaičius kiekvieną eilutę iš UART/serial sąsajos belieka pasiimti tai, ko reikia, o visa kitą galima ignoruoti. Tam parašiau Python skriptą (rasite straipsnio pabaigoje), kuris prisijungia per serial konsolę ir skaito įeinančią informaciją. Mums reikia koordinačių - ilgumos ir platumos (longitude/latitude). Taip pat naudinga pasiimti ir tikslią datą bei laiką.

III. uBlox u-center


uBlox taip pat stengiasi dėl savo klientų, todėl siūlo modulių konfigūravimo priemones. Egzistuoja programinė įranga "u-center", kuria prisijungus prie modulio per tą patį UART galima keisti veikimo parametrus. Išbandžiau ir aš - prisijungiau, pakeičiau standartinį baud greitį į 115200 bps bei koordinačių pateikimo dažnį - vietoj 1 Hz (1000ms), padariau 5 Hz (200ms).


Viską nustačius/pakeitus reikia išsaugoti Receiver > Action > Save Config, kad būtų atnaujinama į modulio EEPROM atmintį įrašyta informacija. Žinoma, grafinė sąsaja palengvina darbą, tačiau tą patį galima atlikti ir naudojantis specifikacijoje aprašytomis komandomis. Modulio baud greičiui iš 9600 į 115200 pakeisti galime naudoti komandą (kur \r\n yra eilutės pabaigos simboliai):

$PUBX,41,1,0007,0003,115200,0*18\r\n

O rezultatų grąžinimo dažnį pakeisti panaudojant jau UBX dvejetainį protokolą ir komandą CFG-RATE (0x06, 0x08), pasiunčiant baitų paketą:



0xB5,0x62, 0x06,0x08, 0x06,0x00, 0x00,0xC8,0x00,0x01,0x00,0x00, 0xDD,0x9F

kur

0xB5,0x62 - UBX protokolo antraštė,
0x06,0x08 - klasės baitas ir ID baitas,
0x06,0x00 - payload ilgis (6 baitai) [little endian formatu],
0x00,0xC8,0x00,0x01,0x00,0x00 - 6 payload baitai
    0x00,0xC8 - matavimo laikas (200ms)
    0x00,0x01 - ciklų skaičius (1)
    0x00,0x00 - atskaitos laikas (UTC - 0)
0xDD,0x9F - paketo duomenų kontrolinė suma paskaičiuota žemiau parodytu metodu


Jeigu reikia daugiau valdymo, komandas galime susirasti oficialioje dokumentacijoje.

IV. Finalas

Štai ir tiek to GPS modulio naudojimo. Įdomiausia, ką toliau darysime su gautomis koordinatėms - paišysime žemėlapyje ar galbūt kaupsime judėjimo trajektorijos nustatymui ir pan. Taigi, šiam kartui viskas. Prisegu reikalingus failus ir skriptus.

---------
Download all documents from here.






Komentarų nėra:

Rašyti komentarą