RasPiCar Projekt Forum

Normale Version: GPS Zeit aus Navit in Skript schreiben?
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo,

nachdem mein CarPi nun super läuft, stört mich nur noch eins:
Mein USB GPS unterstützt kein PPS, also kann ich das mit dem Sync bei NTP vergessen. Jedes mal einen Hotspot am Handy aktivieren um das die Zeit synchronisiert wird, ist nervig. Nachdem die Uhr bei mir nicht auf die Sekunde genau gehen muss, hatte ich folgende Idee:

- aus snaga.xml
Code:
<osd enabled="yes" type="text" label="${vehicle.position_time_iso8601[+01:00;%M%M%D%D%h%h%m%m%Y%Y]} " x="512" y="45" w="256" h="80" />
+01:00;%M%M%D%D%h%h%m%m%Y%Y auslesen und in ein Skript schreiben

- dieses Skript soll dann mit den ausgelesenen Werten die Systemzeit setzen
Code:
sudo date -u MMDDhhmmYY
- das ganze dann in crontab

Damit wäre ich schon zufrieden. Nur wie bekomme ich die Zeit in mein Skript? Hat da jemand eine Idee und kann mir helfen?
Warum baust du dir nicht einfach eine RTC ein?
Hat das mittlerweile schon jemand gemacht mit dem RTC? Hatte bisher noch keine Lust Big Grin
(20.03.2017, 20:24)Jack schrieb: [ -> ]Warum baust du dir nicht einfach eine RTC ein?
Weil alles im Auto eingebaut ist und ich keine Lust habe alles wieder raus zu holen Wink
@tigger-gg
Hm, blöd gelaufen! Big Grin Mit den Skripten kann ich leider nicht helfen. Bin da selber ein ziemlicher Noob …

@Thedk
In meinem Projekt arbeitet seit geraumer Zeit eine RTC DS3231 absolut zuverlässig. Hatte zuerst Bedenken, da die RTC wie auch das Radio-Modul den I2C benutzt. Das ist aber kein Problem, die beiden stören sich nicht. Die Einrichtung mit einer der zahlreichen im Netz zu findenden Anleitungen war auch ruckzuck erledigt. Von meiner Seite eine klare Empfehlung dafür. Aber unbedingt darauf achten, dass es eine DS3231 ist und keine DS1307. Letztere ist nämlich ziemlich ungenau. Und ein weiterer Punkt, auf den man achten sollte: Wenn möglich, ein Exemplar mit einer CR2032 als Stromversorgung nehmen. Es gibt nämlich auch Angebote mit einer ziemlich exotischen Knopfzelle, die man nur schwer im Handel findet. Und nach ca. einem Jahr ist die Zelle leer und muss ersetzt werden. Die CR2032 hat eine höhere Kapazität und hält somit länger durch und ist darüberhinaus auch überall erhältlich.
Hab beide Module da Wink
Das teilweise ein Akku und bei manchen eine normale Batterie verbaut ist, hatte ich auch schon gelesen. Deswegen habe ich mir gleich ein Modul ohne Batterie bestellt.
Anleitungen habe ich auch schon genug gefunden, muss ich demnächst mal ran wenn ich Lust habe Big Grin
Das lohnt sich auf jeden Fall. Die Uhrzeit über GPS zu holen hat bei mir nicht immer wirklich zuverlässig funktioniert. Mit der RTC ist das jetzt überhaupt kein Problem mehr.
So, ich hab mal ein wenig in meinen "alten Dateibeständen" gekramt. Ich wusste ich hatte so was ähnliches schon mal gebraucht. Bei unserem ersten Wetterballon ist noch ein RPi mitgeflogen (ist inzwischen von einem Arduino ersetzt worden). Genau das gleich Problem mit der Systemzeit hatten wir da auch.
Hier
bin ich damals fündig geworden und habe auch vom Autor sehr nette und schnelle Hilfe bekommen. Das Python Script von der Seite hatten wir damals abgeändert um dem RPi die Systemzeit beizubringen. Ich habe das jetzt noch ein wenig angepasst. Dabei ist das raus gekommen (ich habe es gpstime.py genannt):
Code:
#!/usr/bin/python
# -*- coding: utf-8 -*-
import serial
import time
import datetime
import commands
import os
import sys

# Dictionary fuer die empfangene Daten
Protokolle = {}
# Variablen fuer die Uhrzeit
Uhrzeit = ""
Datum = ""
Stunde = ""
Minute = ""
Sekunde = ""
Tag = ""
Monat = ""
Jahr = ""

# UART oeffnen
UART = serial.Serial("/dev/ttyACM0", 9600)
UART.isOpen()

