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