GPS-Empfänger mit Arduino

Für Mikrocontroller (Arduino, ESP32, etc.) gibt es einige günstige GPS-Module, von denen hier zwei vorgestellt und getestet werden.

ublox® NEO-6M-0-001

ublox® NEO-6M-0-001 GPS-Empfänger-Modul mit Keramik-Antenne
Abb.: ublox® NEO-6M-0-001 GPS-Empfänger-Modul mit Keramik-Antenne

Technische Daten

Betriebsspannung: 3,3V bis 5V (Gleichspannung)
Stromaufnahme: 45mA
Baudrate(n): 4800 bis 115200 (default: 9600)
Betriebstemperatur: -40°C bis +85°C
Betriebsaufnahmezeit: Kaltstart: min. 27s; Warmstart: 1s
Interface: RS232 TTL

Das ublox® NEO-6M GPS-Modul besitzt einen EEPROM zum Zwischenspeichern von Konfigurationsdaten und wird mit einer keramischen Antenne ausgeliefert. Weiterhin besitzt es eine kleine wiederaufladbare Batterie als USV. Eine Mikro-USB-Buchse bietet den Anschluss an den PC. Das Modul arbeitet mit stardardisierten NMEA-Nachrichten.

Anschlüsse des ublox® NEO-6M

Anschlüsse am NEO-6M GPS-Empfänger-Modul

Die (grüne) LED-Anzeige hat zwei Zustände:
- leuchtet durchgehend = GPS-Modul such nach Satelliten.
- LED blinkt: Position erkannt (Modul hat genug Satelliten erkannt)

NEO-6M Beschreibung Arduino
VCC Stromversorgung (3,3V-5V) 5V
GND Masseanschluss GND
TXD Senden von Daten 3
RXD Datenempfang 4
PPS "pulse per second" (wird hier nicht verwendet)

Verwendete Bauteile

Aufbau der Schaltung

Aufbau der Schaltung

Auslesen der GPS-Daten

Mit der SoftwareSerial-Library können die Rohdaten des GPS-Moduls ausgelesen und auf der seriellen Konsole des Arduino ausgegeben werden.

#include <SoftwareSerial.h>

#define PIN_RXD 3
#define PIN_TXD 4

#define GPS_BAUD 9600

// serial connection to the GPS device
SoftwareSerial gpsSerial(PIN_RXD, PIN_TXD);

void setup()
{
    Serial.begin(9600);
    gpsSerial.begin(GPS_BAUD);
}

void loop()
{
    // Output raw GPS data to the serial monitor
    while (gpsSerial.available() > 0) {
        Serial.write(gpsSerial.read());
    }
}
Ausgabe auf der seriellen Konsole
Abb.: Ausgabe auf der seriellen Konsole

Im obigen Bild sieht man die Rohdaten des GPS. Da ich das Modul innerhalb des Hauses betrieben habe, gab es noch keine richtigen GPS-Daten. Diese sehen dann folgendermaßen aus:

Ausgabe auf der seriellen Konsole mit GPS-Daten
Abb.: Ausgabe auf der seriellen Konsole mit GPS-Daten

Die hierbei ausgegebenen NMEA-Nachrichten sind jedoch schwer für Menschen lesbar. Daher gibt es Libraries, die das Auslesen der GPS-Daten vereinfachen.

Library "TinyGPS++"

Die TinyGPS++-Library kann die NMEA-Nachrichten parsen und in ein gut lesbares bzw. weiterverabeitbares Format transferieren.
Als Experiment läd man die Library von der angegeben Seite und legt den entpackten Ordner in den "libraries"-Ordner im Arduino-Basisordner. Nun öffnet man die Arduino-IDE und kann unter Beispiele nun das "FullExample" öffnen. Nach dem Kompilieren und Hochladen auf den Arduino sollte in etwa die folgende Ausgabe in der seriellen Konsole zu sehen sein:

Ausgabe auf der seriellen Konsole mit der TinyGPS++ Library
Abb.: Ausgabe auf der seriellen Konsole mit der TinyGPS++ Library

Der folgende Sketch ist eine Vereinfachung eines der Beispiele der Library:

#include <TinyGPS++.h>
#include <SoftwareSerial.h>

#define PIN_RXD 3
#define PIN_TXD 4

#define GPS_BAUD 9600

SoftwareSerial gpsSerial(PIN_RXD, PIN_TXD);
TinyGPSPlus tinyGps;

void setup()
{
    Serial.begin(9600);
    gpsSerial.begin(GPS_BAUD);
}

void loop()
{
    while (gpsSerial.available() > 0){
        tinyGps.encode(gpsSerial.read());
        if (tinyGps.location.isUpdated()){
            Serial.print("Latitude = ");
            Serial.println(tinyGps.location.lat(), 6);
            Serial.print("Longitude = ");
            Serial.println(tinyGps.location.lng(), 6);
            Serial.println("");
        }
    }
}

