En este tutorial vamos a explorar el uso del shield GPS con arduino. Como ya sabremos, la tecnología GPS nos permite conocer nuestra ubicación exacta en cualquier parte del mundo; en los proyectos de arduino podemos aprovechar esta tecnología para muchas cosas, por ejemplo: para realizar dispositivos de rastreo, localización y medición remota, para conocer el tiempo con extrema precisión, entre muchas otras aplicaciones que iremos tratando con el tiempo en nuestro blog.

En el ecosistema de arduino existen numerosos dispositivos que nos permiten agregar la funcionalidad de GPS a nuestros proyectos, por ejemplo: el shield GPS para arduino (en sus distintas variantes) y el módulo GPS GY-GPS6MV2. En este tutorial estaremos trabajando con ambos dispositivos como si fueran uno mismo (ya que su funcionalidad es básicamente la misma) y solo cambia la forma física del dispositivo y la manera de conectarlo con el arduino.

En la foto principal de este artículo vemos nuestro arduino equipado con un shield GPS y una antena activa externa, que está diseñada para fijarse en la lámina de un automóvil (o cualquier otra superficie metálica) mediante un imán que posee.

Materiales necesarios

Para esta experiencia requerimos los siguientes materiales, los cuales puedes adquirir en nuestra tienda virtual:

De manera alternativa puedes elegir un módulo GPS GY-GPS6MV2 que ya viene con una antena:

Fundamentos de la tecnología GPS

La tecnología GPS (Global Positioning System) consiste en una constelación de 24 satélites en órbita que transmiten información precisa de tiempo y posición (órbita del satélite) a estaciones terrestres. El sistema GPS provee información de navegación: Latitud, Longitud, Velocidad, Rumbo, Tiempo, etc. Las estaciones terrestres no transmiten información de vuelta al satélite GPS, solamente utilizan la información recibida para realizar cálculos matemáticos.

Cuando el receptor GPS recibe la señal y rastrea al menos 4 satélites, tiene la capacidad de calcular su posición y se dice que “ha obtenido un punto GPS” (GPS Fix). La estación terrestre (receptor GPS) es la encargada de calcular su posición utilizando la información transmitida por los satélites. El receptor GPS utiliza un método matemático conocido como trilateración.

Si algún lector desea conocer más detalles técnicos sobre el funcionamiento del sistema GPS recomendamos revisar el libro: FUNDAMENTALS OF GPS RECEIVERS A HARDWARE APPROACH (DAN DOBERSTEIN).

En todo momento deben existir de 4 a 12 satélites en vista para que el GPS funcione. La siguiente animación nos da una idea de como funcionan los satélites GPS.

gps con arduino satelites en orbita

Sistemas de coordenadas geográficas utilizado en GPS

  • Latitud: su línea de base es el Ecuador. Las lineas imaginarias reciben el nombre de paralelos. La latitud es la distancia que existe entre un punto cualquiera y el Ecuador, medida sobre el meridiano que pasa por dicho punto, se expresa en grados sexagesimales. Todos los puntos ubicados sobre el mismo paralelo tienen la misma latitud. Los paralelos al norte del Ecuador reciben la denominación Norte (N), mientras que aquellos que se encuentran al sur del Ecuador reciben la denominación Sur (S). La latitud se mide de 0º a 90º. Al Ecuador le corresponde la latitud de 0º. Los polos Norte y Sur tienen latitud 90º N y 90º S respectivamente.
  • Longitud: su línea de base es el Meridiano de Greenwich. Las lineas imaginarias reciben el nombre de meridianos. La longitud es la distancia que existe entre un punto cualquiera y el Meridiano de Greenwich, medida sobre el paralelo que pasa por dicho punto. Se expresa en grados sexagesimales. Todos los puntos ubicados sobre el mismo meridiano tienen la misma longitud. Aquellos que se encuentran al oriente del meridiano de Greenwich reciben la denominación Este (E). Aquellos que se encuentran al occidente del meridiano de Greenwich reciben la denominación Oeste (O). Se mide de 0º a 180º. Al meridiano de Greenwich le corresponde la longitud de 0º.El antimeridiano correspondiente está ubicado a 180º. Los polos Norte y Sur no tienen longitud.

Lo anterior se resume en forma gráfica como se muestra a continuación:

Configurando el módulo receptor GPS: comunicación con una PC.

