Utilisation d'un module GPS (liaison série)

21 juillet 2014 - Mots-clés : Liens Linux Raspberry Pi

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