Bauteil · Sensor

NEO-6M GPS Module

Ein NEO-6M liefert einem Outdoor-Roboter absolute Position über den seriellen Port. NMEA lesen, warum HDOP mehr zählt als die Genauigkeit und was es nicht kann.

Was es ist

Ein GNSS-Empfänger: Ein Chip, der auf die Zeitsignale lauscht, die eine Satelliten­konstellation sendet, und aus den Unterschieden ihrer Ankunfts­zeiten seine eigene Position löst. Das NEO-6M ist das Modul, dem die meisten Hobby-Roboter zuerst begegnen – ein u-blox-Empfänger, eine Keramik-Patch-Antenne und ein serieller Port.

Es ist der einzige Sensor an einem Roboter, der eine absolute Position meldet. Alles andere hier – Encoder, eine IMU, ein Reflexionsarray – misst eine Änderung oder ein lokales Merkmal. GPS stoppt Odometrie­drift davor, unbegrenzt zu sein, und es ist der Grund, warum ein Outdoor-Rover ein einen Kilometer entferntes Ziel bekommen kann.

Wie es funktioniert

Du sprichst nicht mit ihm. Es spricht mit dir, mit 9600 Baud, in NMEA-0183-Sätzen – eine kommagetrennte Zeile pro Nachricht, mehrmals pro Sekunde.

Zwei davon tragen alles, was ein Roboter braucht:

$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

Lies den Fix, dann prüfe ihn. Das Statusfeld in RMC ist A für aktiv oder V für ungültig, und die Fix-Qualität in GGA ist 0 ohne Lösung – in beiden Fällen trägt der Satz trotzdem plausibel aussehende Koordinaten. Das HDOP-Feld erwischt den subtileren Fehler: Es beschreibt Satelliten­geometrie, und schlechte Geometrie liefert eine selbstbewusste Antwort Dutzende Meter daneben.

Breite kommt als Grad-und-Dezimal­minuten (4807.038 sind 48° 07,038′), was nicht Grad ist. Rechne einmal um, dann erneut in Meter relativ zu einem festen Ursprung – die Arithmetik steht hier –, und alles dahinter arbeitet in Einheiten, die ein Regler versteht.

Wann man es verwendet

Nutze eines, wann immer der Roboter draußen über Strecken arbeitet, die Odometrie nicht überlebt: ein Wegpunkt-Rover, ein Rasenmäher, eine Vermessungs­plattform, ein Agrarroboter. Grob jenseits von dreißig Metern Fahrt hat Koppeln allein mehr Fehler gesammelt, als ein GPS-Fix trägt.

Greife drinnen gar nicht, überhaupt, niemals danach. Und greife nicht danach für Präzision: 2,5 m sind weit für einen Roboter, der 30 cm breit ist. GPS sagt dir, in welchem Feldteil du bist; ein Radencoder sagt dir, wo du innerhalb eines Meters davon bist. Nutze beides, fusioniert.

Der Upgrade-Pfad, nach Wert geordnet: zuerst eine höhere Aktualisierungs­rate (5 oder 10 Hz entfernen den größten Teil der Veraltung), dann ein Multikonstellations-Modul (GPS plus GLONASS oder Galileo verbessert Geometrie und damit HDOP), und erst dann RTK – das Zentimeter erreicht und eine Basisstation, eine Daten­verbindung und ein anderes Budget braucht.

Typische Fallstricke

  • Kaltstart sind Minuten, nicht Sekunden. Ohne Almanach muss der Empfänger einen von den Satelliten mit 50 Bit pro Sekunde herunterladen. Ein Roboter, der beim ersten Einschalten draußen tot wirkt, wartet meist nur.
  • Es hat keine Peilung. Nur Position. Paare es mit Magnetometer oder Gyro; Kurs über Grund ist unter etwa 1 m/s bedeutungslos.
  • 5 V an RX töten 3,3-V-Module. Prüfe, ob dein Breakout Pegel wandelt. Modul-TX in ein 5-V-Board ist in Ordnung.
  • Die Antenne braucht Himmel, keine Aussicht. Metall darüber – inklusive deiner eigenen Chassisplatte – kostet dich Satelliten. Montiere sie oben, flach, nach oben schauend.
  • Folge niemals Roh-Fixes. Kopple dazwischen und korrigiere bei jedem; den Fixes direkt zu folgen kostet eine Größenordnung Spurfehler und vierfaches Lenken.
  • Sechs Nachkommastellen sind 11 cm – und mehr, als ein float hält. Rechne in Meter relativ zu einem Missions­ursprung statt Arithmetik auf Rohgraden zu tun.

