Tutorial Arduino: GPS logger con EM406A, GPS Shield y MicroSD shield

Publicado por en Tutoriales el 10/09/2011
Comentarios: 0

Esta semana vamos a juguetear con GPS. Haremos un logger que monitorizará nuestra posición y valores de sensores conectados al Arduino. Toda esta información la irá almacenandose en una MicroSD cada segundo, con un formato que después podremos utilizar para ver los datos en cualquier aplicación de mapas. Explicaré los formatos de datos gps, el montaje del proyecto, el código y la visualización de datos en Google Earth.

¡Empezamos!

Todos sabréis más o menos que es el sistema GPS (Global Positioning System) se basa en una constelación de 24 satélites que permiten conseguir la posición en cualquier punto de la tierra. Fué desarrollado en principio por el Departamento de Defensa de los Estados Unidos. Se empezaron a enviar los satélites en 1973 y hasta 1993 no declararon el sistema como preparado para una operación inicial. El sistema es relativamente muy joven.

Datos curiosos:

  • Los satélites GPS tienen relojes atómicos instalados para tener el mejor sincronismo posible.
  • Se encuentran situados a 26 kilómetros de la Tierra, en 6 órbitas con 4 satélites en cada una.
  • Tienen un período de órbita de unas 12 horas y una vida media de 7.5 años alimentados con paneles solares.
  • Trabajan en una frecuencia de 1575.42 Mhz (civil) y 1227.60 Mhz (militar cifrada)
  • En principio EEUU para uso civil introducía un error aleatorio entre 10 y 100m en los datos. ¡Esto no cambió hasta el año 2000!
  • Conseguimos una precisión que varia entre 1 y 15 metros dependiendo de los sistemas que usemos, variaciones en la ionosfera, número y geometría de los satélites que usamos.
  • En 2014 se espera que saldrá a la luz el sistema europeo de posicionamiento Galileo
Los datos que recibiremos en nuestro modulo GPS siguen el protocolo NMEA siglas de National Marine Electronics Asociation.  Tienen esta estructura:

$GPRMC,044235.000,A,4322.0289,N,00824.5210,W,0.39,65.46,020911,,,A*44

Empiezan por "$" y acaban en un "A*" seguido de dos números, éste es el checksum para poder saber si el dato recibido es correcto. Los datos se separan por comas y el primero es el tipo de transmisión, en este caso el GPRMC (o RMC), uno de los mas usados, que por ejemplo no incluye el valor de altitud, que si se incluye en el GPGGA. Todo el protocolo lo enlazo en la sección de descargas. Revisemos los datos para entenderlos:

  • 044235.000 es el es la hora GMT (04:42:35)
  • A es la indicación de que el dato de posición esta fijado y es correcto. V seria no válido
  • 4322.0289 es la longitud (43º 22.0289´)
  • N Norte
  • 00824.5210 es la latitud (8º 24.5210´)
  • W Oeste
  • 0.39 velocidad en nudos
  • 65.46 orientación en grados
  • 020911 fecha (2 de septiembre del 2011)
