Dies ist ein Memo über das GPS-Modul in Python von Raspberry Pi3. Die OS-Version von Raspberry Pi 3 ist
~~Raspbian GNU/Linux 8.0 (jessie)~~ Raspbian GNU / Linux 9.4 (Stretch) (behoben am 5. Oktober 2018)
ist.
Für das GPS-Modul habe ich Akizuki Denshis "GPS Receiver Kit 1 kompatibel mit" Michibiki "mit PPS-Ausgang" verwendet.
Dieses GPS-Modul sendet die empfangenen GPS-Daten seriell aus. Es gibt zwei Möglichkeiten, seriell mit Raspberry Pi 3 zu kommunizieren: über den USB-Anschluss und über den GPIO-Pin. Wenn Sie den USB-Anschluss verwenden, ist ein serielles USB-Konvertierungsmodul erforderlich, daher habe ich diesmal den GPIO-Pin verwendet. Verbinden Sie den Raspberry Pi 3 und das GPS-Modul wie folgt.
Raspberry Pi3 | GPS-Modul |
---|---|
04(5v) | 5V |
06(Ground) | GND |
08(TXD0) | RXD |
10(RXD0) | TXD |
Ich verwende keinen GPS 1PPS-Pin, daher verbinde ich nichts.
Aktivieren Sie für die serielle Kommunikation mit Raspberry Pi3 serial in raspi-config und stellen Sie ein, dass serial nicht als Konsole verwendet wird.
Starten Sie raspi-config und aktivieren Sie serial wie folgt:
pi$ sudo raspi-config
Wählen Sie "5 Schnittstellenoptionen" und dann "P6 Seriell". Wählen Sie "Ja" für "Möchten Sie, dass auf eine Anmeldeshell über die Seriennummer zugegriffen werden kann?", "Fertig stellen" und "Neustart".
pi$ sudo reboot
Ein Gerät namens / dev / serial0 wird erstellt.
pi$ ls /dev/se*
/dev/serial0 /dev/serial1
Ändern Sie /boot/cmdline.txt, um serial0 so festzulegen, dass es nicht als Konsole verwendet wird.
pi$ cat /boot/cmdline.txt
dwc_otg.lpm_enable=0 console=tty1 console=serial0,115200 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait quiet splash plymouth.ignore-serial-consoles
Löschen Sie "console = serial0,115200" im Editor und starten Sie neu.
pi$ sudo reboot
Installieren Sie das serielle Python-Modul. (5. Oktober 2018: Von Python-Seriell zu Pyserial geändert)
pi$ pip install pyserial
Wenn Sie pyenv nicht verwenden, installieren Sie es mit pip3.
Jetzt können Sie Python auf Raspberry Pi 3 für die serielle Kommunikation verwenden. Wenn Sie das GPS-Modul an Raspberry Pi3 anschließen, starten Sie Python wie folgt und überprüfen Sie, ob die GPS-Daten gelesen werden können.
pi$ python3
>>> import serial
>>> s = serial.Serial('/dev/serial0', 9600, timeout=10)
>>> print(s.readline())
b'\x00\x00\xc0\x00\xfe\x00pK&&KLN\xcb14,302,,06,08,254,27,30,07,230,29*70\r\n'
>>> print(s.readline())
b'$GPGSV,4,4,14,23,05,150,19,14,04,054,*74\r\n'
>>>
Die erste readline () besteht aus halbfertigen Daten, aber die zweite und nachfolgende readline () scheint in der Lage zu sein, GPS-Daten zu lesen.
Die vom GPS-Modul gesendeten Daten sind Zeichenfolgen im Format NMEA-0183. Für das Datenformat von NMEA-0183 ist die Site "NMEA 0183 Sätze Datenanalyse" leicht zu verstehen.
Das GPS-Modul empfängt Signale von GPS-Satelliten und zeigt Informationen wie Zeit, Breite, Länge, Höhe über dem Meeresspiegel, Anzahl und ID der zur Positionierung verwendeten Satelliten sowie die Position (Azimut und Höhe) jedes Satelliten im NMEA-0183-Format an. Es wird als Zeichenfolge von gesendet.
Es gibt eine Python-Bibliothek, die diese Zeichenfolgendaten in programmgesteuert benutzerfreundliche Daten konvertiert. Eine Suche im Internet ergab micropyGPS und pynmea2.
micropyGPS ist eine GPS-Datenanalysebibliothek, die unter Python 3.x und MicroPython ausgeführt wird. Wenn Sie GPS-Daten eingeben, werden diese analysiert und Daten zum GPS-Objekt hinzugefügt und aktualisiert. Informationen wie Zeit, Breite, Länge, Anzahl der zur Positionierung verwendeten Satelliten und ID können als GPS-Objektdaten abgerufen werden. Die Dokumentation ist auch solide.
pynmea2 scheint GPS-Daten nur Zeile für Zeile zu analysieren, und die Dokumentation sieht schlecht aus.
Deshalb habe ich mich für micropyGPS als Bibliothek entschieden. Um es zu verwenden, laden Sie einfach micropyGPS.py von Github herunter und legen Sie es in dem Verzeichnis ab, in dem Python gestartet wird.
Das Python-Programm, das GPS-Daten liest, sieht folgendermaßen aus: Lesen Sie die Daten vom GPS-Modul Das Hinzufügen und Aktualisieren von Daten zum GPS-Objekt wird als Thread ausgeführt und die Daten werden alle 3 Sekunden ausgegeben.
Der Zeitunterschied in der Zeitzone (+9 Stunden in Japan) und das Ausgabeformat für Längen- und Breitengrad werden beim Erstellen eines MicroGPS-Objekts als Argumente angegeben. Es scheint, dass die folgenden Formate als Ausgabeformat angegeben werden können.
'ddm'Dezimalgrad, Minute(40° 26.767′ N)
'dms'Dezimalgrade, Minuten, Sekunden(40° 26′ 46″ N)
'dd'Dezimalgrad(40.446° N)
import serial
import micropyGPS
import threading
import time
gps = micropyGPS.MicropyGPS(9, 'dd') #Erstellen Sie ein MicroGPS-Objekt.
#Argumente sind Zeitzonen-Zeitdifferenz und Ausgabeformat
def rungps(): #Lesen Sie das GPS-Modul und aktualisieren Sie das GPS-Objekt
s = serial.Serial('/dev/serial0', 9600, timeout=10)
s.readline() #Verwerfen Sie die erste Zeile, da sie möglicherweise halbfertige Daten liest
while True:
sentence = s.readline().decode('utf-8') #Lesen Sie GPS-Daten und konvertieren Sie sie in eine Zeichenfolge
if sentence[0] != '$': #Der Anfang ist'$'Wenn nicht, werfen Sie es weg
continue
for x in sentence: #Analysieren Sie die gelesene Zeichenfolge und fügen Sie dem GPS-Objekt Daten hinzu und aktualisieren Sie diese
gps.update(x)
gpsthread = threading.Thread(target=rungps, args=()) #Erstellen Sie einen Thread, um die obige Funktion auszuführen
gpsthread.daemon = True
gpsthread.start() #Starten Sie einen Thread
while True:
if gps.clean_sentences > 20: #Ausgabe, wenn bis zu einem gewissen Grad die richtigen Daten gesammelt wurden
h = gps.timestamp[0] if gps.timestamp[0] < 24 else gps.timestamp[0] - 24
print('%2d:%02d:%04.1f' % (h, gps.timestamp[1], gps.timestamp[2]))
print('Längengrad Breitengrad: %2.8f, %2.8f' % (gps.latitude[0], gps.longitude[0]))
print('Über dem Meeresspiegel: %f' % gps.altitude)
print(gps.satellites_used)
print('Satellitennummer: (Höhenwinkel,Richtungswinkel,SN-Verhältnis)')
for k, v in gps.satellite_data.items():
print('%d: %s' % (k, v))
print('')
time.sleep(3.0)
Als ich das Programm ausführte, erhielt ich das folgende Ergebnis. Der Breiten- und Längengrad unterhalb des Dezimalpunkts ist ausgeblendet.
14:02:19.0
Längengrad Breitengrad: 35.********, 139.********
Über dem Meeresspiegel: 51.900000
Satelliten positionieren: [17, 28, 6, 3, 193, 1, 22, 8]
Satellitennummer: (Höhenwinkel,Richtungswinkel,SN-Verhältnis)
193: (59, 173, 40)
3: (71, 124, 24)
6: (13, 259, 27)
1: (49, 42, 16)
8: (15, 115, 21)
42: (48, 170, 34)
11: (40, 69, None)
14: (4, 47, None)
17: (42, 317, 15)
19: (20, 307, None)
22: (56, 66, 21)
23: (10, 145, None)
28: (63, 248, 38)
30: (3, 224, 16)
Die Linie nach der "Satellitennummer" ist die Satellitennummer, der Höhenwinkel, der Azimutwinkel und das SN-Verhältnis des erfassten Satelliten. Der Satellit Nummer 193 ist "Michibiki, der erste Quasi-Zenit-Satellit".
Recommended Posts