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:
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)
Aes la indicación de que el dato de posición esta fijado y es correcto. V seria no válido
4322.0289es la longitud (43º 22.0289´)
NNorte
00824.5210es 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:
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.
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;
voidsetup()
{
Serial.begin(4800);
}
voidloop()
{
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!
Increíble, solo te puedo dar mi enhorabuena de este magnifico tutorial.
Siempre que veo este tipo de ejemplos, pienso lo increíble que sería meterle una shield con una SIM y enviar por SMS, el posicionamiento, cuando le hacemos una perdida por ejemplo, y poderla dejar en el coche por poner un ejemplo.
Un saludo y con esto se abre un mar de posibilidades.
Genial el artículo. Muchas gracias Alex por tu trabajo y el esfuerzo... Solo un apunte más: no es un buen parámetro de calidad de sensibilidad de un gps la altura medida dado que la altura en un gps es "calculada". El sistema de gps "solo" te da la posición en el plano, la altura lo da el datum que no es más que el modelo de tierra que usa el gps. Todo esto es muy a grandes rasgos ;)...
UFF, muchas gracias a todos por la aceptación. Me alegro mucho que os guste el tutorial. Espero que os sea útil en vuestros proyectos:)
Sobre la altura del GPS, es completamente correcto. Pero el hecho de que no varie mucho la altitud entre datos consecutivos apunta a que la variación de la posición calculada es mínima:) El sistema es muy complejo y muy interesante de estudiar. A ver si el nuevo sistema Galileo nos aporta mayor precisión:)
hola, tengo un gps bluetooth, lo he abierto, y esta dividido en dos partes, una, el gps, y otra, el emisor bluetooth. He "trabajado" con la parte del gps. Prescindiré del emisor de bluetooth, ya que no necesitare conectarlo a nada mas que al arduino (y para eso no necesito nada mas que el gps)
Del gps, he encontrado TX RX y PWR Y GND
Si junto PWR y RX se enciende el led verde. Que quiere decir eso? si junto PWR Y TX no pasa nada, no se contrarrestan, no hay corto, nada de nada. He probado de todo, y eso es lo que obtengo xD. Esto da un poco igual porque el led esta en el otro modulo, a si que no lo voy a tener.
Ahora viene la pregunta que queria hacer, pero no podía hasta que mirara esto
(menos mal que tengo una fuente de alimentacion variable y he podido testear para averiguar los contactos que eran xDD si no, no creo que nadie me hubiese podido ayudar)
Bueno, la pregunta: Me voy a comprar un arduino mega 2560 A donde tengo que conectar los pines TX RX, GND?
Que tengo que cambiar de que archivo de programacion para que sepa el arduino a donde le estoy conectando el gps?
Y por ultimo pero no menos importante: El arduino mega, tiene un puerto ide. Si a ese puerto ide le pongo un adaptador a micro sd (que los hay muy baratos) funcionaria? en ese caso, que parametros tendria que cambiar en que archivo para que el arduino sepa donde guardar la info del gps?
Siento hacer tantas preguntas, pero es lo que pasa, cuando haces lo que pone en el tutorial con piezas TOTALMENTE diferentes xDDD agradeceria una verdadera barbaridad a quien me pueda ayudar con esto, ya que va a ser mi primer proyecto, y tengo muchas ganas de empezar con arduino, que todavia no me ha llegado, pero quiero tenerlo todo preparado para cuando me llegue. GRACIAS! :-)
Ningún arduino tiene puerto ide. Leelo bien. La mejor forma de añadir una tarjeta MicrosSD a tu proyecto es usar la MicroSD Shield que se menciona en este mismo artículo.
he encontrado una shield que esta bastante bien, combina el gps shield y micro sd shield, pero SD en vez de micro sd. Me cojere ese, ya que con el envio a españa y todo el royo, sale 20? http://www.adafruit.com/products/98
hola estoy tratando de hacer un datalogguer algo parecido a lo que tenes solo que no estoy usando gps tengo el mismo shield y necesito salvar unos datos de unas entradas análogas pero al parecer no me detecta la sd he visto en varios foros y al parecer la programación es la misma tampoco me funcionan los ejemplos de arduino asi que no se que hacer
Alguien sabria como hacer que el rate del em-406 fuera de menos de un segundo? ya que lo queria implementar en una telemetria y el vehiculo va rapido y en pistas pequeñas da muchos fallos porque en un segundo cambia bastante de un sitio a otro. Muchas gracias de antemano y menudo crack de tutorial.
hola alex esta muy bien tu tutorial, yo estoy haciendo un dataloger y estoy utilizando el modulo gps fv-m8 y me gustaria saber como manipular los datos que se me envian por el puerto serie aqui en tu blog dices como leer la trama NMEA por medio del monitor serial, quisiera saber si tienes un link o tutorial de como crear un archivo .txt o csv y poder manipular la trama para asi guardar el archivo en una sd.
disculpa Alex la librería TinyGPS que dejaste en este tutorial funciona para la versión 0022 de arduino y con el arduino Ng atmega8 es que yo estoy utilizando esa versión y no me corre el ejemplo de static_test de la misma libreria me podrías ayudar Gracias
hola yo estoy usando el shield GSM con el GPS y al querer hacerlos funcionar los dos al mismo tiempo para que me mande las coordenadas no funciona al parecer esto debido a los puertos de comunicacion RX y TX. pero probe cambiando los puertos de comunicacion para uno de estos para el GPS use los pines 2 y 3 y ´para el GSM el 4 y 5 pero aun asi no funciona. ¿como puedo solucionar este problema?
hola amigos, me interesaría trabajar con estas herramientas. tengo una arduino uno, una lilypad y una mega. como puedo hacer para obtener estos shields?? muchas gracias y felicitaciones por tanto trabajo!
Hola! Tengo todo el material y ya he conseguido que funcione la lectura del GPS, pero no logro que funcione el código para almacenar datos en la SD con los sensores. Soy nuevo en esto de programar cosas con Arduino, pero Creo que hay elementos desactualizados, con respecto a las nuevas versiones creadas después de que se publicara este post. Me acabo de descargar la versión de ARDUINO 1.0.2 Y Me da errores de que debo cambiar las líneas del archivo "BricoGeek_SdFatGPS_CSVSensorLogger.pde". He comprobado que todas las librerías estuvieran en sus sitio y cuando le doy a cargar me dice los siguiente: [...] Desde Arduino 1.0, la palabra clave 'BYTE' ya no está soportada en Serial.print(var, BYTE). Por favor utiliza Serial.write() en su lugar.[...] Pues bien. He cambiado cada línea en la que dice eso, pero al final de todo me dice HERROR COMPILANDO. y así se queda la cosa; no se por donde avanzar.
Espero que podáis ayudarme a solventar esto y que funcione.
El GPS, ADAFRUIT GPS MTK3339 (http://www.bricogeek.com/shop/442-adafruit-gps-mtk3339.html) y que su tutorial está en: http://learn.adafruit.com/adafruit-ultimate-gps/parsed-data-output. El codigo de este tutorial para el registro de los datos recopiladas del GPS en una Micros SD, será el mismo para el GPS de Adafruit?
Buen día, estoy realizando el montaje de este mismo tutorial con la unica diferencia que estoy utilizando el gps ls20031 pero no he logrado que los datos se almacenen en la shield sd.
Enviar comentario
Debes disponer de una cuenta de usuario para publicar un comentario.
Si aún no dispones de una cuenta, únete a la comunidad de BricoGeek.com y registrate ahora, te llevará tan solo un minuto y es gratis.
También puedes identificate si ya dispones de una cuenta de usuario.
Enviado el 10/09/2011 (19:51)
Un saludo