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.
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.
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.
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 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. (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.
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.
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".