Bluetooth GPS module koppelen

In deze tutorial verbind ik een draadloze Bluetooth GPS ontvanger met de Raspberry Pi. Jaren geleden kreeg ik bij mijn smartphone het navigatiepakket Route 66. Omdat de smartphones toen nog geen ingebouwde GPS ontvanger hadden, kreeg ik er een draadloze GPS ontvanger bij die via Bluetooth met de smartphone verbonden werd. Het heeft altijd erg goed en vrijwel zonder problemen gewerkt.

Recent kwam ik de GPS ontvanger weer tegen en ik vroeg me af of het mogelijk zou zijn de ontvanger met de Raspberry Pi te verbinden en GPS data te ontvangen.

Martyn Davies had in 2017 hierover al een item geplaatst. Op basis van zijn uitleg heb ik uitgezocht hoe je de GPS ontvanger aan de Pi kan koppelen en de GPS data in beeld kunt brengen. Met een eenvoudig Python script halen we de tijd uit de NMEA-berichten (National Marine Electronics Association) en hebben we een erg nauwkeurige klok tot onze beschikking.

De data die de ontvanger afgeeft bevat o.a. de tijd, de coördinaten en andere informatie die de satellieten afgeven. Afhankelijk van de locatie kan je veel satellieten ontvangen.

Het NMEA-protocol
Het protocol bestaat uit losse berichtjes (sentences) waarin bepaalde gegevens gegroepeerd zijn. De sentences bestaan in principe alleen uit leesbare ASCII karakters en de ‘carriage return‘- en ‘line feed‘-karakters. Een sentence kan maximaal 82 tekens lang zijn, inclusief de $ en de CR/LF.
Iedere sentence bevat een vast aantal componenten.

– Eerst komt een dollarteken ($)

– Daarna twee tekens met de talker id. Dit is een afkorting voor de apparatuur die de sentence verstuurt (bijvoorbeeld de GPS stuurt berichtjes met de talker id GP en GLONASS id GL).

– Dan volgt de sentence identifier van drie letters. Deze geeft aan wat de informatie in de sentence is en bepaalt daarmee ook de lay-out van de rest van de sentence. Een voorbeeld van een sentence identifier is HDT voor een bericht dat de koers van een schip verstuurt.

– Het deel dat nu volgt is van variabele lengte en kan getallen en tekst bevatten. De inhoud wordt bepaald door de sentence identifier en het NMEA-0183 protocol. Sommige velden in een sentence zijn niet verplicht, maar dan moeten die posities wel leeg worden doorgegeven. (zie onderstaand voorbeeld). De verschillende velden worden met komma’s gescheiden.

– Aan het einde van het bericht mag een checksum toegevoegd worden. Als dit gedaan wordt, dan komt eerst een asterisk (*) en volgt daarna de hexadecimale weergave van de xor van alle tekens tussen de ‘$’ en de ‘‘. De checksum is twee tekens lang. Voorbeeld: $TTSSS,veld,1,veld,2,,*2A.

– Als laatste volgen de tekens ‘carriage return’ en ‘line feed’.

Een voorbeeld

Wil je meer weten over NMEA, klik dan hier.


Update de Raspberry Pi
Allereerst zorgen we ervoor dat Raspbian van de laatste updates voorzien is.

sudo apt update

Screen
We hebben een communicatieprogramma binnen een terminal TTY-instantie nodig waarbij de commando’s van de SSH-terminal geen invloed mogen hebben op het communicatieprogramma.

Screen heeft deze eigenschappen. Bij Screen kan je de instantie die het proces bevat loskoppelen en opnieuw verbinden. Je kunt zelfs de SSH-sessie helemaal afmelden en verbinding maken vanaf een andere computer en vervolgens de terminal TTY-instantie opnieuw verbinden, het communicatieproces zal er nog steeds zijn, wat het ook deed toen je de verbinding verbrak.

Screen is snel en eenvoudig te installeren en makkelijk te gebruiken ook.

sudo apt-get install screen

Meer weten over screen? Klik hier.

Voor deze tutorial moet ook Pyserial geïnstalleerd worden:

