Arduino GPS Datenlogger DIY Projekt

Hallo zusammen,

um die Geschwindigkeit eines Modells ermitteln zu können, bietet der Markt einige käufliche Lösungsansätze an. Da unser Hobby ModellBAU heißt, zeige ich in den nächsten Schritten, wie man mit relativ wenig Aufwand einen solchen Datenlogger mit Hilfe eines GPS Moduls realisieren kann.
Ziel ist es also einen Datenlogger aufzubauen, der die entsprechenden Daten aus dem GPS Modul auslesen und auf SD Karte abspeichert kann. Als Grundlage verwende ich Arduino Bausteine. Im Detail handelt es sich um folgende Komponenten:

• Arduino Nano „kompatibel“ 5V
• SD-Kartenleser SPI Schnittstelle
• Arduino kompatibles GPS Modul RS232 mit neo-6m ublox
• Stiftleisten, Litzen, LED und 3 Widerstände

Die Unkosten für die oben genannten Komponenten belaufen sich auf etwa 20€, abhängig vom ausgewählten Anbieter, preiswerte Komponenten gibt es u.a. bei Aliexpress.

1. Hardware Aufbau

Die ersten Gehversuche wurden mit dem Arduino UNO durchgeführt. Das GPS Modul sowie der SD Kartenlesen wurden dazu „fliegend“ miteinander verdrahtet. Somit ist das Experimentieren deutlich einfach als wenn die Komponenten sofort an der späteren Position fest verlötet werden.

Arduino_Logger-1.jpg

GPS Modul:

Das auf den Bildern dargestellte GPS-Modul ist nicht mit dem neo-6m Chip von ublox ausgestattet. Es handelt sich hier um eine „Sparversion“ des genannten Chips. Für den weiteren Aufbau hat das aber erstmal keinen Einfluss. Der einzige Unterschied ist die geringere Update Frequenz der GPS Informationen. Das entsprechende neo-6m Modul ist jedoch bereits geordert. Dieses bietet deutlich mehr Einstellmöglichkeiten.
Die Kommunikation zwischen Arduino und dem GPS Modul erfolgt seriell mittels RS232. Diese Module werden auch mit I2C angeboten. Hier wird die RS232 Version verwendet.
Sowohl das Arduino als auch der Kartenleser arbeiten mit einer Betriebsspannung von 5,0 V. Das GPS Modul lediglich mit 3,3V. Die Spannungsversorgung für das GPS Modul muss also im 3,3V erfolgen. Für die beiden Datenleitungen ( TX und RX) bieten sich folgende Lösungsansätze an: Daten die vom GPS Modul an das Arduino gesendet werden, werden trotz des Signalpegels von 3,3V erkannt. Signale die vom Arduino Richtung GPS Modul geschickt werden, müssen entsprechend mit einem Spannungsteiler um 33% verringert werden.

ST-1.jpg

Ich habe für R1 800Ohm und für R2 1600 Ohm verwendet. Der genaue Wert ist hier nicht so sehr von Bedeutung. Wichtig ist nur, dass R2 doppelt so groß wie R1 ist und nicht mehr als 3 mA Strom fließen.

Verkabelung Arduino/SD-Kartenleser

Sowohl das Arduino Nano als auch der SD Kartenleser werden im nächsten Schritt zusammen verkabelt. Die beiden Komponenten stellen somit die Basiseinheit für den GPS Datenlogger dar. Das GPS Modul wird explizit nicht mit den beiden Komponenten fix verlötet, damit dieses später im Modell optimal ausgerichtet bzw. positioniert werden kann.
Sinnvoll ist es, die scharfen Kanten der Platinen ein wenig abzurunden, damit sich der Schrumpfschlauch an diesen Stellen nicht aufscheuern kann.

Arduino_Logger-2.jpg

Im ersten Schritt wird mit dem Lötkolben die Stiftleiste am SD Kartenleser entfernt und entsprechende Litzen an der Platine verlötet. Da das Arduino und der SD Kartenleser später fix verdrahten werden, nehmen die Stiftleisten nur unnötig Platz weg. Für solche Lötarbeiten hat sich zum Fixieren der Komponenten Wäscheklammern als hilfreich herausgestellt.

