Fase 7: Antena GPS & Tracking

De Wiki AOC | Luis M. Garcia
Saltar a: navegación, buscar

Para realizar esta fase es necesario el módulo GPS NEO-6M.

Ejemplmod6mo.jpg

NOTA: Esta fase no se ha podido finalizar por completo, ya que no sabemos el motivo de que el módulo no recoja los datos, puesto que está conectado correctamente. Puede ser un defecto a la hora de soldar o error de fábrica, no obstante se va a exponer el proceso completo a realizar, tanto el que si se ha podido llevar a cabo y el que no.

Parte Realizada

Parte que hemos podido configurar y realizar (más o menos).

Esquema del cableado

El módulo GPS cuenta con 4 conectores diferentes (VCC, RX, TX, GND). Los conectores del módulo deben de ir conectados a la Raspberry Pi de la siguiente forma:

  • VCC > Conectado con 3.3V de la Raspberry
  • GND > Conectado con GND de la Raspberry
  • RX > Conectado con TX de la Raspberry (cruce)
  • TX > Conectado con RX de la Raspberry (cruce)

Esquema (las Raspi que se muestra es otro modelo):

Ejemconeed6mo.jpg

Pines de la Raspberry Pi 2 modelo B:

Erttoneed6mo.jpg

Activando el puerto serie dev/ttyAMA0

El puerto serie dev/ttyAMA0 no esta disponible por defecto y hay que desbloquearlo. Para ello abriremos el archivo /boot/cmdline.txt y cambiamos:

dwc_otg.lpm_enable=0 console=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p6 rootfstype=ext4 elevator=deadline rootwait fbcon=map:10 fbcon=font:VGA8x8

por

dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p6 rootfstype=ext4 elevator=deadline rootwait fbcon=map:10 fbcon=font:VGA8x8

Una vez realizado lo anterior tendremos que ir al archivo /etc/inittab y modificar la última línea, dejandola comentada y quedando de la siguiente forma:

#T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100

Para que todos estos cambios tengan efecto tenemos que reiniciar el sistema.

Instalando GPSD

Una vez reiniciado el SO instalaremos GPSD. GPSD es una aplicación que corre en segundo plano y que recoge los datos GPS del módulo y los envía a través de un socket que necesita ser activado cada vez que iniciamos la Raspberry. El comando de activación es el siguiente:

sudo gpsd /dev/ttyAMA0 -F /var/run/gpsd.sock

El comando de ejecución es:

cgps -s

Datos capturados

Por desgracia, como ya se ha mencionado, nuestro módulo no envía datos y creemos que puede ser por un error físico en las soldaduras o defecto, ya que las conexiones están correctas, recibe corriente (se calienta) y se ha seguido los pasos de forma correcta. Es por ello que nuestro resultado al ejecutar el programa es el siguiente:

Cc6mo.png

Si todo funcionase de forma correcta el resultado debería de ser tal que así:

Cc63mo.png

Parte no Realizada/Probada

Esta es la parte que no se ha podido probar por falta de datos capturados.

Script en Python

Disponemos del siguiente Script de Python que resulta de la unión de varios diferentes que se han encontrado:

#! /usr/bin/python
# Importamos los modulos necesarios
import os
from gps import *
from time import *
import time
import threading

gpsd = None #Declaramos la variable GPSD
os.system('clear') #Limpiamos la terminal 
#Este paso es opcional ya que no hace falta que muestre ningun mensaje en la terminal
#Si ponemos el script como un 'daemon'

class GpsPoller(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)
        global gpsd #Declaramos GPSD como una variable global
        gpsd = gps(mode=WATCH_ENABLE) #Iniciamos el streaming de datos GPS
        self.current_value = None
        self.running = True 

    def run(self):
        global gpsd
        while gpsp.running:
            gpsd.next() #Esto continuara el loop y recojera todos los datos para limpiar el buffer


if __name__ == '__main__':
    gpsp = GpsPoller() # Creamos el thread para recibir datos del modulo GPS
    try:
        gpsp.start() # Y lo arrancamos
        while True: #Iniciamos un bucle


            os.system('clear')#Limpiamos la terminal 
