GPS-Logger mit SD-Karte

Schon wieder ein GPS-Logger?

Stimmt - Es gibt im Internet schon gefühlte 34 Fantastilliarden Bauanleitungen für einen GPS-Logger, also ein Gerät, mit dem man die Daten eines GPS-Empfängers aufzeichnen und diese dann am PC nachverfolgen und auswerten kann. Und doch fehlt jeder Variante ein wichtiger Punkt, den ich auf meiner Haben-Wollen-Liste stehen hatte:

Aussenansicht

Natürlich gibt es auch fertige Geräte, die sowas können, aber hey - wir sind ja schließlich Bastler, oder? ;-)

Features und Bedienung

Der Logger hat zur Bedienung nur zwei Taster und einen Ein-/Ausschalter, außerdem ist noch eine Ladebuchse vorhanden, so dass man bei Verwendung von Akkus diese laden kann, ohne das Gehäuse zu öffnen. Seitlich ist ein Schlitz im Gehäuse, über den die SD-Karte eingesteckt wird. Nach dem Einschalten wird zuerst die SD-Karte initialisiert und überprüft, ist diese ok, geht es gleich weiter in die normale Anzeige:

Hauptmenü

In der obersten Zeile wird ganz links die Anzahl der empfangenen Satelliten angezeigt, hier noch 0. Rechts daneben steht der aktuelle Status, bei WARTE wird noch auf den Empfang von GPS-Daten gewartet (daher auch noch keine Satelliten). Ganz rechts folgt schließlich noch die Batteriespannung der beiden Micro-Zellen (Batterien oder Akkus). Was in der zweiten Zeile angezeigt wird, kann man durch einen kurzen Druck auf den rechten Taster auswählen. Möglich sind die aktuelle Uhrzeit (UTC), Datum, Längengrad, Breitengrad, aktuelle Höhe, Geschwindigkeit in Knoten, Kurs und Status der SD-Karte (freier Speicher). Bei jedem Druck schaltet die Anzeige eins weiter, am Ende geht es wieder zurück zur Uhrzeit.

Hat der GPS-Empfänger ausreichend Satelliten empfangen, um die Position zu bestimmen, wechselt die Anzeige; der Status ist jetzt BEREIT, d.h. man kann die Aufzeichnung starten, und es werden aktuell z.B. 7 Satelliten empfangen:

Hauptmenü

Weitere mögliche Status sind:

Status Bedeutung
WARTE Warte auf GPS-Empfang (kein Datum/Uhrzeit)
BEREIT Daten werden empfangen, bereit zum Loggen
AKTIV Logging ist aktiv
FEHLER SD-Karte fehlt, nicht bereit oder schreibgeschützt

Ist der Logger bereit, kann mit einem langen Tastendruck auf den linken Taster das Logging gestartet werden. Es wird dann anschließend automatisch eine neue Datei auf der SD-Karte angelegt, in die alle vom GPS-Empfänger eintreffenden Daten geschrieben werden. Der Ablageort dieser Datei ist folgender:

\GPS\yyyy_mm\dd_hhmm.LOG

Die Daten werden auf der Karte im Unterverzeichnis GPS abgelegt. Ein weiterer Unterordner yyyy_mm bezeichnet Jahr (yyyy) und Monat (mm) des Logs, und die Datei selbst enthält den Tag (dd) und die Start-Uhrzeit (hhmm) des Logs. Die Endung der Datei ist LOG. Innerhalb der Datei sieht eine Zeile folgendermaßen aus:

010513,132206,4815.12729,N,01069.43578,E,549.7M,1.049,66.52,47.8M,06,0

Hierbei bedeuten:

Wert Bedeutung
010513 Datum (1.Mai 2013)
132206 UTC-Zeit (für MEZ: +1 Stunde, für MESZ: +2 Stunden)
4815.12729,N Längengrad
01069.43578,E Breitengrad
549.7M Höhe über mittlerem Meeresspiegel
1.049 Aktuelle Geschwindigkeit (in Knoten)
66.52 Kurs (in Grad)
47.8M Geoidal separation
06 Anzahl empfangener Satelliten
0 Wenn 1: hier wurde ein Wegpunkt gesetzt.

Über einen langen Tastendruck auf den rechten Taster kann man einen Wegpunkt setzen, um besondere Orte zu markieren (z.B. ein Ort mit besonders schöner Aussicht). Im File wird dann einfach eine "1" ans Ende der Zeile geschrieben, wodurch die Zeile als Wegpunkt gekennzeichnet ist.

Stoppen kann man die Aufzeichnung dann über einen weiteren langen Tastendruck auf die linke Taste, wodurch das File auf der Karte geschlossen wird.

Datenkonvertierung