Pinbelegung und Verdrahtung

Pin Name Was er tut
1 VCC 3,3–5 V. Prüfe, ob dein Breakout regelt – viele NEO-6M-Boards tun es
2 RX Modul empfängt Konfiguration. 3,3-V-Logik an nacktem Modul
3 TX Modul sendet NMEA. Sicher in einen 5-V-Eingang
4 GND Masse
5 PPS Ein Puls pro Sekunde, auf GPS-Zeit ausgerichtet. Von meisten Projekten ignoriert
GPS Arduino Uno Hinweis
VCC 5 V Wenn dein Board einen Regler hat; 3,3 V, wenn nicht
GND GND
TX Pin 4 (SoftwareSerial RX) Modul spricht, Board hört zu
RX Pin 3 über Teiler Nur nötig, wenn du das Modul konfigurierst

Du kannst RX ganz offen lassen. Ein GPS-Modul im Standard­zustand streamt NMEA mit 9600 Baud, ohne gefragt zu werden, und für einen Roboter, der nur Position liest, ist das alles, was du brauchst. Verbinde RX nur, wenn du die Aktualisierungs­rate erhöhen oder ungenutzte Sätze stumm schalten willst.

Auslesen ohne Bibliothek

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

Die zwei Zeilen, die am meisten zählen, sind die, die Leute überspringen.

field[2][0] != 'A' ist das Gültigkeits­tor. Ein Empfänger ohne Fix sendet trotzdem perfekt wohlgeformte RMC-Sätze mit Koordinaten – meist die letzte bekannte Position oder Nullen. Code ohne Prüfung des Statusflags navigiert selbstbewusst in die Mitte des Atlantiks, wo 0°N 0°E liegt.

toDegrees existiert, weil 4807.038 nicht 4807,038 Grad sind, und auch nicht 48,07038 Grad. Es sind 48° 07,038′, was 48,1173° sind. NMEA-Koordinaten als Dezimalgrad zu behandeln ist der häufigste GPS-Fehler überhaupt, und der Fehler ist groß genug, um offensichtlich zu sein – was das einzig Gute daran ist.

Für echte Projekte nutze TinyGPS++. Es handhabt jeden Satztyp, Prüfsummen und die Randfälle. Die manuelle Version oben lohnt sich einmal, damit du weißt, was sie tut.

Genauigkeit: was die Zahlen wirklich heißen

Zahl Typisches NEO-6M Was sie heißt
Horizontale Genauigkeit ~2,5 m CEP Die Hälfte aller Fixes liegt innerhalb 2,5 m. Die Hälfte nicht
Aktualisierungs­rate 1 Hz Standard, 5 Hz einstellbar Bei 1 m/s ist ein 1-Hz-Fix bis zu einem Meter alt, bevor du ihn liest
Kaltstart ~27 s, Minuten ohne Almanach Nichts ist kaputt; es lädt mit 50 Bit pro Sekunde
Warmstart ~1 s Mit Stützstrom, der den Almanach am Leben hält
Tempo­genauigkeit ~0,1 m/s Wirklich gut – besser als die Position

CEP ist ein Median, keine Schranke. Die Hälfte deiner Fixes ist schlechter als 2,5 m, und nahe Gebäuden ist der Schwanz lang. Für einen 30 cm breiten Roboter ist „irgendwo innerhalb weniger Meter“ keine Position – es ist eine Nachbarschaft.

HDOP ist das Feld zum Beobachten. Es beschreibt Satelliten­geometrie statt Signal­qualität, und es ist das Ding, das eine selbstbewusste Antwort erzeugt, die Dutzende Meter falsch ist:

