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 float ne 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

Références