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).

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).

sudo dpkg-reconfigure tzdata

raspi-timezone

Software Installieren

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

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

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.

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.

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:

....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.

sudo nano /etc/modules

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

snd-bcm2835
pps-gpio

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).

sudo ppstest /dev/pps0

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

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

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.

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

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.

cp /usr/share/misc/config.guess /usr/share/misc/config.sub .
        ./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

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.

cd ..
dpkg-buildpackage -b
dpkg -i ../ntp_4.2.6.p5+dfsg-3+deb7u1_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

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.

# 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:

ntpq -p

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.

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“.

Viel Spaß!


wallpaper-1019588
Kakuriyo -Bed & Breakfast for Spirits- erhält nach 7 Jahren eine zweite Staffel
wallpaper-1019588
Murai in Love: Erster Trailer enthüllt neue Details
wallpaper-1019588
My Wife Has No Emotion: Visual und neue Details enthüllt
wallpaper-1019588
Action Manga zeichnen: David Füleki veröffentlicht Zeichenbuch