Att bygga en Stratum-1 NTP-server, del 1

Det är klart att man kan använda en extern NTP-server för att synka kockorna i all sin utrustning, från routrar till switchar till servrar och klienter i nätverket, det finns allt från time.apple.com till nto.nist.gov … men … hur kul är det?

Nej, istället kommer jag att bygga mig en egen tidskälla på högsta nivå, en Stratum-1. Dessa kan kosta hundratusentals kronor så nej, en sådan med ugn och iridiumkristaller blir det inte … utan istället börjar jag med en Raspberry Pi 5 som faktiskt blivit över, den har redan en NVME-hatt på sig vilket inte underlättar då den nyainförskaffade GPS-hatten skall monteras, den är gjord av Waveshare och har ett L76K-chip för GPS-avläsning. Vad jag helt missade var att puls-per-second (PPS) signalen inte skickas direkt från GPS-kortet till Pi:s 40-poliga I/O utan jag får sätta en kabel med hylsstift på lämpligt stift och sedan löda kabeländen på lysdiodens plussida för att få pulserna att trigga NTP-uppdateringarna, det är en av anledningarna till att det kommer en del 2 också 🙂 … för en sådan kabel med hylsa var jag inte människa att hitta så den är beställd, kommer nästa vecka …

Vad började jag med då?

Ett rent Raspberry Pi OS, uppdaterat och med en fast IP-adress, det är alltid steg 1. Starta sedan raspi-config, välj Serial under interface, att inte ha login tillgängligt över seriella interfacet, däremot den seriella portens hårdvara tillgänglig via Raspberry Pi OS.

På så sätt kommer vi åt tilläggsmodulen direkt från Raspberry Pi:n förutsatt att modulen har sin bygling korrekt satt, skall vara i mitten.

Sedan är det dags att förbereda sig för att kunna använda GPIO hedern, eller 40-pins anslutningen vilken hanteras av ett Broadcom 2835-chip.

wget http://www.airspayce.com/mikem/bcm2835/bcm2835-1.71.tar.gz
tar zxvf bcm2835-1.71.tar.gz
cd bcm2835-1.71/
sudo ./configure && sudo make && sudo make check && sudo make install

Nästa steg är att installera WiringPI, det bibliotek som bl.a. hanterar den seriella kommunikationen mellan Raspberry Pi och GPS-tilläggskortet. Här fick jag problem, WiringPi är har bl.a. ett beroende till libc6 och WiringPi kunde inte hitta detta standardbibliotek, fick till sist köra en …

sudo apt --fix-broken install

… och sedan fungerade följande.

sudo git clone https://github.com/WiringPi/WiringPi
cd WiringPi
sudo ./build

Oavsett vilken version man får så måste gpio -v visa något liknande efter installation.

gpio version: 3.16
Copyright (c) 2012-2025 Gordon Henderson and contributors
This is free software with ABSOLUTELY NO WARRANTY.
For details type: gpio -warranty

Hardware details:
 Type: Pi 5, Revision: 00, Memory: 8192MB, Maker: Sony UK 

System details:
 * Device tree present.
 Model: Raspberry Pi 5 Model B Rev 1.0
 * Supports full user-level GPIO access via memory.
 * Supports basic user-level GPIO access via /dev/gpiomem.
 * Supports basic user-level GPIO access via /dev/gpiochip (slow).

Andra resultat innebär ett installationsfel och då måste man felsöka denna del av installationen … 😉

Sedan är det dags för ett Linuxbibliotek som används för att ”skriva och läsa” status på 40-pin I/O headern.

sudo su
wget https://github.com/joan2937/lg/archive/master.zip
unzip master.zip
cd lg-master
sudo make install 

exit

Vi närmar oss nu slutet på ”Del 1”, nu väntar jag på en längre bandkabel mellan Raspberry Pi:n och NVME-hatten samt kabelsnutten med hylsa så att jag kan få sekundpilserna till Raspberry Pi:ns I/O header … men visst kan vi testa att allt fungerar såhär långt.

sudo apt-get install minicom

Därefter, på en Raspberry Pi 5 …

sudo minicom -D /dev/ttyAMA0 -b 9600

Det skall ge något liknande skärmen …

