Utilisation d'un module GPS (liaison série)
Jouons avec un récepteur GPS
Comme il est connecté au port série, il faut arrêter la console sur la laision série. Modifiez le fichier /boot/cmdline.txt et supprimez toutes référence /dev/AMA0 dans les parties «console=» et «kgdboc=»
Arrêtez le service console :
systemctl disable serial-getty@ttyAMA0.service
Pour pouvoir accéder au périphérique /dev/ttyAMA0, il faut ajouter l'utilisateur au groupe uucp :
gpasswd -a utilisateur uucp
suivi d'une déconnexion/connexion pour que cela prenne effet.
Testez la réception nmea :
cat /dev/ttyAMA0
on doit voir défiler des trames ressemblant à ceci :
$GPGGA,192602.000,4848.4143,N,00210.6136,E,1,7,1.07,132.8,M,47.3,M,,*58 $GPGSA,A,3,19,27,32,01,14,28,22,,,,,,1.43,1.07,0.95*0C $GPRMC,192602.000,A,4848.4143,N,00210.6136,E,0.69,217.35,200714,,,A*6E $GPVTG,217.35,T,,M,0.69,N,1.29,K,A*3A
Si tout fonctionne comme parfaitement jusqu'ici, vous pouvez installer gpsd qui saura interpréter les trames nmea :
# pacman -S gpsd
Lancez gpsd en mode console :
$ gpsd -D 5 -N -n /dev/ttyAMA0
Puis affichez les coordonnées :
$ GPSD_UNITS=metric cgps -s
Ce qui affiche :
Si ça fonctionne, on peut le lancer en tant que service. Modifiez le fichier /etc/gpsd :
# Default settings for gpsd. START_DAEMON="true" GPSD_OPTIONS="" DEVICES="/dev/ttyAMA0" USBAUTO="true"
# systemctl enable gpsd
# systemctl start gpsd
Accéder au gps en Python :
C'est une version corrigée de l'exemple donnée en lien (Python GPS Module: Reading latest GPS Data) test_gps.py :
#!/usr/bin/python2
from gps import *
import threading
import time
class GpsPoller(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
self.session = gps(mode=WATCH_ENABLE)
self.current_value = None
self.running = True
def get_current_value(self):
return self.current_value
def run(self):
while self.running:
self.current_value = self.session.next()
time.sleep(0.2) # tune this, you might not get values that quickly
if __name__ == '__main__':
gpsp = GpsPoller()
gpsp.start()
# gpsp now polls every .2 seconds for new data, storing it in self.current_value
try:
while True:
# In the main thread, every 5 seconds print the current value
time.sleep(5)
val = gpsp.get_current_value()
print val.lat, val.lon, val.alt
except KeyboardInterrupt:
gpsp.running = False
gpsp.join()
$ python2 test_gps.py
Ce qui affiche :
48.807053333 2.177113333 108.1 48.807045 2.177106667 108.1 48.80704 2.177115 108.5 48.807043333 2.177123333 108.6 48.807048333 2.177126667 108.6 48.807045 2.177126667 108.6 48.807041667 2.17712 108.7 48.80705 2.177126667 108.7 48.80705 2.177131667 108.7
Liens
Liaison série :
GPS :
- Adafruit Ultimate GPS on the Raspberry Pi
- GPSD Installation Instructions
- Python GPS Module: Reading latest GPS Data
- gps-python3
Conversion de coordonnées :