HDOP Qualität Nutzen?
< 1 Ideal Ja
1–2 Exzellent Ja
2–5 Gut Ja, mit Vorsicht
5–10 Mäßig Nur als langsame Korrektur
> 10 Schlecht Fix verwerfen

Prüfe auf HDOP ebenso wie auf das Gültigkeits­flag. Ein Fix mit HDOP 12 ist kein Fix; er ist eine Schätzung mit Dezimalpunkt.

Statische Drift, und warum sie zählt

Lasse ein GPS-Modul zehn Minuten perfekt still liegen und logge jeden Fix. Du bekommst eine Wolke mehrere Meter groß. Nichts hat sich bewegt.

Das ist das eine Wichtigste, selbst zu sehen, bevor man Navigations­code schreibt, weil es erklärt, warum Roh-Fixes zu folgen hoffnungslos ist. Ein Regler mit dieser Wolke gefüttert jagt ihr hinterher, und der Roboter schlingert dauernd bei wenig Fortschritt. Kopple mit Encodern zwischen Fixes und nutze jeden Fix nur zur Korrektur der langsamen Drift, und derselbe Regler spurt sauber – das Wegpunkt-Navigations-Tutorial hat die Zahlen.

Das Modul konfigurieren

Die Aktualisierungs­rate zu erhöhen ist die eine wertvollste Änderung, und sie lohnt sich vor allem anderen. u-blox-Module nehmen binäre UBX-Befehle:

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

Bei 5 Hz wird 9600 Baud zum Engpass – der volle NMEA-Satz passt nicht in 200 ms. Entweder Baudrate auf 38400 erhöhen oder Sätze abschalten, die du nicht nutzt (besonders GSV ist wortreich und meldet Satelliten­details, die kein Roboter braucht).

Beachte, dass an einem NEO-6M die Konfiguration ohne Batterie­stützung nicht bleibt. Sende sie bei jedem Start.

Fehlerbehebung

Symptom Wahrscheinliche Ursache Lösung
Gar keine Daten TX/RX nicht gekreuzt oder falsche Baud Modul-TX → Board-RX; zuerst 9600 versuchen
Daten kommen, nie ein Fix Drinnen GPS braucht Himmel. Ein Fenster reicht meist nicht
Erster Fix dauert Minuten Kaltstart ohne Almanach Normal. Draußen mit freier Sicht warten
Position ist 0, 0 Ungültigen Fix genutzt Auf RMC-Statusflag A prüfen
Position wild falsch ddmm.mmmm als Grad behandelt Umrechnen: Grad + Minuten/60
Position springt mehrere Meter Normales Empfänger­rauschen Erwartet. Mit Odometrie fusionieren; nie Roh-Fixes folgen
Fix selbstbewusst, aber weit daneben Schlechte Satelliten­geometrie Fixes mit HDOP über ~5 verwerfen
Weniger Satelliten als erwartet Antenne verbaut Oben montieren, nach oben, frei von Chassisplatte
Modul wurde heiß und starb 5 V in einen 3,3-V-RX-Pin Prüfen, ob dein Board Pegel wandelt, vor dem Verdrahten
Läuft, stoppt dann bei 5 Hz 9600 Baud trägt die Sätze nicht Baudrate erhöhen oder GSV abschalten

Ein Modul wählen

Modul Konstellationen Rate Hinweise
NEO-6M GPS 1–5 Hz Der billige Standard. Altern, aber überall
NEO-M8N GPS + GLONASS + Galileo bis 10 Hz Bessere Geometrie, besseres HDOP – das sinnvolle Upgrade
NEO-M9N Multiband-fähig bis 25 Hz Spürbar besser im urbanen Umfeld
ZED-F9P (RTK) Multiband 20 Hz Zentimeter-Genauigkeit, mit Basisstation und Datenlink

Der Upgrade-Pfad lohnt sich in Reihenfolge. Eine höhere Aktualisierungs­rate entfernt den größten Teil des Veraltungs­problems und kostet nichts. Ein Multikonstellations-Empfänger sieht mehr Satelliten, was Geometrie und damit HDOP verbessert – das ist in der echten Welt eine größere Verbesserung, als die Genauigkeits­angabe vermuten lässt, besonders nahe Gebäuden. RTK erreicht Zentimeter und ist transformativ für einen Roboter, der im Feld einer Linie folgen muss, braucht aber eine Basisstation, einen Korrektur­datenlink und grob das zehnfache Budget.

