Componente · Sensor
GPS / GNSS Module
Posicionamiento por satélite para rovers terrestres y drones autónomos: oraciones NMEA, cálculo de rumbo y distancias con la fórmula de Haversine.
Qué es
Un receptor GNSS: un chip que escucha las señales de sincronismo que difunde una constelación de satélites y calcula su propia posición a partir de las diferencias entre sus tiempos de llegada. El NEO-6M es el módulo con el que se topa la mayoría de los robots de afición: un receptor u-blox, una antena de parche cerámica y un puerto serie.
Es el único sensor de un robot que informa de una posición absoluta. Todo lo demás en este sitio —encoders, una IMU, una matriz de reflectancia— mide un cambio o una característica local. El GPS es lo que impide que la deriva de la odometría sea ilimitada, y es la razón por la que a un rover exterior se le puede dar un destino a un kilómetro de distancia.
Cómo funciona
No le hablas tú. Te habla él, a 9600 baudios, en frases NMEA 0183: una línea separada por comas por mensaje, varias veces por segundo.
Dos de ellas llevan todo lo que un robot necesita:
$GPGGA,123519,4807.038,N,01131.000,E,1,08,0.9,545.4,M,... fix quality, sats, HDOP
$GPRMC,123519,A,4807.038,N,01131.000,E,022.4,084.4,... validity, position, speed, course
Lee la solución y después aplícale un filtro. El campo de estado de RMC es A para activa o
V para inválida, y la calidad de la solución en GGA es 0 cuando no hay solución: en ambos
casos la frase sigue llevando coordenadas de aspecto creíble. El campo HDOP es el que detecta el
fallo más sutil: describe la geometría de los satélites, y una geometría mala produce una
respuesta confiante desplazada dezenas de metros.
La latitud llega en grados y minutos decimales (4807.038 son 48° 07.038′), que no son grados.
Convierte una vez, y luego vuelve a convertir a metros respecto a un origen fijo —la
aritmética está aquí— y todo lo que viene después funciona
en unidades que un controlador entiende.
Cuándo usarlo
Usa uno siempre que el robot trabaje al aire libre a distancias que la odometría no aguanta: un rover con waypoints, un cortacésped, una plataforma de topografía, un robot agrícola. En términos generales, pasados los treinta metros de recorrido, la navegación por cuenta propia por sí sola ya ha acumulado más error del que arrastra una solución de GPS.
No lo busques en interiores, nunca, bajo ningún concepto. Y no lo busques por precisión: 2,5 m es mucho para un robot de 30 cm de ancho. El GPS te dice en qué parte del campo estás; un encoder de rueda te dice dónde estás dentro de un metro de ahí. Usa ambos, fusionados.
La vía de mejora, por orden de valor: primero una frecuencia de actualización mayor (5 o 10 Hz elimina casi toda la desfase), luego un módulo multiconstelación (GPS más GLONASS o Galileo mejora la geometría y por tanto el HDOP), y solo después RTK, que llega a centímetros y necesita una estación base, un enlace de datos y otro presupuesto.
Errores comunes
- El arranque en frío son minutos, no segundos. Sin almanaque, el receptor tiene que descargar uno de los satélites a 50 bits por segundo. Un robot que parece muerto al primer encendido al aire libre normalmente solo está esperando.
- No tiene rumbo. Solo posición. Combínalo con un magnetómetro o un giróscopo: el rumbo sobre el suelo no significa nada por debajo de unos 1 m/s.
- 5 V en el RX matan los módulos de 3,3 V. Comprueba si tu placa adaptadora convierte el nivel. El TX del módulo hacia una placa de 5 V no tiene problema.
- La antena necesita cielo, no vista. El metal por encima —incluida tu propia placa del chasis— te cuesta satélites. Móntala arriba, plana y hacia arriba.
- Nunca sigas soluciones en crudo. Haz la navegación por cuenta propia entre ellas y corrige con cada una; seguir las soluciones directamente cuesta un orden de magnitud en error de seguimiento y cuatro veces el giro.
- Seis decimales son 11 cm, y más de lo que cabe en un
float. Convierte a metros respecto a un origen de misión en lugar de hacer aritmética con grados en crudo.
Patillaje y cableado
| Pin | Nombre | Qué hace |
|---|---|---|
| 1 | VCC | 3.3–5 V. Comprueba si tu placa regula: muchas placas NEO-6M lo hacen |
| 2 | RX | El módulo recibe configuración. Lógica de 3,3 V en un módulo desnudo |
| 3 | TX | El módulo transmite NMEA. Seguro hacia una entrada de 5 V |
| 4 | GND | Masa |
| 5 | PPS | Un pulso por segundo, alineado con el tiempo GPS. La mayoría de los proyectos lo ignora |
| GPS | Arduino Uno | Nota |
|---|---|---|
| VCC | 5 V | Si tu placa tiene regulador; 3.3 V si no lo tiene |
| GND | GND | |
| TX | Pin 4 (RX de SoftwareSerial) | El módulo habla, la placa escucha |
| RX | Pin 3 mediante divisor | Solo hace falta si configuras el módulo |
Puedes dejar RX sin conectar del todo. Un módulo GPS en su estado por defecto transmite NMEA a
9600 baudios sin que se lo pidas, y para un robot que solo lee posición, eso es todo lo que
necesitas. Conecta RX solo cuando quieras subir la frecuencia de actualización o silenciar las
frases que no uses.
Leerlo sin biblioteca
#include <SoftwareSerial.h>
SoftwareSerial gps(4, 3); // RX from module TX, TX to module RX
char line[100];
uint8_t len = 0;
void setup() {
Serial.begin(115200);
gps.begin(9600);
}
void loop() {
while (gps.available()) {
char c = gps.read();
if (c == '\n') {
line[len] = '\0';
if (strncmp(line, "$GPRMC", 6) == 0) handleRmc(line);
len = 0;
} else if (len < sizeof(line) - 1) {
line[len++] = c;
}
}
}
void handleRmc(char *s) {
// $GPRMC,time,status,lat,N/S,lon,E/W,speed,course,date,...
char *field[13] = {nullptr};
uint8_t n = 0;
for (char *tok = strtok(s, ","); tok && n < 13; tok = strtok(nullptr, ",")) field[n++] = tok;
if (n < 7 || field[2][0] != 'A') return; // 'V' = void. Coordinates are still present
// and still meaningless. Gate on this.
Serial.print(toDegrees(field[3], field[4][0]), 6);
Serial.print(' ');
Serial.println(toDegrees(field[5], field[6][0]), 6);
}
// NMEA gives ddmm.mmmm — degrees and DECIMAL MINUTES, not decimal degrees.
double toDegrees(const char *ddmm, char hemisphere) {
double raw = atof(ddmm);
int deg = (int)(raw / 100);
double minutes = raw - deg * 100;
double result = deg + minutes / 60.0;
return (hemisphere == 'S' || hemisphere == 'W') ? -result : result;
}
Las dos líneas que más importan son precisamente las que la gente se salta.
field[2][0] != 'A' es el filtro de validez. Un receptor sin solución sigue emitiendo
frases RMC perfectamente formadas con coordenadas, normalmente la última posición conocida o
ceros. El código que no comprueba el flag de estado navegará con toda confianza hacia el medio
del Atlántico, que es donde está 0°N 0°E.
toDegrees existe porque 4807.038 no son 4807,038 grados, y tampoco son 48,07038 grados.
Son 48° 07.038′, que son 48,1173°. Tratar las coordenadas NMEA como grados decimales es el error
de GPS más habitual que existe, y el error es lo bastante grande como para ser evidente, que es
lo único bueno que tiene.
Para proyectos reales, usa TinyGPS++. Gestiona todos los tipos de frase, las sumas de comprobación y los casos límite. La versión manual de arriba merece ejecutarse una vez para saber qué está haciendo.
Precisión: qué significan realmente las cifras
| Cifra | NEO-6M típico | Qué significa |
|---|---|---|
| Precisión horizontal | ~2.5 m CEP | La mitad de las soluciones caen dentro de 2,5 m. La otra mitad no |
| Frecuencia de actualización | 1 Hz por defecto, 5 Hz configurable | A 1 m/s, una solución a 1 Hz puede tener hasta un metro de desfase cuando la lees |
| Arranque en frío | ~27 s, minutos sin almanaque | No hay nada malo: está descargando a 50 bits por segundo |
| Arranque en caliente | ~1 s | Con alimentación de respaldo manteniendo vivo el almanaque |
| Precisión de velocidad | ~0.1 m/s | Realmente buena, mejor que la de posición |
El CEP es una mediana, no un límite. La mitad de tus soluciones son peores que 2,5 m, y la cola es larga cerca de los edificios. Para un robot de 30 cm de ancho, «en algún sitio a pocos metros» no es una posición: es un barrio.
El HDOP es el campo que hay que vigilar. Describe la geometría de los satélites más que la calidad de la señal, y es lo que produce una respuesta confiante que se equivoca por decenas de metros:
| HDOP | Calidad | ¿Sirve? |
|---|---|---|
| < 1 | Ideal | Sí |
| 1–2 | Excelente | Sí |
| 2–5 | Buena | Sí, con precaución |
| 5–10 | Moderada | Solo como corrección lenta |
| > 10 | Mala | Rechaza la solución |
Aplica un filtro por HDOP además de por el flag de validez. Una solución con HDOP de 12 no es una solución: es una conjetura con punto decimal.
Deriva estática, y por qué importa
Deja un módulo GPS perfectamente quieto durante diez minutos y registra cada solución. Obtendrás una nube de varios metros de diámetro. No se movió nada.
Esta es la cosa más importante que puedes ver por ti mismo antes de escribir cualquier código de navegación, porque explica por qué seguir soluciones en crudo es inútil. Un controlador al que le alimentas esa nube la persigue, y el robot serpentea continuamente mientras avanza muy poco. Haz navegación por cuenta propia con encoders entre soluciones y usa cada solución solo para corregir la deriva lenta, y el mismo controlador sigue la línea limpiamente; el tutorial de navegación por waypoints tiene los números.
Configurar el módulo
Subir la frecuencia de actualización es el cambio más valioso que hay, y merece la pena hacerlo antes que nada. Los módulos u-blox aceptan comandos binarios UBX:
// UBX-CFG-RATE: 200 ms measurement period -> 5 Hz
const uint8_t setRate5Hz[] = {
0xB5, 0x62, 0x06, 0x08, 0x06, 0x00,
0xC8, 0x00, // 200 ms
0x01, 0x00, // one measurement per solution
0x01, 0x00, // align to GPS time
0xDE, 0x6A // checksum
};
void setup() {
gps.begin(9600);
delay(100);
gps.write(setRate5Hz, sizeof(setRate5Hz));
}
A 5 Hz, los 9600 baudios pasan a ser el cuello de botella: el conjunto completo de frases NMEA no cabe en 200 ms. O subes la velocidad a 38400, o deshabilitas las frases que no uses (GSV en particular es verboso e informa de detalles de satélite que ningún robot necesita).
Ten en cuenta que en un NEO-6M la configuración no persiste sin alimentación de respaldo en el módulo. Mándala en cada arranque.
Resolución de problemas
| Síntoma | Causa probable | Solución |
|---|---|---|
| Ningún dato | TX/RX sin cruzar, o velocidad incorrecta | TX del módulo → RX de la placa; prueba primero 9600 |
| Llegan datos, pero nunca hay solución | En interiores | El GPS necesita cielo. Una ventana raramente basta |
| La primera solución tarda minutos | Arranque en frío sin almanaque | Es normal. Espera al aire libre con buena vista |
| La posición es 0, 0 | Estás usando una solución inválida | Filtra por el flag de estado A de RMC |
| La posición está muy desviada | Tratar ddmm.mmmm como grados | Convierte: deg + minutes/60 |
| La posición salta varios metros | Ruido normal del receptor | Es lo esperado. Fusiona con odometría; nunca sigas soluciones en crudo |
| La solución es confiante pero está muy desviada | Geometría de satélites mala | Rechaza soluciones con HDOP por encima de ~5 |
| Menos satélites de lo esperado | Antena obstruida | Móntala arriba, hacia arriba, sin la placa del chasis en medio |
| El módulo se calentó y murió | 5 V hacia un pin RX de 3.3 V | Comprueba si tu placa convierte el nivel antes de cablear |
| Funciona y se para a 5 Hz | 9600 baudios no bastan para transportar las frases | Sube la velocidad o deshabilita GSV |
Cómo elegir un módulo
| Módulo | Constelaciones | Frecuencia | Notas |
|---|---|---|---|
| NEO-6M | GPS | 1–5 Hz | El barato por defecto. Envejece pero está en todas partes |
| NEO-M8N | GPS + GLONASS + Galileo | hasta 10 Hz | Mejor geometría, mejor HDOP: la mejora sensata |
| NEO-M9N | Capaz de multibanda | hasta 25 Hz | Notablemente mejor en entornos urbanos |
| ZED-F9P (RTK) | Multibanda | 20 Hz | Precisión centimétrica, con estación base y enlace de datos |
La vía de mejora merece recorrerse en orden. Una frecuencia de actualización mayor elimina casi todo el problema de desfase y no cuesta nada. Un receptor multiconstelación ve más satélites, lo que mejora la geometría y por tanto el HDOP: es una mejora real mayor de lo que sugiere la especificación de precisión, sobre todo cerca de edificios. RTK llega a centímetros y es transformador para un robot que tiene que seguir una línea en un campo, pero necesita una estación base, un enlace de datos de corrección y unas diez veces el presupuesto.
Una cosa que ningún módulo GPS te da a ningún precio: rumbo estando quieto. El rumbo sobre el suelo se deriva de posiciones sucesivas, así que por debajo de unos 1 m/s es ruido, y a velocidad cero no significa nada. Un robot que necesita saber hacia qué mira necesita un magnetómetro o un giróscopo, por bueno que sea su GPS.
Explora el grafo
Se usa en estos montajes
Proyectos, rutas de aprendizaje y simuladores que incluyen GPS / GNSS Module.
Preguntas
Preguntas frecuentes sobre GPS / GNSS Module
¿Qué precisión tiene realmente un NEO-6M?
Unos 2.5 metros la mitad del tiempo, con vista despejada del cielo y buena geometría de satélites; ese es el número de la hoja de datos, y resulta optimista para un robot que circula junto a un edificio o bajo los árboles. Lo importante es que se degrada dando respuestas erróneas con total seguridad en lugar de fallos evidentes, así que acepta cada fix solo según la calidad de fix que informa el receptor y según el HDOP, en vez de fiarte de la posición solo porque se ha podido interpretar.
¿Qué es el HDOP y por qué importa más que la cifra de precisión?
La dilución horizontal de la precisión describe la geometría de los satélites que están a la vista en ese momento. Unos satélites repartidos por el cielo dan una solución bien condicionada; unos satélites agrupados dan una mal condicionada, y el receptor sigue informando de una posición con total seguridad. Un HDOP por debajo de 2 es bueno, y por encima de aproximadamente 2.5 conviene descartarlo. Es el campo más útil de la sentencia GGA y casi nadie lo lee.
¿Puede un módulo GPS decirle a mi robot hacia dónde está orientado?
No. Un fix es una posición, y un robot parado mirando al norte da exactamente el mismo fix que uno mirando al sur. El rumbo sobre el suelo se calcula a partir de posiciones consecutivas, así que solo significa algo mientras el robot se mueve de verdad: por debajo de aproximadamente 1 metro por segundo es sobre todo ruido. Los rovers de exterior combinan el GPS con un magnetómetro para el rumbo absoluto, con un giroscopio para el rumbo a corto plazo, o con ambos.
¿Por qué mi robot hace eses al seguir waypoints GPS?
Porque un fix a 1 Hz es a la vez antiguo y ruidoso, y un seguidor de trayectorias alimentado con fixes en bruto se abalanza sobre cada fix nuevo. Medido en el mismo recorrido y con el mismo controlador, un fix a 1 Hz con ruido del orden del metro convierte 0.09 m de error transversal RMS en 1.25 m y multiplica por cuatro y medio el esfuerzo de dirección. La solución es navegar a estima entre fixes y usar cada fix nuevo para corregir esa estimación, no para sustituirla.
¿Funciona en interiores?
Prácticamente nunca, y no es un defecto. La señal de un satélite GPS llega más débil que el suelo de ruido térmico y necesita un cielo sin obstáculos; un tejado la bloquea. Los módulos colocados en el alféizar de una ventana a veces consiguen señal y dan errores grandes por multitrayecto. Prueba en exteriores, en campo abierto, y cuenta con un minuto para el arranque en frío antes de suponer que algo está roto.
¿5 V o 3.3 V?
La mayoría de las placas de conexión llevan un regulador y aceptan 5 V en VCC, pero la lógica propia del módulo es de 3.3 V. Meter 5 V en RX en una placa sin adaptación de niveles es la forma habitual de que mueran. Comprueba tu placa concreta y, si tienes dudas, excita RX a través de un divisor; el TX del módulo hacia un microcontrolador de 5 V no da problemas, porque 3.3 V supera el umbral de nivel alto de un AVR.
Lecturas adicionales