Raspberry Pi Uhrzeit über GPS beziehen – Zeitserver

Wer mit seinem Raspberry Pi keine Internetanbindung hat steht bei vielen Projekten und Szenarien vor dem Problem keine korrekte Uhrzeit am Raspberry Pi einstellen zu können da dem kleinen Mini-Computer eine Echtzeituhr (RTC) fehlt. Natürlich kann man sich mit einem passenden Zeit-Modul (RTC DS1307) versorgen, allerdings ist bei den günstigen Varianten das Problem das die Uhrzeit nicht sehr genau ist.

Als Alternative zur Echtzeituhr kann ein GPS Empfänger verwendet werden um die Uhrzeit des Raspberry Pi einzustellen, Nachteil dieser Lösung ist das eine Sichtverbindung der Antenne zu mehreren GPS-Satelliten notwendig ist. In diesem Tutorial zeige ich euch wie mit eurem GPS-Modul die Uhrzeit eures Raspberry Pi einstellen könnt, verwendet wird hierbei das Network Time Protocol (NTP).

Inhaltsverzeichnis

gear-27636_640

PPS Signal des GPS Moduls

Die meisten GPS Empfänger haben ein PPS Signal welches wir benötigen um unseren Raspberry Pi mit der Uhrzeit der GPS Sateliten zu versorgen, das China Modul gy-gps6mv2 welches ich via Serial angebunden habe besitzt keinen direkten Ausgang für das PPS Signal. Das NEO-6M GPS Modul hat aber ein PPS, daher müssen wir durch einen kleinen Lötpunkt das PPS Signal abgreifen. Falls ihr ein Modul mit einem PPS-Output benutzt könnt ihr euch das sparen, PPS mit PIN12 bzw GPIO18 verbinden und mit dem nächsten Schritt weiter machen.

Also habe ich in der Doku der NEO6 Serie gesehen das PIN3 das PPS Signal liefert, das Signal müssen wir abgreifen.

neo6-pins

NEO-6M Pins

Capture

NEO6-M Belegung

Wir haben an dem GY-GPS6MV2 zwei Möglichkeiten das PPS Signal abzuholen, entweder direkt an PIN3 des Moduls oder am Widerstand den ich euch markiert habe.

neo6-pins-pps-2

Ich habe mich dazu entschlossen das Signal am Widerstand abzuholen um mit meinen schlechten Löt-Skills den GPS Empfänger nicht zu brutzeln, das Ergebnis sieht bei mir wie folgt aus. Das PPS Signal habe ich mit GPIO PIN 12 (GPIO18) an meinem Raspberry Pi verbunden.

PPS

Den NTP-Dienst am Raspberry Pi einrichten

Nachdem ihr euer GPS-Modul mit dem RasPi verbunden und eingerichtet habt (details zu meinem Modul gibt es hier), wichtig ist das wie oben beschrieben auch das PPS Signal an GPIO18 (PIN12) anliegt, können wir mit der Konfiguration beginnen.

Zeitzone Konfigurieren

Falls ihr eure Zeitzone noch nicht eingestellt habt erledigt das über folgenden Befehl (vermutlich befindet ihr euch wie ich in UTC +1 Europe/Berlin).

raspi-timezone

Software Installieren

Wir starten mit dem Setup benötigter Software und einer Aktualisierung eures Systems, inkl. Firmware.

Nach Aktualisierung eures Systems ist ein Reboot notwendig

PPS aktivieren

Um unserem NTP Dienst immer die aktuelle Uhrzeit unseres GPS-Moduls zu übermitteln verwenden wir PPS, mit PPS sind wir in der Lage über einen GPIO Port die Uhrzeit des GPS Empfängers abzufragen und an den NTP Dienst weiterzugeben.

Raspberry Pi mit aktuellem Raspbian

Bei aktuellen Raspbian kommt Device Tree zum Einsatz, PPS muss daher in der config.txt aktiviert werden:

Fügt am Ende folgende Zeile hinzu

Speichert mit STRG+X, Y und ENTER. Dann müssen wir das Modul noch bei jedem Start laden.

Fügt ans Ende der Datei folgenden Eintrag hinzu

Raspberry Pi VOR kernel 3.18.x

Hierzu müssen wir PPS allerdings erst aktivieren und einrichten, daher definieren wir an welchem GPIO Port das PPS Signal anliegt, in meinem Fall habe ich das PPS Signal an PIN12 was GPIO 18 entspricht. Wir editieren also die Datei /boot/cmdline.txt mit Nano.

Dort fügen wir ans Ende der Zeile diesen Eintrag hinzu: bcm2708.pps_gpio_pin=18  (WICHTIG! Ans Ende der Zeile, nicht in eine neue Zeile). Bei mir sieht das so aus:

