¿Nos ayudas a pagar el Hosting?

Compartir en facebook Compartir en google+ Compartir en twitter Compartir en pinterest Compartir en linkedin

Lectura de GPS con Orange Pi

Publicado en Enero de 2018

Los 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.

Lectura de datos de GPS

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.

Nombre*

Email* Nunca será publicado ni compartido

Comentario*



Copyright © 2018 desde 2016. Todos los derechos reservados | Diseño JaviPSantos

Solicitamos su permiso para obtener datos estadísticos de su navegación en esta web, en cumplimiento del Real Decreto-ley 13/2012. Si continúa navegando consideramos que acepta el uso de cookies.

OK | Más información