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
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.
NEO-6M Pins |
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.
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.
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).
1 |
sudo dpkg-reconfigure tzdata |
Software Installieren
Wir starten mit dem Setup benötigter Software und einer Aktualisierung eures Systems, inkl. Firmware.
1 2 3 4 |
sudo apt-get -y update && sudo apt-get -y upgrade sudo rpi-update sudo apt-get -y install ntp pps-tools |
Nach Aktualisierung eures Systems ist ein Reboot notwendig
1 |
sudo reboot |
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:
1 |
sudo nano /boot/config.txt |
Fügt am Ende folgende Zeile hinzu
1 2 |
dtoverlay=pps-gpio |
Speichert mit STRG+X, Y und ENTER. Dann müssen wir das Modul noch bei jedem Start laden.
1 |
sudo nano /etc/modules |
Fügt ans Ende der Datei folgenden Eintrag hinzu
1 |
pps-gpio |
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.
1 |
sudo nano /boot/cmdline.txt |
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:
1 |
....ator=deadline rootwait bcm2708.pps_gpio_pin=18 |
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.
1 |
sudo nano /etc/modules |
Das Ende meiner Modules Datei sieht nun so aus, gespeichert wird bei Nano wieder mit STRG+X, Y und Enter
1 2 |
snd-bcm2835 pps-gpio |
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).
1 |
sudo ppstest /dev/pps0 |
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
1 2 |
sudo sh -c 'echo "deb-src http://mirrordirector.raspbian.org/raspbian/ wheezy main contrib non-free rpi" >> /etc/apt/sources.list' sudo apt-get update |
Dann holen wir uns die Build Dependencies und den Quellcode des NTP Dienstes
1 2 3 |
cd ~ sudo apt-get -y build-dep ntp sudo apt-get -y source ntp |
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.
1 |
cd ntp-4.2.6.p5+dfsg/debian/ |
Hier finden wir eine Datei rules welche wir bearbeiten um die fehlende Funktion für PPS zu aktivieren
1 |
sudo nano rules |
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.
1 2 3 4 5 6 7 8 9 10 11 12 |
./configure CFLAGS='$(CFLAGS)' CPPFLAGS='$(CPPFLAGS)' LDFLAGS='$(LDFLAGS)' \ --prefix=/usr \ --enable-all-clocks --enable-parse-clocks --enable-SHM \ --disable-debugging --sysconfdir=/var/lib/ntp \ --with-sntp=no \ --with-lineeditlibs=edit \ --without-ntpsnmpd \ --disable-local-libopts \ --enable-ntp-signd \ --disable-dependency-tracking \ --with-openssl-libdir=/usr/lib/$(DEB_HOST_MULTIARCH) \ --enable-ATOM |
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
1 2 |
sudo nano changelog |
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.
1 2 3 4 5 |
cd .. sudo dpkg-buildpackage -b cd /home/pi sudo dpkg -i ntp_4.2.6.p5+dfsg-3+deb7u4_armhf.deb |
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
1 |
sudo nano /etc/ntp.conf |
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.
1 2 3 4 5 6 7 8 9 |
# pps-gpio /dev/pps0 server 127.127.22.0 minpoll 4 maxpoll 4 fudge 127.127.22.0 refid PPS fudge 127.127.22.0 flag3 1 # enable kernel PLL/FLL clock # gpsd clock server 127.127.28.0 minpoll 4 maxpoll 4 prefer fudge 127.127.28.0 refid GPS fudge 127.127.28.0 time1 +0.130 |
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:
1 |
ntpq -p |
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.
1 |
sudo nano /etc/dhcp/dhclient.conf |
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
1 |
sudo rm -f /etc/dhcp/dhclient-exit-hooks.d/ntp |
Viel Spaß!