Arduino_Logger-3.jpg

Damit die Lötstellen gegen mögliche Kurzschlüsse geschützt sind, sollte zur Isolation eine Schicht mit Heißkleiber an den entsprechenden Stellen aufgebracht werden. Die CS (Chip Select) Leitung wurden hier mit verdrahtet. Wenn allerdings keine weiteren Komponenten mit am SPI Bus verbunden sind, kann diese fix verdrahtet werden.

Arduino_Logger-4.jpg

Im nächsten Schritt wird der Kartenleser mit dem Arduino Nano verlötet. Die Pin Belegung ist dabei bis auf den CS (Chip Select) aufgrund der Hardware fix vorgegeben. Verbunden werden muss also wie folgt:

• MOSI – Pin 11
• MISO – Pin 12
• CLK – PIN 13
• CS – PIN 5 ( nicht Hardwaregebunden, andere Pins können ebenfalls verwendet werden)

Ebenfalls ist der VCC mit 5V und der GND Pin zu verbinden. Die Kunst besteht darin, die Kabel möglichst ideal zwischen den beiden Platinen zu verbinden, sodass nur wenig Stauraum benötigt wird.

Arduino_Logger-5.jpg

Das Arduino Nano verfügt über einen integrierten Spannungswandler, sodass dieses mit Spannungen zwischen 7-12V versorgt werden kann. Die Spannungsversorgung kann zum Beispiel im Modell über den Balancer Stecker durch 2 Lipo Zellen erfolgen. Die beiden PINS sind mit VIN und GND gekennzeichnet.

Um das GPS Modul nicht fest mit dem Arduino verlöten zu müssen, wird eine Buchsenleiste (RM 2,54mm) angebracht. Die Anschlüsse für TX und RX können später in der Software frei definiert werden, vorausgesetzt der PIN wird nicht schon für eine andere Anwendung benötigt. Hier auf dem Bild PIN 3 (D3) für RX und PIN4 (D4) für TX. An dieser Stelle sei nochmal erwähnt, dass zwischen der TX Arduino und RX GPS Leitung der Spannungsteiler eingebaut werden muss, damit das GPS Modul nicht beschädigt wird. Ebenfalls wird die Spannungsversorgung ( 3,3V und GND) verlötet.

Arduino_Logger-6.jpg

Sobald die Buchsenleiste fertig verlötet ist, wird diese mit einem Tropfen Sekundenkleber auf der Platine fixiert.

Arduino_Logger-7.jpg

Im letzten Schritt wird noch eine LED mit entsprechenden Vorwiderstand verbaut, damit der Zustand des Datenloggers visuell dargestellt werden kann. In diesem Beispiel wurde eine 5mm LED verwendet. Eine kleinere LED ist für diese Anwendung in jedem Fall sinnvoller. Die LED auf dem Arduino Nano kann nicht verwendet werden, da dieser PIN/LED für den SPI Bus benötigt wird.

Arduino_Logger-8.jpg

Zu guter Letzt werden Arduino und der SD Kartenleser miteinander verschrumpft. Für die Spannungsversorgung wird eine Stiftleiste benötigt, sofern man die Versorgung über den Balancerstecker am Lipo Akku bevorzugt.
Fertig verkabelt kann das Ergebnis wie folgt aussehen:

Arduino_Logger-10.jpgArduino_Logger-9.jpg

Ich hoffe mit diesem Beitrag ein wenig zum Nachbauen animieren zu können. Vielleicht gibt es für den Aufbau noch elegantere Lösungen. Freue mich auf Fotos von euren Loggern:). In den nächsten Tagen werde ich ein paar Zeilen zur Software posten.

Gruß Max
 
Genial! Den werde ich mir auch bauen! Vom Aufbau her nix, was nicht zu machen wäre!
Bei der Programmierung wirds dann schon etwas schwierig (zumindest für mich - NixProgrammierSprachenBeherrscher).
Habe bis jetzt erst 1 Arduino Nano Projekt hinter mir - eine 9Kanal Lichtsteuerung für eine Passagiermaschine, quasi ein digitaler Ein/Ausschalter. Simulierte LED Antikollisionslichter/Blitzer am Bauch und Seitenleitwerk, an den Flügelspitzen je 3LEDs, die als Lauflicht abwechselnd einschalten.
Einen Anfang zu finden war nicht einfach, aber ein Freund (beruflich SPS Programmierer) unterstütze mich.
 
