Componente · Sensore
Modulo GPS NEO-6M
NEO-6M dà posizione assoluta ai robot esterni via seriale. Scopri come leggere NMEA, perché conta più l'HDOP della precisione dichiarata e cosa non può fare.
Che cos’è
Un ricevitore GNSS: un chip che ascolta i segnali di sincronizzazione trasmessi da una costellazione di satelliti e determina la propria posizione dalle differenze tra i loro tempi di arrivo. NEO-6M è il modulo che la maggior parte dei robot hobbistici incontra per prima: un ricevitore u-blox, un’antenna patch ceramica e una porta seriale.
È l’unico sensore di un robot che riporta una posizione assoluta. Tutto il resto su questo sito — encoder, una IMU, una schiera a riflessione — misura una variazione o una caratteristica locale. Il GPS limita la deriva dell’odometria e permette di assegnare a un rover esterno una destinazione a chilometri di distanza.
Come funziona
Non sei tu a parlargli. È lui a parlare con te, a 9600 baud, in frasi NMEA 0183: una riga separata da virgole per ogni messaggio, più volte al secondo.
Due di esse contengono tutto ciò che serve a un robot:
$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
Leggi il fix, quindi verificalo. Il campo di stato in RMC è A per active oppure V per void, mentre la qualità del fix in GGA è 0 quando non esiste una soluzione: in entrambi i casi la frase contiene comunque coordinate plausibili. Il campo HDOP intercetta il guasto più subdolo: descrive la geometria satellitare e una geometria errata produce una risposta convincente sbagliata di decine di metri.
La latitudine arriva in gradi e minuti decimali (4807.038 corrisponde a 48° 07.038′), non in gradi. Convertila una volta, poi di nuovo in metri rispetto a un’origine fissa — l’aritmetica è qui — e tutto ciò che segue lavorerà nelle unità comprese dal controllore.
Quando usarlo
Usane uno ogni volta che il robot lavora all’aperto su distanze superiori a quelle sostenute dall’odometria: un rover a punti di passaggio, un tosaerba, una piattaforma di rilevamento, un robot agricolo. In linea di massima, dopo trenta metri di guida la sola navigazione stimata ha accumulato più errori di quanti ne contenga un fix GPS.
Non raggiungerlo mai al chiuso. E non usarlo per la precisione: 2.5 m sono molti per un robot largo 30 cm. Il GPS indica in quale parte del campo ti trovi; un encoder della ruota indica dove ti trovi entro un metro da quella posizione. Usali entrambi, con fusione.
Il percorso di miglioramento, in ordine di valore: prima una frequenza di aggiornamento maggiore (5 o 10 Hz elimina gran parte dei dati obsoleti), poi un modulo multicostellazione (GPS più GLONASS o Galileo migliora la geometria e quindi l’HDOP) e solo alla fine RTK, che raggiunge la precisione in centimetri ma richiede una stazione base, un collegamento dati e un budget diverso.
Problemi comuni
- L’avvio a freddo richiede minuti, non secondi. Senza almanac, il ricevitore deve scaricarlo dai satelliti a 50 bit per secondo. Un robot che all’esterno sembra spento alla prima accensione di solito sta solo aspettando.
- Non ha una direzione. Solo la posizione. Abbinalo a un magnetometro o a un giroscopio; la rotta sul terreno non significa nulla sotto circa 1 m/s.
- 5 V su RX uccidono i moduli a 3.3 V. Controlla se la tua scheda di sviluppo esegue l’adattamento di livello. L’uscita TX del modulo verso una scheda a 5 V va bene.
- L’antenna ha bisogno del cielo, non di una visuale. Il metallo sopra di essa, compresa la tua stessa piastra del telaio, ti fa perdere satelliti. Montala in alto, in piano e rivolta verso l’alto.
- Non seguire mai i fix grezzi. Esegui la navigazione stimata tra un fix e il successivo e correggi con ciascuno; seguire direttamente i fix aumenta di un ordine di grandezza l’errore di tracciamento e quadruplica lo sterzo.
- Sei cifre decimali corrispondono a 11 cm, più di quanto un
floatpossa contenere. Converti in metri rispetto all’origine della missione, invece di fare aritmetica sui gradi grezzi.
Piedinatura e cablaggio
| Pin | Nome | Funzione |
|---|---|---|
| 1 | VCC | 3.3–5 V. Controlla se la tua scheda di sviluppo regola la tensione: molte schede NEO-6M lo fanno |
| 2 | RX | Il modulo riceve la configurazione. Logica a 3.3 V su un modulo nudo |
| 3 | TX | Il modulo trasmette NMEA. Sicuro verso un ingresso a 5 V |
| 4 | GND | Terra |
| 5 | PPS | Un impulso al secondo, allineato al tempo GPS. Ignorato dalla maggior parte dei progetti |
| GPS | Arduino Uno | Nota |
|---|---|---|
| VCC | 5 V | Se la scheda ha un regolatore; 3.3 V se non lo ha |
| GND | GND | |
| TX | Pin 4 (SoftwareSerial RX) | Il modulo parla, la scheda ascolta |
| RX | Pin 3 tramite partitore | Necessario solo se configuri il modulo |
Puoi lasciare RX completamente scollegato. Un modulo GPS allo stato predefinito trasmette NMEA a
9600 baud senza ricevere richieste e, per un robot che legge soltanto la posizione, è
tutto ciò che ti serve. Collega RX solo quando vuoi aumentare la frequenza di aggiornamento o
disattivare le frasi non utilizzate.
Lettura senza librerie
#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;
}
Le due righe più importanti sono quelle che le persone saltano.
field[2][0] != 'A' è la verifica di validità. Un ricevitore senza fix emette comunque frasi
RMC perfettamente formate contenenti coordinate, di solito l’ultima posizione nota oppure
zeri. Il codice che non controlla il flag di stato si metterà fiduciosamente in navigazione
verso il mezzo dell’Atlantico, dove si trova 0°N 0°E.
toDegrees esiste perché 4807.038 non è 4807.038 gradi, e non è nemmeno 48.07038
gradi. È 48° 07.038′, cioè 48.1173°. Trattare le coordinate NMEA come gradi decimali è il
bug GPS più comune in assoluto, e l’errore è abbastanza grande da essere ovvio, il che è
l’unica cosa buona.
Per i progetti reali usa TinyGPS++. Gestisce ogni tipo di frase, i checksum e i casi limite. La versione manuale sopra vale la pena eseguirla una volta, così sai cosa sta facendo.
Precisione: cosa indicano davvero i numeri
| Valore | NEO-6M tipico | Significato |
|---|---|---|
| Precisione orizzontale | ~2.5 m CEP | Metà dei fix rientra in 2.5 m. L’altra metà no |
| Frequenza di aggiornamento | 1 Hz predefinito, 5 Hz configurabile | A 1 m/s, un fix a 1 Hz può essere vecchio di un metro quando lo leggi |
| Avvio a freddo | ~27 s, minuti senza almanac | Non c’è nessun problema: sta scaricando a 50 bit per secondo |
| Avvio a caldo | ~1 s | Con alimentazione di backup che mantiene l’almanac |
| Precisione in velocità | ~0.1 m/s | Davvero buona, migliore della posizione |
Il CEP è una mediana, non un limite. Metà dei fix è peggiore di 2.5 m e la coda è lunga vicino agli edifici. Per un robot largo 30 cm, «da qualche parte entro pochi metri» non è una posizione: è un quartiere.
L’HDOP è il campo da osservare. Descrive la geometria satellitare anziché la qualità del segnale, ed è ciò che produce una risposta convincente sbagliata di decine di metri:
| HDOP | Qualità | Usarlo? |
|---|---|---|
| < 1 | Ideale | Sì |
| 1–2 | Eccellente | Sì |
| 2–5 | Buona | Sì, con cautela |
| 5–10 | Moderata | Solo come correzione lenta |
| > 10 | Scarsa | Scarta il fix |
Verifica anche l’HDOP, oltre al flag di validità. Un fix con HDOP pari a 12 non è un fix: è un’ipotesi con la virgola.
Deriva statica e perché conta
Lascia un modulo GPS perfettamente fermo per dieci minuti e registra ogni fix. Otterrai una nuvola di diversi metri di ampiezza. Non si è mosso nulla.
Questo è l’unica cosa che devi vedere di persona prima di scrivere qualsiasi codice di navigazione, perché spiega perché seguire i fix grezzi è inutile. Un controllore che riceve quella nuvola la insegue e il robot ondeggia continuamente facendo scarsi progressi. Esegui la navigazione stimata con gli encoder tra un fix e il successivo e usa ciascun fix solo per correggere la deriva lenta: lo stesso controllore traccia in modo pulito. Il tutorial sulla navigazione a punti di passaggio contiene i numeri.
Configurazione del modulo
Aumentare la frequenza di aggiornamento è la modifica più preziosa e vale la pena farla prima di tutto il resto. I moduli u-blox accettano comandi UBX binari:
// 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, 9600 baud diventa il collo di bottiglia: l’insieme completo di frasi NMEA non entra in 200 ms. Aumenta la velocità a 38400 oppure disattiva le frasi che non usi (GSV in particolare è prolisso e riporta dettagli sui satelliti che nessun robot richiede).
Nota che su NEO-6M la configurazione non persiste senza alimentazione di backup della batteria sul modulo. Inviala a ogni avvio.
Risoluzione dei problemi
| Sintomo | Causa probabile | Soluzione |
|---|---|---|
| Nessun dato | TX/RX non incrociati oppure baud errato | TX del modulo → RX della scheda; prova prima 9600 |
| Arrivano dati, ma nessun fix | Al chiuso | Il GPS ha bisogno del cielo. Una finestra di solito non basta |
| Il primo fix richiede minuti | Avvio a freddo senza almanac | Normale. Aspetta all’aperto con una vista libera |
| La posizione è 0, 0 | Stai usando un fix void | Verifica il flag di stato RMC A |
| La posizione è molto errata | Stai trattando ddmm.mmmm come gradi | Converti: deg + minutes/60 |
| La posizione salta di diversi metri | Normale rumore del ricevitore | Previsto. Esegui la fusione con l’odometria; non seguire mai i fix grezzi |
| Il fix è convincente ma molto lontano | Geometria satellitari scarsa | Scarta i fix con HDOP superiore a ~5 |
| Satellite meno del previsto | Antenna ostacolata | Montala in alto, rivolta verso l’alto e lontano dalla piastra del telaio |
| Il modulo si è scaldato ed è morto | 5 V applicati a un pin RX a 3.3 V | Controlla se la scheda esegue l’adattamento di livello prima del cablaggio |
| Funziona, poi si ferma a 5 Hz | 9600 baud non bastano a trasmettere tutte le frasi | Aumenta il baud o disattiva GSV |
Scelta del modulo
| Modulo | Costellazioni | Frequenza | Note |
|---|---|---|---|
| NEO-6M | GPS | 1–5 Hz | La scelta economica standard. Invecchiato, ma ovunque |
| NEO-M8N | GPS + GLONASS + Galileo | fino a 10 Hz | Geometria e HDOP migliori: l’aggiornamento sensato |
| NEO-M9N | Compatibile con più bande | fino a 25 Hz | Notevolmente migliore in ambiente urbano |
| ZED-F9P (RTK) | Multibanda | 20 Hz | Precisione in centimetri, con stazione base e collegamento dati |
Vale la pena seguire il percorso di miglioramento in ordine. Una frequenza di aggiornamento maggiore elimina gran parte del problema dei dati obsoleti e non costa nulla. Un ricevitore multicostellazione vede più satelliti, il che migliora la geometria e quindi l’HDOP: è un miglioramento reale maggiore di quanto suggerisca la specifica di precisione, soprattutto vicino agli edifici. RTK raggiunge la precisione in centimetri ed è trasformativo per un robot che deve seguire una linea in un campo, ma richiede una stazione base, un collegamento dati per le correzioni e circa dieci volte il budget.
Una cosa che nessun modulo GPS ti dà a qualsiasi prezzo: la direzione mentre il robot è fermo. La rotta sul terreno deriva da posizioni successive, quindi sotto circa 1 m/s è rumore e a velocità zero non significa nulla. Un robot che deve sapere in che direzione è rivolto ha bisogno di un magnetometro o di un giroscopio, indipendentemente dalla qualità del GPS.
Esplora il grafo
Usato in queste costruzioni
Progetti, percorsi di apprendimento e simulatori che includono Modulo GPS NEO-6M.
Domande
FAQ su Modulo GPS NEO-6M
Quanto è davvero preciso un NEO-6M?
Circa 2.5 metri metà delle volte, con una vista libera del cielo e una buona geometria satellitare: è il valore del datasheet, ma è ottimistico per un robot che passa accanto a un edificio o sotto gli alberi. La parte importante è che può peggiorare restando convincente ma sbagliato, anziché fallire in modo ovvio; per questo devi verificare la qualità di ogni fix e l'HDOP riportati, invece di fidarti della posizione solo perché è stata elaborata.
Che cos'è l'HDOP e perché conta più del valore di precisione?
La diluizione orizzontale della precisione descrive la geometria dei satelliti attualmente in vista. Satelliti distribuiti sulla volta celeste producono una soluzione ben condizionata; satelliti raggruppati producono una soluzione mal condizionata, ma il ricevitore comunica comunque una posizione con piena confidenza. Un HDOP inferiore a 2 è buono, mentre sopra circa 2.5 conviene scartare il fix. È il singolo campo più utile nella frase GGA, eppure quasi nessuno lo legge.
Un modulo GPS può dire al robot in che direzione è rivolto?
No. Un fix è una posizione, e un robot fermo rivolto a nord produce esattamente lo stesso fix di uno rivolto a sud. La rotta sul terreno viene calcolata da posizioni consecutive, quindi ha significato solo mentre il robot si muove davvero: sotto circa 1 metro al secondo è quasi solo rumore. I rover esterni abbinano il GPS a un magnetometro per la direzione assoluta, a un giroscopio per quella a breve termine, o a entrambi.
Perché il robot ondeggia seguendo i punti di passaggio GPS?
Perché un fix a 1 Hz è contemporaneamente vecchio e rumoroso, e un inseguimento di traiettoria che riceve i fix grezzi scatta verso ogni nuova posizione. Misurato sullo stesso percorso con lo stesso controllore, un fix a 1 Hz con rumore su scala metrica trasforma un errore laterale RMS di 0.09 m in 1.25 m e moltiplica per quattro e mezzo lo sforzo di sterzo. La soluzione è eseguire la navigazione stimata tra un fix e il successivo e usare ogni nuovo fix per correggere quella stima, non per sostituirla.
Funziona al chiuso?
Praticamente mai, e non è un difetto. Il segnale di un satellite GPS arriva più debole del rumore termico e richiede il cielo senza ostacoli; un tetto lo blocca. I moduli sul davanzale a volte acquisiscono il segnale e riportano grossi errori dovuti al multipath. Provali all'aperto, in uno spazio aperto, e prevedi un minuto per l'avvio a freddo prima di dare per rotto qualcosa.
5 V o 3.3 V?
La maggior parte delle schede di sviluppo ha un regolatore e accetta 5 V su VCC, ma la logica del modulo è a 3.3 V. Applicare 5 V a RX su una scheda senza adattamento di livello è il modo tipico in cui questi moduli muoiono. Controlla la scheda specifica e, in caso di dubbio, alimenta RX tramite un partitore: l'uscita TX del modulo verso un microcontrollore a 5 V va bene, perché 3.3 V supera la soglia logica alta di un AVR.
Per approfondire