Component · Sensor

NEO-6M GPS-module

Een NEO-6M geeft een buitenrobot absolute positie via een seriële poort. NMEA lezen, waarom HDOP belangrijker is dan de nauwkeurig en wat de module niet kan.

Wat het is

Een GNSS-ontvanger: een chip die de tijdsignalen ontvangt die een constellatie van satellieten uitzendt en op basis van de verschillen in aankomsttijd zijn eigen positie bepaalt. De NEO-6M is de module die de meeste hobbyrobots als eerste tegenkomen: een u-blox-ontvanger, een keramische patchantenne en een seriële poort.

Het is de enige sensor op een robot die een absolute positie meldt. Al het andere op deze site, van encoders tot een IMU en een reflectiearray, meet een verandering of een lokaal kenmerk. GPS voorkomt dat odometrische afwijking onbegrensd groeit en maakt het mogelijk een rover die buiten rijdt een bestemming een kilometer verderop te geven.

Hoe het werkt

Je praat niet met de module. De module praat met jou, op 9600 baud, in NMEA 0183-zinnen: één regel met door komma’s gescheiden velden per bericht, meerdere keren per seconde.

Twee daarvan bevatten alles wat een robot nodig heeft:

$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

Lees de fix en filter hem vervolgens. Het statusveld in RMC is A voor actief of V voor ongeldig, en de fixkwaliteit in GGA is 0 als er geen oplossing is. In beide gevallen bevat de zin nog steeds plausibel ogende coördinaten. Het HDOP-veld vangt de subtielere fout: het beschrijft de satellietgeometrie, en een slechte geometrie levert een overtuigend antwoord op dat tientallen meters verkeerd ligt.

De breedtegraad komt binnen als graden en decimale minuten (4807.038 is 48° 07.038′), niet als graden. Reken hem eenmaal om en daarna nogmaals naar meters ten opzichte van een vast oorsprongspunt; de rekensom staat hier. Al het daaropvolgende werk dan met eenheden die de microcontroller begrijpt.

Wanneer je hem gebruikt

Gebruik er een zodra de robot buiten werkt over afstanden waarvoor odometrie niet volstaat: een waypoint-rover, een grasmaaier, een meetplatform of een landbouwrobot. Na dertig meter rijden heeft louter dood rekenen al meer fout opgebouwd dan een GPS-fix bevat.

Gebruik hem binnenshuis nooit en gebruik hem niet voor precisie: 2,5 m is ver voor een robot van 30 cm breed. GPS vertelt je welk deel van het veld je in bent; een wielencoder vertelt je waar je binnen een meter van dat punt bent. Gebruik beide en fuseer de gegevens.

De upgradevolgorde op basis van waarde is: eerst een hogere updatefrequentie, want 5 of 10 Hz verwijdert het meeste van de veroudering; vervolgens een module voor meerdere constellaties, want GPS plus GLONASS of Galileo verbetert de geometrie en daarmee HDOP; en pas daarna RTK, dat centimeters haalt en een basisstation, een gegevensverbinding en een ander budget vereist.

Veelvoorkomende valkuilen

  • Een koude start duurt minuten, niet seconden. Zonder almanak moet de ontvanger zelf een almanak downloaden; dat gebeurt met 50 bits per seconde via de satellieten. Een robot die bij de eerste inschakeling buiten dood lijkt, wacht meestal alleen.
  • Hij heeft geen richting. Alleen positie. Combineer hem met een magnetometer of gyroscoop; koers over de grond is onder ongeveer 1 m/s betekenisloos.
  • 5 V op RX vernietigt 3,3V-modules. Controleer of je breakout de spanningsniveaus aanpast. TX van de module naar een 5V-bord is veilig.
  • De antenne heeft ongehinderd zicht op de hemel nodig. Metaal erboven, inclusief je eigen chassispaneel, kost je satellieten. Monteer de antenne bovenaan, vlak en omhoog gericht.
  • Volg nooit ruwe fixes. Dood reken tussen de fixes en corrigeer bij elke fix; rechtstreeks de fixes volgen verhoogt de volgfout met een orde van grootte en de bestuurinspanning viermaal.
  • Zes decimalen is 11 cm, en dat past niet in een float. Reken om naar meters ten opzichte van het oorsprongspunt van de missie in plaats van met ruwe graden te rekenen.

