Im Netz gibt es mittlerweile viele Anleitung zu NTP über GPS (siehe http://doc.ntp.org/4.2.6/drivers/driver20.html oder http://www.satsignal.eu/ntp/Raspberry-Pi-NTP.html). Aber entweder werden spezielle Receiver verwendet, oder PPS funktioniert nicht. Daher hier die Anleitung für Dummies:
Vorbereitung Empfänger:
Als Empfänger kommt der billigste u-blox7 Empfänger zum Einsatz (z.B. hier: https://www.amazon.de/dp/B015E2XSSO/), der über USB als serielles Gerät die NMEA Daten liefert. Doch wir wollen auch das PPS-Signal! -> Lötkolben
Die LED wird mit dem PPS-Signal des Empfängers betrieben und hat einen Pegel von etwa 2,8V und kann damit direkt an den Raspberry angeschlossen werden (GPIO-18 in unserem Fall).
Raspberry Pi
Kerneleinstellungen:
Laden der folgenden Module (eintragen in /etc/modules):
i2c-dev pps-gpio
Aktivieren des PPS-GPIO Moduls auf Pin 18 (Eintragen als letzte Zeile in /boot/config.txt):
dtoverlay=pps-gpio,gpiopin=18
Das pps-gpio Modul stellt sicher, dass das PPS Signal ausgewertet werden kann. Zusätzlich wird noch das Paket pps-tools benötigt, das mittels
apt-get install pps-tools
installiert werden kann. Die Änderung wird nach einem Reboot aktiv. Und kann mittels:
pi@raspberrypi:~ $ sudo ppstest /dev/pps0 trying PPS source "/dev/pps0" found PPS source "/dev/pps0" ok, found 1 source(s), now start fetching data... source 0 - assert 1493324550.000003956, sequence: 456311 - clear 0.000000000, sequence: 0 source 0 - assert 1493324551.000001890, sequence: 456312 - clear 0.000000000, sequence: 0 source 0 - assert 1493324552.000001441, sequence: 456313 - clear 0.000000000, sequence: 0
geprüft werden.
NTP compilieren, da raspbian keine PPS Unterstützung mitbringt:
mkdir install pi@raspberrypi:~ $ cd install pi@raspberrypi:~/install $ sudo apt-get install libcap-dev pi@raspberrypi:~/install $ sudo apt-get install libssl-dev pi@raspberrypi:~/install $ sudo apt-get remove ntp pi@raspberrypi:~/install $ wget https://www.eecis.udel.edu/~ntp/ntp_spool/ntp4/ntp-4.2/pi@raspberrypi:~/install $ tar xzf ntp-4.2.8p12.tar.gz pi@raspberrypi:~/install $ apt-get install pps-tools pi@raspberrypi:~/install $ cd ntp-4.2.8p12/ pi@raspberrypi:~/install/ntp-4.2.8p12 $ ./configure --enable-linuxcaps pi@raspberrypi:~/install/ntp-4.2.8p12 $ make -j4 pi@raspberrypi:~/install/ntp-4.2.8p12 $ sudo make install && sudo cp /usr/local/bin/ntp* /usr/bin/ && sudo cp /usr/local/sbin/ntp* /usr/sbin/
NTP Konfiguration
In /etc/ntp.conf.dhcp folgendes eintragen:
driftfile /var/lib/ntp/ntp.drift statsdir /var/log/ntpstats/ statistics loopstats peerstats clockstats filegen loopstats file loopstats type day enable filegen peerstats file peerstats type day enable filegen clockstats file clockstats type day enable server 0.debian.pool.ntp.org iburst server 1.debian.pool.ntp.org iburst server 2.debian.pool.ntp.org iburst server 3.debian.pool.ntp.org iburst server 127.127.20.0 minpoll 2 maxpoll 4 prefer # GPSd fudge 127.127.20.0 flag1 1 refid NMEA server 127.127.22.0 minpoll 4 maxpoll 4 fudge 127.127.22.0 refid PPS restrict -4 default kod notrap nomodify nopeer noquery restrict -6 default kod notrap nomodify nopeer noquery restrict 127.0.0.1 restrict ::1
Jetzt fehlt “nur” noch die Verbindung des GPS Treibers (127.127.20.0) und PPS Treibers (127.127.22.0) zu unserem GPS Empfänger. Der Treiber 20 bzw. 22 verwendet hardcodiert die Dateien /dev/gpsX und /dev/gpsppsX für die NMEA und PPS Informationen. Ein einfacher Symlink reicht leider nicht, da dieser beim Reboot wieder gelöscht wird. Stattdessen via /etc/udev/rules.d/09.pps.rules automatisch eintragen lassen (siehe Comment from Pete Stephenson on http://www.satsignal.eu/ntp/RaspberryPi-notes.html):
KERNEL=="ttyACM0", SYMLINK+="gps0" KERNEL=="pps0", OWNER="root", GROUP="tty", MODE="0660", SYMLINK+="gpspps0"
Neustart des ntp-Servers mittels /etc/init.d/ntp restart. Damit die beiden Symlinks auch nach einem Reboot aktiv bleiben, die Anlage der symlinks in die /etc/rc.local eintragen:
ln -s /dev/pps0 /dev/gpspps0 ln -s /dev/ttyACM0 /dev/gps0
Abfrage des Timeservers mittels: ntpq -c peers -c rv :
remote refid st t when poll reach delay offset jitter ============================================================================== oGPS_NMEA(0) .NMEA. 0 l - 8 377 0.000 -0.003 0.002 -ntp0.technl.net 80.114.85.144 2 u 47 64 377 48.622 -9.328 2.313 +mail.veland.de 89.238.79.186 3 u 47 64 377 38.701 2.456 3.736 +v6.blazing.de 213.172.96.14 2 u 52 64 377 28.919 -0.301 2.960 +217.79.179.106 212.51.144.44 2 u 57 64 377 31.623 -0.386 2.552 associd=0 status=0415 leap_none, sync_uhf_radio, 1 event, clock_sync, version="ntpd 4.2.8p10@1.3728-o Sun Apr 16 12:01:26 UTC 2017 (1)", processor="armv7l", system="Linux/4.4.50-v7+", leap=00, stratum=1, precision=-19, rootdelay=0.000, rootdisp=1.000, refid=NMEA, reftime=dcaccfd1.533a3357 Thu, Apr 27 2017 20:15:13.325, clock=dcaccfd1.9db99523 Thu, Apr 27 2017 20:15:13.616, peer=36778, tc=3, mintc=3, offset=-0.003099, frequency=-13.013, sys_jitter=0.002371, clk_jitter=0.002, clk_wander=0.001
Der jitter kann evtl. noch verbessert werden durch die Angabe von nohz=off (http://www.satsignal.eu/ntp/Raspberry-Pi-NTP.html#nohz) und fixe Frequenzen für arm_freq_min und arm_freq_max, aber das muss ich selbst erst noch beobachten.