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


Software • von Sven Reifschneider • 22. Juli 2024 • 0 Kommentare

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.


Teile diesen Beitrag

Wenn dir dieser Artikel gefallen hat, teile ihn doch mit deinen Freunden und Bekannten! Das hilft mir dabei, noch mehr Leute zu erreichen und motiviert mich, weiterhin großartige Inhalte für euch zu erstellen. Nutze einfach die Sharing-Buttons hier unten, um den Beitrag auf deinen bevorzugten sozialen Medien zu teilen. Danke dir!

Sharing Illustration
Donating Illustration

Unterstütze den Blog

Falls du meine Arbeit und diesen Blog besonders schätzen solltest, würde ich mich riesig freuen, wenn du mich unterstützen möchtest! Du kannst mir zum Beispiel einen Kaffee spendieren, um mich bei der Arbeit an neuen Artikeln zu erfrischen, oder einfach so, um den Fortbestand des Blogs zu fördern. Jede noch so kleine Spende ist herzlich willkommen und wird sehr geschätzt!

Bitcoin (BTC):1JZ4inmKVbM2aP5ujyvmYpzmJRCC6xS6Fu
Ethereum (ETH):0xC66B1D5ff486E7EbeEB698397F2a7b120e17A6bE
Litecoin (LTC):Laj2CkWBD1jt4ZP6g9ZQJu1GSnwEtsSGLf
Dogecoin (DOGE):D7CbbwHfkjx3M4fYQd9PKEW5Td9jDoWNEk
Sven Reifschneider
Über den Autor

Sven Reifschneider

Herzliche Grüße! Ich bin Sven, ein technischer Innovator und begeisterter Fotograf aus der malerischen Wetterau, in der Nähe des lebendigen Frankfurt/Rhein-Main-Gebiets. In diesem Blog verbinde ich mein umfangreiches technisches Wissen mit meiner künstlerischen Leidenschaft, um Geschichten zu erschaffen, die fesseln und erleuchten. Als Leiter von Neoground spreng ich die Grenzen der KI-Beratung und digitalen Innovation und setze mich für Veränderungen ein, die durch Open Source Technologie Widerhall finden.

Die Fotografie ist mein Portal, um die flüchtige Schönheit des Lebens auszudrücken, die ich nahtlos mit technologischen Einsichten verbinde. Hier trifft Kunst auf Innovation, jeder Beitrag strebt nach Exzellenz und entfacht Gespräche, die inspirieren.

Neugierig, mehr zu erfahren? Folge mir in den sozialen Medien oder klicke auf "Mehr erfahren", um das Wesen meiner Vision zu erkunden.


Noch keine Kommentare

Kommentar hinzufügen

In deinem Kommentar kannst du **Markdown** nutzen. Deine E-Mail-Adresse wird nicht veröffentlicht. Mehr zum Datenschutz findest du in der Datenschutzerklärung.