Vamos a comenzar esta sección mencionando algo importante: Normalmente podemos utilizar un receptor GPS sin la necesidad de configurarlo, solamente basta con conectarlo al dispositivo al cual entregará los datos de posición y el receptor GPS comenzará a trabajar, sin embargo, puede ser necesario en algunas circunstancias cambiar el baudrate (UART) o la frecuencia de actualización. Por lo anterior mencionamos aquí esta posibilidad, aunque se trate de un tutorial básico.

Existen aplicaciones del fabricante con las cuales se pueden visualizar en vivo los datos del módulo GPS (lo cual es excelente para comprobar que nuestro módulo receptor GPS funciona correctamente) o cambiar su configuración de manera muy sencilla mediante una interfaz gráfica en nuestra PC. Para configurar el GPS es necesario conocer el chipset con el que está construido. El chip más comercial en México es el Ublox Neo 6M, aunque podemos encontrar otros dispositivos en el mercado y cada cual tendrá su protocolo y/o aplicación de configuración correspondiente.

Para UBLOX la aplicación es u-center (solo windows). Si deseamos conectar el GPS con la PC se requiere un arduino (usándolo como puente USB-UART) o una interfaz USB serial. El módulo GPS UBLOX NEO 6M utiliza un protocolo propietario de configuración conocido como UBX, los detalles de este protocolo están disponibles en la documentación técnica, pero solo servirán para usuarios expertos.

En este artículo no nos vamos a centrar en la configuración del receptor GPS, solamente queremos aclarar que es posible llevar a cabo una configuración del módulo y que es la razón por la cual los módulos y shield GPS tienen un pin para la recepción de datos (RX).

Conexión del shield GPS con Arduino

El shield GPS se conecta simplemente colocándolo en la parte de arriba del arduino UNO. Al tratarse de un accesorio específicamente diseñado para Arduino, la facilidad de conexión es una gran ventaja sobre los módulos GPS sueltos que existen en el mercado. Una ventaja adicional de el shield GPS es que dispone de un socket para tarjeta microSD conectado a los pines de SPI y podemos de esa forma guardar una gran cantidad de datos fácilmente.

conexion de shield gps con arduino

El shield GPS dispone de un “multiplexor” basado en jumpers para seleccionar los pines de TX y RX en el Arduino. Se deben colocar los jumpers en los pines apropiados, según la configuración elegida en el software (sketch). Hay que recordar que el TX del GPS va conectado con el RX de Arduino y viceversa, por lo que hay que prestar atención al colocar los jumpers.

Conexión del módulo GPS con Arduino

En el caso del módulo GPS, será necesario realizar la conexión mediante jumpers tipo dupont. La conexión del módulo GPS con arduino sería como se muestra en el siguiente diagrama.

conexion de modulo GPS con Arduino

Recepción / transmisión de datos del GPS por UART

La forma estándar de comunicación de un módulo GPS con Arduino es a través de una interfaz serial asíncrona: UART.  Cuando el GPS recibe alimentación, envía datos NMEA (u otro formato propietario) en el pin TX. La configuración por defecto del puerto serie, depende mucho del fabricante del módulo GPS. El GPS nos va a arrojar datos continuamente a través de su puerto serie aunque aun no sea capaz de calcular su posición (GPS fix).

Al tratarse de una comunicación por UART las señales habituales son:

  • Conexión necesaria: GPS TX → Arduino RX
  • Conexión opcional: GPS RX → Arduino TX
  • VCC positivo de alimentación
  • GND tierra o negativo de la alimentación

El baudrate estándar es el siguiente para los productos que mencionamos:

  • 9600 baudios para el GY-GPS6MV2
  • 38400 baudios para el shield GPS
  • 4800 baudios es otra velocidad común

Podrían existir otros baudrates y configuraciones de fábrica diferentes, por lo que habrá que revisar con el fabricante o el proveedor.

Sentencias NMEA: Entendiendo los datos del receptor GPS

Las sentencias NMEA (siglas de National Marine Electronics Asociation) son el estándar utilizado por la mayoría de los receptores GPS. Se trata de un protocolo basado en lineas de texto, aunque no está diseñado para ser fácilmente legible por humanos. Se usan “Sentencias” o lineas de texto delimitadas por saltos de linea. Existen varios tipos de sentencias NMEA según el estándar, pero todas tienen en común lo siguiente:

  • Inician con el carácter $ seguido del nombre de la sentencia (indica el tipo de datos que contiene)
  • Los datos (campos) en cada sentencia están delimitados por comas.
  • Envío de checksum al final en cada sentencia NMEA

