Composant · Capteur
NEO-6M GPS Module
Un NEO-6M donne sa position absolue à un robot extérieur via un port série. Lire le NMEA, pourquoi le HDOP compte plus que la précision, et ses limites.
Présentation
Un récepteur GNSS : une puce qui écoute les signaux horaires diffusés par une constellation de satellites et résout sa propre position depuis les écarts de temps d’arrivée. Le NEO-6M est le module que la plupart des robots loisir rencontrent en premier — un récepteur u-blox, une antenne pastille céramique, et un port série.
C’est le seul capteur d’un robot qui rapporte une position absolue. Tout le reste sur ce site — encodeurs, IMU, réseau de réflectance — mesure un changement ou un détail local. Le GPS empêche la dérive d’odométrie d’être non bornée, et c’est pourquoi un rover extérieur peut recevoir une destination à un kilomètre.
Fonctionnement
Vous ne lui parlez pas. Il vous parle, à 9600 bauds, en phrases NMEA 0183 — une ligne à champs séparés par virgules par message, plusieurs fois par seconde.
Deux d’entre elles portent tout ce qu’un robot exige :
$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
Lisez la position, puis conditionnez-la. Le champ d’état dans RMC vaut A pour actif ou V pour nul, et la qualité dans GGA vaut 0 quand il n’y a pas de solution — dans les deux cas la phrase porte quand même des coordonnées d’apparence plausible. Le champ HDOP est celui qui attrape la défaillance plus subtile : il décrit la géométrie des satellites, et une mauvaise géométrie donne une réponse assurée à des dizaines de mètres.
La latitude arrive en degrés-et-minutes-décimales (4807.038 vaut 48° 07,038′), ce qui n’est pas des degrés. Convertissez une fois, puis convertissez encore en mètres relatifs à une origine fixe — l’arithmétique est ici — et tout l’aval travaille en unités comprises par un contrôleur.
Quand l’utiliser
Utilisez-en dès que le robot travaille en extérieur sur des distances au-delà de la survie de l’odométrie : un rover à waypoints, une tondeuse, une plateforme de relevés, un robot agricole. En gros, passé trente mètres de roulage, l’estime seule a accumulé plus d’erreur qu’une position GPS n’en porte.
Ne le prenez jamais en intérieur, jamais. Et ne le prenez pas pour la précision : 2,5 m, c’est long pour un robot large de 30 cm. Le GPS dit dans quelle partie du champ vous êtes ; un encodeur de roue dit où vous êtes à un mètre près autour. Utilisez les deux, fusionnés.
La voie d’évolution, par ordre de valeur : une fréquence de mise à jour plus haute d’abord (5 ou 10 Hz supprime l’essentiel du retard), puis un module multi-constellation (GPS plus GLONASS ou Galileo améliore la géométrie et donc le HDOP), et seulement ensuite le RTK — qui atteint le centimètre et exige une station de base, une liaison de données, et un autre budget.
Pièges courants
- Le démarrage à froid prend des minutes, pas des secondes. Sans almanach, le récepteur doit en télécharger un depuis les satellites à 50 bits par seconde. Un robot qui semble mort à la première mise sous tension en extérieur attend généralement juste.
- Il n’a pas de cap. Position seulement. Associez-le à un magnétomètre ou un gyroscope ; le cap suivi est insensé sous environ 1 m/s.
- Du 5 V sur RX tue les modules 3,3 V. Vérifiez si votre carte adapte les niveaux. Le TX du module vers une carte 5 V convient.
- L’antenne veut le ciel, pas une vue. Du métal au-dessus — y compris votre propre plaque de châssis — coûte des satellites. Montez-la dessus, à plat, vers le haut.
- Ne suivez jamais des positions brutes. Estimez entre elles et corrigez à chacune ; suivre directement les positions coûte un ordre de grandeur en erreur de suivi et quatre fois la direction.
- Six décimales font 11 cm — et plus qu’un
floatne tient. Convertissez en mètres relatifs à une origine de mission plutôt que de calculer sur des degrés bruts.
Brochage et câblage
| Broche | Nom | Rôle |
|---|---|---|
| 1 | VCC | 3,3–5 V. Vérifiez si votre carte régule — beaucoup de cartes NEO-6M le font |
| 2 | RX | Le module reçoit la configuration. Logique 3,3 V sur module nu |
| 3 | TX | Le module émet le NMEA. Sûr vers une entrée 5 V |
| 4 | GND | Masse |
| 5 | PPS | Une impulsion par seconde, alignée au temps GPS. Ignorée par la plupart des projets |
| GPS | Arduino Uno | Note |
|---|---|---|
| VCC | 5 V | Si votre carte a un régulateur ; 3,3 V sinon |
| GND | GND | |
| TX | Broche 4 (RX SoftwareSerial) | Le module parle, la carte écoute |
| RX | Broche 3 via diviseur | Seulement si vous configurez le module |
Vous pouvez laisser RX totalement déconnecté. Un module GPS à l’état par défaut diffuse du NMEA à
9600 bauds sans qu’on le lui demande, et pour un robot qui lit la position et rien d’autre, c’est
tout ce qu’il faut. Connectez RX seulement quand vous voulez monter la fréquence ou faire taire des phrases
inutilisées.
Le lire sans bibliothèque
#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;
}
Les deux lignes qui comptent le plus sont celles que l’on saute.
field[2][0] != 'A' est la condition de validité. Un récepteur sans position émet quand même des phrases RMC parfaitement
bien formées contenant des coordonnées — généralement la dernière position connue, ou des zéros.
Un code qui ne vérifie pas le drapeau naviguera avec assurance vers le milieu de
l’Atlantique, là où se trouve 0°N 0°E.
toDegrees existe parce que 4807.038 n’est pas 4807,038 degrés, et pas non plus 48,07038
degrés. C’est 48° 07,038′, soit 48,1173°. Traiter les coordonnées NMEA comme des degrés décimaux
est le bogue GPS le plus fréquent, et l’erreur est assez grande pour être évidente —
ce qui est sa seule qualité.
Pour de vrais projets, utilisez TinyGPS++. Il gère chaque type de phrase, sommes de contrôle, et les cas limites. La version manuelle ci-dessus vaut d’être exécutée une fois pour savoir ce qu’elle fait.
Précision : ce que les nombres signifient vraiment
| Grandeur | NEO-6M typique | Signification |
|---|---|---|
| Précision horizontale | ~2,5 m CEP | La moitié des positions tombe dans 2,5 m. L’autre moitié non |
| Fréquence | 1 Hz par défaut, 5 Hz configurable | À 1 m/s, une position 1 Hz est périmée jusqu’à un mètre avant lecture |
| Démarrage à froid | ~27 s, minutes sans almanach | Rien n’est cassé ; ça télécharge à 50 bits par seconde |
| Démarrage à chaud | ~1 s | Avec secours batterie gardant l’almanach |
| Précision de vitesse | ~0,1 m/s | Vraiment bonne — meilleure que la position |
Le CEP est une médiane, pas une borne. La moitié de vos positions sont pires que 2,5 m, et la queue est longue près des bâtiments. Pour un robot large de 30 cm, « quelque part à quelques mètres » n’est pas une position — c’est un quartier.
Le HDOP est le champ à surveiller. Il décrit la géométrie des satellites plutôt que la qualité du signal, et c’est lui qui produit une réponse assurée fausse de dizaines de mètres :
| HDOP | Qualité | L’utiliser ? |
|---|---|---|
| < 1 | Idéale | Oui |
| 1–2 | Excellente | Oui |
| 2–5 | Bonne | Oui, avec prudence |
| 5–10 | Modérée | Seulement en correction lente |
| > 10 | Médiocre | Rejeter la position |
Conditionnez sur le HDOP comme sur le drapeau de validité. Une position à HDOP de 12 n’est pas une position ; c’est une devinette avec une virgule.
Dérive statique, et pourquoi elle compte
Laissez un module GPS parfaitement immobile dix minutes et enregistrez chaque position. Vous obtiendrez un nuage de plusieurs mètres. Rien n’a bougé.
C’est la chose la plus importante à voir soi-même avant d’écrire le moindre code de navigation, parce qu’elle explique pourquoi suivre des positions brutes est sans espoir. Un contrôleur nourri de ce nuage le poursuit, et le robot louvoie en continu en progressant peu. Estimez avec les encodeurs entre les positions et utilisez chaque position seulement pour corriger la dérive lente, et le même contrôleur suit proprement — le tutoriel navigation à waypoints a les nombres.
Configurer le module
Monter la fréquence est le changement isolé le plus rentable, et il vaut d’être fait avant tout le reste. Les modules u-blox prennent des commandes binaires 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));
}
À 5 Hz, 9600 bauds devient le goulot — le jeu complet de phrases NMEA ne tient pas en 200 ms. Soit montez la vitesse à 38400, soit désactivez les phrases inutilisées (GSV en particulier est verbeuse et rapporte des détails satellites dont aucun robot n’a besoin).
Notez que sur un NEO-6M la configuration ne persiste pas sans secours batterie sur le module. Envoyez-la à chaque démarrage.
Dépannage
| Symptôme | Cause probable | Solution |
|---|---|---|
| Aucune donnée du tout | TX/RX non croisés, ou mauvaise vitesse | TX module → RX carte ; essayez 9600 d’abord |
| Données arrivent, jamais de position | En intérieur | Le GPS exige le ciel. Une fenêtre ne suffit généralement pas |
| La première position prend des minutes | Démarrage à froid sans almanach | Normal. Attendez en extérieur avec vue dégagée |
| La position est 0, 0 | Utilisation d’une position nulle | Conditionnez sur le drapeau d’état RMC A |
| Position follement fausse | ddmm.mmmm traité comme degrés | Convertissez : deg + minutes/60 |
| La position saute de plusieurs mètres | Bruit normal du récepteur | Normal. Fusionnez avec l’odométrie ; ne suivez jamais des positions brutes |
| Position assurée mais loin | Mauvaise géométrie satellites | Rejetez les positions à HDOP au-delà de ~5 |
| Moins de satellites qu’attendu | Antenne obstruée | Montez dessus, vers le haut, dégagée de la plaque châssis |
| Le module a chauffé et est mort | 5 V dans une broche RX 3,3 V | Vérifiez si votre carte adapte avant de câbler |
| Marche, puis s’arrête à 5 Hz | 9600 bauds incapables de porter les phrases | Montez la vitesse ou désactivez GSV |
Choisir un module
| Module | Constellations | Fréquence | Notes |
|---|---|---|---|
| NEO-6M | GPS | 1–5 Hz | Le défaut bon marché. Vieillissant mais partout |
| NEO-M8N | GPS + GLONASS + Galileo | jusqu’à 10 Hz | Meilleure géométrie, meilleur HDOP — l’évolution sensée |
| NEO-M9N | Multi-bande possible | jusqu’à 25 Hz | Nettement meilleur en milieu urbain |
| ZED-F9P (RTK) | Multi-bande | 20 Hz | Précision centimétrique, avec station de base et liaison |
La voie d’évolution vaut d’être prise dans l’ordre. Une fréquence plus haute supprime l’essentiel du retard et ne coûte rien. Un récepteur multi-constellation voit plus de satellites, ce qui améliore la géométrie et donc le HDOP — c’est une amélioration réelle plus grande que la spécification de précision ne le suggère, surtout près des bâtiments. Le RTK atteint le centimètre et est transformateur pour un robot qui doit suivre une ligne dans un champ, mais il faut une station de base, une liaison de corrections, et environ dix fois le budget.
Une chose qu’aucun module GPS ne donne à aucun prix : le cap à l’arrêt. Le cap suivi dérive des positions successives, donc sous environ 1 m/s c’est du bruit, et à vitesse nulle c’est insensé. Un robot qui doit savoir où il regarde exige un magnétomètre ou un gyroscope quelle que soit la qualité de son GPS.
Explorer le graphe
Utilisé dans ces réalisations
Projets, parcours d'apprentissage et simulateurs qui intègrent le composant NEO-6M GPS Module.
Questions
FAQ : NEO-6M GPS Module
Quelle est vraiment la précision d'un NEO-6M ?
Environ 2,5 mètres la moitié du temps, avec une vue dégagée du ciel et une bonne géométrie des satellites — c'est le chiffre de la fiche technique et un chiffre optimiste pour un robot roulant près d'un bâtiment ou sous des arbres. L'important est qu'il se dégrade en réponses fausses assurées plutôt qu'en échecs évidents, donc conditionnez chaque position sur la qualité annoncée et sur le HDOP plutôt que de croire la position parce qu'elle s'analyse.
Qu'est-ce que le HDOP et pourquoi compte-t-il plus que le chiffre de précision ?
La dilution horizontale de précision décrit la géométrie des satellites actuellement en vue. Des satellites répartis dans le ciel donnent une solution bien conditionnée ; des satellites regroupés donnent une solution mal conditionnée, et le récepteur rapporte quand même une position en pleine confiance. Un HDOP sous 2 est bon et au-delà d'environ 2,5 vaut d'être rejeté. C'est le champ le plus utile de la phrase GGA et presque personne ne le lit.
Un module GPS peut-il dire à mon robot où il pointe ?
Non. Une position est une position, et un robot immobile face au nord donne exactement la même position que face au sud. Le cap suivi est calculé depuis des positions successives, donc il ne signifie quelque chose que pendant que le robot bouge vraiment — sous environ 1 mètre par seconde, c'est surtout du bruit. Les rovers extérieurs associent le GPS à un magnétomètre pour le cap absolu, à un gyroscope pour le cap court terme, ou aux deux.
Pourquoi mon robot louvoie en suivant des waypoints GPS ?
Parce qu'une position à 1 Hz est à la fois périmée et bruitée, et un suiveur de chemin nourri de positions brutes se rue sur chaque nouvelle. Mesuré sur le même parcours avec le même contrôleur, une position 1 Hz à bruit métrique fait passer 0,09 m d'erreur transversale RMS à 1,25 m et multiplie l'effort de direction par quatre et demi. La solution est d'estimer à l'estime entre les positions et d'utiliser chaque nouvelle pour corriger cette estimation plutôt que la remplacer.
Ça marche en intérieur ?
Essentiellement jamais, et ce n'est pas un défaut. Le signal d'un satellite GPS arrive plus faible que le plancher de bruit thermique et exige un ciel dégagé ; un toit l'arrête. Les modules sur un rebord de fenêtre acquièrent parfois et rapportent de grosses erreurs par multi-trajet. Testez en extérieur, au dégagé, et prévoyez une minute de démarrage à froid avant de supposer une panne.
5 V ou 3,3 V ?
La plupart des cartes portent un régulateur et acceptent 5 V sur VCC, mais la logique propre du module est en 3,3 V. Injecter 5 V dans RX sur une carte sans adaptation est la façon habituelle de les tuer. Vérifiez votre carte précise, et dans le doute pilotez RX via un diviseur — le TX du module vers un microcontrôleur 5 V convient, puisque 3,3 V franchit le seuil de haut logique sur un AVR.
Pour aller plus loin