pip install pyserial

Ik kreeg onderstaande melding, jij misschien ook. De bibliotheek is al in de distributie opgenomen.

Bluetooth ondersteuning in Raspbian
Vanaf Raspbian versie 8 bevat het systeem alle techniek om Bluetooth te gebruiken. Je hoeft dus niet veel te doen om het aan de praat te krijgen. Wil je de versie van het besturingssysteem controleren? Geef dan het volgende commando:

cat /etc/os-release

Raspbian versie 10 (Buster)

De bluetooth GPS ontvanger kunnen we op twee manieren met de Raspberry Pi koppelen (pairen).
– Via de LXTerminal (voorkeur)
– Via de Raspbian desktop (snelst)

Ofschoon het verbinden via de desktop makkelijk en snel is, heeft het verbinden via de terminal mijn voorkeur vanwege het leerelement. Ik leg ze hieronder allebei uit.

Bluetooth ontvanger verbinden met de Pi (via de Raspbian desktop)

  1. Schakel je draadloze Bluetooth ontvanger in.
  2. Ga naar de Raspbian desktop.
  3. Ga naar het Bluetooth pictogram rechts bovenin het scherm
  4. Een keuzemenu verschijnt. Kies Add Device…

5. Een overzicht van alle beschikbare Bluetooth apparaten verschijnt die de Pi ‘ziet’. Het bestaat uit MAC-adressen en ID’s. Zoek het apparaat dat je wilt verbinden, de GPS ontvanger dus.

  1. Selecteer de GPS ontvanger en klik op Pair.
  2. Een venster verschijnt waarin je de PIN-code moet ingeven. Voor mijn en de meeste bluetooth apparaten is de code ‘0000’.
  1. Als je te lang wacht met invoeren krijg je een time-out en zal je het opnieuw moeten proberen.
  2. Als de code juist is wordt het apparaat met de Pi ge-paird. Dit wordt bevestigd met een melding.
  1. Opvallend is de opmerking in de melding dat de Raspberry Pi geen services heeft die gebruik maakt van de Bluetooth GPS ontvanger. Dit klopt! We gaan hier nu mee aan de slag.

De Bluetooth GPS ontvanger is nu verbonden met de Raspberry Pi.

Bluetooth ontvanger verbinden met de Pi (via de LXTerminal)

  1. Open de LXTerminal.
  2. Schakel je Bluetooth ontvanger in.
  3. Kijk of en welke Bluetooth service ingeschakeld is met:

systemctl status bluetooth

4. Wil je zien of de zogenaamde daemon actief is. Geef dan het commando:

ps ax | grep “blue”

Je ziet in dit scherm en daarvoor dezelfde PID (Process ID) 671, dat wil zeggen dat het goed werkt.

5. Scannen van de omgeving naar Bluetooth devices met:

hcitool scan

Bij mij werd de Bluetooth GPS ontvanger met de naam BlueGPS BD93CD en zijn MAC-adres snel gevonden.

6. Geef het commando: bluetoothctl

7. Scan voor de omgeving met: scan on

Uitzetten is: scan off

8. Om de Pi met de Bluetooth ontvanger te laten paren geeft je in:

pair 00:02:C7:BD:93:CD

Voor de meeste Bluetooth apparaten is de PIN-code: 0000

TIP: Als het in de terminal niet lukt om te pairen. Kijk dan in de desktop van Raspbian, klik op het Bluetooth pictogram en probeer hier met de GPS ontvanger te /pairen.

Communicatie tot stand brengen
Nu de GPS ontvanger via Bluetooth met de Pi verbonden is gaan we de communicatie tot stand brengen. We checken in de terminal nog even het gepairde apparaat. Daarvoor moeten we wel in de bluetoothctl modus zitten. Mocht dit nog niet het geval zijn, omdat je via de desktop gepaird hebt, geef dan in de terminal het commando:

bluetoothctl

Geef in de terminal [bluetooth]# het commando: paired-devices

Je ziet de bluetooth apparaten die met de Pi verbonden zijn.

Met Ctrl-D stop je de Bluetooth control modus.

