GPS für den Raspberry Pi
über
Dank I2C und SPI entfällt der größte Teil der sonst nötigen Signal-Konditionierung für den Anschluss von Sensoren an Mikrocontroller. Die modernen „schlüsselfertigen“ Sensoren liefern ihre Daten fix und fertig über einen standardisierten seriellen Bus. Als verbleibendes Problem hat man es mit winzigen Gehäusen zu tun, denn viele Sensoren sind für den Einsatz in Smartphones etc. vorgesehen, was die Verpackung in BGA- und ähnlich winzige Gehäuse zur Folge hat, die man von Hand nicht wirklich gut bestücken kann (siehe Kasten Probleme mit BGAs).
Gerade bei Kleinserien wäre es unökonomisch, fertige Evaluation-Boards zu verwenden, die einen Hauptcontroller plus die ganze Sensorik enthalten. Dann sind Erweiterungs-Boards wie etwa die Berry-Familie eine attraktive Alternative.
Willkommen in der Berry-Familie
Bei den Berry-Boards handelt es sich um ausgereifte Produkte. Der Hersteller OzzMaker bietet eine ganze Reihe solcher Platinen an. Nachfolgend geht es vor allem um die Typen BerryIMU und BerryGPS-IMU. Bild 1 zeigt beide Boards.
Auch wenn moderne Sensorchips im Interesse höherer Packungsdichte normalerweise nur auf sehr wenigen I2C-Adressen ansprechbar sind, bieten die im BerryIMU enthaltenen und in Tabelle 1 aufgelisteten weiteren Sensoren meistens zwei verschiedene Adressoptionen.
Bei den Berry-Boards kann man die Adressen durch die in Bild 2 gezeigten Jumper auf der Unterseite der Platine per Lötzinntropfen selektieren. Dank entsprechender Elektronik funktionieren die Platinen sowohl mit den mit 3,3 V eines Raspberry Pi als auch mit den 5 V der Arduino-Welt. BerryIMU V3 ist dabei insofern besonders, als das Board nicht nur per I2C kommuniziert, sondern die Verbindung durch Setzen eines der abgebildeten Jumper in eine SPI-Schnittstelle verwandelt werden kann.
Richtig amüsant empfand ich die in Bild 3 gezeigte Verbindungslösung, die den Anschluss einer IMU-Platine an einen RPi ermöglicht. Berry-Boards zeigen sich bezüglich RPi etwas widerspenstig. Ich wollte einen RPi des Typs 4B verwenden, da sich dieses Modell gerade auf meinem Schreibtisch befand. Beim Anschluss eines BerryIMU muss man genau darauf achten, dass die kleine Adapterplatine so auf dem Header steckt, dass die Buchsenöffnung für den Kabelanschluss weg vom RPi zeigt.
Tests
Für die Suche nach einem RPi im LAN bietet sich die Verwendung von nmap an. Der Befehl nmap -sP 192.168.1.1/24 findet mit dem Netzwerk verbundene RPIs auch ohne an sie angeschlossene Bildschirme.
Im nächsten Schritt werden die Sensoren in Betrieb genommen. Die Berry-Boards sind reichhaltig dokumentiert. Auch die Nutzung der Sensoren in verschiedenen Einsatzszenarien ist illustriert. Der Beispiel-Code ist wie häufig bei GitHub zu finden. Da aktuelle Versionen von Rasbpian den git-Client mitbringen, erfolgt die Bereitstellung durch folgendes Kommando:
pi@raspberrypi:~ $ git clone http://github.com/ozzmaker/BerryIMU.git
Für einen ersten Ausleseversuch bietet sich python-BerryIMU-gyro-accel-compass an. Hierzu gibt man folgenden Befehl ein:
pi@raspberrypi:~/BerryIMU/python-BerryIMU-gyro-accel-compass $ python3 berryIMU-simple.py
Nachfolgend ist eine typische Reaktion zu sehen:
Found BerryIMUv3 (LSM6DSL and LIS3MDL)
Loop Time 0.02 # ACCX Angle 173.62 ACCY Angle 179.06 # # GRYX Angle 0.08 GYRY Angle -0.03 GYRZ Angle 0.02 # # CFangleX Angle 104.20 CFangleY Angle 107.43 # # HEADING 303.92 tiltCompensatedHeading 313.31 #
Wer die Haupt-Arbeitsdatei des Programms öffnet, findet dort eine hardwarespezifische Unterstützungs-Bibliothek:
IMU.detectIMU()
if(IMU.BerryIMUversion == 99):
print(" No BerryIMU found... exiting ")
sys.exit()
IMU.initIMU()
Die Auswertung der Informationen erfolgt in einer Endlosschleife, welche von der IMU bereitgestellte Funktionen aufruft und die Ergebnisse anfangs in Variablen zwischenspeichert:
while True:
ACCx = IMU.readACCx()
ACCy = IMU.readACCy()
ACCz = IMU.readACCz()
GYRx = IMU.readGYRx()
GYRy = IMU.readGYRy()
GYRz = IMU.readGYRz()
MAGx = IMU.readMAGx()
MAGy = IMU.readMAGy()
MAGz = IMU.readMAGz()
Bei der geöffneten Bibliotheksdatei sieht man, dass der Beispiel-Code ein Lehrbuch-Exempel für die Modularisierung einer Python-Applikation darstellt. Im Header kommt im ersten Schritt das SMBus-Modul zum Einsatz, dass auf der RPi-Plattform für die Interaktion mit dem I2C-Bus sorgt:
import smbus
bus = smbus.SMBus(1)
from LSM9DS0 import *
from LSM9DS1 import *
from LSM6DSL import *
from LIS3MDL import *
import time
Sensorik
Ich habe schon oft erlebt, dass die bloße Interaktion mit solchen Sensoren nur ein vergleichsweise kleiner Teil der Arbeit ist. Aber wenn man sich einmal durch die Datenblätter gegraben hat, sind auch Sensoren anderer Hersteller schnell verstanden. Kritischer ist da schon die Daten-Aufbereitung auf einem höheren Level.
Zum Glück ist BerryIMU besonders umfangreich dokumentiert. Das mit RPi Mögliche - z.B. mit der kostenlosen Version des Analyse-Programms Wolfram - wird voll ausgenutzt. Aus Platzgründen sei hier auf die Webseite von OzzMaker verwiesen, von wo auch Bild 4 stammt.
Auf der angeführten Webseite finden sich unter anderem Grafiken, die zwischen Harteisen und Weicheisen-Verschiebung unterscheiden. Dies betrifft den Versatz der Daten bzw. des Mittelpunkts der Punktewolke. Sogenannte HIDs (Hard Iron Distortions) entstehen durch magnetische Objekte, die sich permanent in der Umgebung des Objekts befinden. SIDs (Soft Iron Distortions) hingegen sind ferromagnetische und sonstige, z.B. auf das Erdmagnetfeld zurückzuführende Störungen. HIDs verschieben nur den Mittelpunkt, während SIDs die normalerweise runde Form des Feldplots verzerrt. Wie Sie sehen können, ist diese Webseite durchaus interessant.
Drohnen-Sensor
BerryIMU ist für den Einsatz in Drohnen nicht wirklich gut geeignet, weil sich die Verbindung mit dem Adapter von Bild 3 nicht vibrationssicher realisieren lässt. Problem Nr. 2 ist, dass BerryIMU keine GPS-Daten liefert, die aber für viele Aufgaben wichtig sind.
Für die Verbindung zwischen Raspberry Pi und dem besser geeigneten BerryGPS-IMU muss ein zehnpoliger Header eingelötet werden. Das ist mit etwas Löterfahrung trotz der Nähe zu zwei SMD-Entkopplungskondensatoren nicht weiter schwierig (siehe auch den Kasten Warum von Hand Löten).
Für die mechanische Verbindung liegen vier Schrauben/Mutter-Sätze bei. Die Löcher auf der Platine sind dabei für den RPi Zero gedacht. Beim Einsatz mit einem RPi 4 bleiben - wie in Bild 5 zu sehen - zwei Löcher ungenutzt.
Nach dem Aufstecken (im ausgeschalteten Zustand) kann man den RPi einschalten, um dann einen Scan per I2CDetect durchzuführen. Diese Platine liefert die gleichen Ergebnisse wie BerryIMU, da sie die gleichen Sensoren mitbringt.
Interessanter ist die Inbetriebnahme des ebenfalls auf der Platine befindlichen Ublox-GPS-Moduls, das BerryGPS-IMU von der kleineren Variante BerryIMU unterscheidet. Man hat hier die Wahl zwischen der integrierten und einer externen Antenne, was über einen Schalter festzulegen ist. Das an eine kleine Knopfzelle erinnernde Element ist ein SuperCap, der die kurzfristige Zwischenspeicherung von Ephemeridendaten über die Satellitenpositionen unterstützt. Diese Infos helfen dem GPS-Empfänger, nach kurzem Ausschalten schneller wieder hochzufahren und so die GPS-Daten schneller bereitstellen zu können.
Die eigentliche Kommunikation zwischen GPS-Modul und Host-Rechner erfolgt über einen seriellen Port. Beim RPi gestaltet sich das aufgrund immer wieder auftretender kleiner Kernel-Unstimmigkeiten etwas problematisch. Man sollte daher zuvor nach folgendem Schema eine Aktualisierung des verwendeten RPi-OS vornehmen:
pi@raspberrypi ~ $ sudo apt-get update
pi@raspberrypi ~ $ sudo apt-get upgrade
pi@raspberrypi ~ $ sudo reboot
Die Konfiguration des seriellen Ports erfolgt über Raspi-Config mit der Option Interfacing Options. Gewählt wird die Option Serial, und der serielle Port soll keine Login-Konsole anbieten.
Im zweiten Schritt fragt das Programm, ob die Hardware für den seriellen Port einzuschalten ist – Antwort ist ein klares Ja. Dann zeigt sich die in Bild 6 zu sehende Bestätigung. Nun ist nur noch ein Reboot erforderlich, um die neue Hardware-Konfiguration wirksam werden zu lassen.
GPS verstehen
Die Eingabe des folgenden Kommandos sorgt dafür, dass der RPi die vom GPS-Modul gelieferten Informationen in der Kommandozeile ausgibt:
pi@raspberrypi:~ $ cat /dev/serial0
$GPGSV,1,1,00*79
$GLGSV,1,1,00*65
$GNGLL,,,,,,V,N*7A
$GNTXT,01,01,01,NMEA unknown msg*46
Die Daten im NMEA-Format sind nicht allzu kompliziert. Wer alle Informationen aus dem GPS-Datenstrom extrahieren möchte, sollte sich einen eigenen Parser bauen. Linux wird schon lange erfolgreich als OS für Prozessrechner und Steuerungen eingesetzt. Deshalb gibt es mittlerweile eine umfangreiche Infrastruktur für die Verarbeitung von Geo-Daten. Wer ein GPS-System integriert, kann Applikationen von Drittanbietern schnell und einfach auf die angelieferten Daten zugreifen lassen.
Für die Einrichtung der Daten-Pipeline braucht es zunächst eine Gruppe von Paketen. Besonders wichtig ist gpsd (gpsdaemon). Diese im Hintergrund laufende Software leitet GPS-Informationen weiter:
pi@raspberrypi:~ $ sudo apt-get install gpsd-clients gpsd -y
Nach dem Download wird die Konfigurationsdatei nach folgendem Schema bearbeitet:
pi@raspberrypi:~ $ sudo pico /etc/default/gpsd
Besonders wichtig ist der Block Devices:
# Devices gpsd should collect to at boot time.
# They need to be read/writeable, either by user gpsd or the group dialout.
DEVICES=""
- - - - -
# Devices gpsd should collect to at boot time.
# They need to be read/writeable, either by user gpsd or the group dialout.
DEVICES="/dev/serial0"
An dieser Stelle lässt sich die Funktion der Pipeline z.B. mit gpsmon überprüfen. Resultat ist eine grafisch attraktive Übersicht der NMEA-Daten:
pi@raspberrypi:~ $ gpsmon
Fazit
Egal für welche Projekte genau: Die Anbindung von Accelerometer, Magnetometer und Co. ist für Mikrocontroller-affine Zeitgenossen schon eine Art digitale Kulturtechnik, deren Beherrschung man nie bereut. Die Boards von OzzMaker eignen sich ideal nicht nur für Experimente, sondern erleichtern dank ihrer umfangreichen Dokumentation den praktischen Einsatz.
Für kleine Serien sind die Platinen ebenfalls gut geeignet, denn bei kleinen Mengen fallen sie preiswerter aus, als wenn man Analoges selbst herstellen (lassen) würde. Da man sie anonym kaufen kann, sind diese Boards auch schwerer „tracebar“. Alles in allem eine runde Sache!
Sie haben Fragen oder Kommentare?
Haben Sie Fragen oder Anmerkungen zu diesem Artikel? Schicken Sie eine E-Mail an den Autor unter tamhan@tamoggemon.com oder kontaktieren Sie Elektor unter editor@elektor.com.
Diskussion (0 Kommentare)