Een GPS-tracker op de Raspberry

Als je de mini-computer Raspberry Pi 3B al in jouw camper geïnstalleerd hebt (als media-player of iets dergelijks), dan kun je hem ook inzetten als GPS-tracker. Hij legt dan van de door jouw gereden route de GPS coördinaten vast, maar ook de snelheid en de hoogte. Met een klein beetje software kun je die dan weer uitlezen en , als je dat wilt, op Google Maps laten weergeven.

GPS-module

Voor de Raspberry zijn talloze GPS-modules te verkrijgen, van top-hat (die je boven op de Raspberry moet prikken) tot losse USB-modules. Ik heb voor die laatste gekozen omdat ze eenvoudig zijn aan te sluiten (je hoeft alleen de usb-stekker in de Raspberry te steken) en op Ali voor een prikje te krijgen. Ik heb de Stoton Ublox NMEA-0183 bij Ali gekocht voor nog geen € 7,00, incl. verzendkosten. NMEA-0183 is van oorsprong een protocol om via apparatuur aan boord van schepen gegevens uit te wisselen. In de loop van de tijd is het uitgebreid en de GPS-modules gebruiken het nu ook om hun data uit te wisselen. Deze data worden verpakt in een zin die maximaal 82 karakters kan bevatten. Een typische GPS data zin ziet er zo uit:

$GPGGA, 131056.000,5209.6087,N,00577.4958,E,2.10,0.80,95.9,M,48.1,M,0000,0000*4B

De GPS module doet niets anders dan een constante stroom van die zinnen naar de Raspberry sturen. Voor ons zijn alleen de eerste serie karakters van belang:
$GPGGA = $: begin van de zin, GP: GPS apparaat, GGA: betrouwbare gecontroleerde data
131056.000 = UTC tijdsaanduiding
5209.6087,N = positie is N 52.096087, omgerekend is dat N 52°05’45.9″
00577.4958,E = positie is O 5,774958, omgerekend O 5°46’29.9″
2.10 = snelheid in km/h
*4B = xor controle bit; hiermee kan worden vastgesteld of de overdracht van de gegevens fouten heeft bevat of niet. De in dit voorbeeld opgenomen coördinaten zijn die van de Minicamping “de Bosrand”, Arnhemseweg 87, 6731 BR Otterlo.

Afvangen van de data door de Raspberry

Nu moet deze stroom van data nog door de Raspberry worden afgevangen, vertaald naar bruikbare data en worden opgeslagen, zodat je ze later kunt verwerken. Gelukkig hebben andere mensen al het harde werk voor je gedaan om de onbewerkte GPS-gegevens goed te ontleden, en we kunnen (naast andere opties) een leuk klein pakket met de naam ‘gpsd’ gebruiken. Dit pakket fungeert in wezen als een laag tussen je applicaties en de feitelijke GPS-hardware, geeft een correcte afhandeling van overdrachtsfouten en een gemeenschappelijke, goed gedefinieerde interfaces voor elke GPS-module.

Om gpsd te installeren tikken we de volgende zin in in de Terminal:

pi@raspberrypi ~ $ sudo apt-get install gpsd gpsd-clients python-gps

Het zojuist geïnstalleerde programma heeft een onhebbelijkheidje: het start systemd (system management daemons) service. Deze service luistert voortdurend naar onder andere de usb-poort en start het programma gpsd zodra je een GPS-ontvanger aansluit. Helaas blokkeert deze service andere onderdelen van gpsd die we verderop nog zullen gebruiken en dat wil je niet. Daarom zetten we de ze (extra) functie uit met de volgende twee commando?:

pi@raspberrypi ~ $ sudo systemctl stop gpsd.socket
pi@raspberrypi ~ $ sudo systemctl disable gpsd.socket

Als je ze ooit weer zou willen aanzetten dan kun je dat met het commando sudo systemctl enable gpsd.socket sudo systemctl start gpsd.socket

Voordat we verder gaan willen we zeker weten dat de GPS-module door de Raspberry wordt herkend. Dat doe je door alle poorten af te vragen:

pi@raspberrypi ~ $ sudo lsusb

Jouw Raspberry antwoord met zoiets als:

Hieruit blijkt dat jouw GPS wordt herkend, hij zit nl op Bus 001 Device 007 (Prolific Technology)

Weet jij de naam van jouw module niet, type dan dit commando in zonder dat de module is aangesloten, sluit vervolgens de module aan en tik het commando weer in. Wijzigt de uitkomst dan is de module herkend (en weet jij ook de benaming van jouw module!)

Vervolgens laten we het programma “gpsd” weten dat de module op de USB-poort is aangesloten en niet op bijvoorbeeld de GPIO-poorten van de Raspberry.

pi@raspberrypi:~$ sudo gpsd /dev/ttyUSB0 -F /var/run/gpsd.sock

Als het goed is opent “gpsd” nu de juiste poort en stroomt de data binnen. Dit kunnen we testen door

