15/03/2024
En el vasto y fascinante universo de la electrónica y la robótica, los módulos GPS se han convertido en componentes indispensables para innumerables proyectos, desde sistemas de seguimiento personal hasta vehículos autónomos. Sin embargo, la información que estos módulos emiten, conocida como flujos de datos NMEA, puede ser compleja de interpretar directamente. Aquí es donde bibliotecas especializadas como TinyGPS++ entran en juego, actuando como un puente esencial entre la cruda información GPS y tu microcontrolador Arduino, permitiéndote acceder a datos de ubicación, fecha, hora, altitud y mucho más de manera sencilla y eficiente.

TinyGPS++ es una evolución robusta y mejorada de su predecesora, TinyGPS. Diseñada específicamente para entornos Arduino, esta biblioteca no solo hereda la capacidad de su predecesora para extraer información fundamental de las sentencias NMEA, sino que también introduce una interfaz de programación considerablemente más intuitiva y la capacidad de decodificar datos arbitrarios de cualquier sentencia NMEA, incluso las propietarias. Si estás buscando una solución potente y fácil de usar para integrar funcionalidades GPS en tus proyectos, has llegado al lugar correcto. En este artículo, exploraremos en profundidad TinyGPS++, desde su instalación hasta sus características más avanzadas, asegurando que puedas dominarla y aprovechar al máximo tus módulos GPS.
- Instalación de TinyGPS++ en tu Entorno Arduino
- Comenzando a Usar TinyGPS++: Lo Básico
- TinyGPS++ vs. TinyGPS: Una Comparativa Detallada
- El Modelo de Objeto de TinyGPS++: Accediendo a Tus Datos
- Resolviendo Problemas: Depuración en TinyGPS++
- Extracción Personalizada de Sentencias NMEA
- Estableciendo una Solución GPS (Fix)
- Cálculo de Distancia y Rumbo a Puntos de Interés
- Preguntas Frecuentes (FAQ) sobre TinyGPS++
- Conclusión
Instalación de TinyGPS++ en tu Entorno Arduino
La integración de TinyGPS++ en tu entorno de desarrollo Arduino es un proceso directo y sencillo que te permitirá comenzar a trabajar con la biblioteca en cuestión de minutos. Para instalarla, sigue estos pasos:
- Descarga la biblioteca: Dirígete al repositorio oficial o al enlace de descarga provisto por el desarrollador (a menudo encontrarás el enlace en la página de la biblioteca o en un foro de Arduino). Asegúrate de descargar la versión más reciente.
- Descomprime el archivo: Una vez descargado, el archivo estará en formato ZIP. Descomprímelo en tu computadora.
- Ubica la carpeta de librerías de Arduino: Esta carpeta se encuentra generalmente dentro de tu directorio de bocetos de Arduino. La ruta exacta puede variar según tu sistema operativo, pero típicamente es:
- Windows:
C:\Users\TuUsuario\Documents\Arduino\libraries - macOS:
~/Documents/Arduino/libraries - Linux:
~/Arduino/libraries
- Windows:
- Copia la carpeta descomprimida: Mueve la carpeta descomprimida (que probablemente se llamará algo como
TinyGPSPlus-mastero similar) a la carpetalibrariesde Arduino. Es crucial que renombres esta carpeta aTinyGPSPlus. Esto asegura que el IDE de Arduino la reconozca correctamente. - Reinicia el IDE de Arduino: Para que el IDE detecte la nueva biblioteca, es necesario cerrarlo y volver a abrirlo.
- Verifica la instalación: Una vez reiniciado, puedes verificar que la biblioteca se ha instalado correctamente yendo a
Boceto > Incluir Librería > TinyGPSPlusen el menú del IDE. Si aparece en la lista, ¡estás listo para usarla!
Comenzando a Usar TinyGPS++: Lo Básico
Una vez instalada, la utilización de TinyGPS++ es sorprendentemente sencilla, gracias a su modelo de objeto intuitivo. Para empezar a extraer datos de tu módulo GPS, necesitarás seguir un patrón básico:
1. Incluir la Biblioteca y Crear una Instancia
Lo primero es incluir la biblioteca en tu boceto y crear una instancia del objeto TinyGPSPlus. Este objeto será tu punto de acceso a todos los datos GPS.
#include "TinyGPS++.h" TinyGPSPlus gps; 2. Alimentar el Objeto con Datos NMEA
Los módulos GPS transmiten continuamente flujos de datos NMEA a través de un puerto serie. Tu Arduino debe leer estos caracteres y pasárselos al objeto TinyGPSPlus para que los decodifique. Esto se hace mediante el método encode().
Si tu módulo GPS está conectado, por ejemplo, a los pines 4 (RX) y 3 (TX) de tu Arduino usando SoftwareSerial, el código para alimentar el objeto sería similar a este:
#include "SoftwareSerial.h" SoftwareSerial ss(4, 3); // RX, TX void setup() { Serial.begin(115200); // Para depuración en el monitor serie ss.begin(9600); // Velocidad de tu módulo GPS } void loop() { while (ss.available() > 0) { gps.encode(ss.read()); } // Aquí iría tu lógica para consultar los datos GPS } Es crucial que esta alimentación de datos sea constante y eficiente para evitar la pérdida de caracteres y asegurar que la biblioteca pueda procesar las sentencias NMEA completas.
3. Consultar la Información Deseada
Una vez que el objeto gps ha sido alimentado con datos, puedes consultarlo para obtener la información que necesitas. TinyGPS++ organiza los datos en sub-objetos fáciles de acceder. Por ejemplo, para obtener la altitud en metros:
if (gps.altitude.isUpdated()) { Serial.print("Altitud: "); Serial.print(gps.altitude.meters()); Serial.println(" metros"); } TinyGPS++ vs. TinyGPS: Una Comparativa Detallada
TinyGPS++ es el sucesor directo de la popular biblioteca TinyGPS. Aunque comparten el mismo motor de análisis compacto, TinyGPS++ presenta mejoras significativas que la hacen una alternativa más atractiva para muchos proyectos modernos. Aquí te presentamos una tabla comparativa para ayudarte a decidir cuál es la mejor opción para tus necesidades:
| Característica | TinyGPS | TinyGPS++ |
|---|---|---|
| Interfaz de Programación | Más compleja, menos intuitiva | Más intuitiva y orientada a objetos |
| Extracción de Sentencias NMEA Estándar | Básica (GPGGA, GPRMC) | Básica + capacidad para cualquier sentencia NMEA definida |
| Extracción de Sentencias NMEA Propietarias | No compatible | Totalmente compatible a través de TinyGPSCustom |
| Precisión de Flotantes | Mayormente 32-bit (float) | Puede aprovechar 64-bit (double) en procesadores compatibles (ej. Arduino Due) |
| Uso de Memoria (RAM/Flash) | Muy compacta (más 'tiny') | Ligeramente mayor, debido a la funcionalidad extendida |
| Compatibilidad con Código Existente | Incompatible con TinyGPS++ | Incompatible con TinyGPS |
| Modelo de Objeto | Menos estructurado | Claro y bien definido, con sub-objetos para cada tipo de dato |
| Funciones de Diagnóstico | Limitadas | Más completas (charsProcessed(), failedChecksum(), etc.) |
Considera TinyGPS++ sobre TinyGPS si:
- La compatibilidad con código existente de TinyGPS no es una preocupación.
- Tu boceto no está cerca de los límites de recursos de RAM o Flash.
- Estás utilizando un Arduino Due o un procesador que puede beneficiarse de la mayor precisión de los números de punto flotante de 64 bits (
double). - Prefieres un modelo de objeto más intuitivo y fácil de usar.
- Necesitas consultar datos NMEA más allá de la ubicación, fecha, hora, altitud, rumbo, velocidad, satélites o HDOP básicos.
En resumen, TinyGPS++ ofrece una experiencia de desarrollo más moderna y flexible, con capacidades extendidas que la convierten en la opción preferida para la mayoría de los nuevos proyectos.
El Modelo de Objeto de TinyGPS++: Accediendo a Tus Datos
El corazón de TinyGPS++ es su modelo de objeto, que organiza la información GPS de manera lógica y accesible. El objeto principal TinyGPSPlus contiene varios sub-objetos centrales, cada uno dedicado a un tipo específico de dato:
location: Contiene la última posición geográfica (latitud y longitud).date: Proporciona la última fecha (UTC).time: Ofrece la última hora (UTC).speed: Indica la velocidad actual sobre el terreno.course: Representa el rumbo actual sobre el terreno.altitude: Almacena la última altitud.satellites: Muestra el número de satélites visibles y utilizados para el cálculo de la posición.hdop: Horizontal Dilution of Precision (Dilución Horizontal de la Precisión), un indicador de la calidad de la posición horizontal.
Cada uno de estos sub-objetos ofrece métodos para examinar su valor actual, a menudo en múltiples formatos y unidades. Aquí tienes una lista completa de algunos de los métodos más comunes y útiles:
Serial.println(gps.location.lat(), 6); // Latitud en grados (double) Serial.println(gps.location.lng(), 6); // Longitud en grados (double) Serial.println(gps.date.year()); // Año (2000+) (u16) Serial.println(gps.date.month()); // Mes (1-12) (u8) Serial.println(gps.date.day()); // Día (1-31) (u8) Serial.println(gps.time.hour()); // Hora (0-23) (u8) Serial.println(gps.time.minute()); // Minuto (0-59) (u8) Serial.println(gps.time.second()); // Segundo (0-59) (u8) Serial.println(gps.speed.knots()); // Velocidad en nudos (double) Serial.println(gps.speed.mph()); // Velocidad en millas por hora (double) Serial.println(gps.speed.kmph()); // Velocidad en kilómetros por hora (double) Serial.println(gps.course.deg()); // Rumbo en grados (double) Serial.println(gps.altitude.meters()); // Altitud en metros (double) Serial.println(gps.satellites.value());// Número de satélites en uso (u32) Serial.println(gps.hdop.value()); // HDOP (i32 en centésimas) Validez, Estado de Actualización y Antigüedad de los Datos
Es importante saber si los datos que estás consultando son válidos y están actualizados. TinyGPS++ proporciona métodos específicos para esto:
isValid(): Retornatruesi el objeto contiene datos válidos y seguros para consultar.isUpdated(): Indica si el valor del objeto ha sido actualizado (no necesariamente cambiado) desde la última vez que lo consultaste. Esto es útil para saber cuándo mostrar nueva información.age(): Devuelve el número de milisegundos transcurridos desde la última actualización del objeto. Si este valor es mayor a unos 1500 milisegundos, podría indicar un problema, como la pérdida de la señal GPS.
Resolviendo Problemas: Depuración en TinyGPS++
Cuando un boceto de TinyGPS++ no funciona como se espera, la causa suele ser una transmisión de datos NMEA incompleta o inexistente. Afortunadamente, TinyGPS++ incluye métodos de diagnóstico que te ayudarán a identificar y resolver estos problemas:
charsProcessed(): El número total de caracteres NMEA recibidos por el objeto. Si este valor es 0 después de un tiempo, indica un problema de conexión o cableado.sentencesWithFix(): El número de sentencias$GPRMCo$GPGGAque reportaron una solución de posición.failedChecksum(): El número de sentencias NMEA de todos los tipos que fallaron la prueba de suma de verificación. Un número creciente aquí indica que los datos están llegando incompletos o corruptos.passedChecksum(): El número de sentencias de todos los tipos que pasaron la prueba de suma de verificación.
Un error común es cuando las sentencias NMEA se envían a TinyGPS++ de forma incompleta. Esto sucede a menudo si los caracteres del GPS se leen demasiado lento o con poca frecuencia, lo que provoca la pérdida de algunos. El síntoma es fácil de detectar: fallos en la suma de verificación. Cada sentencia NMEA termina con un campo numérico que representa una suma matemática de todos los caracteres. Si este número no coincide con la suma real, TinyGPS++ simplemente descarta la sentencia y aumenta el contador de failedChecksum().
Para depurar, puedes usar una cláusula de depuración como esta para volcar el flujo de datos NMEA entrante si no se recibe suficiente información:
// Debug: si no hemos visto muchos datos en 5 segundos, algo anda mal. if (millis() > 5000 && gps.charsProcessed() < 10) { Serial.println("ERROR: No se reciben datos GPS!"); Serial.println("Volcado del flujo GPS:"); while (true) { // Bucle infinito para volcar el flujo if (ss.available() > 0) { Serial.write(ss.read()); } } } Si el contador de failedChecksum() se incrementa continuamente, tienes un problema. Una pista importante: ¡no uses delay() en tu boceto si estás leyendo datos serie, ya que puede causar la pérdida de caracteres!
Extracción Personalizada de Sentencias NMEA
Una de las características más potentes y novedosas de TinyGPS++ es su capacidad para extraer datos arbitrarios de cualquier sentencia NMEA, incluso las personalizadas por el fabricante. Esto se logra con el objeto TinyGPSCustom.
Para usarlo, le indicas a TinyGPS++ el nombre de la sentencia (ej. "GPRMB") y el número del campo separado por comas que te interesa. Por ejemplo, para extraer la dirección de giro ('L' o 'R') de una sentencia $GPRMB (campo 3):
TinyGPSCustom steerDirection(gps, "GPRMB", 3); // ... en tu loop() if (steerDirection.isUpdated()) { Serial.print("Dirección de giro: "); Serial.println(steerDirection.value()); // Imprime "L" o "R" } Esto abre un mundo de posibilidades para trabajar con datos GPS más allá de los básicos que cubre la biblioteca por defecto.