Das Dateiformat des Loggers ist bewusst sehr platzsparend ausgelegt mit möglichst wenig Overhead. Jedoch kann man eine Log-Datei dadurch nicht so ohne Weiteres nutzen, um die Daten zum Beispiel in Google Earth oder andere Programme zu importieren. Aus diesem Grund hab ich für den PC einen kleinen Konverter geschrieben, der ein Log-File des GPS-Loggers in ein sogenanntes GPX-File umwandelt, was ein sehr verbreitetes Format für GPS-Daten ist. Dieses kann man dann nach Belieben weiterverwenden.

Konverter für Log-Daten

Im oberen Textfeld wird die zu konvertierende Datei gewählt (Klick auf Durchsuchen...). Über die zwei Checkboxen darunter kann ausgewählt werden, ob Tracks (aufgezeichnete Strecke, ohne Wegpunkte) oder nur die Wegpunkte oder beide konvertiert werden sollen. Ganz unten wird schließlich ausgewählt, in welches Dateiformat konvertiert werden soll, im Moment ist aber nur GPX implementiert. Anschließend muss man nur noch auf Konvertieren klicken, das wars schon.

In Google Earth beispielsweise kann man die Daten dann einlesen, wenn man im Menü Tools auf GPS klickt und dann im Fenster "Aus Datei importieren" auswählt. Jetzt nur noch die GPX-Datei angeben, und fertig. Man sieht die gefahrene Route als blaue Linie, und die Wegpunkte als kleine Flaggen. Der Konverter nummeriert die Wegpunkte einfach durch.

Import in Google Earth

Die Genauigkeit der Tracks ist aufgrund der sekündlichen Aufzeichnung ziemlich gut, wie das folgende Bild zeigt. Der blaue Track liegt recht genau auf dem Straßenzug:

Genauigkeit des Loggers

Downloads

Hier kann man das komplette Projekt, inkl. Layout, Firmware und PC-Software herunterladen.

Die Schaltung

Der Schaltplan, den man hier einzeln ansehen kann (im Download-Paket ist er ebenfalls enthalten), ist relativ übersichtlich. Auf Seite 2 ist links der Controller zu sehen. Er wird über den ISP-Anschluss, eine einreihige, 6polige Stiftleiste programmiert. Da die SPI-Pins auch für die SD-Karte benötigt werden, sind die Signale mit Schutzwiderständen entkoppelt. Als Quarz dient ein 7,3728MHz-Baudratenquarz, damit die korrekte Baudrate für das GPS-Modul generiert werden kann. Die Spannungsversorgung für den AD-Wandler (AVCC), der für die Messung der Batteriespannung benutzt wird, ist schließlich mit einer 10µH-Spule von der digitalen Versorgung entkoppelt.

Rechts ist der Anschluss des Displays zu sehen. Es handelt sich dabei um ein HMC16223SG von Pollin, das bereits mit einem kurzen Stück Flex-Kabel geliefert wird und auf der Platine direkt in einen entsprechenden Steckverbinder gesteckt wird. Es kann aber auch jedes andere HD44780-Display mit 2x16 Zeichen verwendet werden. Der Controller des Displays arbeitet mit 3,3V, jedoch reicht diese Spannung nicht aus, um einen gut lesbaren Kontrast zu erhalten. Darum ist mit der Schaltung um D1, D2, C8, C9 und R15 eine Ladungspumpe aufgebaut, die vom Controller mit einer 25kHz-PWM gefüttert wird und eine negative Spannung für das Display erzeugt.

Unterhalb des Displays ist schließlich der SD-Kartenslot abgebildet. Es handelt sich um einen abgeschirmten Sockel des Typs SDCMF-10915W0T1 von Multicomp, den ich bei Farnell über den hbe-shop bezogen habe. Die Versorgungsspannung für die Karte ist über L2 und C10 entkoppelt. An den Pins 10 und 11 des Sockels kann detektiert werden, ob eine Karte eingesteckt ist (CARD_DET) und ob diese schreibgeschützt ist (CARD_WP). Beide Signale schalten nach Masse, im Controller ist am Porteingang ein Pullup aktiviert.

Auf Seite 3 ist die Spannungsversorgung der gesamten Schaltung zu sehen. Es handelt sich um einen Schaltregler, der mit einem MCP1640B von Microchip aufgebaut ist und aus der Batteriespannung eine stabile Spannung von 3,3V generiert. Die Ausgangsspannung wird mit R29 und R30 eingestellt. Zur Messung der Batteriespannung dient der Spannungsteiler R25/R26, der - logisch - noch vor dem Regler sitzt. Nicht dargestellt ist die Ladebuchse, die parallel zum Akku angeschlossen ist.

Innenansicht des GPS-Loggers