Perfecto, entendemos los datos. ¿Ahora que? Preparemos el hardware. Para conseguir estos datos necesitaremos un módulo GPS.
Yo he utilizado el EM406A. Se trata de un módulo muy utilizado, pequeño, potente y con la antena integrada. Conseguirá datos cada segundo, se alimenta con 5v y se comunica por serie. Es compatible con el sistema WAAS que permite incluso mayor precisión ¿Que mas podemos pedir?
Pues por ejemplo una shield para conectarlo al Arduino, pues posee un microconector. Con la GPS shield solo debemos enchufarlo y montarla sobre el Arduino. Para esta prueba configuraremos los dos mini interruptores de la shield como ON y DLINE. Mantendrá el módulo encendido y enviará los datos por los pines digitales 2 y 3.
Necesitamos incluir un par de librerías en nuestro IDE de Arduino que os dejo al final del tutorial. La TinyGPS y la NewSoftSerial. Muy sencillo como siempre, las soltamos en el directorio "libraries" y listo. Abrimos el código de ejemplo y lo subimos al Arduino. Desde el ordenador abrimos el puerto serie y en cuanto se fije la posición el led del GPS parpadeará (el módulo debe tener visión directa del cielo para conseguir posición) y nos dará los datos por pantalla. ¡En 10 minutos hemos conseguido nuestra posición GPS!
Bien, salgamos a la calle a probarlo... Uy, esto de sacar el ordenador a la calle o el portátil es muy latoso ¿No?
Pues vamos a hacerlo independiente del ordenador con una MicroSD Shield. Nos permitirá almacenar los datos en una tarjeta de memoria  y luego revisarlos en el ordenador. La montamos encima del Arduino, y encima colocamos nuestra shield del GPS. También le he añadido un par de LEDS para monitorizar el estado de las escrituras en la MicroSD y el GPS. Esta vez usaremos el receptor GPS a traves del puerto serie del Arduino, pines 0 y 1. Por lo que debemos situar los interruptores en OFF y UART. El OFF apaga el módulo, ya que para programar el Arduino usamos el serial y si tenemos el receptor encendido no nos lo programará bien.
Incluimos una nueva libreria la SDFat (en los enlaces) y subimos el código de ejemplo "BricoGeek_SdFatGPS_CSVSensorLogger" al Arduino. Una vez subido y con el Arduino encendido ya podemos encender el receptor cambiando el interruptor a ON. Cuando consigamos posición el led rojo se mantendrá encendido y cada segundo empezara a guardar los datos en un archivo de datos separados por comas (CSV) encendiendo el led verde por cada escritura. Cada vez que el Arduino se encienda creará uno nuevo correlativo. Si el led rojo parpadea es que el GPS no nos esta dando datos validos u ocurrió un error de escritura en la tarjeta. También podemos ver los datos o errores conectando el Arduino al ordenador y abriendo el puerto serie a 4800 bps.
Una vez hagamos nuestra ruta y tengamos el archivo nos iremos a www.gpsvisualizer.com. Es una web gratuita y genial que nos permite convertir datos GPS en archivos o enlaces a distintos tipos de aplicaciones o webs de mapas. Os explicaré como importar esos datos para Google Earth:
  1. vamos a http://www.gpsvisualizer.com/map_input?form=googleearth
  2. Lo configuramos así:
  1. En Desc. template introducimos sin comillas "Latitud: {lat}º Longitud: {long}º Velocidad:{speed}Km/h  Tiempo: {Time} Elevación:{altitude}m Sens0: {sens0}". Esto nos permitirá en cada punto tener todos los datos. El nombre entre {} es la variable de cada columna de nuestro archivo. En este caso que no necesitamos saber la altura ya que vamos sobre el suelo, GPS visualizer saca el dato {altitude} de sus bases de datos para cada posición.
  2. Damos a "Create KML file", nos lo descargamos y lo abrimos con el Google Earth.
Este es el resultado. ¡Impresionante eh! Ya podemos visualizar todos los datos como queramos:)
 
 
El primero de los códigos usa a fondo la librería TinyGPS, le pedimos los datos y ya hace todo el trabajo sucio, mientras que el segundo utiliza solo la librería de la MicroSD y es mejor para entender como se extraen los datos, so comprueba el checksum, etc.
Si queremos simplemente leer lo que nos manda el receptorGPS solo tenemos que ponerlo en UART y subir este codigo en Arduino.
byte NMEA;
void setup()
{
  Serial.begin(4800);
}
void loop()
{
  if (Serial.available()>0)
  {
    NMEA = Serial.read();
    Serial.print(NMEA,BYTE);
  }
}
 
Recibiremos algo así.
 
En el vídeo a continuación se ven tanto los montajes pruebas, una ruta grabada y el resultado con Google earth. No os lo perdáis, esta lleno de mas información!

 

 

 

En la tienda

Arduino UNO Arduino GPS Shield Receptor GPS EM-406A SiRF III con Antena

Si te ha gustado, compártelo con tus amigos!
Google Plus 

Ver comentarios antiguos...