Forum » Operacijski sistemi » Kako na linuxu (Raspberry PI) prepričati NTP, da bo uporabil podatke iz GPS-a
Kako na linuxu (Raspberry PI) prepričati NTP, da bo uporabil podatke iz GPS-a
mojca ::
Na Raspberry PI sem namestila modul za GPS, ki po serijski povezavi pošilja stavke NMEA, na pin 18 pa PPS.
Dela praktično vse, razen najpomembnejšega: samodejne nastavitve časa (dokler nisem bolje razroščevala in dokler nisem potrebovala res natančnega merjenja časa, nisem niti opazila, da ne dela).
"gpsd" dela in se pri rebootu pravilno zažene (ročno ga zaženem z "gpsd /dev/ttyAMA0 -n -F /var/run/gpsd.sock"), če gpsd ne dela, mi "sudo gpsmon /dev/ttyAMA0" kaže smiselne rezultate, "cgps -s" mi kaže pravilen čas in koordinate, "ppstest" dela:
"ntpq" se dela, da dela:
Če v pythonu berem
potem mi "točen čas" dela, ampak ima vsaj pol do tričetrt sekunde zamika (ker ne upošteva PPS-ja).
Tule so neka navodila, ampak polovice ukazov nimam (gpsstatus, gpsinit, ...)
Morda kdo ve, kaj točno je potrebno zapisati v /etc/ntp.conf, da bo pravilno delalo? Par vrstic imam (ne vem, iz katerega vira sem jih dobila), a sumim, da so napačne:
Ni mi čisto jasno, od kod sploh pridejo 127.127.20.0, 127.127.22.0 ipd v navodilih.
Dela praktično vse, razen najpomembnejšega: samodejne nastavitve časa (dokler nisem bolje razroščevala in dokler nisem potrebovala res natančnega merjenja časa, nisem niti opazila, da ne dela).
"gpsd" dela in se pri rebootu pravilno zažene (ročno ga zaženem z "gpsd /dev/ttyAMA0 -n -F /var/run/gpsd.sock"), če gpsd ne dela, mi "sudo gpsmon /dev/ttyAMA0" kaže smiselne rezultate, "cgps -s" mi kaže pravilen čas in koordinate, "ppstest" dela:
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 1452689251.000004193, sequence: 4382 - clear 0.000000000, sequence: 0 source 0 - assert 1452689252.000002066, sequence: 4383 - clear 0.000000000, sequence: 0
"ntpq" se dela, da dela:
ntpq -p remote refid st t when poll reach delay offset jitter ============================================================================== oPPS(0) .PPS. 0 l 15 16 377 0.000 -0.004 0.002 *pritisni.ctrl-a 193.2.1.117 2 u 22 64 377 9.359 3.703 1.012 ...
Če v pythonu berem
import gps session = gps.gps("localhost", "2947") session.stream(gps.WATCH_ENABLE | gps.WATCH_NEWSTYLE) while True: report = session.next() if report['class'] == 'TPV': if hasattr(report, 'time'): print(report.time[11:-5])
potem mi "točen čas" dela, ampak ima vsaj pol do tričetrt sekunde zamika (ker ne upošteva PPS-ja).
Tule so neka navodila, ampak polovice ukazov nimam (gpsstatus, gpsinit, ...)
Morda kdo ve, kaj točno je potrebno zapisati v /etc/ntp.conf, da bo pravilno delalo? Par vrstic imam (ne vem, iz katerega vira sem jih dobila), a sumim, da so napačne:
server 127.127.22.0 minpoll 4 maxpoll 4 fudge 127.127.22.0 refid PPS
Ni mi čisto jasno, od kod sploh pridejo 127.127.20.0, 127.127.22.0 ipd v navodilih.
bosto ::
Hja, ne bom ti znal povedat kaj imaš narobe, bi ti pa predlagal da si prebereš tole:
The Raspberry Pi as a Stratum-1 NTP Server
Dokumentacija o driverjih je pa na PPS Clock Discipline in Shared Memory Driver
The Raspberry Pi as a Stratum-1 NTP Server
Dokumentacija o driverjih je pa na PPS Clock Discipline in Shared Memory Driver
mojca ::
Ta dokument sem že brala, ampak je dooooolg in včasih je malo morje različnih pristopov. Sem še enkrat pošteno premlela in ugotovila, da mi je manjkal verjetno vsaj strežnik "28" (SHM) in "-n" pri klicu gpsd-ja.
Manjkajoči kos informacije:
To pomeni, da se brez mreže sploh ne sinhronizira.
server 127.127.28.0 minpoll 4 maxpoll 4 prefer fudge 127.127.28.0 time1 +0.500 refid GPS stratum 15
Manjkajoči kos informacije:
if the first preferred server goes offline, it appears that NTP will no longer accept the PPS data as valid.
To pomeni, da se brez mreže sploh ne sinhronizira.
bosto ::
Da ni problem v preveliki razliki lokalnega časa in časa posredovanega z gps?
Kolikor se spomnim ntpd privzeto noče popravljat prevelikih razlik (1000s ali nekaj takega).
Kolikor se spomnim ntpd privzeto noče popravljat prevelikih razlik (1000s ali nekaj takega).
mojca ::
Raspberry nima ure. Vsakič, ko ga izklopim in ponovno prižgem, je njegova ura nastavljena na zadnji čas, ko je bil še prižgan. Če naredim reboot, je razlika med uro na GPS-u in lokalno uro približno 8 sekund, vendar se pred priklopom na mrežo ura tudi slučajno noče premakniti niti za ped. Tudi če bi teorija o preveliki razliki držala, osem sekund to verjetno ni.
Imam tudi RTC, ampak problem je, ker mi ni jasno, kako gladko združiti oba mehanizma sinhronizacije (GPS + RTC, brez kakršnegakoli zanašanja na mrežno povezavo). Prav tako mi ni jasno, kako RTC priključiti na RPi še kako drugače kot zgolj preko I2C (recimo z SQW). Če je mogoče, bi si želela točnost ure spraviti nekje na red velikosti milisekunde.
Imam tudi RTC, ampak problem je, ker mi ni jasno, kako gladko združiti oba mehanizma sinhronizacije (GPS + RTC, brez kakršnegakoli zanašanja na mrežno povezavo). Prav tako mi ni jasno, kako RTC priključiti na RPi še kako drugače kot zgolj preko I2C (recimo z SQW). Če je mogoče, bi si želela točnost ure spraviti nekje na red velikosti milisekunde.
::
Če sam prav razumem, ima DS3231 (poleg ostalih funkcij) uro, ki jo lahko z branjem registrov preko I2C nastavljaš ali bereš. Sam to zadevo uporabljam na mikrokrmilnikih, kjer itak teče samo moja koda in v primeru da rabim točen čas, preberem ustrezne vrednosti. Za RPi pa predvidevam, da bi moral obstajati nek driver, ki ti omogoča uporabo DS3231 kot sistemske RTC ure. Mogoče nekaj takega.
mojca ::
Stran, ki si jo linkal, svetuje, da uro uporabiš ob vsakem zagonu računalnika, kar mi ne pomaga. RTC sem že nastavila tako, da znam nanjo pisati iz nje brati čas, ampak to mi ne pomaga povsem. Če bom računalnik zagnala enkrat letno (in RTC popravila samo enkrat letno) in mi bo vsak dan ura na PI-ju zdrsnila 1 sekundo, je to povsem nesprejemljivo.
Najraje bi uro vsako sekundo korigirala čas glede na PPS (in NMEA) in po potrebi popravljala čas na RTC-ju. Ampak PPS-ja očitno ne morem uporabiti, če nimam povezave na internet, pa ne razumem, zakaj.
Na lokaciji, kjer ni (nujno) interneta, bi rada vedela čas na cca. 1 ms natančno.
(Če bi uporabljala Arduino, bi verjetno SQW nastavila na najvišjo možno frekvenco in štela signalčke od enega do drugega PPS-ja iz GPS-ja.)
Najraje bi uro vsako sekundo korigirala čas glede na PPS (in NMEA) in po potrebi popravljala čas na RTC-ju. Ampak PPS-ja očitno ne morem uporabiti, če nimam povezave na internet, pa ne razumem, zakaj.
Na lokaciji, kjer ni (nujno) interneta, bi rada vedela čas na cca. 1 ms natančno.
(Če bi uporabljala Arduino, bi verjetno SQW nastavila na najvišjo možno frekvenco in štela signalčke od enega do drugega PPS-ja iz GPS-ja.)
AC_DC ::
od tu dalje:
I've run the test command on two equally equipped and setup Raspberry Pi's.
http://blog.remibergsma.com/2013/05/12/...
Iz tega lahko za poljuben dan, ko ura ni več online syncana, predvidiš za koliko bo kazala napačno.
Da v malino vtakneš nek usb modem in vsake toliko online syncaš čas ni opcija ?
Ali bi ti rada iz GPS modula dobila točen čas in tako syncala čas na malini ?
I've run the test command on two equally equipped and setup Raspberry Pi's.
http://blog.remibergsma.com/2013/05/12/...
Iz tega lahko za poljuben dan, ko ura ni več online syncana, predvidiš za koliko bo kazala napačno.
Da v malino vtakneš nek usb modem in vsake toliko online syncaš čas ni opcija ?
Ali bi ti rada iz GPS modula dobila točen čas in tako syncala čas na malini ?
Zgodovina sprememb…
- spremenilo: AC_DC ()
mojca ::
Hvala, bom podrobno preučila članek in ukaze.
Ampak graf prikazuje 140 ms drifta v eni uri. Če bi rada imela uro natančno na 1 ms, je to nesprejemljivo.
Kaj je mišljeno z USB modemom? GPRS? Teoretično imam router s SIM kartico, vendar je to precej nezanesljivo. Vsake toliko je operater preobremenjen in ni povezave, a tudi ko povezava je, je nezanesljivost NTP-ja preko GPRS-ja tudi +/- 2 s.
Glede na to, da imam na RPi priklopljen GPS z nekaj 10 ns negotovosti pri signalu PPS (merila sem razliko med dvema neodvisnima GPS-oma), bi moralo to nekako zadostovati za doseganje milisekundne točnosti tudi v odsotnosti mreže ali se motim?
(Še vedno ne razumem, zakaj NTP ne dela, ko mreže ni.)
Ampak graf prikazuje 140 ms drifta v eni uri. Če bi rada imela uro natančno na 1 ms, je to nesprejemljivo.
Kaj je mišljeno z USB modemom? GPRS? Teoretično imam router s SIM kartico, vendar je to precej nezanesljivo. Vsake toliko je operater preobremenjen in ni povezave, a tudi ko povezava je, je nezanesljivost NTP-ja preko GPRS-ja tudi +/- 2 s.
Glede na to, da imam na RPi priklopljen GPS z nekaj 10 ns negotovosti pri signalu PPS (merila sem razliko med dvema neodvisnima GPS-oma), bi moralo to nekako zadostovati za doseganje milisekundne točnosti tudi v odsotnosti mreže ali se motim?
(Še vedno ne razumem, zakaj NTP ne dela, ko mreže ni.)
::
Sam take časovne natančnosti ne potrebujem, zame je zadosti že minuta. Se pa sprašujem, če je RPi z običajnim Linuxom sploh primeren za kaj takega? Sam sem npr. zaradi zanesljivosti delovanja mojega sistema vse IO operacije preselil na Arduina, RPi pa skrbi za povezavo v svet.
misek ::
Zakaj je sploh potreben internet in/ali rtc?
Začetni čas se prebere preko gpsd nato pa pps skrbi za točnost.
Sicer sam tega nisem počel sem pa kakšno leto nazaj pomagal znancu.
Začetni čas se prebere preko gpsd nato pa pps skrbi za točnost.
Sicer sam tega nisem počel sem pa kakšno leto nazaj pomagal znancu.
Kocka ::
Še vedno ne razumem, zakaj NTP ne dela, ko mreže ni
Ne more delati, ker NTP komunicira preko mreže. To je protokol, ki preko interneta prebere uro.
Network Time Protocol @ Wikipedia
Najraje bi uro vsako sekundo korigirala čas glede na PPS (in NMEA) in po potrebi popravljala čas na RTC-ju. Ampak PPS-ja očitno ne morem uporabiti, če nimam povezave na internet, pa ne razumem, zakaj.
Točno to rabiš. GPS ti ves čas na serijski port (UART) pošilja NMEA (in ne NTP) sporočila. Zgledajo nekako takole:
$GPGGA,092750.000,5321.6802,N,00630.3372,W,1,8,1.03,61.7,M,55.2,M,,*76
$GPGSA,A,3,10,07,05,02,29,04,08,13,,,,,1.72,1.03,1.38*0A
$GPGSV,3,1,11,10,63,137,17,07,61,098,15,05,59,290,20,08,54,157,30*70
$GPZDA,201530.00,04,07,2002,00,00*60
NMEA 0183 @ Wikipedia
Za točen čas rabiš slednjega ($GPZDA):
http://www.gpsinformation.org/dale/nmea...
Torej, poslušaš na serijskem portu in prestrezaš sporočila, dokler ne dobiš $GPZDA sporočila, iz katerega prebereš točen čas. Nato počakaš na naslednji 1 PPS impulz in v tem trenutku zapišeš ta prebrani točen čas z dodano 1 sekundo v svoj RTC modul. Nato popraviš uro na Linuxu glede na čas v RTC-ju.
PPS impulz dobiš ven iz GPS modula preko svojega pina in ga vodiš na en GPIO pin.
mojca ::
Še vedno ne razumem, zakaj NTP ne dela, ko mreže ni
Ne more delati, ker NTP komunicira preko mreže. To je protokol, ki preko interneta prebere uro.
Network Time Protocol @ Wikipedia
OK, ampak naj vprašam drugače. Na tej sliki imaš levo zgoraj strežnik Stratum 1. Od kod se le-ta sinhronizira? Ali je napaka v sliki? Če NTP "razume" PPS, zakaj ne bi mogel spotoma znati prebrati še stavkov NMEA? (Kolikor vidim, je nek "SHM" podprt, ampak meni ne dela.) Seveda lahko vse naredim na roke, ampak ne razumem, v čem je fora tega, da pišem softver na roke (razen če bi pisala za Arduino, kar morda celo bom; samo strežnika NTP morda ne bi ravno implementirala na Arduinu), če bi moral biti "piece of cake" podpreti še branje iz serijskega porta.
Najraje bi uro vsako sekundo korigirala čas glede na PPS (in NMEA) in po potrebi popravljala čas na RTC-ju. Ampak PPS-ja očitno ne morem uporabiti, če nimam povezave na internet, pa ne razumem, zakaj.
Točno to rabiš. GPS ti ves čas na serijski port (UART) pošilja NMEA (in ne NTP) sporočila. Zgledajo nekako takole:
$GPGGA,092750.000,5321.6802,N,00630.3372,W,1,8,1.03,61.7,M,55.2,M,,*76
$GPGSA,A,3,10,07,05,02,29,04,08,13,,,,,1.72,1.03,1.38*0A
$GPGSV,3,1,11,10,63,137,17,07,61,098,15,05,59,290,20,08,54,157,30*70
$GPZDA,201530.00,04,07,2002,00,00*60
NMEA 0183 @ Wikipedia
Za točen čas rabiš slednjega ($GPZDA):
http://www.gpsinformation.org/dale/nmea...
Torej, poslušaš na serijskem portu in prestrezaš sporočila, dokler ne dobiš $GPZDA sporočila, iz katerega prebereš točen čas. Nato počakaš na naslednji 1 PPS impulz in v tem trenutku zapišeš ta prebrani točen čas z dodano 1 sekundo v svoj RTC modul. Nato popraviš uro na Linuxu glede na čas v RTC-ju.
A nima ura na linuxu tudi nekih softverskih popravkov ali zdaj sanjam? V stilu: če po stotih sinhronizacijah operacijski sistem ugotovi, da ima konsistentno prepočasno notranjo uro, bi jo lahko samodejno popravljal že sam.
Z RS232 imam slabe izkušnje (i.e.: pri privzetih nastavitvah načeloma počasen, 1 znak = 1 ms). Upam, da je I2C hitrejši. In morda bi morala preveriti, če moram povišati hitrost.
PPS impulz dobiš ven iz GPS modula preko svojega pina in ga vodiš na en GPIO pin.
To že imam in mi dela. Z NMEA stavki se tudi švercam na gpsd in uporabljam knjižnico za komunikacijo z gpsd-jem.
Čeprav me zdaj začenja skrbeti: a je iz serijskega pina možno brati samo z enim programom? Ker z enim programom berem čas iz stavkov NMEA in ga izpisujem na LCD, istočasno pa bi ga rada uporabila še za sinhronizacijo ure. Se bo to dvoje skregalo med seboj?
Našla sem še en link.
jype ::
mojca> Čeprav me zdaj začenja skrbeti: a je iz serijskega pina možno brati samo z enim programom? Ker z enim programom berem čas iz stavkov NMEA in ga izpisujem na LCD, istočasno pa bi ga rada uporabila še za sinhronizacijo ure. Se bo to dvoje skregalo med seboj?
To ne bo šlo. Najbolje je, da napišeš program, ki dela oboje.
To ne bo šlo. Najbolje je, da napišeš program, ki dela oboje.
mojca ::
Hm. Morda pa prav v tem grmu tiči zajec. Istočasno poganjam gpsd in skušam ntp sinhronizirati iz stavkov NMEA. ("Poor man's solution": preko pretvornik TTL2USB speljati kopijo podatkov iz GPS-ja še na USB in ponovno testirati.)
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | C#, OBD2 in branje iz portaOddelek: Programiranje | 1577 (1194) | detroit |
» | Digitalna regulacija tokovnega viraOddelek: Elektrotehnika in elektronika | 2842 (2416) | Red_Mamba |
» | C# NMEA podatki iz GPS-jaOddelek: Programiranje | 964 (765) | krneki0001 |
» | URAOddelek: Slo-Tech | 1945 (1854) | PaJo |
» | Windows 2000 in Windows Time serviceOddelek: Operacijski sistemi | 2316 (2212) | JeDo |