Pindindeling en bedrading

Pin Naam Functie
1 VCC 3,3–5 V. Controleer of jouw breakout de spanning regelt; veel NEO-6M-borden doen dat
2 RX Module ontvangt configuratie. 3,3V-logica op een kale module
3 TX Module zendt NMEA. Veilig naar een 5V-ingang
4 GND Aarde
5 PPS Eén puls per seconde, gesynchroniseerd met GPS-tijd. De meeste projecten negeren deze
GPS Arduino Uno Opmerking
VCC 5 V Als je bord een regelaar heeft; anders 3,3 V
GND GND
TX Pin 4 (SoftwareSerial RX) Module praat, bord luistert
RX Pin 3 via spanningsdeler Alleen nodig als je de module configureert

Je kunt RX volledig onverbonden laten. Een GPS-module in de standaardtoestand stuurt NMEA op 9600 baud zonder dat daar een verzoek voor nodig is, en voor een robot die alleen de positie leest is dat alles. Verbind RX alleen wanneer je de updatefrequentie wilt verhogen of ongebruikte zinnen wilt uitschakelen.

Zonder bibliotheek lezen

#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;
}

De twee belangrijkste regels zijn juist de regels die mensen overslaan.

field[2][0] != 'A' is de geldigheidscontrole. Een ontvanger zonder fix zendt nog steeds volkomen correct gevormde RMC-zinnen met coördinaten, meestal de laatst bekende positie of nullen. Code die de statusvlag niet controleert, navigeert vol vertrouwen naar het midden van de Atlantische Oceaan, want daar ligt 0°N 0°E.

toDegrees bestaat omdat 4807.038 niet 4807.038 graden is, maar ook niet 48.07038 graden. Het is 48° 07.038′, oftewel 48.1173°. NMEA-coördinaten als decimale graden behandelen is de meest voorkomende GPS-fout en de fout is groot genoeg om duidelijk op te vallen, wat het enige goede eraan is.

Gebruik voor echte projecten TinyGPS++. Die verwerkt elk type NMEA-zin, controlesommen en randgevallen. Voer de handmatige versie hierboven één keer uit, zodat je weet wat hij doet.

Nauwkeurigheid: wat de getallen echt betekenen

Waarde Gangbare NEO-6M Betekenis
Horizontale nauwkeurigheid ~2,5 m CEP De helft van alle fixes ligt binnen 2,5 m. De andere helft niet
Updatefrequentie Standaard 1 Hz, instelbaar op 5 Hz Bij 1 m/s is een fix van 1 Hz tot een meter oud voordat je hem leest
Koude start ~27 s, minuten zonder almanak Er is niets mis; hij downloadt met 50 bits per seconde
Warme start ~1 s Back-upvoeding houdt het almanak in stand
Nauwkeurigheid van de snelheid ~0,1 m/s Werkelijk goed; beter dan de positie

CEP is een mediaan, geen grens. De helft van je fixes is slechter dan 2,5 m en de staart is lang bij gebouwen. Voor een robot van 30 cm breed is “ergens binnen enkele meters” geen positie, maar een buurt.

HDOP is het veld om in de gaten te houden. Het beschrijft de satellietgeometrie, niet de signaalkwaliteit, en het veroorzaakt het overtuigende antwoord dat tientallen meters verkeerd ligt:

HDOP Kwaliteit Gebruiken?
< 1 Ideaal Ja
1–2 Uitstekend Ja
2–5 Goed Ja, met voorzichtigheid
5–10 Matig Alleen als langzame correctie
> 10 Slecht Verwerp de fix

Filter ook op HDOP en niet alleen op de geldigheidsvlag. Een fix met HDOP van 12 is geen fix; het is een gok met een decimaalteken.

