DesignSpark Electrical Logolinkedin
Menu Suche
Ask a Question

GPS zu Raspberry Pi-Projekten für Orts- und Zeitbestimmung hinzufügen

Durch die Hinzufügung eines GPS-Empfängers erhalten Raspberry Pi-Projekte präzise Positions- und Zeitbestimmungsfunktionen. Das ist äußerst hilfreich, wenn Sie die Position eines Geräts ohne festen Standort und für Systeme bestimmen müssen, die eine präzise Zeitsynchronisierung erfordern. 

Mit dem Adafruit Ultimate GPS-HAT ist das Hinzufügen von GPS-Funktionen zum Raspberry Pi äußerst einfach. Ein zusätzlicher Bonus ist die Integration einer Echtzeituhr mit Akkusicherung sowie ein Prototyping-Bereich. 

In diesem Beispiel montieren wir ein Raspberry Pi 3 Model B (896-8660) und einen Adafruit Ultimate GPS-HAT (124-5481) in ein DIN-Schienengehäuse von Phoenix Contact (122-4298) . Beide Komponenten könnten auch in zahlreichen anderen Gehäusen mit Platz für Pi und HAT untergebracht werden.

Montage

Für die Montage des GPS-HAT muss lediglich die Durchgangsbohrungs-Stiftleiste gelötet werden. Der HAT wird dann mit der P1-Stiftleiste des Pi verbunden.

Die Gehäusekomponenten sind oben zu sehen

In der unteren Hälfte wurde oben links ein Loch gebohrt, um ein Koaxialkabel, SMA-Buchse auf U.FL-Stecker (794-2897) , abringen zu können. Das GPS-Modul hat eine integrierte Antenne. Wenn Hindernisse den Empfang stören oder der Empfänger in einem Metallgehäuse untergebracht ist, ist eine externe Antenne erforderlich.

Der U.FL wurde mit dem HAT verbunden und das Gehäuse wurde zusammengebaut

Beim Testen wurde eine GPS-Antenne der Marke RF Solutions (704-3464) im Fenster platziert.

 

OS-Konfiguration

Es wird keine vollständige Desktop-Distribution von Linux benötigt. Die „Lite“-Variante von Raspbian Jessie ist vollkommen ausreichend. Beschrieben wurde eine microSD-Karte (121-3897) mit:

$ sudo dd if=2017-01-11-raspbian-jessie-lite.img of=/dev/mmcblk0 bs=4M

Beachten Sie, dass der Eingangsparameter des Dateinamens (if) bei neueren Versionen des Raspbian Lite-Image abweichen wird. Ebenso kann der Ausgangsparameter der Datei (of) abhängig von der Linux-Distribution und verwendeten SD-Karte abweichen. Windows-Benutzer können die herkömmlichen Dienstprogramme verwenden, um ein OS-Image auf die MicroSD-Karte zu schreiben.

Wenn ein Bildschirm nicht unbedingt erforderlich ist, arbeite ich bei Raspberry Pi-Projekten bevorzugt mit SSH. Diese Funktion ist nun zwar standardmäßig deaktiviert, kann jedoch wiederhergestellt werden, indem eine leere Datei namens „SSH“ auf der Boot-Partition der Karte erstellt wird. Hierzu muss die Karte entweder auf einem anderen Gerät (z. B. das zum Beschreiben der Karte verwendete Gerät) oder im verwendeten Pi eingelegt sein. Führen Sie den Startvorgang normal durch und geben Sie in der Befehlszeile Folgendes ein:

sudo touch /boot/ssh

Nach einem Neustart sollte die Anmeldung über SSH nun möglich sein und Pi sucht beim Hochfahren automatisch nach der ssh-Datei. Wenn die Datei gefunden wurde, wird ssh aktiviert.

Für Raspberry Pi 3 wird standardmäßig Hardware-UART (serieller Port) über Bluetooth verwendet. Ein serieller Software-Port im unteren Leistungsbereich („mini-UART“) wird zur allgemeinen Verwendung bereitgestellt. Da wir kein Bluetooth benötigen, tauschen wir diese gegeneinander aus. Zunächst einmal führen wir jedoch raspi-config aus und deaktivieren den seriellen Port.

