Einführung
Präzision in der Zeitmessung ist für zahlreiche Anwendungen entscheidend, von wissenschaftlichen Experimenten bis hin zu Netzwerkoperationen. Sich ausschließlich auf öffentliche NTP-Server zu verlassen, kann Variabilität und Abhängigkeit von der Internetverbindung einführen. Durch die Nutzung eines Raspberry Pi und eines GPS-Moduls kannst du eine unabhängige, hochpräzise Zeitquelle für dein lokales Netzwerk schaffen und erhältst eine Uhrzeit, die auf die Mikrosekunde genau ist und direkt mit den Atomuhren in den GPS-Satelliten synchronisiert wird.
Persönliche Motivation
Als Technik-Enthusiast sind Präzision und Zuverlässigkeit von Daten für mich von größter Bedeutung. Die Einrichtung meines eigenen Zeitservers mit einem Raspberry Pi und einem GPS-Modul bot mir nicht nur die Genauigkeit, die ich benötigte, sondern auch ein faszinierendes Projekt zum Eintauchen. Dieser Leitfaden basiert auf meiner erfolgreichen Umsetzung und bietet dir eine detaillierte Roadmap zum Nachmachen. Dieses Setup funktioniert seit vielen Monaten einwandfrei und seit ich eine Mikrosekunden-Präzision habe, kann ich zeitkritische Berechnungen wie MLAT-Tracking für Flugzeuge oder Blitzdetektoren durchführen.
Projektübersicht
Benötigte Komponenten
- Raspberry Pi 3B+ - oder ähnliches, ein Raspberry Pi Zero funktioniert hierfür auch wunderbar
- GPS-Modul (u-blox NEO-6M) - Ideal ist eine Platine mit diesem Modul, die einen praktischen PPS-Header und einen SMA-Anschluss für eine GPS-Antenne bietet. Mit den entsprechenden Fähigkeiten kannst du dies auch selbst an den Chip löten, so ist es jedoch deutlich einfacher.
- GPS-Antenne - Positioniert auf meiner Dachluke für optimalen Empfang, die meisten Outdoor-Antennen funktionieren ebenfalls gut, so lange genug Sicht zum Himmel besteht.
Hardware-Verbindungen
Um eine ordnungsgemäße Kommunikation zwischen dem GPS-Modul und dem Raspberry Pi zu gewährleisten, stelle die folgenden Verbindungen her:
- GPS-Modul VCC: Pi Pin 2 (+5V, funktioniert stabiler als 3,3V)
- GPS-Modul GND: Pi Pin 6, 9 oder 14 (GND)
- GPS-Modul RX: Pi Pin 8 (UART TXD0)
- GPS-Modul TX: Pi Pin 10 (UART RXD0)
- GPS-Modul PPS: Pi Pin 12 (GPIO18: PCM CLK)
Stelle sicher, dass das RX des Moduls mit dem TX des Pi und umgekehrt verbunden ist, damit sie korrekt kommunizieren können. Wenn der Pi etwas sendet (TX), muss das Modul es empfangen (RX).
Meine provisorische Installation sah dann so aus:
Softwareinstallation und Konfiguration
Installation von gpsd
gpsd
ist ein Dienst, der ein oder mehrere GPS-Geräte überwacht, die an einen Host-Computer über Seriell oder USB-Ports angeschlossen sind, und sie auf TCP-Port 2947 abfragbar macht. Die Standard-Repository-Version war in meinem Fall veraltet, daher installieren wir manuell eine neuere Version der Pakete:
wget http://archive.raspberrypi.org/debian/pool/untested/g/gpsd/libgps29_3.24-1~rpt1_armhf.deb
wget http://archive.raspberrypi.org/debian/pool/untested/g/gpsd/gpsd_3.24-1~rpt1_armhf.deb
wget http://archive.raspberrypi.org/debian/pool/untested/g/gpsd/gpsd-clients_3.24-1~rpt1_armhf.deb
wget http://archive.raspberrypi.org/debian/pool/untested/g/gpsd/gpsd-tools_3.24-1~rpt1_armhf.deb
sudo dpkg -i libgps29_3.24-1~rpt1_armhf.deb
sudo dpkg -i gpsd_3.24-1~rpt1_armhf.deb
sudo dpkg -i gpsd-tools_3.24-1~rpt1_armhf.deb
sudo dpkg -i gpsd-clients_3.24-1~rpt1_armhf.deb
Mein Raspberry Pi 3B+ läuft auf Raspbian 11 bullseye, daher bietet das Repository nur Version 3.22, aber für neuere NEO-6M-Module benötigst du mindestens Version 3.24, wie es im Raspberry Pi Forum diskutiert wird: GPSD version 3.22 does not function correctly with some Ublox gps units
Konfiguration von gpsd
Bearbeite die Datei /etc/default/gpsd
, um gpsd zu konfigurieren, die serielle Verbindung zu verwenden:
# Devices gpsd should collect to at boot time.
# They need to be read/writeable, either by user gpsd or the group dialout.
DEVICES="/dev/ttyS0"
# Other options you want to pass to gpsd
GPSD_OPTIONS="-n"
START_DAEMON="true"
# Automatically hot add/remove USB GPS devices via gpsdctl
USBAUTO="false"
Aktiviere den gpsd-Dienst und starte den Raspberry Pi neu:
sudo systemctl enable gpsd.service
sudo reboot
Überprüfe den Status des Dienstes, um sicherzustellen, dass er korrekt läuft, wie in meinem Fall:
sudo systemctl status gpsd.service
● gpsd.service - GPS (Global Positioning System) Daemon
Loaded: loaded (/lib/systemd/system/gpsd.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2024-07-22 16:20:00 CET
Jetzt kannst du einen GPS-Client starten, um die empfangenen Daten anzuzeigen:
cgps localhost:2947
┌───────────────────────────────────────────┐
│ Time 2024-07-22T16:20:42.000Z (18)│
│ Latitude 50.28xxxxxx N │
│ Longitude 8.93xxxxxx E │
│ Alt (HAE, MSL) 197.258, 149.934 m │
│ Speed 0.03 km/h │
│ Track (true, var) 286.1, 2.7 deg │
│ Climb -0.90 m/min │
│ Status 3D FIX (1 secs) │
│ Long Err (XDOP, EPX) 0.59, +/- 8.9 m │
│ Lat Err (YDOP, EPY) 0.64, +/- 9.6 m │
│ Alt Err (VDOP, EPV) 1.84, +/- 42.3 m │
│ 2D Err (HDOP, CEP) 0.88, +/- 16.7 m │
│ 3D Err (PDOP, SEP) 2.04, +/- 38.8 m │
│ Time Err (TDOP) 1.05 │
│ Geo Err (GDOP) 2.30 │
│ Speed Err (EPS) +/- 1.2 km/h │
│ Track Err (EPD) n/a │
│ Time offset 0.128376861 s │
│ Grid Square JO40xxxx │
│ ECEF X, VX 4030000.100 m -0.010 m/s│
│ ECEF Y, VY 630000.100 m -0.010 m/s│
│ ECEF Z, VZ 4880000.100 m -0.010 m/s│
└───────────────────────────────────────────┘
Dieser Befehl zeigt eine praktische Info-Box zusammen mit Echtzeit-GPS-Daten an und bestätigt, dass das GPS-Modul wie erwartet funktioniert. Du kannst das Programm jederzeit mit "Strg + C" beenden. Es ist wichtig, dass du einen 3D-Fix mit einer geringen Fehlerquote erhältst. Dies stellt sicher, dass wir eine gute Verbindung zu den GPS/GNSS-Satelliten haben und stets genügend von ihnen empfangen.
Nutzung des PPS-Signals
Installation und Aktivierung des PPS-Moduls
Das PPS-Signal (Pulse Per Second) ist entscheidend für hochpräzise Zeitmessungen, denn dieses Signal sendet präzise jede Sekunde einen Puls. Installiere die PPS-Tools:
sudo apt install pps-tools
Aktiviere das PPS-GPIO-Modul, indem du die folgende Zeile zu /boot/config.txt
hinzufügst:
dtoverlay=pps-gpio
Und füge dies zu /etc/modules
hinzu:
pps-gpio
Starte den Raspberry Pi neu und überprüfe, ob das PPS-Modul aktiv ist:
lsmod | grep pps
Dies sollte einige Zeilen zurückgeben, darunter "pps_gpio".
Jetzt können wir das PPS-Interface testen, das unter /dev/pps0
verfügbar ist:
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 1721653175.000005483, sequence: 22800085 - clear 0.000000000, sequence: 0
source 0 - assert 1721653176.000006907, sequence: 22800086 - clear 0.000000000, sequence: 0
Dieser Test zeigt jede Sekunde einen Impuls an und bestätigt, dass das PPS-Interface korrekt funktioniert. Du kannst es ebenfalls mit "Strg + C" beenden.
Konfiguration von NTP
Installation von NTP
NTP (Network Time Protocol) wird verwendet, um die Uhren vernetzter Computer zu synchronisieren und bietet neben der bekannten Client-Funktionalität auch einen NTP-Server. Installiere NTP auf deinem Raspberry Pi:
sudo apt install ntp
Konfiguration von NTP
Bearbeite die Datei /etc/ntp.conf
, um den NTP-Server mit GPS und PPS als Zeitquellen sowie einigen öffentlichen NTP-Servern als Backup einzurichten. Hier ist eine Beispielkonfiguration:
driftfile /var/lib/ntp/ntp.drift
# Leap seconds definition provided by tzdata
leapfile /usr/share/zoneinfo/leap-seconds.list
# Statistics
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
# GPS: PPS GPIO via /dev/pps0
server 127.127.22.0 minpoll 4 maxpoll 4
fudge 127.127.22.0 refid PPS
# GPS: GPSD Clock via SHM
server 127.127.28.0 minpoll 4 maxpoll 4 prefer
fudge 127.127.28.0 time1 +0.120 refid GPS flag1 1
# Network fallback
server ptbtime2.ptb.de prefer
server ptbtime4.ptb.de prefer
server ptbtime3.ptb.de prefer
# By default, exchange time with everybody, but don't allow configuration.
restrict -4 default kod notrap nomodify nopeer noquery limited
restrict -6 default kod notrap nomodify nopeer noquery limited
# Local users may interrogate the ntp server more closely.
restrict 127.0.0.1
restrict ::1
# Needed for adding pool entries
restrict source notrap nomodify noquery
# Available to LAN
restrict 192.168.0.0 mask 255.255.255.0
Du musst möglicherweise den GPS-Zeitversatz (time1 +0.120
in meinem Fall) anpassen. Du kannst versuchen, diesen höher oder niedriger zu setzen, damit der Versatz deines SHM im Vergleich zu anderen NTP-Servern so klein wie möglich ist.
Starte schließlich den NTP-Dienst neu:
sudo systemctl restart ntp.service
Dein NTP-Server ist jetzt einsatzbereit.
Überprüfung der NTP-Quellen
Nach ein paar Minuten (bis das GPS-Signal bzw. PPS sauber ausgewertet wird, kann es einen Moment dauern) kannst du die NTP-Quellen überprüfen:
ntpq -p
remote refid st t when poll reach delay offset jitter
==============================================================================
oPPS(0) .PPS. 0 l 4 16 377 0.000 -0.003 0.002
SHM(0) .GPS. 0 l - 16 0 0.000 +0.000 0.000
*ptbtime2.ptb.de .PTB. 1 u 11 64 377 25.993 -0.700 1.733
+ptbtime4.PTB.DE .PTB. 1 u 53 64 377 24.899 +1.965 0.453
+ptbtime3.ptb.de .PTB. 1 u 6 64 377 25.589 +0.596 0.550
Die Ausgabe sollte zeigen, dass PPS und GPS als Zeitquellen verwendet werden, mit öffentlichen NTP-Servern als Fallback.
Jetzt ist unser NTP-Server offiziell ein Stratum 1 NTP-Server, der hochpräzise Zeit an unsere LAN-Geräte liefert. Verwende einfach den Hostnamen oder die IP des Pi und die Zeit kann problemlos synchronisiert werden. Ich habe meinen Pi als Haupt-NTP-Server in meiner Firewall eingetragen, somit erhalten alle Netzwerkgeräte hierüber die Uhrzeit.
Fazit
Die Einrichtung eines hochpräzisen Zeitservers mit einem Raspberry Pi und einem GPS-Modul ist nicht nur ein spannendes Projekt, sondern auch ein äußerst praktisches. Diese Konfiguration läuft seit Monaten zuverlässig in meinem Netzwerk und liefert genaue Zeit an alle angeschlossenen Geräte. Ob für persönliche Projekte oder um präzise Zeitmessung in deinem LAN sicherzustellen, dieser Leitfaden bietet eine umfassende Roadmap zur Erreichung hoher Präzision.
Ich möchte auch Johannes Weber und Austin Pivarnik für ihre großartigen Anleitungen zur Einrichtung eines GPS-basierten NTP-Servers danken, die mir sehr geholfen haben:
- https://weberblog.net/ntp-server-via-gps-on-a-raspberry-pi
- https://austinsnerdythings.com/2021/04/19/microsecond-accurate-ntp-with-a-raspberry-pi-and-pps-gps
Hast du Fragen oder möchtest du deine Erfahrungen teilen? Hinterlasse einen Kommentar unten! Folge mir auf Social Media für weitere spannende Projekte und Updates. Wenn du Hilfe bei der Einrichtung deines eigenen GPS-Zeitservers benötigst, zögere nicht, mich zu kontaktieren!
Dieser Beitrag wurde mit Unterstützung von künstlicher Intelligenz (GPT-4o) erstellt. Neugierig, wie KI solche Texte, Bilder und Brandings aus eigenen Ideen erstellen kann? Erfahren Sie mehr darüber auf der Webseite der Neoground GmbH – Ihr ganzheitlicher Partner für KI, Digitale Transformation, Technologie und Strategie.
Noch keine Kommentare
Kommentar hinzufügen