Library "GPS-neo-6m"

Ich habe noch folgende Library gefunden, aber bisher nicht getestet:
https://cristiansteib.github.io/Gps-neo-6m bzw.
https://github.com/cristiansteib/Gps-neo-6m/

Verwendung der Mikro-USB-Buchse

Man kann das GPS-Modul auch direkt über den Mikro-USB-Anschluss mit dem PC verbinden und die Daten dann über ein Terminal-Programm wie z.B. PuTTY (unter Windows) auslesen. Da mein Laptop jedoch Debian-Linux als Betriebssystem installiert hat kann man unter Linux auch die GPS-Daten folgendermaßen in einem Terminal auslesen lassen:
cat /dev/ttyACM0
Es sollte dann in etwa folgende Ausgabe erfolgen:
$GPTXT,01,01,02,u-blox ag - www.u-blox.com*50
$GPTXT,01,01,02,HW UBX-G70xx 00070000 *77
$GPTXT,01,01,02,ROM CORE 1.00 (59842) Jun 27 2012 17:43:52*59
$GPTXT,01,01,02,PROTVER 14.00*1E
$GPTXT,01,01,02,ANTSUPERV=AC SD PDoS SR*20
$GPTXT,01,01,02,ANTSTATUS=OK*3B
$GPTXT,01,01,02,LLC FFFFFFFF-FFFFFFED-FFFFFFFF-FFFFFFFF-FFFFFFF9*50
$GPRMC,,V,,,,,,,,,,N*53
$GPVTG,,,,,,,,,N*30
$GPGGA,,,,,,0,00,99.99,,,,,,*48
$GPGSA,A,1,,,,,,,,,,,,,99.99,99.99,99.99*30
...
..
.

Beitian BS-280

Anschlüsse des Beitian BS-280

Anschlüsse des Beitian BS-280
Abb.: Anschlüsse des Beitian BS-280 GPS-Moduls
Pin Funktion Beschreibung Arduino Uno
P 1PPS (output) Sobald ein GPS-Fix erreicht wurde, liefert dieser Pin 1 Puls pro Sekunde -
G GND Masse / 0V GND
T TX (output) Serieller Datenausgang (RS-232) 3
R Rx (input) Serieller Dateneingang (RS-232) 4
V VCC (input) Spannungsversorgung (3,6V bis 5,5V) 5V
B BOOT (input) (wird nicht verwendet) -

Verwendete Bauteile

Aufbau der Schaltung

(siehe: Setup für NEO-6M)

Auslesen der GPS-Daten

Hier wird wieder die TinyGPS++-Library verwendet und als Sketch das Beispiel "FullExample, wobei nur die folgenden Zeilen angepasst werden müssen:

static const int RXPin = 3, TXPin = 4;
static const uint32_t GPSBaud = 9600;

Sobald das GPS-Modul freie "Sicht" zum Himmel hat, werden nach kurzer Zeit Daten empfangen und auf der seriellen Konsole der Arduino-IDE dargestellt:

Ausgabe auf der seriellen Konsole der Arduino-IDE
Abb.: Ausgabe auf der seriellen Konsole der Arduino-IDE

Aufbau der NMEA-Nachrichten

Jede NMEA-Nachricht beginnt mit einem "$"-Zeichen und danach folgen komma-separierte Datenfelder, z.B.
$GPGGA,110617.00,41**.*****,N,00831.54761,W,1,05,2.68,129.0,M,50.1,M,,*42
$GPGSA,A,3,06,09,30,07,23,,,,,,,,4.43,2.68,3.53*02
$GPGSV,3,1,11,02,48,298,24,03,05,101,24,05,17,292,20,06,71,227,30*7C
$GPGSV,3,2,11,07,47,138,33,09,64,044,28,17,01,199,,19,13,214,*7C
$GPGSV,3,3,11,23,29,054,29,29,01,335,,30,29,167,33*4E
$GPGLL,41**.*****,N,00831.54761,W,110617.00,A,A*70
$GPRMC,110618.00,A,41**.*****,N,00831.54753,W,0.078,,030118,,,A*6A
$GPVTG,,T,,M,0.043,N,0.080,K,A*2C

Da es verschiedene Nachrichten-Arten gibt, wird der Typ immer vor dem ersten Komma angegeben.
(siehe auch: NMEA 0183)

u-Center

Unter Windows kann auch u-center verwendet werden, eine GNSS-Evaluierungsssoftware des Herstellers ublox®, die in grafischer Ansicht etliche GPS-Daten des Moduls auswerten und anzeigen kann.

Screenshot der GNSS-Evaluierungsssoftware u-center
Abb.: Screenshot der GNSS-Evaluierungsssoftware u-center

Troubleshooting

Bei Problemen mit dem Anschluss der GPS-Module gibt es eine Sammlung von Lösungen in dem GPS Tutorial auf Github.

zurück