Servus Max!

Also damit hast du jetzt was losgetreten...haben will!

Mal ne Frage:
Gibt's ein Dokumentation davon, wie die Daten vom GPS-Modul kommen und ausgewertet werden können?
Sprich das errechnen von Geschwindigkeit, Variowerte, etc., wohl wissend, daß deren Genauigkeit nicht sooo der Hammer sein wird?

Hintergrund ist folgender:

Ich verwende das FrSky System (Taranis E).
Hier gibt eine tolle Library für den Arduino

http://www.rcgroups.com/forums/showthread.php?t=2245978

(ich hoffe der Link ist erlaubt?)

die es ermöglicht, vom Arduino ermittelte Sensorwerte in das FrSky Telemetriesystem "einzuspeisen" (auch parallel zu "echten" FrSky-Sensoren).

Damit ist es sogar möglich, günstige Fremdsensoren zu verwenden.
Zur Zeit nutze ich den brushless RPM Sensor (ca. 3 € beim Chinesen), den 100A Strom-Sensor ( ca. 17€ beim Chinesen) von Orange sowie einen Eigenbau-Drehzahlsensor mittels Hallgeber und Magnet im 500er Heli (da der brushless Sensor nur bis ca. 30.000 U/min funktioniert und am Motor bei 6s mehr anliegen können).

Denkbar wäre auch der Einsatz eines MS5611 wie im OpenXSensor Vario verwendet wird oder eine Einzelzellenüberwachung über mehrere Spannungsteiler.....ich schweife ab!

Nun wäre natürlich auch ein GPS System interessant wie es du hier zeigst.
Mir geht's dabei jedoch eher um Daten wie Geschwindigkeit und Höhe und darum, diese zur Taranis zu übertragen.
Dazu muß der Arduino die entsprechenden Werte vorher ausrechnen....und das ist jetzt der Punkt wo´s bei mir momentan scheitert....

Kannst du mir hier einen Tip geben?

LG
Daniel
 
Inzwischen bin ich ein wenig weiter, wen´s interessiert:

es gibt eine Doku auf der Arduino-Homepage:

http://playground.arduino.cc/Tutorials/GPS

Auf der Seite sind auch noch ein 2. Beispiel sowie eine Erklärung der GPS-Datenströme verlinkt.

Demzufolge kommen die Daten vom GPS-Empfänger seriell und müssen Byte für Byte ausgelesen werden.

Die von mir angesprochenen Daten wie Geschwindigkeit oder Höhe kommen direkt vom Sensor selber, müssen also nicht erst vom Arduino kalkuliert werden.

Wenn ich alles richtig verstanden habe dann vom GPS Empfänger verschiedene Datenströme.

$GPRMC bspw. liefert Koordinaten, Geschwindigkeit, Kurs,etc...
$GPGGA wiederum liefert zusätzlich auch die Höhe, dafür aber keinen Kurs.