#Este paso es opcional ya que no hace falta que muestre ningun mensaje en la terminal
#Si ponemos el script como un 'daemon'

            print 'Latitud: ' , gpsd.fix.latitude #Sacamos por pantalla la latitud
            print 'Longitud: ' , gpsd.fix.longitude #Sacamos por pantalla la longitud

            #Si la latitud y la longitud son igual a 0.0
            if gpsd.fix.latitude == 0.0 and gpsd.fix.longitude == 0.0:
			#Sacamos por pantalla  este mensaje
                print "Esperando GPS..."
            else:
			#En caso contrario sacamos etse mensaje
                print "GPS OK"
                #Guardamos los datos en un archivo 
                #(uso 'a' para agregar el texto. si usase 'w' solo se guardarian las ultimas coordenadas)
                data = open("locations.txt", "a")
                data.write("%s,%s\n" % (gpsd.fix.latitude, gpsd.fix.longitude))
                data.close()

            time.sleep(5) #Pausa de 5 segundos entre comprobaciones

    except (KeyboardInterrupt, SystemExit): #Al pulsar ctrl+c
        print "\nDesconectando GPS..."
        gpsp.running = False
        gpsp.join() # Espera a que el thread finalice
    print "Ok.\nSaliendo..."

Es un daemon (demonio) que toma las coordenadas y cada cierto tiempo las escribe en un fichero. A nosotros se nos ve de la siguiente manera ya que no conseguimos capturar datos:

Ccgps6mo.png

Asi se vería el script funcionando si estuviese capturando datos:

Cc6dfmo.jpg

Automatizar el arranque

Para que el script antes mencionado se inicie automáticamente al arrancar nuestro sistema tendremos que modificar el fichero etc/rc.local y escribir justo antes de exit 0 lo siguiente:

#Inicio el socket GPS cada vez que inicio la Raspberry
sudo gpsd /dev/ttyAMA0 -F /var/run/gpsd.sock
#Inicio un script shell que lanzará mi script en Python
/home/pi/gps.sh &

Como podemos leer en lo anterior es necesario crear un archivo llamado /home/pi/gps.sh. Este archivo a de contener lo siguiente:

!#/bin/sh
 
cd /
cd /home/pi/
sudo python gps.py
cd /

Una vez realizado todo lo anterior, cuando se inicie el sistema se nos iniciara el socket GPS. La Raspberry guardará las coordenadas en el archivo /home/pi/locations.txt.

Representar Coordenadas en Google Maps

Google maps nos ofrece la posibilidad de representar una ruta en el mapa estableciendo checkpoints mediante coordenadas dadas. Con este script en PHP, se carga todos los ‘checkpoints’ del archivo ‘locations.txt’ generado por el ‘daemon’ que hemos hecho previamente en python, realizado por FPAEZ:

<!DOCTYPE html>
<html>
  <head>
    <meta name="viewport" content="initial-scale=1.0, user-scalable=no">
    <meta charset="utf-8">
    <title>LOCALIZADOR</title>
    <style>
      html, body, #map-canvas {
        height: 100%;
        margin: 0px;
        padding: 0px
      }
    </style>
    <script src="https://maps.googleapis.com/maps/api/js?v=3.exp"></script>
	<?php $array = explode("\n", file_get_contents('locations.txt')); ?>
    <script>
    function initialize() {
    var mapOptions = {
    zoom: 20,
    center: new google.maps.LatLng(<?php echo $array[0]; ?>),
    mapTypeId: google.maps.MapTypeId.HYBRID
    };


    var map = new google.maps.Map(document.getElementById('map-canvas'), mapOptions);

    var flightPlanCoordinates = [
	
<?php foreach ($array as $arrayItem) { 
echo 'new google.maps.LatLng('.$arrayItem.'),'; 
} ?>
								];

    var flightPath = new google.maps.Polyline({
        path: flightPlanCoordinates,
        geodesic: true,
        strokeColor: '#FF0000',
        strokeOpacity: 1.0,
        strokeWeight: 2
    });
    flightPath.setMap(map);
    }
    google.maps.event.addDomListener(window, 'load', initialize);
    </script>
    </head>
    <body>
        <div id="map-canvas"></div>
    </body>
</html>

Si se desea que el mapa se pueda consultar desde un navegador, solo tenemos que instalar Apache y el paquete de soporte para PHP. Se tendría que asignar como carpeta raíz del servidor la carpeta donde esta el script y el archivo locations.txt y haríamos las pruebas. Nuestro conocido FPAEZ obtuvo los siguientes resultados:

Ccgttrps6mo.jpg