Travailler avec le GPS en Python pour Raspberry Pi 3

Ceci est un mémo sur le module GPS en Python de Raspberry Pi3. La version OS de Raspberry Pi 3 est

~~Raspbian GNU/Linux 8.0 (jessie)~~ Raspbian GNU / Linux 9.4 (stretch) (corrigé le 5 octobre 2018)

est. Raspberry Pi3 + GPS

Module GPS

Pour le module GPS, j'ai utilisé le "[kit récepteur GPS 1 compatible avec" Michibiki "avec sortie PPS] d'Akizuki Denshi (http://akizukidenshi.com/catalog/g/gK-09991/)".

Ce module GPS envoie les données GPS reçues en série. Il existe deux façons de communiquer en série avec Raspberry Pi 3: en utilisant le port USB et en utilisant la broche GPIO. Lors de l'utilisation du port USB, un module de conversion série USB est nécessaire, j'ai donc utilisé la broche GPIO cette fois. Connectez le Raspberry Pi 3 et le module GPS comme suit.

Raspberry Pi3 Module GPS
04(5v) 5V
06(Ground) GND
08(TXD0) RXD
10(RXD0) TXD

Je n'utilise pas la broche GPS 1PPS, donc je ne connecte rien.

Communication série avec Python sur Raspberry Pi 3

Pour la communication série avec Raspberry Pi3, activez série dans raspi-config et définissez pour ne pas utiliser série comme console.

Activation série avec raspi-config

Lancez raspi-config et activez série comme suit:

pi$ sudo raspi-config

Sélectionnez "5 Options d'interfaçage" puis "P6 Serial". Sélectionnez Oui pour «Souhaitez-vous qu'un shell de connexion soit accessible via série?», Terminez et redémarrez.

pi$ sudo reboot

Un périphérique appelé / dev / serial0 sera créé.

pi$ ls /dev/se*
/dev/serial0  /dev/serial1

Modifiez /boot/cmdline.txt

Modifiez /boot/cmdline.txt pour que serial0 ne soit pas utilisé comme console.

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

Supprimez "console = serial0,115200" dans l'éditeur et redémarrez.

pi$ sudo reboot

Installez le module série Python

Installez le module série Python. (5 octobre 2018: Changement de python-serial en pyserial)

pi$ pip install pyserial

Si vous n'utilisez pas pyenv, installez-le avec pip3.

Vous pouvez maintenant utiliser Python sur Raspberry Pi 3 pour la communication série. Si vous connectez le module GPS à Raspberry Pi3, lancez Python comme suit et vérifiez-le, vous pouvez voir que les données GPS peuvent être lues.

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

La première readline () est des données semi-finies, mais la deuxième readline () et les suivantes semblent être capables de lire les données GPS.

Bibliothèque GPS Python

Les données envoyées depuis le module GPS sont une chaîne de caractères au format NMEA-0183. Pour le format de données NMEA-0183, le site "Analyse des données des phrases NMEA 0183" est facile à comprendre.

Le module GPS reçoit les signaux des satellites GPS et affiche des informations telles que l'heure, la latitude, la longitude, l'altitude au-dessus du niveau de la mer, le nombre et l'ID des satellites utilisés pour le positionnement et la position (azimut et élévation) de chaque satellite au format NMEA-0183. Il est envoyé sous forme de chaîne de caractères.

Il existe une bibliothèque Python qui convertit ces données de chaîne en données faciles à utiliser par programmation. Une recherche sur le Web a trouvé micropyGPS et pynmea2.

micropyGPS est une bibliothèque d'analyse de données GPS qui s'exécute sur Python 3.x et MicroPython. Lorsque vous entrez des données GPS, il les analyse et ajoute et met à jour des données sur l'objet GPS. Des informations telles que l'heure, la latitude, la longitude, le nombre de satellites utilisés pour le positionnement et l'identification peuvent être obtenues sous forme de données d'objet GPS. La documentation est également solide.

pynmea2 semble juste analyser les données GPS ligne par ligne, et la documentation semble médiocre.

J'ai donc décidé d'utiliser micropyGPS comme bibliothèque. Pour l'utiliser, téléchargez simplement micropyGPS.py depuis Github et placez-le dans le répertoire où vous lancez Python.

Programme Python

Le programme Python qui lit les données GPS ressemble à ceci: Lire les données du module GPS Le processus d'ajout et de mise à jour des données à l'objet GPS est exécuté en tant que thread et les données sont sorties toutes les 3 secondes.

Le décalage horaire du fuseau horaire (+9 heures au Japon) et le format de sortie latitude / longitude sont spécifiés comme arguments lors de la création d'un objet MicroGPS. Il semble que les formats suivants peuvent être spécifiés comme format de sortie.

'ddm'Degré décimal, minute(40° 26.767′ N)
'dms'Degrés décimaux, minutes, secondes(40° 26′ 46″ N)
'dd'Degré décimal(40.446° N)
import serial
import micropyGPS
import threading
import time

gps = micropyGPS.MicropyGPS(9, 'dd') #Créez un objet MicroGPS.
                                     #Les arguments sont le décalage horaire du fuseau horaire et le format de sortie

def rungps(): #Lisez le module GPS et mettez à jour l'objet GPS
    s = serial.Serial('/dev/serial0', 9600, timeout=10)
    s.readline() #Jeter la première ligne car elle peut lire des données semi-finies
    while True:
        sentence = s.readline().decode('utf-8') #Lisez les données GPS et convertissez-les en chaîne de caractères
        if sentence[0] != '$': #Le début est'$'Sinon, jetez-le
            continue
        for x in sentence: #Analyser la chaîne de caractères lue et ajouter et mettre à jour des données sur l'objet GPS
            gps.update(x)

gpsthread = threading.Thread(target=rungps, args=()) #Créez un thread pour exécuter la fonction ci-dessus
gpsthread.daemon = True
gpsthread.start() #Lancer un fil

while True:
    if gps.clean_sentences > 20: #Sortie lorsque des données appropriées sont accumulées dans une certaine mesure
        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('longitude latitude: %2.8f, %2.8f' % (gps.latitude[0], gps.longitude[0]))
        print('Au dessus du niveau de la mer: %f' % gps.altitude)
        print(gps.satellites_used)
        print('Numéro de satellite: (Angle d'élévation,Angle de direction,Rapport SN)')
        for k, v in gps.satellite_data.items():
            print('%d: %s' % (k, v))
        print('')
    time.sleep(3.0)

Lorsque j'ai lancé le programme, j'ai obtenu le résultat suivant. La latitude et la longitude sous la virgule décimale sont masquées.

14:02:19.0
longitude latitude: 35.********, 139.********
Au dessus du niveau de la mer: 51.900000
Satellite de positionnement: [17, 28, 6, 3, 193, 1, 22, 8]
Numéro de satellite: (Angle d'élévation,Angle de direction,Rapport SN)
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)

La ligne après le «numéro de satellite» est le numéro du satellite, l'angle d'élévation, l'angle azimutal et le rapport SN du satellite capturé. Le satellite numéro 193 est "Michibiki, le premier satellite quasi zénithal".

Recommended Posts

Travailler avec le GPS en Python pour Raspberry Pi 3
Travailler avec des capteurs dans Mathematica sur Raspberry Pi
Connectez-vous à MySQL avec Python sur Raspberry Pi
Suivi GPS avec Raspeye 4B + BU-353S4 (Python)
Essayez de déboguer Python sur Raspberry Pi avec Visual Studio.
Ubuntu 20.04 sur raspberry pi 4 avec OpenCV et utilisation avec python
Adafruit Python BluefruitLE fonctionne sur Raspeye.
Programmation normale avec la programmation Node-RED avec Raspberry Pi 3
Exécutez un servomoteur en utilisant python sur Raspberry Pi 3
Détectez la température à l'aide de python sur Raspberry Pi 3!
Contrôlez le moteur avec un pilote de moteur en utilisant python sur Raspberry Pi 3!
GPGPU avec Raspberry Pi
pigpio sur Raspberry pi
DigitalSignage avec Raspberry Pi
Cython sur Raspberry Pi
Discord bot raspberry pi zéro avec python [Note]
Détectez les interrupteurs à glissière à l'aide de python sur Raspberry Pi 3!
J'ai essayé L-Chika avec Razpai 4 (édition Python)
Détectez les commutateurs magnétiques à l'aide de python sur Raspberry Pi 3!
Profitez du travail électronique avec GPIO de Raspberry Pi
Allumez / éteignez votre PC avec Raspberry Pi
Essayez de travailler avec Mongo en Python sur Mac
Obtenez des informations sur le processeur de Raspberry Pi avec Python
Rendre DHT11 disponible avec Raspeye + python (Remarque)
Sonnez le buzzer en utilisant python sur Raspberry Pi 3!
Construire un environnement de développement Python sur Raspberry Pi
Mesurer la température du processeur de Raspeye avec Python
Détectez les signaux analogiques avec un convertisseur A / N en utilisant python sur Raspberry Pi 3!
Utilisez python sur Raspberry Pi 3 pour éclairer la LED avec le contrôle du commutateur!
Essayez de tweeter le flux RSS d'arXiv sur Twitter avec python de Raspeye
Enregistrez la température et l'humidité avec systemd sur Raspberry Pi
Plantes Mutter avec Raspberry Pi
Exécutez la matrice LED de manière interactive avec Raspberry Pi 3B + sur Slackbot
Exploitez LibreOffice avec Python
Python: travailler avec Firefox avec du sélénium
Gérer les sons en Python
Contrôlez les moteurs sans balais avec GPIO de Raspberry Pi Zero
Raspeye + Python + Mémo OpenGL
raspberry pi 1 modèle b, python
Installez pyenv sur Raspberry Pi pour gérer Python
Sortie sur "LED 7 segments" en utilisant python avec Raspberry Pi 3!
Introduction de pyenv sur Raspberry Pi
Résoudre les problèmes liés à l'installation d'OpenCV sur Raspberry Pi et à la capture
Utilisez NeoPixel avec la tarte aux framboises
Afficher l'image de la caméra USB avec OpenCV de Python avec Raspeye
Exploitons GPIO de Raspeye avec Python CGI
Installez OpenCV4 sur Raspberry Pi 3
Installez TensorFlow 1.15.0 sur Raspberry Pi
L'intelligence VScode ne fonctionne pas sur Raspeye OS 64 bits! (Python)
Mettre à jour Raspberry Pi Python vers 3.7 ou version ultérieure avec pyenv
Exécutez AWS IoT Device SDK for Python sur Raspberry Pi
Débutant Python s'ouvre et se ferme avec Raspberry Pi
J'ai essayé d'exécuter Movidius NCS avec python de Raspberry Pi3
Créez des jeux LCD (16x2) avec Raspberry Pi et Python
Accédez aux feuilles de calcul Google en utilisant python avec raspberry pi (pour vous-même)
Exécutez l'exemple de code python BNO055 avec I2C (Raspberry Pi 3B)
SSD 1306 OLED peut être utilisé avec Raspeye + python (Remarque)
getrpimodel: Reconnaître le modèle Raspberry Pi (A, B, B +, B2, B3, etc.) avec python
Connectez Raspberry Pi à Alibaba Cloud IoT Platform avec «Python»