» »

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:
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

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.

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.

mojca ::

Ampak šment ... brez mreže se kljub vsemu še vedno noče sinhronizirati.

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

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.

          ::

Kateri RTC pa imaš? Kakšen DS3231?

mojca ::

          ::

Ali obstaja kak driver za tole, da se lahko sistemski čas uporabi iz tega čipa?

mojca ::

Ne najdem posebnega driverja. Zlasti pa ne razumem koncepta.

          ::

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

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 ?

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

          ::

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.

Kocka ::

mojca je izjavil:

Š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 ::

Kocka je izjavil:

mojca je izjavil:

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

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

misek ::

Na LCD izpisuj čas na sistemu - saj ta je točen ne?


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

C#, OBD2 in branje iz porta

Oddelek: Programiranje
191577 (1194) detroit
»

Digitalna regulacija tokovnega vira

Oddelek: Elektrotehnika in elektronika
142842 (2416) Red_Mamba
»

C# NMEA podatki iz GPS-ja

Oddelek: Programiranje
10965 (766) krneki0001
»

URA

Oddelek: Slo-Tech
51946 (1855) PaJo
»

Windows 2000 in Windows Time service

Oddelek: Operacijski sistemi
112316 (2212) JeDo

Več podobnih tem