Welche dieser Ströme (da gibt's ne Menge) geliefert werden, hängt wohl vom GPS Empfänger ab.

In der Zwischenzeit habe ich schon einen Arduino Sketch geschrieben, da allerdings mein Empfänger noch nicht da ist kann ich diesen noch nicht testen.

Sobald das geschehen ist werde ich weitermachen und dann irgendwann mal, sofern ich es zum laufen bringe, getrennt von hier veröffentlichen.
 
Software Teil

Software Teil

Hallo,
nun ist doch ein wenig mehr Zeit vergangen, da ich noch auf das neue GPS gewartet habe. Auch haben sich dadurch in der Software noch ein paar Schwierigkeiten ergeben, die ich aber zwischenzeitlich (hoffentlich) behoben habe. Ich verwende nun das GPS mit dem u blox NEO-6M. Preislich sind die beiden Module im Vergleich zu dem oben gezeigten identisch. Das NEO bietet jedoch wesentlich mehr Einstellmöglichkeiten.

NEO-1.jpgNEO-2.jpg

Bei diesem GPS müssen keine Spannungsteiler zwischen Arduino TX und GPS RX Leitung eingelötet werden. Die Spannungsversorgung sollte jetzt über einen der 5V Pins erfolgen.
Software
Hier wird bis auf die GPS Library auf die Arduino Libraries zurückgegriffen. Für den Betrieb wurde die SoftwareSerial Library ein wenig modifiziert, dazu aber später mehr. Benötigt/verwendet werden:
• <TimerOne.h>, Wird zur Ansteuerung der Status LED benötigt
• <TinyGPS++.h> Library zum Auswerten der empfangenen GPS Informationen. Download: http://arduiniana.org/libraries/tinygps/
• <SoftwareSerial256.h>, Zum Empfangen der seriellen GPS Signale
• <SPI.h>, Schnittstelle zum SD Karten leser
• <SD.h>, Library für das Handling mit dem Kartenleser

Programmablauf:
Zu Beginn werden die Objekte für die serielle Schnittstelle „ss“ und dem GPS „gps“ angelegt und die globalen Variablen deklariert und initialisiert.
In der void Setup wird das GPS und der Timer für die Status LED initialisiert sowie der Pin für die LED und dem SD Chip Select entsprechend aktiviert. Besonders interessant ist hier sicherlich die „GPS_Setup()“ Funktion. Hier wird die Baudrate von 9600 auf 57600 gesetzt, die Wiederholrate auf 5 Hz gesetzt sowie nicht benötigte Datenpakete (GPGSA, GPGSV und GPGLL) deaktiviert.
Das Hauptprogramm wird dabei per State Machine gesteuert. Zu Beginn wartet die Software auf 3 verfügbare Satelliten. Dieser Wert kann/soll auf die eigenen Bedürfnisse abgestimmt werden. Sobald 3 Satelliten verfügbar sind, wechselt der Datenlogger in den Zustand „CREATE_FILENAME“. Jetzt wird der Filname erstellt. Dieser hat das Format „hh_mm“ (Stunde_Minute). Aufgrund unserer Zeitzone wird die Zeit um 2 erhöht. Dementsprechend gibt es natürlich um 24 Uhr zu einem Fehler, da nimmt den Logger aber eh keiner her ;-).
Wenn der Filname erstellt ist, wechselt der Logger in den Modus „RECORD“. Ab jetzt beginnt das Loggen der Informationen. Sollten plötzlich die Anzahl der verfügbaren Satelliten abfallen, so wird der Status „RECORD“ nicht verlassen.

Während der Aufzeichnung sieht der Programmanlauf wie folgt aus:

1. Get_GPS_Values(); -> GPS Informationen werden eingelesen. 5 Hz @ 57600 Baud
2. Check_Update(); -> Hier wird überprüft, ob neue Informationen vorliegen. Sollte ein Wert nicht aktualisiert worden sein, wird der Status in „WAIT_UPDATE“ wechseln. Sollte beim nächsten Durchlauf wieder ein neues Datenpaket vorhanden sein, wird das in die SD Datei geschrieben.
3. Write_Data(); -> Empfangene Daten werden auf die SD Karte geschrieben.

Im Interrupt (alle 100 ms) wird die Status LED gesteuert. In der Funktion werden für alle möglichen Zustände die Blinksequenzen eingestellt. Der erste Wert in der Funktion „LED_Flash“ gibt an wie oft die LED hintereinander blinken soll. Die Zweite Zahl wie lange nach der Blinksequenz Pause ist. Das kann natürlich nach beliebig angepasst werden.

Anmerkung zu #include <SoftwareSerial256.h>
Die die Informationen vom GPS größer als 64 Byte sind, reicht die Standard „SoftwareSerial“ Library nicht aus. Der Buffer kann jedoch einfach nach oben korrigiert werden. Dazu wurde die Standard Library kopiert und entsprechend angepasst. Somit kann diese weiter verwendet werden. Die „neue“ Library <SoftwareSerial256.h> hat einen 4x größeren Buffer von 256 Byte. Diese habe ich ebenfalls im Anhang beigefügt. Die Library muss in die Arduino Software entsprechend eingefügt werden (Sketch->Include Library->Add .ZIP Library) .