Estableciendo una Solución GPS (Fix)
Para que los objetos de TinyGPS++ proporcionen datos válidos y actualizados, deben cumplirse tres condiciones clave:
- Alimentación continua de datos: Debes pasar continuamente los caracteres NMEA al objeto
gpsusando el métodoencode(). - Paso de la prueba de suma de verificación: Las sentencias NMEA deben pasar la prueba de integridad de datos (checksum). Si fallan, son descartadas.
- Reporte de validez de la sentencia: Para los objetos incorporados (no personalizados), las sentencias NMEA deben reportarse como válidas. Por ejemplo, si una sentencia
$GPRMCreporta una validez de "V" (void) en lugar de "A" (active), o si una sentencia$GPGGAreporta un tipo de solución "0" (sin solución), entonces la información de posición y altitud se descarta (aunque la hora y la fecha pueden retenerse).
Es importante tener paciencia; a veces, un dispositivo GPS puede tardar varios minutos en establecer una solución inicial, especialmente si se ha movido una distancia considerable o ha pasado mucho tiempo desde su último uso.
Cálculo de Distancia y Rumbo a Puntos de Interés
TinyGPS++ no solo te dice dónde estás, sino que también te ayuda a saber dónde ir. Incluye métodos estáticos para calcular la distancia y el rumbo a un punto de interés (waypoints).
TinyGPSPlus.distanceBetween(lat1, lng1, lat2, lng2): Calcula la distancia en metros entre dos puntos geográficos.TinyGPSPlus.courseTo(lat1, lng1, lat2, lng2): Calcula el rumbo en grados desde el primer punto hacia el segundo.TinyGPSPlus.cardinal(course): Convierte un rumbo en grados a una dirección cardinal legible por humanos (ej. "N", "NE", "SW").
Aquí tienes un ejemplo práctico para calcular la distancia y el rumbo a la Torre Eiffel:
const double EIFFEL_TOWER_LAT = 48.85826; const double EIFFEL_TOWER_LNG = 2.294516; if (gps.location.isValid()) { double distanceKm = TinyGPSPlus.distanceBetween( gps.location.lat(), gps.location.lng(), EIFFEL_TOWER_LAT, EIFFEL_TOWER_LNG) / 1000.0; // Distancia en km double courseTo = TinyGPSPlus.courseTo( gps.location.lat(), gps.location.lng(), EIFFEL_TOWER_LAT, EIFFEL_TOWER_LNG); // Rumbo en grados Serial.print("Distancia (km) a la Torre Eiffel: "); Serial.println(distanceKm, 2); // 2 decimales Serial.print("Rumbo a la Torre Eiffel: "); Serial.println(courseTo, 2); Serial.print("Dirección cardinal: "); Serial.println(TinyGPSPlus.cardinal(courseTo)); } Preguntas Frecuentes (FAQ) sobre TinyGPS++
Aquí respondemos a algunas de las preguntas más comunes que surgen al trabajar con TinyGPS++:
¿Por qué no obtengo datos de mi módulo GPS?
Las causas más comunes son problemas de cableado (asegúrate de que TX del GPS esté conectado a RX de Arduino y viceversa), velocidad de baudios incorrecta (la mayoría de los módulos GPS usan 9600 bps por defecto), o que el módulo GPS no esté obteniendo una señal satelital válida (necesita estar al aire libre con vista clara al cielo).
¿Qué significa el mensaje 'checksum failed'?
Significa que la sentencia NMEA recibida por TinyGPS++ está incompleta o corrupta. Esto suele ocurrir porque la comunicación serial es demasiado lenta o hay pérdidas de caracteres. Evita usar la función delay() en tu bucle principal si estás procesando datos seriales, ya que detiene el programa y puede causar la pérdida de datos. Asegúrate de leer los datos del puerto serie lo más rápido posible.
¿Es TinyGPS++ compatible con todos los módulos GPS?
TinyGPS++ está diseñado para analizar flujos de datos NMEA estándar, que es el formato de salida más común para la mayoría de los módulos GPS de consumo. Por lo tanto, es compatible con la gran mayoría. Su capacidad para manejar sentencias personalizadas (con TinyGPSCustom) amplía aún más su compatibilidad.
¿Cuánto tiempo tarda en obtener una solución GPS (fix)?
El tiempo para obtener una solución (conocido como Time To First Fix o TTFF) varía. Un "arranque en frío" (primer uso o después de mucho tiempo sin señal) puede tardar varios minutos (5-15 minutos). Un "arranque en caliente" (después de una breve pérdida de señal) suele ser mucho más rápido, en cuestión de segundos.
¿Puedo usar TinyGPS++ sin un módulo GPS físico?
Sí, la biblioteca incluye ejemplos como BasicExample que demuestran cómo usar la biblioteca alimentándola con datos NMEA simulados. Esto es excelente para probar tu código sin necesidad de hardware GPS.
Conclusión
TinyGPS++ es una biblioteca esencial para cualquier entusiasta de Arduino que desee integrar funcionalidades GPS en sus proyectos. Su interfaz intuitiva, su potente capacidad de análisis de sentencias NMEA (incluyendo las personalizadas), y sus herramientas de depuración integradas la convierten en una opción superior a su predecesora.
Ya sea que estés construyendo un rastreador de vehículos, un sistema de navegación personal, o un proyecto de geolocalización complejo, TinyGPS++ simplifica drásticamente el proceso de extracción y manipulación de datos GPS. Te animamos a explorar los ejemplos que vienen con la biblioteca y a experimentar con sus diversas funcionalidades. ¡El mundo de la geolocalización está a tu alcance con TinyGPS++!
Si quieres conocer otros artículos parecidos a TinyGPS++: El Poderoso Cerebro GPS para Arduino puedes visitar la categoría Librerías.