$GNGGA,092016.000,5550.51234,N,01332.70397,E,1,10,1.0,47.6,M,35.2,M,,*72
$GNGLL,5550.51234,N,01332.70397,E,092016.000,A,A*46
$GNGSA,A,3,05,13,14,15,21,22,23,24,30,,,,1.7,1.0,1.3,1*35
$GNGSA,A,3,78,,,,,,,,,,,,1.7,1.0,1.3,2*38
$GPGSV,4,1,13,05,24,210,30,07,09,081,,08,08,020,,13,81,185,15,0*67
$GPGSV,4,2,13,14,62,105,14,15,59,281,24,17,09,130,21,18,05,291,,0*6C
$GPGSV,4,3,13,21,06,187,16,22,60,141,23,23,24,319,26,24,17,264,18,0*6E
$GPGSV,4,4,13,30,35,083,28,0*53
$GLGSV,2,1,07,78,39,220,22,66,10,150,,77,76,062,,76,26,046,,0*7F
$GLGSV,2,2,07,69,08,323,,85,18,006,,68,56,311,,0*47
$GNRMC,092016.000,A,5550.51234,N,01332.70397,E,0.77,143.64,121225,,,A,V*08
$GNVTG,143.64,T,,M,0.77,N,1.43,K,A*21
$GNZDA,092016.000,12,12,2025,00,00*41
$GPTXT,01,01,01,ANTENNA OK*35
$GNGGA,092017.000,5550.51236,N,01332.70393,E,1,10,1.0,47.6,M,35.2,M,,*75
$GNGLL,5550.51236,N,01332.70393,E,092017.000,A,A*41
$GNGSA,A,3,05,13,14,15,21,22,23,24,30,,,,1.7,1.0,1.3,1*35
$GNGSA,A,3,78,,,,,,,,,,,,1.7,1.0,1.3,2*38
$GPGSV,4,1,13,05,24,210,30,07,09,081,,08,08,020,,13,81,185,15,0*67
$GPGSV,4,2,13,14,62,105,14,15,59,281,24,17,09,130,21,18,05,291,,0*6C
$GPGSV,4,3,13,21,06,187,16,22,60,141,23,23,24,319,26,24,17,264,18,0*6E
$GPGSV,4,4,13,30,34,083,28,0*52
$GLGSV,2,1,07,78,39,220,22,66,10,150,,77,76,062,,76,26,046,,0*7F
$GLGSV,2,2,07,69,08,323,,85,18,006,,68,56,311,,0*47
$GNRMC,092017.000,A,5550.51236,N,01332.70393,E,0.00,143.64,121225,,,A,V*0F
$GNVTG,143.64,T,,M,0.00,N,0.00,K,A*27
$GNZDA,092017.000,12,12,2025,00,00*40
$GPTXT,01,01,01,ANTENNA OK*35
$GNGGA,092018.000,5550.51239,N,01332.70385,E,1,10,1.0,47.5,M,35.2,M,,*71
$GNGLL,5550.51239,N,01332.70385,E,092018.000,A,A*46
$GNGSA,A,3,05,13,14,15,21,22,23,24,30,,,,1.7,1.0,1.3,1*35
$GNGSA,A,3,78,,,,,,,,,,,,1.7,1.0,1.3,2*38
$GPGSV,4,1,13,05,24,210,27,07,09,081,,08,08,020,,13,81,185,15,0*61
$GPGSV,4,2,13,14,62,105,11,15,59,281,24,17,09,130,21,18,05,291,,0*69
$GPGSV,4,3,13,21,06,187,16,22,60,141,23,23,24,319,26,24,17,264,18,0*6E
$GPGSV,4,4,13,30,34,083,28,0*52
$GLGSV,2,1,07,78,40,220,22,66,10,150,,77,76,062,,76,26,046,,0*71
$GLGSV,2,2,07,69,08,323,,85,18,006,,68,57,311,,0*46
$GNRMC,092018.000,A,5550.51239,N,01332.70385,E,0.00,143.64,121225,,,A,V*08
$GNVTG,143.64,T,,M,0.00,N,0.00,K,A*27
$GNZDA,092018.000,12,12,2025,00,00*4F
$GPTXT,01,01,01,ANTENNA OK*35

Nu ser vi att vi får in ”North” och ”East”, vi ser också ”ANTENNA OK” vilket är jättebra, vi har seriell kommunikation mellan GPS-hatten och Raspberry Pi.

Är du lite nyfiken på vad en komplett NMEA-sekvens berättar för oss?