Software Auswertung:
Für die Auswertung der Dateien hat sich die Software (kostenlos - http://www.gps-track-analyse.de/) GPS Tracker Analyse als hilfreich herausgestellt. Die Logdateien können eingelesen und ausgewertet werden. Dazu erstellt man unter „Datei->Import-Filter verwalten“ für den Datenlogger am besten ein eigenes File. Das sollte wie folgt aussehen:



Noch eine generelle Anmerkung zur Software. Diese soll ein Grundgerüst darstellen. Die Grundlegende Funktion ist vorhanden. Bugs sind jedoch nicht ausgeschlossen ;-). Für Verbesserungsvorschläge bin ich dankbar.


Hinweis vom Moderator: Der Bitte von Maxi folge leistend, sind die Anhänge entfernt worden, mit dem Verweis, sich bitte hier zu melden:
http://www.rc-network.de/forum/show...-DIY-Projekt?p=3957147&viewfull=1#post3957147
 
Zuletzt bearbeitet von einem Moderator:

kreidler

User
Hi Max,

danke für die Ideen. Ein paar meinten hier schon FRSky-Anbindung. Ich werde über den Winter mal einen nachbauen und mangels FrSky versuchen M-LINK einzubauen. Dazu gibt es auch eine Bibliothek.

Kannst Du eventuell noch ein paar Links zu den Bezugsquellen des Kartenlesers und des GPS-Moduls posten, da es dort doch den einen oder anderen Unterschied geben könnte, wenn man nicht 200% aufpasst.

Gruß Matthias
 
Hallo Matthias,

Mal ne Frage:
Gibt's ein Dokumentation davon, wie die Daten vom GPS-Modul kommen und ausgewertet werden können?
Sprich das errechnen von Geschwindigkeit, Variowerte, etc., wohl wissend, daß deren Genauigkeit nicht sooo der Hammer sein wird?