Gespeichert wird mit STRG+X, Y und ENTER.

Das notwendige Kernel Modul PPS-GPIO soll noch bei jedem Start unseres Raspberry Pi geladen werden, daher fügen wir am Ende der Datei /etc/modules noch den Eintrag pps-gpio in einer neuen Zeile hinzu. Hierzu verwende ich wieder den Editor Nano.

Das Ende meiner Modules Datei sieht nun so aus, gespeichert wird bei Nano wieder mit STRG+X, Y und Enter

PPS Testen

Nach einem Reboot via sudo reboot kann das PPS Interface getestet werden, ihr solltet jede Sekunde eine Ausgabe eures GPS Empfängers bekommen (Sichtverbindung zu Satelliten notwendig).

ppstest

Das war die Einrichtung und der Test von PPS, beendet wird ppstest mit STRG+C

NTP Dienst am Raspberry Pi kompilieren und einrichten

Leider unterstützt das NTP Paket von Raspbian die Uhrzeit via PPS nicht im Standard, daher müssen wir es erneut kompilieren. Um an die Sourcen des NTP Dienstes zu kommen fügen wir das passende Repository zu unserer sources.list hinzu und aktualisieren die Paket Liste

Dann holen wir uns die Build Dependencies und den Quellcode des NTP Dienstes

Der Source Code wurde in das Home des Benutzers pi abgelegt, bei mir ist das momentan ntp-4.2.6.p5+dfsg. Ich wechsle in das erstellte Quellcode Verzeichnis nach debian.

Hier finden wir eine Datei rules welche wir bearbeiten um die fehlende Funktion für PPS zu aktivieren

Wir müssen in der Datei den configure Aufruf mit –enable-ATOM ergänzen, sucht am Besten mit STRG+W nach configure und fügt am Ende des Aufrufs –enable-ATOM hinzu, die Zeile davor müsst ihr noch mit einem “ \“ergänzen. Bei mir sieht das Ergebnis wie folgt aus. Speichern mit STRG+X, Y und Enter.

Um kompilieren zu können müssen wir in der Datei changelog noch die Version von NTP um eine Nummer erhöhen. Wir verwenden wieder nano

und ändern in der Ersten Zeile 4.2.6.p5+dfsg-2 zu 4.2.6.p5+dfsg-3 und speichern mit STRG+X, Y und Enter.

Jetzt kompilieren wir den NTP Dienst mit dpkg-buildpackage -b, das dauert eine Weile. Nach Abschluss des Vorgangs müssen wir nur noch das neu erstellte NTP-Paket installieren, das Erledigt dpkg -i ../ntp_4.2.6.p5+dfsg-3+deb7u1_armhf.deb für uns.

Nun haben wir auf unserem System den NTP Dienst mit aktivierter ATOM Funktion um via PPS gelieferte Daten verarbeiten zu können.

NTP Dienst am Raspberry Pi konfigurieren

Wir haben nun unseren GPS-Empfänger verbunden (RX & TX für die GPS Daten und PPS für die Zeit), unsere Zeitzone eingestellt und die notwendige Software installiert. Die Konfiguration folgt als nächstes, diese wird in einer zentralen Konfigurationsdatei vorgenommen. Ihr findet die Datei in /etc/ntp.conf, ich verwende zum Bearbeiten der Datei wieder den Editor Nano

Wir möchten nun dem NTP Dienst sagen das zwei zusätzliche Zeitquellen vorhanden sind, zum einen die via PPS angebundene und zum anderen die Ausgabe des GPSD. Hierzu fügen wir der Konfiguration folgende Zeilen hinzu.

Die anderen eingetragen NTP Internet Server habe ich entfernt da ihr GPS vermutlich im offline Betrieb als Zeitquelle verwenden wollt. Wollt ihr das ganze im Online Modus als zusätzliche Zeitquelle verwenden können diese auch bestehen bleiben.

Zum testen ob alles geklappt hat müsst ihr einmal den Dienst via „sudo /etc/init.d/ntp restart“ neu starten und könnt euch dann via ntpq die aktuell eingetragenen Zeitserver ansehen:

ntp-test

Falls euer Raspberry Pi eine IP-Adresse via DHCP erhält und euer DHCP Server zusätzlich auch ein NTP-Server ist (z.B. die FritzBox) müsst ihr die automatische Konfiguration via DHCP abschalten.

Innerhalb der Datei entfernt ihr irgendwo hinter request folgenden Inhalt: ntp-servers zusätzlich muss noch die Datei /var/lib/ntp/ntp.conf.dhcp gelöscht werden, das erledigt ihr via „sudo rm -f /var/lib/ntp/ntp.conf.dhcp„.

Alternativ entfernen wir die Datei welche die ntp dhcp Konfiguration erstellt

Viel Spaß!