$ sudo raspi-config

P5 Schnittstellenoptionen → P6 Serieller Port (deaktivieren).

Hiermit wird das Senden von Boot-Nachrichten an den seriellen Port beendet. Darüber hinaus wird der auf dem seriellen Port verfügbare Anmeldedienst deaktiviert.

Daraufhin aktivieren wir den UART und erzwingen die Verwendung des mini-UART über Bluetooth, indem wir die /boot/config.txt bearbeiten und die folgenden Zeilen hinzufügen:

enable_uart=1

dtoverlay=pi3-miniuart-bt

Nach einem Neustart vergewissern wir uns, dass /dev/serial0 auf den Hardware-UART (AMA0) und serial1 auf den Software-UART (S0) verweist, mit:

pi@ntpi:~ $ ls -l /dev/ser*

Erster Test

Beim Testen haben wir den Adafruit-Leitfaden befolgt, aber festgestellt, dass eine debug-Ausgabe vom seriellen Port auch erfolgt, ohne diesen über die vorherige Ausführung von stty konfiguriert zu haben. Als wir „stty“ jedoch ausführten, um die angegebenen Optionen festzulegen, erhielten wir keine Ausgabe. Befolgen Sie also einfach die Informationen unter dem folgenden Link, um das Abrufen von Daten über das GPS-Modul zu testen:

$ cat /dev/ttyAMA0

Wenn alles gut geht, entspricht die Ausgabe in etwa dem oben genannten Screenshot. Viele Kommas mit leeren Feldern dazwischen weisen darauf hin, dass kein GPS-Fix vorhanden ist.

Beachten Sie, dass der Ultimate-GPS-Hat mit Raspberry Pi 3 nicht kompatibel war, als der Adafruit-Leitfaden verfasst wurde. Dieses Problem wird jedoch durch die oben beschriebene UART-Konfiguration behoben.

Eine Anwendung wäre nun in der Lage, die über den GPS-Empfänger ausgegebenen Daten direkt zu verwenden. Bei diesen Daten handelt es sich lediglich um Text, der in Form von „NMEA-Standardsätzen“ formatiert ist. Es gibt sogar Bibliotheken (z. B. pynmea für Python), die bei der Auswertung der Daten hilfreich sind.

gpsd

gpsd wird folgendermaßen beschrieben: „Ein Service-Dämon, das einen oder mehrere GPS- oder AIS-Empfänger überwacht, die über serielle oder USB-Ports an einen Host-Computer angeschlossen sind. Hierdurch können alle verfügbaren Daten zu Standort/Kurs/Geschwindigkeit der Sensoren auf dem TCP-Port 2947 des Host-Computers abgefragt werden.

Mit gpsd können sich Client-Anwendungen, die sich über mehrere Standorte erstrecken, den Zugriff auf unterstützte Sensoren ohne Konflikte oder Datenverluste teilen. Darüber hinaus reagiert gpsd auf Abfragen in einem Format, das wesentlich einfacher zu analysieren ist, als das von den meisten GPS-Empfängern ausgegebene NMEA 0183-Format.“

gpsd ermöglicht das Bereitstellen von GPS-Daten für Anwendungen über das Netzwerk und eine einfache Abstraktion der zugrunde liegenden Hardware. Unterstützt wird gpsd von zahlreichen Anwendungen, wie z. B. Software für GPS-Navigation und Erkennung/Zuordnung drahtloser Netzwerke.

gpsd kann folgendermaßen installiert werden:

$ sudo apt-get update

$ sudo apt-get install gpsd gpsd-clients python-gps

Um gpsd zu konfigurieren, bearbeiten wir /etc/default/gpsd und ergänzen die Zeilen USBAUTO, DEVICES und GPSD_OPTIONS wie folgt::

USBAUTO="false"

DEVICES="/dev/ttyAMA0"

GPSD_OPTIONS="-n"

Damit gpsd beim Starten automatisch aktiviert wird, ist eine geringfügige Korrektur von Raspbian Jessie erforderlich:

$ sudo ln -s /lib/systemd/system/gpsd.service /etc/systemd/system/multi-user.target.wants/