Statische afwijking en waarom die belangrijk is

Laat een GPS-module tien minuten volledig stilstaan en leg elke fix vast. Je krijgt een wolk van enkele meters doorsnede. Er is niets bewogen.

Dit is het belangrijkste dat je zelf moet zien voordat je navigatiecode schrijft, omdat het verklaart waarom het volgen van ruwe fixes zinloos is. Een regelaar die die wolk krijgt blijft hem achternaal jagen, waardoor de robot doorlopend slingert en weinig vooruitgang boekt. Dood reken met encoders tussen de fixes en gebruik elke fix alleen om de langzame afwijking te corrigeren; dezelfde regelaar volgt dan schoon. De tutorial over waypointnavigatie bevat de getallen.

De module configureren

De updatefrequentie verhogen is de waardevolste enkele wijziging en verdient prioriteit boven alles. u-blox-modules nemen binaire UBX-opdrachten aan:

// 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));
}

Bij 5 Hz wordt 9600 baud de beperking: de volledige reeks NMEA-zinnen past niet binnen 200 ms. Verhoog de baudrate naar 38400 of schakel de ongebruikte zinnen uit. GSV is bijzonder uitgebreid en bevat satellietgegevens die voor geen enkele robot nodig zijn.

Let op: bij een NEO-6M blijft de configuratie niet behouden zonder back-upvoeding op de module. Stuur de configuratie bij elke start opnieuw.

Problemen oplossen

Symptoom Waarschijnlijke oorzaak Oplossing
Helemaal geen gegevens TX/RX niet gekruist of verkeerde baud TX van module naar RX van bord; begin met 9600
Er komen gegevens, maar nooit een fix Binnen GPS heeft ongehinderd zicht op de hemel nodig; een raam is meestal niet genoeg
Eerste fix duurt minuten Koude start zonder almanak Normaal. Wacht buiten met vrij zicht
Positie is 0, 0 Ongeldige fix wordt gebruikt Filter op de RMC-statusvlag A
Positie is wild verkeerd ddmm.mmmm als graden behandeld Converteer: deg + minutes/60
Positie springt meerdere meters Normaal ruis in de ontvanger Verwacht. Fuseer met odometrie; volg nooit ruwe fixes
Fix is overtuigend maar ver weg Slechte satellietgeometrie Verwerp fixes met HDOP boven ~5
Minder satellieten dan verwacht Antenne geblokkeerd Monteer bovenop, omhoog gericht en vrij van het chassispaneel
Module wordt warm en sterft 5 V op een 3,3V-RX-pin Controleer vóór het bedraden of je bord de spanningsniveaus aanpast
Het werkt en stopt bij 5 Hz 9600 baud kan de zinnen niet dragen Verhoog de baudrate of schakel GSV uit

Een module kiezen

Module Constellaties Frequentie Opmerkingen
NEO-6M GPS 1–5 Hz Het betaalbare standaard. Verouderd, maar overal verkrijgbaar
NEO-M8N GPS + GLONASS + Galileo tot 10 Hz Betere geometrie en HDOP; de zinnige upgrade
NEO-M9N Meerdere frequentiebanden mogelijk tot 25 Hz Merkbaar beter in stedelijke omgevingen
ZED-F9P (RTK) Meerdere frequentiebanden 20 Hz Centimeternauwkeurigheid, met basisstation en gegevensverbinding

Doorloop de upgrades in de volgorde van hun waarde. Een hogere updatefrequentie verwijdert het meeste verouderingsprobleem en kost niets. Een ontvanger voor meerdere constellaties ziet meer satellieten, wat de geometrie en daarmee HDOP verbetert. Dat is in de praktijk een grotere winst dan de nauwkeurigheidsspecificatie doet vermoeden, vooral nabij gebouwen. RTK haalt centimeterprecisie en verbetert de lijnvolging van een robot die een lijn over een veld moet volgen fundamenteel, maar vraagt een basisstation, een verbinding voor correctiegegevens en ongeveer tien keer het budget.

