Een tijdje geleden heb ik op Dealextreme een GPS-ontvanger besteld. Deze GPS-ontvanger bestaat uit een Ublox NEO-6M chip en een keramische antenne. De Ublox-chip heeft een serieële uitgang die TTL-level data verstuurt met een snelheid van 9600 baud. Deze kan ik dus direct aansluiten op mijn Arduino.
Voor deze opzet maak ik gebruik van het volgende:
- Arduino UNO (kloon)
- Ublox NEO-6M GPS module
- TinyGPS library
- SoftwareSerial library (vanaf Arduino 1.0 in de standaard libraries)
De data die door de Ublox-chip wordt verstuurt is zogenaamde NMEA-data. Dit zijn tekstuele zinnen waarin alle informatie over de huidige locatie, hoogte, tijd, etc. wordt doorgegeven.
Om even een voorbeeld te kunnen geven van deze tekst heb ik mijn oude Garmin Streetpilot III even aangesloten (lees: schaamteloze reden om oude hardware te showen). Hij is al een tijdje niet meer actief geweest dus hij heeft even de tijd nodig om zijn almanac bij te werken.
Na een paar minuten is de Streetpilot zover en wordt de volgende NMEA-tekst via de serieële poort verstuurt:
$GPRMC,103200,A,5205.2936,N,00514.8914,E,0.0,0.0,270813,0.7,W,A*09
$GPRMB,A,0.00,R, N230, N230,5208.0076,N,00505.0946,E,6.612,294.3,,V,A*61
$GPGGA,103200,5205.2936,N,00514.8914,E,1,05,2.5,5.0,M,46.8,M,,*47
$GPGSA,A,3,02,,,12,,,,25,29,31,,,4.5,2.5,3.4*3C
$GPGSV,3,1,10,02,31,057,36,04,05,028,00,10,04,047,00,12,30,095,44*7C
$GPGLL,5205.2936,N,00514.8914,E,103200,A,A*4F
$GPBOD,50.9,T,51.5,M, N230, N230*4A
$PGRME,9.5,M,12.9,M,16.1,M*2E
$PGRMZ,16,f,3*2C
$PGRMM,WGS 84*06
De TinyGPS library zorgt voor het vertalen van deze gegevens naar informatie die we vervolgens in onze Arduino sketch kunnen gebruiken. De SoftwareSerial library gebruik ik, zodat ik de USB-poort van mijn Arduino kan gebruiken om de output van TinyGPS te tonen. De GPS-ontvanger heb ik als volgt aangesloten op mijn Arduino (links GPS-ontvanger, rechts Arduino):
- VCC -> 5V
- TXD -> Digital 3
- RXD -> Digital 4
- GND -> GND
NB: Eigenlijk hoeft RXD niet aangesloten te worden, want we versturen nu toch geen data naar de GPS-ontvanger.
Om alles nu te testen gebruik ik de simple_test.pde sketch die bij de TinyGPS library wordt geleverd (in de Examples directory). In deze sketch heb ik een 2-tal aanpassingen gedaan, namelijk:
void setup()
{
delay(5000);
Serial.begin(115200);
ss.begin(9600);
...
Om te voorkomen dat de serieële (USB) poort van de Arduino wordt geblokkeerd door de output van TinyGPS laat ik de Arduino 5 seconden wachten. In tegenstelling tot de meeste GPS-ontvangers stuurt de Ublox NEO-6M de data niet op 4800 baud maar op 9600 baud. Dit heb ik dus ook even aangepast. Zoals je wellicht eerder hebt gelezen programmeer ik in VIM. Wat ik dus ook heb toegevoegd aan deze sketch is een Makefile met de volgende inhoud:
ARDUINO_LIBS = SoftwareSerial TinyGPS
include /usr/share/arduino/Arduino.mk
Deze Makefile zorgt ervoor dat wanneer ik het commando make upload
uitvoer, de compiler de libraries SoftwareSerial en TinyGPS weet te vinden. Vervolgens kan ik met screen /dev/ttyACM0 115200
op de serieële poort van de Arduino luisteren naar de output van TinyGPS.
Simple TinyGPS library v. 12
by Mikal Hart
LAT=52.088100 LON=5.248230 SAT=0 PREC=0 CHARS=292 SENTENCES=1 CSUM ERR=3
LAT=52.088100 LON=5.248230 SAT=0 PREC=0 CHARS=584 SENTENCES=2 CSUM ERR=5
LAT=52.088100 LON=5.248230 SAT=0 PREC=0 CHARS=874 SENTENCES=3 CSUM ERR=10
LAT=52.088100 LON=5.248230 SAT=0 PREC=0 CHARS=1165 SENTENCES=4 CSUM ERR=14
LAT=52.088111 LON=5.248230 SAT=0 PREC=0 CHARS=1455 SENTENCES=5 CSUM ERR=17
Het lukte! Dit was natuurlijk allemaal vrij basic maar mijn doel is om een tracker in elkaar te zetten en deze aan een ballon te hangen. Via een radiozender (Radiometrix NTX2) wordt dan de GPS-locatie verstuurt. Er zijn een hoop mensen die naar deze signalen luisteren en ervoor zorgen dat deze worden doorgegeven aan bijvoorbeeld http://spacenear.us/tracker/. Wordt dus vervolgt!