Starten können wir es dann mit:

$ sudo service gpsd start

Und testen mit:

$ gpsmon

Resultieren sollte der Test im Hochfahren einer terminalbasierten Anwendung und einer Datenausgabe, die in etwa dem oben abgebildeten Screenshot entspricht.

Der GPS-Empfänger kann nun in Verbindung mit einer vorhandenen Anwendung verwendet werden, sofern diese gpsd unterstützt. Alternativ können wir eine neue Anwendung entwickeln und dabei die einfache Benutzeroberfläche nutzen.

pps

Eine wirklich tolle Funktion dieses HAT besteht darin, dass er nicht nur NMEA-Daten, sondern auch ein PPS-Signal (Pulse per Second) vom GPS-Empfänger bereitstellt. Wofür soll das gut sein, wenn man die Zeit aus den NMEA-Sätzen extrahieren kann? ASCII-Text ist bei weitem nicht die effizienteste Methode zur Übermittlung von Informationen. In diesem Fall werden die Informationen auch über einen relativ langsamen seriellen Port gesendet. Das Betriebssystem trägt ebenfalls zur Latenz bei.

Das vom GPS-Modul generierte PPS-Signal kann über den Raspberry Pi-GPIO abgetastet werden. Und der Linux-Kernel unterstützt sogar den Zugriff über das /dev/pps0-Gerät. Anwendungen können also NMEA-Daten in Verbindung mit dem PPS-Signal verwenden, um äußerst präzise Zeitinformationen abzurufen. Angesichts der Kosten des verwendeten Geräts ein großer Vorteil.

Um Zugriff auf PPS zu erhalten, müssen wir die pps-tools-Software mit folgendem Befehl installieren:

$ sudo apt-get install pps-tools

Fügen Sie zur /boot/config.txt eine weitere Zeile hinzu, um den Linux-Kernel entsprechend zu konfigurieren::

dtoverlay=pps-gpio,gpiopin=4

Nach einem Neustart können wir dann einen Test durchführen

$ sudo ppstest /dev/pps0

Die Ausgabe sollte in etwa dem oben gezeigten Screenshot entsprechen.

NTP server

NTP wird von Network Time Foundation entwickelt.

Eine sehr nützliche Anwendung eines GPS-fähigen Raspberry Pi ist die Erstellung eines Servers, der Zeit über das Network Time Protocol (NTP) auf LAN-Clients verteilt. Die hierfür verwendete NTP-Software ist äußerst flexibel und in der Lage, Zeitinformationen von Peer-NTP-Servern im Internet zu erfassen, sofern eine Verbindung verfügbar ist. Außerdem können Zeitinformationen beispielsweise über NMEA und/oder PPS von einem GPS-Empfänger abgerufen werden, indem intelligente, anpassbare Algorithmen zur Auswahl der besten verfügbaren Zeitquelle verwendet werden.

NTP ist ein Thema für sich. Die Konfiguration von NTP hängt vom jeweiligen Anwendungsfall ab. Viele hilfreiche Informationen finden Sie jedoch auf der Website von David Taylor.

Hier noch einige wichtige Hinweise:

  • Die von Raspbian bereitgestellte NTP-Software muss durch eine auf Quellcode basierende Build ersetzt werden (ein einfacher Vorgang).
  • Die NTPD kann Zeitinformationen direkt vom GPS-Modul (über /dev/ttyAMA0) abrufen oder so konfiguriert werden, dass Daten über gpsd abgerufen werden.
  • Um eine optimale Leistung zu erzielen, muss die NTP-Konfiguration möglicherweise angepasst werden.

Fazit

Mit dem Ultimate-GPS-Hat können präzise Standort- und Zeitinformationen für Raspberry Pi-basierte Projekte schnell und einfach abgerufen werden. Dabei stehen zahlreiche Möglichkeiten zur Verfügung, diese Informationen für Anwendungen und Netzwerkgeräte zugänglich zu machen.

Andrew Back

Open source (hardware and software!) advocate, Treasurer and Director of the Free and Open Source Silicon Foundation, organiser of Wuthering Bytes technology festival and founder of the Open Source Hardware User Group.

1 Jun 2017, 14:06

Kommentare