Lectura de GPS con Orange Pi
Publicado en Enero de 2018Los sistemas de rastreo GPS nos ofrecen la posiblidad de hacer un seguimiento de objetos por motivos de seguridad, interés personal o administración de activos. Sin embargo, estos dispositivos pueden ser costosos y difíciles de instalar. Ahora, puedes hacer tu propio sistema de rastreo GPS mediante el simple uso de Orange Pi y un sencillo y barato GPS portátil por USB. Veamos como.
Que necesitas:
Partimos de un sistema con Armbian actualizado. Arrancamos con el GPS conectado a un puerto USB y colocado en una ventana para que tenga conexión con los satélites. El mío es un BU-353 antiguo que tenía por ahí, pero hay muchos compatibles con el paquete de software gpsd
. Aquí tienes la lista. Para empezar, vamos a ver si reconoce nuestra unidad de GPS ejecutando la siguiente sentencia en un terminal:
ls /dev/ttyUSB*
y debería devolvernos algo como esto:
/dev/ttyUSB0
Bien, de momento vemos que hay algo conectado en ttyUSB0
. Creo que viene instalado por defecto, pero si no, instala la herramienta gpsd. Como luego usaremos Python
ejecutamos lo siguiente y ya lo tenemos todo instalado:
sudo apt-get install python gpsd gpsd-clients
Para probar la conexión con la unidad de GPS puedes hacer una lectura directa con:
cgps
y debería darte una respuesta similar a esta, que se actualiza constantemente. Párala con CONTROL + C.
┌───────────────────────────────────────────┐┌─────────────────────────────────┐ │ Time: 2018-01-22T18:47:11.000Z ││PRN: Elev: Azim: SNR: Used: │ │ Latitude: 40.xxxxxx N ││ 25 65 295 39 Y │ │ Longitude: -3.xxxxxx W ││ 12 58 039 44 Y │ │ Altitude: 2554.1 ft ││ 32 45 285 23 Y │ │ Speed: 0.2 mph ││ 24 43 115 27 Y │ │ Heading: 29.2 deg (true) ││ 29 39 187 22 Y │ │ Climb: -19.7 ft/min ││ 14 30 309 26 Y │ │ Status: 3D FIX (0 secs) ││ 2 19 089 39 Y │ │ Longitude Err: +/- 34 ft ││ 6 12 055 30 Y │ │ Latitude Err: +/- 46 ft ││ 31 10 303 38 Y │ │ Altitude Err: +/- 105 ft ││ 19 02 034 00 N │ │ Course Err: n/a ││ 10 00 243 00 N │ │ Speed Err: +/- 63 mph ││ │ │ Time offset: 0.852 ││ │ │ Grid Square: IN80ej ││ │ └───────────────────────────────────────────┘└─────────────────────────────────┘ {"class":"VERSION","release":"3.11","rev":"3.11-3","proto_major":3,"proto_minor":9} 47Z","flags":1,"native":0,"bps":4800,"parity":"N","stopbits":1,"cycle":1.00}]} {"class":"WATCH","enable":true,"json":true,"nmea":false,"raw":0,"scaled":false,"timing":false,"split24":false,"pps":false} {"class":"SKY","tag":"GSV","device":"/dev/ttyUSB0","xdop":0.69,"ydop":0.95,"vdop":1.40,"tdop":1.47,"hdop":1.00,"gdop":2.87,"pdop":1. 80,"satellites":[{"PRN":25,"el":65,"az":295,"ss":39,"used":true},{"PRN":12,"el":58,"az":39,"ss":44,"used":true},{"PRN":32,"el":45,"a z":285,"ss":23,"used":true},{"PRN":24,"el":43,"az":115,"ss":27,"used":true},{"PRN":29,"el":39,"az":187,"ss":22,"used":true},{"PRN":1 4,"el":30,"az":309,"ss":26,"used":true},{"PRN":2,"el":19,"az":89,"ss":39,"used":true},{"PRN":6,"el":12,"az":55,"ss":30,"used":true}, {"PRN":31,"el":10,"az":303,"ss":38,"used":true},{"PRN":19,"el":2,"az":34,"ss":0,"used":false},{"PRN":10,"el":0,"az":243,"ss":0,"used ":false}]} {"class":"TPV","tag":"RMC","device":"/dev/ttyUSB0","mode":3,"time":"2018-01-22T18:47:10.000Z","ept":0.005,"lat":40.xxxxx,"lon":- 3.xxxxx,"alt":778.600,"epx":10.408,"epy":14.233,"epv":32.200,"track":189.0400,"speed":0.262,"climb":-0.100,"eps":28.47,"epc":64. 40} {"class":"TPV","tag":"RMC","device":"/dev/ttyUSB0","mode":3,"time":"2018-01-22T18:47:11.000Z","ept":0.005,"lat":40.xxxxx,"lon":- 3.xxxxx,"alt":778.500,"epx":10.408,"epy":14.233,"epv":32.200,"track":29.1800,"speed":0.077,"climb":-0.100,"eps":28.47,"epc":64.4 0}
Perfecto. Funciona y conecta con los satélites. A mi no me funcionó a la primera y me daba un error de conexión porque decía que ya estaba ocupado. Tuve que editar el archivo de configuración de gpsd y dejarlo así:
sudo nano /etc/default/gpsd
# Default settings for the gpsd init script and the hotplug wrapper. # Start the gpsd daemon automatically at boot time START_DAEMON="true" # Use USB hotplugging to add new USB devices automatically to the daemon USBAUTO="true" # Devices gpsd should collect to at boot time. # They need to be read/writeable, either by user gpsd or the group dialout. DEVICES="/dev/ttyUSB0" # Other options you want to pass to gpsd GPSD_OPTIONS="-n -G -b" GPSD_SOCKET="/var/run/gpsd.sock"
y después de reiniciar, todo funcionó perfectamente. También puede ayudar ejecutar con permisos de super usuario SU
para comprobar si funciona:
stty -F /dev/ttyUSB0 ispeed 4800 && cat < /dev/ttyUSB0 $GPGGA,185701.000,4000.1564,N,xxxxx.3724,W,1,08,1.1,768.5,M,51.7,M,,0000*42 $GPGSA,A,3,02,12,06,31,25,14,29,32,,,,,1.9,1.1,1.6*30 $GPRMC,185701.000,A,4000.1564,N,xxxxx.3724,W,0.14,31.62,220118,,,A*4C $GPGGA,185702.000,4000.1563,N,xxxxx.3723,W,1,08,1.1,768.7,M,51.7,M,,0000*43 $GPGSA,A,3,02,12,06,31,25,14,29,32,,,,,1.9,1.1,1.6*30 $GPRMC,185702.000,A,4000.1563,N,xxxxx.3723,W,0.05,47.79,220118,,,A*44 $GPGGA,185703.000,4000.1558,N,xxxxx.3721,W,1,08,1.1,769.0,M,51.7,M,,0000*4E $GPGSA,A,3,02,12,06,31,25,14,29,32,,,,,1.9,1.1,1.6*30 $GPRMC,185703.000,A,4000.1558,N,xxxxx.3721,W,0.17,138.96,220118,,,A*74 $GPGGA,185704.000,4000.1552,N,xxxxx.3720,W,1,09,1.1,769.2,M,51.7,M,,0000*41 $GPGSA,A,3,02,12,06,31,25,14,24,29,32,,,,1.9,1.1,1.6*36 $GPRMC,185704.000,A,4000.1552,N,xxxxx.3720,W,0.50,169.64,220118,,,A*72
o usar otro proceso llamado gpsmon.
Ahora que GPSd se está comunicando correctamente con su receptor y tiene instalado el software adecuado, podemos leer los datos del GPS a través de Python. El siguiente código utiliza el subprocesamiento para obtener cada actualización de GPS (de lo contrario, el búfer se llena) y cuando se solicita (líneas 31-54) obtiene el conjunto de datos más reciente. Crea un directorio llamado gps
y dentro de él un archivo llamado gpsdatos.py
con el siguiente código que encontré investigando sobre el tema y funciona realmente bien:
#!/usr/bin/env python # -*- coding: iso-8859-15 -*- # Written by Dan Mandle http://dan.mandle.me September 2012 # License: GPL 2.0 # Adaptado por # author : "javier pérez santos para orangepiweb.es" # credits : "javier pérez santos, orangepiweb.es" # copyright : "Copyright 2017, orangepiweb.es" """ ___ ____ ___ __ _ / _ \ _ __ __ _ _ __ __ _ ___| _ \(_) \ / /__| |__ ___ ___ | | | | '__/ _` | '_ \ / _` |/ _ \ |_) | |\ \ /\ / / _ \ '_ \ / _ \/ __| | |_| | | | (_| | | | | (_| | __/ __/| | \ V V / __/ |_) | __/\__ \ \___/|_| \__,_|_| |_|\__, |\___|_| |_| \_/\_/ \___|_.__(_)___||___/ |___/ Lectura de GPS con Orange Pi """ import os from gps import * from time import * import time import threading gpsd = None #seting the global variable os.system('clear') #clear the terminal (optional) class GpsPoller(threading.Thread): def __init__(self): threading.Thread.__init__(self) global gpsd #bring it in scope gpsd = gps(mode=WATCH_ENABLE) #starting the stream of info self.current_value = None self.running = True #setting the thread running to true def run(self): global gpsd while gpsp.running: gpsd.next() #this will continue to loop and grab EACH set of gpsd info to clear the buffer if __name__ == '__main__': gpsp = GpsPoller() # create the thread try: gpsp.start() # start it up while True: #It may take a second or two to get good data #print gpsd.fix.latitude,', ',gpsd.fix.longitude,' Time: ',gpsd.utc os.system('clear') print print ' GPS reading' print '----------------------------------------' print 'latitude ' , gpsd.fix.latitude print 'longitude ' , gpsd.fix.longitude print 'time utc ' , gpsd.utc,' + ', gpsd.fix.time print 'altitude (m)' , gpsd.fix.altitude print 'eps ' , gpsd.fix.eps print 'epx ' , gpsd.fix.epx print 'epv ' , gpsd.fix.epv print 'ept ' , gpsd.fix.ept print 'speed (m/s) ' , gpsd.fix.speed print 'climb ' , gpsd.fix.climb print 'track ' , gpsd.fix.track print 'mode ' , gpsd.fix.mode print print 'sats ' , gpsd.satellites time.sleep(5) #set to whatever except (KeyboardInterrupt, SystemExit): #when you press ctrl+c print "\nKilling Thread..." gpsp.running = False gpsp.join() # wait for the thread to finish what it's doing print "Done.\nExiting."FUENTE: http://www.danmandle.com/blog/getting-gpsd-to-work-with-python/
Y mostrará lo siguiente en pantalla. Puedes reemplazar las líneas 31-54 con lo que quieras hacer con los datos en vez de mostrarlos por pantalla. La idea es almacenar puntos únicos y códigos de tiempo en una base de datos MySQL o SQLite y tal vez crear en una web de seguimiento.
Espero que te haya sido de utilidad, no dudes en escribir un comentario si ves algún error o si puedo ayudarte.
Utiliza este espacio si quieres añadir algún comentario adicional o si tienes alguna duda.
No olvides añadir tu distribución y tu placa.
Todos los comentarios serán validados antes de su publicación.
Copyright © 2024 desde 2016. Todos los derechos reservados | Diseño JaviPSantos