Eines gibt dir kein GPS-Modul zu keinem Preis: Peilung im Stillstand. Kurs über Grund leitet sich aus aufeinander­folgenden Positionen ab, ist also unter etwa 1 m/s Rauschen und bei Tempo null bedeutungslos. Ein Roboter, der wissen muss, wohin er zeigt, braucht Magnetometer oder Gyro, egal wie gut sein GPS ist.

Den Graphen erkunden

Verwendet in diesen Bauprojekten

Projekte, Lernpfade und Simulatoren, die NEO-6M GPS Module verwenden.

Fragen

FAQ zu NEO-6M GPS Module

Wie genau ist ein NEO-6M wirklich?

Etwa 2,5 Meter die Hälfte der Zeit, mit freier Himmelssicht und guter Satellitengeometrie – was die Zahl im Datenblatt und eine optimistische für einen Roboter ist, der neben einem Gebäude oder unter Bäumen fährt. Wichtig ist, dass es in selbstbewusst falsche Antworten statt offensichtliche Ausfälle abgleitet, also prüfe jeden Fix auf gemeldete Fix-Qualität und HDOP, statt der Position zu trauen, weil sie geparst wurde.

Was ist HDOP und warum zählt es mehr als die Genauigkeitszahl?

Horizontale Genauigkeitsverwässerung beschreibt die Geometrie der gerade sichtbaren Satelliten. Über den Himmel verteilte Satelliten geben eine gut konditionierte Lösung; gebündelte geben eine schlecht konditionierte, und der Empfänger meldet trotzdem eine Position mit vollem Selbstbewusstsein. Ein HDOP unter 2 ist gut und über etwa 2,5 ablehnenswert. Es ist das nützlichste Feld im GGA-Satz und fast niemand liest es.

Kann ein GPS-Modul meinem Roboter sagen, wohin er zeigt?

Nein. Ein Fix ist eine Position, und ein stehender Roboter nach Norden gibt exakt denselben Fix wie einer nach Süden. Kurs über Grund wird aus aufeinanderfolgenden Positionen gerechnet, bedeutet also nur etwas, während der Roboter wirklich fährt – unter grob 1 Meter pro Sekunde ist es meist Rauschen. Outdoor-Rover paaren GPS mit Magnetometer für absolute Peilung, Gyro für kurzfristige Peilung oder beidem.

Warum schlingert mein Roboter beim Folgen von GPS-Wegpunkten?

Weil ein 1-Hz-Fix zugleich alt und verrauscht ist, und ein Bahnfolger mit Roh-Fixes bei jedem neuen lungert. Gemessen auf derselben Strecke mit demselben Regler macht ein 1-Hz-Fix bei meterskaligem Rauschen aus 0,09 m RMS-Querfehler 1,25 m und vervielfacht den Lenkaufwand um viereinhalb. Die Lösung ist, zwischen Fixes zu koppeln und jeden neuen Fix zur Korrektur dieser Schätzung statt zum Ersetzen zu nutzen.

Funktioniert es drinnen?

Praktisch nie, und das ist kein Defekt. Das Signal eines GPS-Satelliten kommt schwächer als der thermische Rauschboden an und braucht unverbauten Himmel; ein Dach stoppt es. Module auf der Fensterbank erfassen manchmal und melden große Fehler aus Mehrwegeausbreitung. Teste draußen im Offenen und plane eine Minute für Kaltstart ein, bevor du etwas als kaputt annimmst.

5 V oder 3,3 V?

Die meisten Breakout-Boards tragen einen Regler und akzeptieren 5 V an VCC, aber die eigene Logik des Moduls ist 3,3 V. 5 V in RX auf einem Board ohne Pegelwandlung zu speisen ist die übliche Art, wie diese sterben. Prüfe dein konkretes Board, und treibe RX im Zweifel über einen Teiler – TX des Moduls in einen 5-V-Mikrocontroller ist in Ordnung, da 3,3 V die Logik-High-Schwelle an einem AVR überschreiten.

Weiterführende Literatur

Quellen