Position och fix

  • $GNGGA
    Global Positioning System Fix Data
    ◦ 102733.000 → Tid (UTC: 10:27:33)
    ◦ 5550.51375,N → Latitud: 55° 50.51375′ N
    ◦ 01332.69776,E → Longitud: 13° 32.69776′ E
    ◦ 1 → Fixstatus (1 = GPS fix)
    ◦ 10 → Antal satelliter används
    ◦ 1.1 → HDOP (horisontell noggrannhet)
    ◦ 56.4,M → Höjd över havet: 56.4 meter
    ◦ 35.2,M → Geoid separation (skillnad mellan havsnivå och ellipsoid)
  • $GNGLL
    Geographic Position – Latitude/Longitude
    ◦ Samma koordinater som ovan, med tidstämpel.
    ◦ A,A → Data giltig, aktiv fix.

Satellitstatus

  • $GNGSA
    GNSS DOP och aktiva satelliter
    ◦ A,3,… → Automatisk 3D‑fix.
    ◦ Listar satellit‑ID som används (12, 13, 14, 15, 17, 19, 22, 23, 24).
    ◦ 2.0,1.1,1.7 → PDOP, HDOP, VDOP (precisionstal).
    ◦ Andra raden visar en GLONASS‑satellit (ID 69).
  • $GPGSV / $GLGSV
    Satellit‑info (GPS resp. GLONASS)
    ◦ Antal satelliter i sikte: GPS = 12, GLONASS = 8.
    ◦ Varje block visar: satellitnummer, elevation (höjd över horisont), azimut (riktning), signalstyrka (SNR).
    ◦ Exempel: 10,17,330,24 → Satellit 10, 17° höjd, 330° riktning, SNR 24.

Rörelse och tid

  • $GNRMC
    Recommended Minimum GNSS Data
    ◦ Tid: 10:27:33 UTC
    ◦ Position: samma koordinater
    ◦ Hastighet: 0.73 knop (~1.34 km/h)
    ◦ Kurs: 231.66° (sydvästlig riktning)
    ◦ Datum: 12 december 2025
    ◦ Status: giltig fix (A).
  • $GNVTG
    Course over ground and ground speed
    ◦ Kurs: 231.66° (True)
    ◦ Hastighet: 0.73 knop / 1.34 km/h.
  • $GNZDA
    Datum och tid
    ◦ Tid: 10:27:33 UTC
    ◦ Datum: 12/12/2025
    ◦ Lokala tidszon‑offset: 00,00 (ingen offset).

Systemmeddelande

  • $GPTXT
    Textmeddelande från mottagaren
    ◦ ANTENNA OK → Antennen fungerar som den ska.

Sammanfattning
Mottagaren rapporterar:

  • Position: 55°50.51375′ N, 13°32.69776′ E (Fogdarp/Ringsjön‑området).
  • Höjd: ca 56 m över havet.
  • Fix: giltig 3D‑fix med 10 satelliter.
  • Noggrannhet: HDOP 1.1 (bra precision).
  • Rörelse: nästan stillastående, kurs ~231° (sydväst), hastighet ~1 km/h.
  • Datum/tid: 12 december 2025, 10:27:33 UTC.
  • Antennstatus: OK.

.

Fortsättning följer …

>> Del 2

Nordh Tech
Privacy Overview

GDPR och kakor (cookies)

Den 25 maj 2018 började dataskyddsförordningen (GDPR) att gälla i Sverige och övriga EU.

Det innebär bland annat att inget företag eller organisation får spara personuppgifter som inte behövs för att leverera det du bett om och att du har rätt att ”bli glömd” så snart du ber om det.

För din kontakt med Nordh.Tech innebär det inte så mycket.

Vi sparar en kaka (cookie) vilket innebär en liten textfil med information om vad du gjort när du surfar hos oss, vi gör det för att kunna få statistik rörande vad du gjort när du besöker oss och för att vi skall kunna ge dig nytt innehåll och inte till exempel behöva fråga dig var gång du besöker oss om du godkänner våra GDPR-villkor eller att det sparas en ”kaka” på din dator.

Vi sparar också din epostadress för att kunna skicka dig vårt nyhetsbrev eller hantera din inloggning i vårt forum, om du bett om det vill säga. Då du prenumererar på nyhetsbrevet eller begär inloggning till vårt forum anger du också ditt förnamn eller inloggningsnamn men här kan du ange vilket namn som helst. Vissa anger även efternamn men dessa raderas så att endast förnamnet kommer att användas i hälsningsfrasen i varje nyhetsbrev.

Hoppas detta gör att du kan känna dig trygg med ditt besök hos mig här på Internet.