
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 installNä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 ./buildOavsett 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
exitVi 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 minicomDärefter, på en Raspberry Pi 5 …
sudo minicom -D /dev/ttyAMA0 -b 9600Det 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*35Nu 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 …
