Hochpräzise Zeit mit GPS auf einem Raspberry Pi und diese über NTP bereitstellen


Software • by Sven Reifschneider • 22 July 2024 • 0 comments
info
This post is also available in English. Read in English

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.

Title Image

Projektübersicht

Benötigte Komponenten

  1. Raspberry Pi 3B+ - oder ähnliches, ein Raspberry Pi Zero funktioniert hierfür auch wunderbar
  2. 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.
  3. GPS-Antenne - Positioniert auf meiner Dachluke für optimalen Empfang, die meisten Outdoor-Antennen funktionieren ebenfalls gut, so lange genug Sicht zum Himmel besteht.
GPS-Antenne und Modul

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

Connections

Meine provisorische Installation sah dann so aus:

GPS Modul
Title Image

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.

Title Image

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.

Title Image

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:

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.


Share this post

If you enjoyed this article, why not share it with your friends and acquaintances? It helps me reach more people and motivates me to keep creating awesome content for you. Just use the sharing buttons below to share the post on your favorite social media platforms. Thank you!

Sharing Illustration
Donating Illustration

Support the Blog

If you appreciate my work and this blog, I would be thrilled if you'd like to support me! For example, you can buy me a coffee to keep me refreshed while working on new articles, or simply contribute to the ongoing success of the blog. Every little bit of support is greatly appreciated!

Bitcoin (BTC):1JZ4inmKVbM2aP5ujyvmYpzmJRCC6xS6Fu
Ethereum (ETH):0xC66B1D5ff486E7EbeEB698397F2a7b120e17A6bE
Litecoin (LTC):Laj2CkWBD1jt4ZP6g9ZQJu1GSnwEtsSGLf
Dogecoin (DOGE):D7CbbwHfkjx3M4fYQd9PKEW5Td9jDoWNEk
Sven Reifschneider
About the author

Sven Reifschneider

Greetings! I'm Sven, a tech innovator and enthusiastic photographer from scenic Wetterau, near the vibrant Frankfurt/Rhein-Main area. This blog is where I fuse my extensive tech knowledge with artistic passion to craft stories that captivate and enlighten. Leading Neoground, I push the boundaries of AI consulting and digital innovation, advocating for change that resonates through community-driven technology.

Photography is my portal to expressing the ephemeral beauty of life, blending it seamlessly with technological insights. Here, art meets innovation, each post striving for excellence and sparking conversations that inspire.

Curious to learn more? Follow me on social media or click on "learn more" to explore the essence of my vision.


No comments yet

Add a comment

You can use **Markdown** in your comment. Your email won't be published. Find out more about our data protection in the privacy policy.