pi@raspberrypi:~$ cgps

Nu alles werkt passen we het configuratie-bestand aan zodat de Raspberry ook bij een automatische start “gpsd” goed laat werken. We geven in de Terminal het volgende in:

pi@raspberrypi:~$ sudo nano /etc/default/gpsd

we wijzigen nu het bestandje zodat het er zo uit ziet:

Opslaan van de data

Ik gebruik mijn Raspberry Pi 3B in de camper in de eerste plaats voor de aansturing van mijn alarm. Als mijn alarm uit staat, doet de Raspberry dienst als Camptica (registratie van koelkast-temperatuur, buiten temperatuur, luchtdruk, luchtvochtigheid e.d.). Hij kan dan tevens als GPS-tracker dienst doen. Mijn Raspberry is echter geheel verscholen ingebouwd maar ik heb wel twee USB-poorten met kabeltjes verlengd tot in het dashboard van de camper. Die twee poorten kan ik nu mooi gebruiken voor de aasluiting van de GPS-module en een lege USB-stick als opslag.

Om een USB-stick als opslag-medium in te stellen ga je als volgt te werk:

Achterhaal het unieke ID-nummer van de USB-stick
Om het unieke ID-nummer van de USB stick te weten te komen, tik in het Terminal-venster in:

pi@raspberrypi:~$ ls -l /dev/disk/by-uuid/

Je ziet dan zoiets als:

Gewoonlijk geeft de regel met “/sda” jouw USB-stick weer en in ons geval is dat ID: “18A9-9943”. Noteer jouw ID op een papiertje; je hebt het later nog nodig.

Maak een Mount Point

Een mount point is een map die direct verwijst naar jouw USB-stick. Maak een herkenbare map daarvoor aan:

pi@raspberrypi:~$ sudo mkdir /media/usb

Ik maak gebruik van “usb” maar je kunt elke naam daar voor bedenken. Hou het kort want als je handmatig naar de USB wilt moet je die map elke keer intikken.
Nu moeten we de Raspberry Pi zelf eigenaar maken van die map:

pi@raspberrypi:~$ sudo chown -R pi:pi /media/usb

Dit hoef je maar éénmaal te doen.
Je hebt vanaf nu twee keuzes:

  1. Handmatig de koppeling activeren:
    a. Typ het volgende commando in:
    b. pi@raspberrypi:~$ sudo mount /dev/sda1 /media/usb -o uid=pi,gid=pi
    c. Dit activeert de usb-stick zodat de Raspberry Pi deze kan gebruiken. Laat je “-o uid=pi,gid=pi” weg, dan kun je de usb-stick alleen beschrijven door gebruik te maken van “sudo” .
    d. Nu kun je read, write of delete files door “/media/usb” te gebruiken als bestemming.
  2. Auto activatie:
    Als je de Raspberry Pi herstart gaan die instellingen van de handmatige activatie verloren. Als je de USB-stick wilt activeren elke keer als je de Raspberry opstart, moet je de fstab-file aanpassen:
    a. pi@raspberrypi:~$ sudo nano /etc/fstab
    b. Dan voeg aan het einde het volgende toe:
    c. UUID=18A9-9943 /media/usb vfat auto,nofail,noatime,users,rw,uid=pi,gid=pi 0 0
    d. De “nofail” option zorgt er voor dat het boot-process doorgaat ook al is de USB-stick niet aanwezig.
    e. De “noatime” option zorgt ervoor dat het systeem niet elke keer wordt ge_updated als er een bestand is gelezen. De prestaties worden hierdoor verhoogd.
    f. Mijn fstab file ziet er als volgt uit:

Zorg er voor dat je de juiste UUID gebruikt. Druki vervolgens op CTRL-X , gevolgd door Y om het bestand op te slaan en nano te verlaten. Nu herstart:

pi@raspberrypi:~$ sudo reboot

Jouw USB_stick zou nu beschikbaar moeten zijn als map “/media/usb”.

Je kunt nu “gpsd” rechtstreeks naar de USB-stick laten schrijven. Dit doe je door het volgende commando in de Terminal in te geven:

pi@raspberrypi:~$ sudo gpspipe -r -d -l -o /media/usb/data.date +"%Y%m%d%h%m%s".nmea

Je stopt het schrijven met

pi@raspberrypi:~$ sudo killall gpspipe

Er zijn diverse programma’s te downloaden die vervolgens van deze NMEA-data een visueel spoor op een kaart trekken. De meest eenvoudige is GPSBabel.

Installeer GPSBabel daarna en tik in Terminal in:

pi@raspberrypi:~$ gpsbabel -i nmea -f /media/usb/data.160902Sep091472862456.nmea -o kml -F trackdata1.kml

Je hebt nu een bestandje in het Google formaat kml, waar bijna elk GPS programma (en Google Maps) mee aan de slag kan.

laatstelijk gewijzigd: december 2017