Verbinden met COM-poort
Om de tekstberichten te kunnen lezen moet het apparaat met een COM-poort verbonden worden. Dit moeten we doen als super- user:

sudo su

Nu ben je super-user. We geven de COM-poort de naam rfcomm1 met :

rfcomm bind /dev/rfcomm1 [MAC-adres van jouw apparaat]

In dit voorbeeld wordt dit:

rfcomm bind /dev/rfcomm1 00:02:C7:BD:93:CD

Om te weten wat de status van de poort is geef je het commando:

rfcomm

De reactie op het commando:

We willen nu zien welke informatie ontvangen wordt. Hiervoor gebruiken we om de tekst van de COM-poort rfcomm1 te kunnen zien. Je hoeft hiervoor niet persé super-user te zijn.

screen /dev/rfcomm1

Screen opent zich en loopt vol met de NMEA-informatie die door de Bluetooth ontvanger naar de Pi verzonden wordt.

NMEA-informatie

Om de terminal te beëindigen en terug te gaan naar de prompt, druk je op: Ctrl-D.


Global Positioning system fixed data
In deze tutorial ben ik met name geïnteresseerd naar de $GPGGA, ook wel GGA genoemd. Dit is de Global Positioning system fixed data. Deze ziet er als volgt uit:

$GPGGA, 144634.000,5156.5934,N,00553.2354,E,1,04,4.6,57.9,M,0.0,M,,0000*5E

Hierin staat onder andere de tijd, de breedte- en lengtegraad, Noord/Zuid, Oost/West, de hoogte, aantal satellieten, HDOP (Horizontal Dilution Of Precision ) en of er een “fix” is en zo ja of dat een 2D of 3D-fix is.

In het bijzonder ben ik geïnteresseerd in de eerste waarde, te weten: 144634. Dit is de tijd in uren, minuten en seconden. Zoals je wellicht weet is de GPS-tijd erg accuraat. Met een script kunnen we de tijd in het GPS -signaal zichtbaar maken.

Python script
Ik heb een op basis van het script van Martyn Davies een paar scripts gemaakt. Het is aan jou om er je eigen ding van te maken.

Maak de map GPS aan en zet de scripts hier in. Je start het script met:

python simple-gps3.py

De klok wordt zichtbaar zodra de GPS data ontvangen en verwerkt is.

simple-gps3.py

Gebruik Ctrl-C om het script te stoppen.


Voorkomen van meldingen
Voordat het script gestart kan worden, moet je er zeker van zijn dat de COM-poort rfcomm1 niet door andere toepassingen gebruikt wordt en beschikbaar is, ander krijg je de melding:

rfcomm1 is niet beschikbaar

of

Deze melding geeft aan dat COM-poort rfcomm1 bezig is.


Voor een snel resultaat

Als je bovenstaande eenmaal gedaan hebt, wil je de tweede keer niet alles weer doorlopen. Daarom heb ik hieronder een korte route beschreven waarbij je snel een werkend script hebt.

1. Verwijder in de desktop de oude pairing met de GPS ontvanger
2. Reboot de Pi
3. Schakel de bluetooth GPS ontvanger in nadat de Pi opgestart is
4. Pair via de desktop de draadloze bluetooth GPS-ontvanger met de Pi
5. Bind de COM-poort met het MAC-adres van jouw GPS-ontvanger: sudo rfcomm bind /dev/rfcomm1 00:02:C7:BD:93:CD
6. Check of de poort rfcomm1 als device in het systeem beschikbaar is, dit doe je met:
cd /dev/ && ls
In het overzicht dat verschijnt zou rfcomm1 zichtbaar moeten zijn.
7. Check of de poort voor Python beschikbaar is met:
python -m serial.tools.list_ports
Staat rfcomm1 erbij? Als het goed is als: /dev/rfcomm1
8. Start nu het gewenste script in de GPS directorie op zoals:
python ~/GPS/simple-gps.py

De GPS tijd op basis van het originele script (simple-gps.py)

Gebruik Ctrl-C om het script te stoppen.

Have A Nice Day!