Bei den UBlox GPS Modulen kann man per Software einstellen welche Informationen alles verschickt werden. Das kann man wie in meinem Programmbeispiel manuell durch beschreiben der jeweiligen Register erledigen. Auch bietet UBlox eine Software an, womit sich genau solche Einstellungen vornehmen lassen (https://www.u-blox.com/de/product/u-center-windows). Die Software ist kostenlos. Auf Youtube findet man dazu auch Informationen. Schau' dir einfach mal die Datenblätter des NEO6m Chips an, dort findest du einige Infos.
Es gibt mit Sicherheit Lösungen die genauer als das GPS arbeiten. Das muss aber jeder selbst entscheiden wie genau es für die jeweiligen Anwendungen sein soll.

Ich habe folgende Komponenten verwendet:
 
Hallo Matthias,
Bei den UBlox GPS Modulen kann man per Software einstellen welche Informationen alles verschickt werden. Das kann man wie in meinem Programmbeispiel manuell durch beschreiben der jeweiligen Register erledigen.

Ich habe mir in der Zwischenzeit sowohl dein Programmbeispiel als auch das gut 200seitige Datenblatt des NEO6m angesehen.

In deinem Programm deaktivierst du diverse Einstellungen bspw. folgendermaßen:

Code:
unsigned char Set_Message1[]={0xB5, 0x62, 0x06, 0x01, 0x03, 0x00, 
                               0xF0, 0x02, 0x00, 0xFC, 0x13};             // GPGSA deaktivieren
ss.write(Set_Message1,sizeof(Set_Message1));
delay(50);
unsigned char Set_Message2[]={0xB5, 0x62, 0x06, 0x01, 0x03, 0x00, 
                                0xF0, 0x03, 0x00, 0xFD, 0x15};            // GPGSV deaktivieren
ss.write(Set_Message2,sizeof(Set_Message2));

Wie´s funktioniert ist mir also grundsätzlich schon mal klar, meine Frage wäre aber jetzt, woher du die Hex-Werte der einzelnen Einstellunen hast?
Im 200Seiten NEO6m Schmöker habe ich nicht wirklich etwas hierzu gefunden?

mfg
Daniel
 

kreidler

User
Ich habe mir in der Zwischenzeit sowohl dein Programmbeispiel als auch das gut 200seitige Datenblatt des NEO6m angesehen.

In deinem Programm deaktivierst du diverse Einstellungen bspw. folgendermaßen:

Code:
unsigned char Set_Message1[]={0xB5, 0x62, 0x06, 0x01, 0x03, 0x00, 
                               0xF0, 0x02, 0x00, 0xFC, 0x13};             // GPGSA deaktivieren
ss.write(Set_Message1,sizeof(Set_Message1));
delay(50);
unsigned char Set_Message2[]={0xB5, 0x62, 0x06, 0x01, 0x03, 0x00, 
                                0xF0, 0x03, 0x00, 0xFD, 0x15};            // GPGSV deaktivieren
ss.write(Set_Message2,sizeof(Set_Message2));

Wie´s funktioniert ist mir also grundsätzlich schon mal klar, meine Frage wäre aber jetzt, woher du die Hex-Werte der einzelnen Einstellunen hast?
Im 200Seiten NEO6m Schmöker habe ich nicht wirklich etwas hierzu gefunden?

mfg
Daniel

Ich habe mal die Suchfunktion im PDF (https://www2.u-blox.com/images/down...DescriptionProtocolSpec_(GPS.G6-SW-10018).pdf) benutzt: Ab Kapitel 22 / Seite 96 UBX Protocol

Every Message starts with 2 Bytes: 0xB5 0x62
dann kommt
31.9 set CFG-MSG (0x06 0x01)
und
2 Bytes Länge der 'Payload' 0x03 0x00
daher dann
3 Bytes mit Angaben nach Kapitel 19:
0xF0 0x02 0x00 -> GSA
0xF0 0x03 0x00 -> GSV
und 2 Bytes Prüfsumme nach Kapitel 26

Was ich jetzt nicht verstanden oder überlesen habe, ist, wann eingeschaltet bzw. ausgeschaltet wird?
Vielleicht kann Max ja etwas dazu schreiben.

Gruß Matthias
 
Hallo Matthias,

was meinst du damit wann ein- oder ausgeschaltet wird?
Die Frage von Daniel hat sich nach deiner Antwort denke ich mal beantwortet.

Gruß Max
 

kreidler

User
was meinst du damit wann ein- oder ausgeschaltet wird?

Laut deinem Kommentar im Code schreibst Du "deaktivieren". Woher weisst Du, wann z.B. GSA aktiviert ist oder wie kann man GSA wieder aktiveren, falls es ausgeschaltet wurde?

Ist das die Bedeutung von dem dritten Byte?
0xF0 0x02 0x00 -> GSA deaktivieren
bzw.
0xF0 0x02 0x01 -> GSA aktivieren
Liege ich damit richtig oder komplett falsch. Ansonsten würde ja theoretisch die 2 Byte Version ausreichend sein.

Ich habe mich noch nicht weiter eingelesen und war dieser Punkt für mich momentan nicht herauszufinden.

Gruß Matthias
 
Hallo zusammen!

Was das Thema Übertragung der GPS Daten per Telemetrie (funktioniert nur mit den X-Empfängern) angeht habe ich es folgendermaßen gelöst.

Ich verwende diesen GPS-Empfänger:

http://www.ebay.at/itm/252100899673?_trksid=p2060353.m2749.l2649&ssPageName=STRK:MEBIDX:IT

sowie einen Arduino Nano.

Verkabelung wie folgt:

3,3V Arduino ---------> GPS VCC
Gnd Arduino ----------> GPS Gnd
RX Arduino (Pin0) ----> GPS TX
TX Arduino (Pin1) ----> GPS RX

Als Libraries benötigt man


Der Code stammt zum Großteil von hier (Post #2): http://www.rcgroups.com/forums/showthread.php?t=2482328
(Wer die Geschichte mit den D-Empfängern verwenden will findet hier auch den notwendigen Code dafür...)

So hat man für ca. 10€ (GPs) + 3 € (Arduino Clone) ein funktionierendes GPS Telemetrie-System, welches für kleines Geld auch noch um ein Vario erweitert werden kann (siehe dazu ebenfalls der oben angeführte Post)
Bei mir läuft zusätzlich sogar noch Drehzahl- & Strommessung über den Arduino, mittels preiswerter Orange Sensoren von HK! Gesamtkosten für die Telemetrieeinheit somit keine 40€!



lg
Daniel
 
Hier noch der zugehörige Code:

Code:
/*
  Author: flarssen, 05/2015
  GPS to FrSky Telemetry interface,
  using 
  FrSky S-Port Telemetry library http://www.rcgroups.com/forums/showthread.php?t=2245978
  TinyGPS library http://arduiniana.org/libraries/tinygps/
*/
#include <SoftwareSerial.h>
#include <TinyGPS.h>
#include "FrSkySportSensor.h"
#include "FrSkySportSensorGps.h"
#include "FrSkySportSingleWireSerial.h"
#include "FrSkySportTelemetry.h"

#define NO_PIN 255        
#define LED_PIN 13                     // the pin connected to onboard LED
#define PIN_SerialTelemetryTX 12       // the pin to use for serial data to the FrSky receiver

SoftwareSerial serialD(NO_PIN, PIN_SerialTelemetryTX, true);
FrSkySportSensorGps gps;                // Sport GPS sensor
FrSkySportTelemetry telemetry;          // Sport telemetry object
TinyGPS tinyGps;                        // GPS object

uint32_t currentTime, sentenceTime1, sentenceTime2;
byte gpsSentences = 0;

void SetXGpsData(void)
{
  int year;
  byte month, day, hour, minute, second, hundredths;
  float flat, flon, falt, fc, fmps;
  unsigned long age;
  
  tinyGps.f_get_position(&flat, &flon, &age);
  falt = tinyGps.f_altitude(); // +/- altitude in meters
  fc = tinyGps.f_course(); // course in degrees
  fmps = tinyGps.f_speed_mps(); // speed in m/sec
  tinyGps.crack_datetime(&year, &month, &day, &hour, &minute, &second, &hundredths, &age);
  gps.setData(flat, flon, falt, fmps, fc, year-2000, month, day, hour, minute, second);
}

void setup()
{
  pinMode(LED_PIN, OUTPUT); 
  telemetry.begin(FrSkySportSingleWireSerial::SOFT_SERIAL_PIN_12, &gps);
  Serial.begin(9600);
}

void loop() {
  while (Serial.available() > 0) {
    if (tinyGps.encode(Serial.read())) { // if a NMEA sentence is complete 
      if (!gpsSentences)  // if first of two sentences
        sentenceTime1 = millis();  // timestamp sentence 1
      else
        sentenceTime2 = millis();  // timestamp sentence 2
      gpsSentences++;
    }
    if (gpsSentences > 1) { // if more then one sentence
      if (sentenceTime2 - sentenceTime1 > 175) {// sentences not from same dataset, resync
        sentenceTime1 = sentenceTime2;
        gpsSentences = 1;
      }
      else { // process GPS data
        digitalWrite(LED_PIN, HIGH);
          SetXGpsData();
        digitalWrite(LED_PIN, LOW);
        gpsSentences = 0; 
      }
    }
  }
  telemetry.send();
}
 
Laut deinem Kommentar im Code schreibst Du "deaktivieren". Woher weisst Du, wann z.B. GSA aktiviert ist oder wie kann man GSA wieder aktiveren, falls es ausgeschaltet wurde?

Ist das die Bedeutung von dem dritten Byte?
0xF0 0x02 0x00 -> GSA deaktivieren
bzw.
0xF0 0x02 0x01 -> GSA aktivieren
Liege ich damit richtig oder komplett falsch. Ansonsten würde ja theoretisch die 2 Byte Version ausreichend sein.

Ich habe mich noch nicht weiter eingelesen und war dieser Punkt für mich momentan nicht herauszufinden.

Gruß Matthias

Hallo Matthias,

ich habe zu Beginn mir angeschaut welche Pakete alle übertragen werden und welche ich überhaupt benötige. Dabei habe ich gesehen, dass GPGSA und GPGSV nicht nötig sind. Zumindest nicht für mein Vorhaben. Wie man die Pakete wieder aktiviert habe ich noch nicht nachgesehen. Viele Möglichkeiten gibt es allerdings nicht. Entweder wie deine oben beschrieben oder der gleiche Wert wird nochmal gesendet, also eine Art toogle.
Bei meinem Beispiel werden die Einstellungen jedes mal neu gesetzt. Es besteht auch die Möglichkeit diese fest abzuspeichern. Das macht aber meiner Meinung nach nicht viel Sinn, denn dann müsste man nur einmal dieses Setup starten und später erst das Programm für den wirklichen Logger aufspielen. Finde ich ein wenig zu umständlich.

Gruß Maxi
 
Hi zusammen,

habe vor einigen Wochen auch mit dem Arduino angefangen, eins meiner Ziel ist, damit Telemetrie Sensoren für Jeti selbst zu bauen.

Nun habe ich diesen hier gezeigt GPS Datenlogger auf dem Steckbrett nachgebaut und hatte doch mit so einigen Problemen zu kämpfen. Das von Maxi hier angebotene SoftwareSerial256 habe ich gar nicht zum arbeiten bewegen können, deshalb habe ich es erst mal mit dem SoftwareSerial.h aufgebaut was soweit gut funktioniert.
Ich habe es für mich Stück für Stück mit den im GPS_Logger.ino und GPS_Logger_Funktionen.ino Programmteilen und Funktionen neu aufbauen müssen.

Die im Programm genutzte Setup Routine (GPS_Setup) habe ich mit meinem NEO-6M GPS Modul noch gar nicht zum funktionieren gebracht, da arbeite ich nun dran.

Nichts desto trotz habe ich ein funktionirenden GPS Logger hinbekommen.

Was mir aufgefallen ist, das die Datein auf der SD Card alle den gleichen Datum/Zeitstempel haben, das hat mich gestört. Also bin aich im I-Net auf die Suche gegangen und habe auch eine einfache Lösung gefunden um mit den Datum/Zeit Daten des GPS Moduls den Datum/Zeitstempel der geschriebenen Datei zu schreiben.

Da ich noch auf das Micro SD carden Modul warte, habe ich noch kein fertiges Bild zu liefern.

Danke für die Vorlage :-)

Im Bild mein aktuelle "Gesteck" achja, die beiden zusätzlichen LEDs zeigen mir den Zutand der SD Card an, da ich Probleme hatte das sie nur bei jedem zweiten "Booten" erkannt wurde

GPS_Logger.jpg
 
Hallo Andi,

lade doch bitte mal dein Programm hoch, bin neugierig:D
Bist dir sicher das du ein NEO GPS Modul erwischt hast? Sieht auf dem ersten Blick nicht so aus.
 

kalle123

User
Das von Maxi hier angebotene SoftwareSerial256 habe ich gar nicht zum arbeiten bewegen können, deshalb habe ich es erst mal mit dem SoftwareSerial.h aufgebaut was soweit gut funktioniert.

Same here ...

Was ist denn da los? Werde die Schaltung auch mal auf dem Steckbrett aufbauen ....

Nur wenn ich dies hier lese ... ? Schade!

Anmerkung zu #include <SoftwareSerial256.h>
Die die Informationen vom GPS größer als 64 Byte sind, reicht die Standard „SoftwareSerial“ Library nicht aus. Der Buffer kann jedoch einfach nach oben korrigiert werden. Dazu wurde die Standard Library kopiert und entsprechend angepasst. Somit kann diese weiter verwendet werden. Die „neue“ Library <SoftwareSerial256.h> hat einen 4x größeren Buffer von 256 Byte. Diese habe ich ebenfalls im Anhang beigefügt. Die Library muss in die Arduino Software entsprechend eingefügt werden (Sketch->Include Library->Add .ZIP Library) .



Auch die "example" nehmen die lib nicht Auswertung_5.png

Gruß KH
 
Hallo,

sorry das ich mich jetzt erst melde. Ich bin noch ein paar Tage schwer beschäftigt. Spontan würde ich sagen das ihr SoftwareSerial256.h includieren müsst und nicht SoftwareSerial.h. Vermutlich habe ich da etwas nicht ganz korrekt angepasst.

Werde mir das Problem in den nächsten Tagen nochmal ansehen, sofern es nicht klappen sollte

Gruß Maxi
 
Ansicht hell / dunkel umschalten
Oben Unten