Für einige Projekte, z.b: im CarComputer-Bereich, wird die aktuelle GPS Position benötigt. Dazu kann an den Raspberrry Pi ein USB GPS Empfänger angeschlossen und ausgewertet werden. Die meisten der für den USB-Port erhältlichen GPS-Mäuse melden sich als serielles Gerät an und werden von dem Raspberry Pi ohne Treiberinstallation automatisch erkannt. Empfehlenswert ist der GlobalSat BU-353-S4 GPS-USB-Empfänger. Er bietet mit dem SirfStar 4 Chip eine sehr gute Empfangsleistung. Der Zugriff auf die GPS Daten kann über die Tool Suite gpsd erfolgen.
GPS Empfänger einrichten
Wird der GPS-Empfänger an den Raspberry Pi angeschlossen muss er in der Liste der USB Geräte auftauchen. Diese kann mit dem Befehl „lsusb“ aufgerufen werden.
root@raspberrypi:~# sudo lsusb Bus 001 Device 002: ID 0424:9512 Standard Microsystems Corp. Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. Bus 001 Device 004: ID 067b:2303 Prolific Technology, Inc. PL2303 Serial Port
Je nach Hersteller ist des GPS-Empfängers unterscheidet sich die Bezeichnung des Gerätes. In diesem Fall ist es das Gerät „Prolific Technology, Inc. PL2303 Serial Port“.
Raspbian weißt dem Gerät automatisch einen virtuellen USB Port zu. Welcher Port zugewiesen wurde kann aus dem Syslog gelesen werden mit dem Befehl: „sudo tail -f /var/log/syslog“. Hier wurde der Port „ttyUSB0“ zugewiesen. Die Logdatei kann wie die meisten Konsolen Programme mit Strg+C beendet werden:
root@raspberrypi:/dev# sudo tail -f /var/log/syslog Apr 7 17:55:11 raspberrypi kernel: [4926303.396898] usb 1-1.3: New USB device strings: Mfr=0, Product=0, SerialNumber=0 Apr 7 17:55:11 raspberrypi kernel: [4926303.452197] usbcore: registered new interface driver usbserial Apr 7 17:55:11 raspberrypi kernel: [4926303.454106] usbcore: registered new interface driver usbserial_generic Apr 7 17:55:11 raspberrypi kernel: [4926303.455879] USB Serial support registered for generic Apr 7 17:55:11 raspberrypi kernel: [4926303.455924] usbserial: USB Serial Driver core Apr 7 17:55:11 raspberrypi kernel: [4926303.465107] usbcore: registered new interface driver pl2303 Apr 7 17:55:11 raspberrypi kernel: [4926303.465828] USB Serial support registered for pl2303 Apr 7 17:55:11 raspberrypi kernel: [4926303.465944] pl2303 1-1.3:1.0: pl2303 converter detected Apr 7 17:55:11 raspberrypi kernel: [4926303.477427] usb 1-1.3: pl2303 converter now attached to ttyUSB0
Um die von dem GPS-Empfänger empfangen GPS-Koordinaten auszulesen empfehlen sich unter Linux die bereits angesprochenen gpsd Tools. Diese können mit folgendem Befehl installiert werden:
sudo apt-get install gpsd gpsd-clients python-gps
Der gpsd Daemon wird wie folgt gestartet:
sudo gpsd /dev/ttyUSB0 -F /var/run/gpsd.sock -G
Das Flag „-G“ sorgt dafür, das der Server unter allen IP-Adressen auf Port 2947 erreichbar ist und nicht nur unter localhost. Unter Windows kann dies z.B. mit Telnet getestet werden. (Telnet muss ab Windows 7 über „Programme und Funktionen“ in der Systemsteuerung nachinstalliert werden)
telnet IP_ADRESSE_RASPI 2947
Für den GlobalSat Empfänger kann es notwendig sein sein Binärprotokoll nach NMEA zu ändern damit dieses korrekt von gpsd verarbeitet wird. Dies kann mit dem Befehl „gpsctl -n“ erreicht werden.
Anzeige der GPS Daten
Die GPS-Daten können auf der Konsole mit dem Programm „cgps“ angezeigt werden. Dabei ist zu beachten das der GPS Empfänger freie Sicht zum Himmel benötigen um Daten zu empfangen.
sudo cgps -s
Mit dem Befehl „xgps“ steht ein grafische Programm zur Verfügung. Ist an dem Raspberry Pi kein Monitor angeschlossen kann die Ausgabe grafischer Programme auch über SSH erfolgen wie es in diesem Artikel beschrieben.
sudo xgps
Mit dem Programm „gpsmon“ der gpsd Toolsuite lassen sich die vom GPS Empfänger gesendet Rohdaten, meist in Form von NMEA Sätzen, live auf der Console sehen. Somit kann wunderbar überprüft werden ob Daten empfangen werden.
sudo gpsmon
Auslesen der GPS-Daten in Java
Gpsd stellt die GPS-Daten in JSON codierter Form auf Port 2947 bereit. Dieses können über eine TCP/IP Socketverbindung auslesen werden. Vereinfacht wird dies unter Java mit der Library GPSd4java.
Allerdings war die Library bei mir nicht direkt lauffähig. Ich musste über die Socket-Verbindung zunächst einen Befehl schicken, der die JSON-Ausgabe der GPS-Daten startet.
?WATCH={"enable":true,"json":true};
Danach können mit der Library die Daten sehr gut ausgelesen werden. Dazu habe ich das kleine, auf dem Screenshot abgebildete, Java Programm geschrieben:
Download ausführbares Programm „jGpsdTest“:
Download des Source-Codes: