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 © 2025 desde 2016. Todos los derechos reservados | Diseño JaviPSantos
Orange Pi en español