Para entender un poco que es una sentencia NMEA veamos un ejemplo, prestando atención a la linea que comienza con $GPRMC y $GPGGA:

  • Hora – 235317.000 equivale a 23:53 y 17.000 GMT
  • Longitud: 4003.9040, N Norte
  • Longitud: 10512.5792, W Oeste
  • Numero de satélites vistos: 08
  • Altitud: 1577 metros

El estándar es propietario y para obtener la especificación completa hace falta pagar por ello, sin embargo, existe suficiente información en Internet para permitirnos trabajar cómodamente.

Librería para GPS con Arduino

Como se puede ver en el ejemplo anterior sobre sentencias NMEA, sacar la información de navegación puede ser una tarea que nos consuma mucho tiempo si deseamos realizar la programación por nuestra cuenta. Afortunadamente existe una librería cuyo uso se ha extendido bastante para comunicar el GPS con Arduino. Se trata de la librería TinyGPS que podemos descargar de su página oficial y agregarla a nuestro IDE.

http://arduiniana.org/libraries/tinygps/

Esta librería incluye métodos adecuados para extraer la información de las sentencias NMEA y convertir dicha información a tipos de datos nativos de C. Algunos ejemplos de dichos métodos son:

Además podemos obtener otros datos mediante el API de TinyGPS:

  • Obtener posición actual: gps.get_position(&lat, &lon, &fix_age);
  • Obtener fecha y hora: gps.get_datetime(&date, &time, &fix_age);
  • Obtener velocidad en centésimas de nudo (knots): speed = gps.speed();
  • Obtener curso en centésimas de grados: course = gps.course();

Código para visualizar sentencias NMEA en el monitor serial

El código que mostramos a continuación nos permitirá visualizar las sentencias NMEA tal cual son enviadas por el puerto serie (UART) del GPS. Esto es muy útil para comprobar que nuestro módulo GPS funciona correctamente y no se encuentra quemado o en mal estado. Solamente hemos de configurar el baudrate y los pines de arduino donde se comunicará el GPS (ya hablamos más arriba sobre el baudrate estándar). Las lineas a configurar están resaltadas a continuación:

El resultado en el monitor serial debe ser parecido a lo siguiente:

gps sentencias nmea monitor serie

Código de ejemplo básico GPS con Arduino

El código a continuación muestra la información de navegación obtenida del GPS, primero convirtiéndola de sentencias NMEA a tipos de datos nativos de C y luego volcándola al monitor serial en forma de latitud y longitud. Con dicha información ya podemos trabajar sobre cualquier aplicación específica que tengamos en mente, por ejemplo: registradores de ruta, localizadores satelitales, etc.

Este código no mostrará nada en pantalla si el GPS aún no puede calcular nuestra ubicación (GPS fix), por lo que hay que colocar el receptor GPS cerca de una ventana para comenzar a visualizar información en el monitor serial. También es necesario asegurarnos que la librería TinyGPS recibe información válida. Para esto podemos descomentar la linea 57 y visualizar de esta forma las sentencias NMEA que entran a la librería TinyGPS.

Conclusión y resumen

  • En este artículo se han presentado las nociones sobre el funcionamiento del sistema de posicionamiento global GPS.
  • Hemos aprendido las bases del sistema de coordenadas geográficas usadas en la navegación GPS.
  • Hemos visto que los receptores GPS se pueden conectar a la PC y que existe software específico para evaluar su funcionamiento.
  • Se ha aprendido que los receptores GPS comúnmente usados con arduino son dispositivos configurables, pero que existen protocolos propietarios de acuerdo al fabricante, por lo que se podría considerar un tema avanzado fuera del alcance de este artículo.
  • Conocimos el protocolo mediante el cual un receptor GPS envía información de navegación (sentencias NMEA).
  • Sabemos ahora que los GPS se conectan mediante el UART (Serial o  SoftwareSerial) al arduino o cualquier otro microcontrolador.
  • Aprendimos a conectar un shield GPS con arduino y también un módulo GPS genérico mediante cables.
  • Visualizamos las sentencias NMEA directamente en el monitor serial de arduino.
  • Aprendimos sobre la librería TinyGPS y su uso para procesar sentencias NMEA.
  • Realizamos un programa básico con TinyGPS que nos muestra las coordenadas en latitud y longitud a partir de un GPS con Arduino

Los pagos realizados mediante Paypal no podrán ser facturados. Solo se facturarán ordenes pagadas mediante deposito. Ignorar