Eén ding krijg je van geen enkele GPS-module voor elke prijs: richting terwijl de robot stilstaat. Koers over de grond wordt afgeleid uit opeenvolgende posities, dus onder ongeveer 1 m/s is dat ruis en bij nul snelheid betekenisloos. Een robot dat moet weten welke kant hij op kijkt, heeft een magnetometer of gyroscoop nodig, hoe goed de GPS ook is.

Verken de graaf

Gebruikt in deze bouwprojecten

Projecten, leerroutes en simulators waarin de NEO-6M GPS-module voorkomt.

Vragen

FAQ over de NEO-6M GPS-module

Hoe nauwkeurig is een NEO-6M werkelijk?

Ongeveer 2,5 meter in de helft van de gevallen, met vrij zicht op de hemel en een goede configuratie van de satellieten. Dat staat op de datasheet, maar is optimistisch voor een robot naast een gebouw of onder bomen. Het belangrijke is dat de module niet duidelijk faalt, maar steeds met overtuiging verkeerde antwoorden komt. Filter daarom elke fix op de gerapporteerde kwaliteit en op HDOP en vertrouw niet op de positie alleen omdat die is verwerkt.

Wat is HDOP en waarom is het belangrijker dan het nauwkeurigheidsgetal?

Horizontal Dilution of Precision beschrijft de geometrie van de satellieten die op dat moment zichtbaar zijn. Satellieten die over de hemel verspreid liggen geven een goed geconditioneerde oplossing; gebundelde satellieten geven een slecht geconditioneerde oplossing, terwijl de ontvanger de positie vol vertrouwen blijft melden. HDOP onder 2 is goed en boven ongeveer 2,5 is de fix beter verwerpen. Het is het nuttigste veld in de GGA-zin en vrijwel niemand leest het.

Kan een GPS-module mijn robot vertellen in welke richting hij kijkt?

Nee. Een fix is een positie, en een stilstaande robot die naar het noorden kijkt geeft exact dezelfde fix als een robot die naar het zuiden kijkt. Koers over de grond wordt berekend uit opeenvolgende posities en betekent dus alleen iets als de robot werkelijk beweegt; onder ongeveer 1 meter per seconde is hij vooral ruis. Rovers voor gebruik buiten combineren GPS met een magnetometer voor een absolute richting, een gyroscoop voor de korte termijn of beide.

Waarom slingert mijn robot bij het volgen van GPS-waypoints?

Omdat een fix van 1 Hz tegelijk verouderd en ruisachtig is, en een padvolger die ruwe fixes krijgt bij elke nieuwe fix uitschiet. Gemeten op dezelfde baan met dezelfde regelaar verandert een fix van 1 Hz met kleine ruiswaarden op meterschaal een RMS-fout van 0,09 m dwars op het pad in 1,25 m en vermenigvuldigt de bestuurinspanning met vierenhalf. De oplossing is om tussen de fixes dood te rekenen en elke nieuwe fix te gebruiken om die schatting te corrigeren in plaats van hem te vervangen.

Werkt het binnen?

Vrijwel nooit, en dat is geen defect. Het signaal van een GPS-satelliet komt zwakker binnen dan de thermische ruisvloer en vereist ongehinderd zicht op de hemel; een dak houdt het tegen. Modules op een vensterbank vinden soms een signaal en melden grote fouten door meervoudige reflecties. Test buiten in de openlucht en reken op een minuut voor een koude start voordat je denkt dat er iets kapot is.

5 V of 3,3 V?

De meeste breakoutborden hebben een spanningsregelaar en accepteren 5 V op VCC, maar de logica van de module zelf werkt op 3,3 V. 5 V in RX voeden op een bord zonder spanningsniveau-omzetting is de gebruikelijke manier waarop deze modules sterven. Controleer je specifieke bord en gebruik bij twijfel een spanningsdeler voor RX; TX van de module naar een 5V-microcontroller is veilig, want 3,3 V haalt op een AVR de drempel voor logisch hoog.

Verder lezen

Bronnen