while True:
    Protokolle = {}
    for Counter in range(3):

        Daten = []

        # Zeile einlesen
        Zeile = UART.readline()
        Zeile = Zeile.strip()
        # Zeile trennen
        Daten = Zeile.split(",")
        # Daten dem Dictionary hinzufuegen
        Schluessel = Daten[0]
        del Daten[0]
        Protokolle.update({Schluessel:Daten})
    for Key in Protokolle.iterkeys():
        # Daten extrahieren
        if(Key == "$GPRMC"):
            # Datum formatieren
            Uhrzeit = Protokolle[Key][0]
#           UTC + 1 Stunde
            Stunde = int(float(Uhrzeit[0:2]) + 1)
            Minute = Uhrzeit[2:4]
            Sekunde = Uhrzeit[4:6]
            Datum = Protokolle[Key][8]
            Tag = Datum[0:2]
            Monat = Datum[2:4]
            Jahr = Datum[4:6]
            Seperator = "."

#           Systemzeit zusammen setzen (MMDDhhmmYY.ss)
            Systemzeit = Monat+Tag+str(Stunde)+Minute+Jahr+Seperator+Sekunde

#           Sytemzeit setzen
            os.system('sudo date ' + str(Systemzeit))

            print Key
            print Monat
            print Tag
            print Stunde
            print Minute
            print Jahr
            print Systemzeit
            time_set = True
            UART.close()

            sys.exit()
            time.sleep(1)
gpstime.py habe ich in /home/pi erstellt und mit
Code:
chmod +x gpstime.py
ausführbar gemacht.
Folgende Zeile muss noch an die eigene Schnittstelle angepasst werden. Wie man die raus findet erklärt CHristian hier.
Code:
UART = serial.Serial("/dev/ttyACM0", 9600)
Das Script holt sich aus den NMEA Daten den GPRMC Datensatz und daraus dann das Datum und die Uhrzeit und übergibt das dem RPi als Systemzeit.
Damit das alles auch automatisch abläuft, lasse ich das Script von /etc/rc.local beim Systemstart aufrufen:
Code:
python /home/pi/gpstime.py &
Bei einem ersten Test hatte mein USB-GPS "leider" sofort einen Fix. Also hat alles super funktioniert.
Da ich leider von Python keine große Ahnung habe, weiß ich noch nicht was das Skript macht wenn der GPS Empfänger länger zum Fix braucht. Ich hoffe das meiner jetzt über Nacht alles vergisst und er morgen früh länger für einen Fix braucht. Dann kann ich dazu vielleicht mehr sagen.
Sollte das mit der rc.local keine gute Idee sein, könnte man das Script auch in crontab z.B. die 2./5. und 7. Minute nach Systemstart starten lassen. Ich werde berichten.
Inzwischen bin ich soweit zufrieden wie es läuft. Ich habe mich gegen die rc.local und für crontab entschieden.

crontab -e:

Code:
@reboot sleep 60; python /home/pi/gpstime.py
@reboot sleep 80; python /home/pi/gpstime.py
Damit wird das Skript nach jedem Start aller 60 und 80 Sekunden ausgeführt.
Ein kleines Problem gab es noch. Navit erhebt auch Anspruch auf die GPS Schnittstelle (dev/tty****). Da aber nach dem Systemstart dev/tty**** noch von gpstime.py benutzt wird, musste ich Navit pausieren bis das Skript bzw die Zeitsynchronisation beendet ist.
Ich habe in /opt/carpc/startup/StartCarPC vor den Start von Navit ein sleep 80 && gesetzt.
Code:
#!/bin/bash

# Start gpsd
#sudo killall gpsd
#sudo chmod a+r /dev/ttyUSB0
#gpsd /dev/ttyUSB0

# Start Navit with a low priority
sleep 80 && navit &
#/usr/bin/7ways_starter.sh &

cd /opt/carpc/startup/
./StartCarPC_stage2 &
Somit muss ich 80 Sekunden warten bis ich Navit benutzen kann. Nach einigen Tests habe ich bemerkt, dass ich die sleep Zeit verkürzen kann. Denn ich habe festgestellt, dass auch wenn kein GPS Fix steht, das GPS Modul so ziemlich sofort die Uhrzeit empfängt.
Beim Wechsel von Sommer- und Winterzeit muss in gpstime.py entweder
Code:
Stunde = int(float(Uhrzeit[0:2]) + 1)
oder
Code:
Stunde = int(float(Uhrzeit[0:2]) + 2)
geändert werden.

Es ist sicher keine Ideallösung, doch mir genügt das vollkommen.
Es soll auch nur eine Lösung dafür sein, wenn keine Internetverbindung besteht, das GPS Modul kein PPS unterstützt bzw. wenn keine RTC vorhanden ist.