
Arduino Mega + GPS NEO-6M: Primeros pasos obteniendo la posición con TinyGPS++
El receptor NEO-6M es uno de los módulos GPS más utilizados en proyectos educativos y de robótica gracias a su bajo coste, facilidad de uso y excelente compatibilidad con Arduino.
En este primer tutorial vamos a comprobar que el módulo funciona correctamente utilizando un Arduino Mega 2560. Primero veremos las tramas NMEA que envía el GPS y, posteriormente, extraeremos la información realmente útil: latitud, longitud, número de satélites y altitud.
Este será el punto de partida para los próximos proyectos, donde utilizaremos el GPS para registrar recorridos, realizar proyectos de Ciencia Ciudadana o integrarlo con placas ESP32 como la Heltec WiFi LoRa 32 V3.
Material necesario
- Arduino Mega 2560
- Módulo GPS NEO-6M
- Cables Dupont
Conexiones
El Arduino Mega dispone de varios puertos serie hardware, lo que facilita enormemente el uso del GPS.
| NEO-6M | Arduino Mega |
|---|---|
| VCC | 5V |
| GND | GND |
| TX | RX1 (Pin 19) |
| RX | TX1 (Pin 18) (opcional) |
En este ejemplo únicamente necesitamos conectar el TX del GPS al RX1 del Mega, ya que únicamente vamos a recibir información del satélite.
Instalación de la librería TinyGPS++
Antes de cargar el programa debemos instalar la librería TinyGPS++, una de las mejores librerías disponibles para interpretar automáticamente las tramas NMEA enviadas por el receptor GPS.
Desde el IDE de Arduino:
Programa → Incluir librería → Administrar bibliotecas…
Buscar:
TinyGPS++
Autor:
Mikal Hart
Instalar la versión más reciente.
Gracias a esta librería no tendremos que analizar manualmente las cadenas NMEA como:
$GPGGA,...
$GPRMC,...
$GPVTG,...
La librería extrae directamente los datos más importantes.
Código
#include <TinyGPS++.h>
TinyGPSPlus gps;
void setup()
{
Serial.begin(115200); // Monitor Serie
Serial1.begin(9600); // GPS
Serial.println();
Serial.println("Probando NEO-6M...");
}
void loop()
{
while (Serial1.available())
{
char c = Serial1.read();
// Mostrar todas las tramas NMEA
Serial.write(c);
gps.encode(c);
}
if (gps.location.isUpdated())
{
Serial.println();
Serial.println("-----------------------");
Serial.print("Latitud : ");
Serial.println(gps.location.lat(),6);
Serial.print("Longitud: ");
Serial.println(gps.location.lng(),6);
Serial.print("Satelites: ");
Serial.println(gps.satellites.value());
Serial.print("Altitud: ");
Serial.println(gps.altitude.meters());
Serial.println("-----------------------");
}
}
Explicación del programa
1. Cargar la librería
#include <TinyGPS++.h>
Importamos la librería TinyGPS++, que será la encargada de interpretar toda la información enviada por el receptor GPS.
Después creamos un objeto llamado gps.
TinyGPSPlus gps;
Este objeto almacenará todos los datos obtenidos del satélite.
2. Configuración inicial
Serial.begin(115200);
Serial1.begin(9600);
Se inicializan dos puertos serie.
- Serial comunica el Arduino con el ordenador mediante USB.
- Serial1 se comunica con el módulo GPS.
El NEO-6M trabaja por defecto a 9600 baudios.
3. Lectura del GPS
while (Serial1.available())
Mientras existan datos enviados por el GPS, los iremos leyendo carácter a carácter.
char c = Serial1.read();
Cada carácter recibido pertenece a una trama NMEA.
4. Mostrar las tramas
Serial.write(c);
Esta línea simplemente copia toda la información recibida al Monitor Serie.
Podremos observar mensajes similares a:
$GPRMC,...
$GPGGA,...
$GPGSV,...
Esto resulta muy útil para comprobar rápidamente que el GPS está funcionando correctamente.
5. Interpretar las tramas
gps.encode(c);
Aquí ocurre la “magia”.
TinyGPS++ recibe cada carácter y reconstruye automáticamente las diferentes tramas NMEA.
Cuando una trama está completa, extrae toda la información útil.
6. Comprobar si existe una nueva posición
if (gps.location.isUpdated())
Solo cuando el GPS ha calculado una nueva posición mostramos la información.
Esto evita imprimir datos repetidos continuamente.
7. Mostrar los datos
gps.location.lat()
Obtiene la latitud.
gps.location.lng()
Obtiene la longitud.
gps.satellites.value()
Número de satélites utilizados.
gps.altitude.meters()
Altitud en metros.
Resultado esperado
Cuando el receptor haya localizado suficientes satélites aparecerá algo parecido a:
-----------------------
Latitud : 36.427214
Longitud: -5.145314
Satelites: 10
Altitud: 42.60
-----------------------
Si el módulo todavía no ha conseguido fijar la posición (GPS Fix), es normal que durante unos minutos únicamente aparezcan las tramas NMEA sin coordenadas válidas.
Consejos
- La primera localización puede tardar entre 1 y 5 minutos, especialmente si el módulo es nuevo o lleva tiempo sin utilizarse.
- Coloca la antena con visión directa del cielo. En interiores puede ser muy difícil obtener cobertura.
- Lo habitual es trabajar con 8 o más satélites para conseguir una posición estable.
- En el Monitor Serie selecciona 115200 baudios, ya que es la velocidad utilizada para la comunicación entre el Arduino y el ordenador.
Próximo tutorial
Ahora que hemos comprobado que el NEO-6M funciona perfectamente con Arduino Mega, el siguiente paso será conectar este mismo receptor a una Heltec WiFi LoRa 32 V3 (ESP32-S3) para crear dispositivos de geolocalización mucho más compactos y con conectividad inalámbrica

Etiqueta:Altitud, arduino, Arduino Mega, Arduino Mega 2560, ciencia ciudadana, Educación, Electrónica, esp32, Geolocalización, gps, Heltec WiFi LoRa 32 V3, iot, Latitud, Longitud, Módulo GPS, NEO-6M, NMEA, Posicionamiento GPS, programación, Programación Arduino, robótica, Satélites, Serial1, stem, TinyGPS++, UART