Darunter ist schließlich das GPS-Modul zu sehen, dessen 3,3V-Versorgung über L3, C13 und C15 entkoppelt ist. Ich habe ein NL507eTTL von Navilock verwendet, das die Daten direkt auf einer seriellen Schnittstelle mit TTL-Pegeln ausgibt. Das Modul gibt es unter anderem bei Ebay, Amazon oder Conrad, es kann aber auch jedes andere Modul verwendet werden (z.B. alte "GPS-Maus"), das die Daten seriell zur Verfügung stellt. Mein Modul sendet die Daten standardmäßig mit 9600 Baud, 8 Datenbits, 1 Stopbit und ohne Parity. Die Kommunikationsleitungen gehen über R27 und R28 direkt an den Controller. Prinzipiell wird nur die Tx-Leitung benötigt, da keine Kommandos vom Controller zum Modul gesendet werden, trotzdem ist diese für eventuelle Erweiterungen vorgesehen.

Das doppelseitige Layout ist mit KiCAD erstellt und selbst geätzt. Die Größe der Platine ist ausgelegt für ein Hammond-Gehäuse, Typ 1591CTBU, das es zum Beispiel bei Farnell oder auch Conrad gibt. Die Platine wird mit Abstandsbolzen am Gehäuseboden befestigt, das Display und die Taster werden direkt in den Deckel eingebaut.

Firmware

Die Firmware für den Mikrocontroller besteht aus mehreren Quellfiles:

Sourcefile Inhalt
gpslogger.c Enthält die main(), Initialisierungen und die Interruptroutinen
gpslogger.h Header-File mit Defines, Deklaration globaler Variablen und Funktionen
gpslogger_lcd.c Anzeigeroutinen für das LC-Display
gpslogger_log.c Enthält die gesamte Logik, Batteriespannungsmessung, Telegrammhandler...
gpslogger_var.c Die globalen Variablen

Ansonsten werden noch die LCD-Routinen von Peter Fleury (lcd.h, lcd.c), und für das Schreiben auf die SD-Karte die FAT-Routinen von Holger Klabunde (Dateien im Unterverzeichnis fat) verwendet.

Die Software ist relativ geradlinig aufgebaut, es gibt zwei Interrupts, einen 20µs-Interrupt, der zur Erzeugung der internen Zeitbasis dient und gleichzeitig den Portpin für die Kontrastspannungserzeugung toggelt, sowie eine USART-Empfangsinterrupt, der neue Zeichen vom GPS-Modul in einen Puffer schiebt. Die gesamte Verarbeitung findet dann in der Main Loop statt. Bei einem empfangenen Line Feed vom GPS-Modul wird ein neues Telegramm als erkannt markiert, dekodiert und bei aktivem Logging in das zuvor geöffnete File auf der SD-Karte geschrieben. Vom GPS-Modul werden nur die beiden Telegramme $GPGGA und $GPRMC ausgewertet, sie beinhalten zusammen alle benötigten Daten.

Ins File geschrieben wird in der Routine logger_fsm(), die sich in gpslogger_log.c befindet. Wenn eine Aufzeichnung läuft und neue Daten vorhanden sind, werden diese entsprechend formatiert und abgelegt. logger_fsm() ist die State Machine des Loggers, in der die Zustände BEREIT, AKTIV, WARTE und FEHLER abgebildet sind. Übrigens kommt der Logger von selbst nicht aus dem Zustand FEHLER heraus, da ich es nicht hinbekommen habe, ein "Hot Plugging" der SD-Karte umzusetzen. Deswegen muss man bei einem Fehler den Logger aus- und wieder einschalten.

Noch ein Wort zur Batteriespannungsmessung. Ich verwende nur die höherwertigen 8 Bit des Wandlungsergebnisses, also ergibt sich ein Wert von 0 bis 255. Zusammen mit dem Spannungsteiler 10kOhm / 27kOhm bedeutet das, dass sich die Batteriespannung über die Formel:

UBat = 2,56V*(ADC-Wert/256)*(10k+27k)/27k = ADC-Wert*0.0137037 ADC-Wert = UBat*72.972972

Um die Batteriespannung zu erhalten, ziehe ich vom ADC-Wert also zunächst solange 73 ab, wie der Rest noch größer als 73 ist, und merke mir wie oft ich das machen kann. Für jede Subtraktion addiere ich zum Ergebnis (das anfangs 0 ist) 1 Volt. Anschließend führe ich das gleiche Spiel noch für 1/10 Volt durch, entsprechend einem ADC-Wert von 7. So komme ich ohne zeitaufwändige Division schnell zu meiner Batteriespannung, die zwar nicht supergenau ist, aber für den vorliegenden Zweck völlig ausreichend.

Bilder

Hier folgen noch ein paar Bilder vom fertigen GPS-Logger.

Der GPS-Logger
Der GPS-Logger
Der GPS-Logger
Der GPS-Logger
Der GPS-Logger