GPS UP501 ,MPU-6050 und SD-Karte.

Hallo zusammen,
Kurze Projekt erklärung:
Der MPU-6050 soll mit hilfe des UP501 die Kurvenlage und die Position eines Motorrads auf der SD-Karte speichern.

Momentanes Problem:
Der GPS-Sensor sendet die Ausgegeben Zeilen nicht als ganzen Block, sondern als einzelne Zeichen, weshalb ich es nicht vernünftig auf der SD-Karte speichert und ich auch nicht gleichzeitig die Werte des MPU-6050 speichern kann.

Momentane Gespeicherte Werte(Beispiel):

G
P
S
:
1
2
5
4
6
6
N
3
X:2123 Y:1356 Z:1563

S
F
5
2
1
,
:
und so weiter

Wunsch:
Program Mit dem man auf einer Karte Die Strecke und den Winkel sieht.
Besseres abspeichern:

GPS:256,113220,1N15613:
X:1561 Y:1651 Z:1353

GPS:131,156156,1N16515:
X:1156 Y:1176 Z:1155
usw.

mfg frek07

Dann solltest du zumindest mal den Code zeigen...

Hatte einen Fehler übersehen.
Die SD Karte Speicherte mit dataFile.println() ,was dann das halbe Speicherproblem erklärt.
Den MPU-6050 hab ich noch garnicht miteingebunden, weil der meines Erachtens nach dann immer in den Zeichen rum "Trollt".
Hab momentan keinen Arduino zurhand.
Mein Lehrer meinte grade dass man die einzelnen Zeichen als Zeichenkette zwischenspeichern kann.
Weis wer wie man das machen Könnte?

#include <SoftwareSerial.h>
#include <SPI.h>
#include <SD.h>

const int chipSelect = 4;
char GPS;
SoftwareSerial mySerial(2, 3); // RX, TX ... the 10 is what matters based on my suggested wiring above
#define PMTK_SET_NMEA_UPDATE_1HZ  "$PMTK220,1000*1F"
//#define PMTK_SET_NMEA_UPDATE_5HZ  "$PMTK220,200*2C"
//#define PMTK_SET_NMEA_UPDATE_10HZ "$PMTK220,100*2F"

// turn on only the second sentence (GPRMC)
#define PMTK_SET_NMEA_OUTPUT_RMCONLY "$PMTK314,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0*29"
// turn on ALL THE DATA
//#define PMTK_SET_NMEA_OUTPUT_ALLDATA "$PMTK314,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0*28"
void setup()
{
  Serial.begin(115200);
  Serial.println("Adafruit MTK3329 NMEA test!");

  Serial.print("Initializing SD card...");
  // see if the card is present and can be initialized:
  if (!SD.begin(chipSelect)) {
    Serial.println("Card failed, or not present");
    // don't do anything more:
    return;
  }
  Serial.println("card initialized.");


  // 9600 NMEA is the default baud rate
  mySerial.begin(9600);

  // uncomment this line to turn on only the "minimum recommended" data for high update rates!
  mySerial.println(PMTK_SET_NMEA_OUTPUT_RMCONLY);

  // uncomment this line to turn on all the available data - for 9600 baud you'll want 1 Hz rate
  //mySerial.println(PMTK_SET_NMEA_OUTPUT_ALLDATA);

  // Set the update rate
  // 1 Hz update rate
  mySerial.println(PMTK_SET_NMEA_UPDATE_1HZ);
  // 5 Hz update rate- for 9600 baud you'll have to set the output to RMC only (see above)
  //mySerial.println(PMTK_SET_NMEA_UPDATE_5HZ);
  // 10 Hz update rate - for 9600 baud you'll have to set the output to RMC only (see above)
  //mySerial.println(PMTK_SET_NMEA_UPDATE_10HZ);
}

void loop() // run over and over
{

  if (mySerial.available()) {
    GPS = (char)mySerial.read();
    Serial.print(GPS);
    File dataFile = SD.open("GPS.txt", FILE_WRITE);
    dataFile.print(GPS);
    dataFile.close();
  }

if (Serial.available()) {
  mySerial.print((char)Serial.read());
}
}

Frek07:
Mein Lehrer meinte grade dass man die einzelnen Zeichen als Zeichenkette zwischenspeichern kann.
Weis wer wie man das machen Könnte?

Dein Programm arbeitet viel zu ineffektiv, weil Du jedes einzelne Zeichen so schreibst:

  • öffne die Datei
  • schreibe ein Zeichen
  • schließe die Datei

Da die Aktionen "öffne die Datei" und "schließe die Datei" um ein Vielfaches länger dauern als "schreibe ein Zeichen", verbraucht Dein Programm beim Loggen der Daten die mehr als tausendfache Zeit wie es notwendig wäre.

Was Dein Lehrer nun vorschlägt wäre: Sammele die Zeichen einer kompletten Zeile in einem String zusammen und schreibe dann mit der Logik:

  • öffne die Datei
  • schreibe eine ganze Zeile
  • schließe die Datei

Ich hätte da aber noch eine andere Idee, allerdings nicht getestet, vielleicht probierst Du mal diese Logik mal aus:

File dataFile;

void loop() // run over and over
{

  if (mySerial.available()) {
    GPS = (char)mySerial.read();
    dataFile.print(GPS);
    Serial.print(GPS);
    if (GPS=='\n') // bei erkanntem Zeilenende
    {
      // hier ggf. Funktion aufrufen zur Ausgabe von X, Y, Z
      dataFile.close(); // Datei schließen
      dataFile = SD.open("GPS.txt", FILE_WRITE); // und sofort wieder öffnen
    }
  }

if (Serial.available()) {
  mySerial.print((char)Serial.read());
}
}

Dabei wäre das Filehandle 'dataFile' eine globale Variable, alle Schreibvorgänge bis zum ersten Zeilenende schlagen fehl (weil die Datei bis dahin nicht geöffnet ist) und es können am Anfang der Datei keine "halben Zeilen" auftreten. Ab dem ersten eingetroffenen Zeilenende dann wird die Datei dann immer geschlossen und sofort wieder geöffnet, und alle nachfolgenden Schreibvorgänge im Program können dass das geöffnete Dateihandle verwenden, womit die Schreibrate des Programms sehr viel höher sein kann.

Das Zeilenende vom GPS mußt Du ja sowieso erkennen können, weil das immer der Punkt ist, wo Du nachfolgend die X,Y,Z-Werte in einer Zeile ausgeben möchtest.

P.S.: Die zu Arduino mitgelieferte "SoftwareSerial" Library ist eine der schlechtesten Libraries, die mitgeliefert wird. Bei gleichzeitiger Verwendung von "Serial" und "SoftwareSerial" ist Buchstabensalat vorprogrammiert. Besser wäre es, Du installierst Dir die zusätzliche "AltSoftSerial" Library, die funktioniert um Längen besser. Allerdings nicht bei freier Pinwahl für RX/TX: Je nach Board mußt Du zusammen mit AltSoftSerial fest vorgegebene Pins verwenden, beim UNO wären das also beispielsweise Pin-8 für RX und Pin-9 für TX.

Top!!!
Vielen Lieben dank :smiley:

nächstes großes problem:
Die MPU-6050 Werte mit in die Karte einbinden.

hier der link von der Seite, wo ich die GPRMC-Daten decodiere:

kleines problem:
gelegentlich abgehackte zeilen...

ax;ay;az;gx;gy;gz;ms;GPRMC

-3596	1513	5604	1155807	$GPRMC,160634.800,A,5227.2830,N,00722.4878,E,0.72,341.28,110615,,,A*64
452	1732	13216	-1102	-6275	5475	1156014	$GPRMC,160635.000,A,5227.2830,N,00722.4879,E,0.75,342.71,110615,,,A*64
-1800	1624	10104	-2383	-4988	824	1156210	$GPRMC,160635.200,A,5227.2830,N,00722.4880,E,0.75,356.52,110615,,,A*64
-3020	-196	16344	-2048	3232	-1829	1156408	$GPRMC,160635.400,A,5227.2830,N,00722.4882,E,0.73,0.34,110615,,,A*66
-2508	440	13668	1092	444	2246	1156605	$GPRMC,160635.600,A,5227.2830,N,00722.4882,E,0.69,0.34,110615,,,A*6F
724	-1228	8312	222	-4902	1860	1156999	$GPRMC,160635.800,A,5227.2829,N,00722.4883,E,0.45,0.34,110615,,$GPRMC,160636.000,A,5227.2825,N,00722.4883,E,0.29,0.34,110615,,,A*6B
-504	2488	12888	331	-2866	7780	1157204	$GPRMC,160636.200,A,5227.2821,N,00722.4883,E,0.25,0.34,110615,,,A*61
-1016	948	10608	-2474	-3639	5569	1157407	$GPRMC,160636.400,A,5227.2819,N,00722.4884,E,0.24,0.34,110615,,,A*6A
-2460	100	14884	-1240	-265	2874	1157604	$GPRMC,160636.600,A,5227.2820,N,00722.4884,E,0.25,0.34,110615,,,A*63
-1976	1364	11232	2774	491	2483	1157809	$GPRMC,160636.800,A,5227.2820,N,00722.4885,E,0.28,0.34,110615,,,A*61
2276	-1008	11752	-888	-5585	-2792	1158005	$GPRMC,160637.000,A,5227.2820,N,00722.4884,E,0.33,0.34,110615,,,A*63
-1568	-428	15396	-739	-1402	-1031	1158206	$GPRMC,160637.200,A,5227.2820,N,00722.4884,E,0.36,0.34,110615,,,A*64
976	-536	10400	-358	-4872	-4241	1158405	$GPRMC,160637.400,A,5227.2820,N,00722.4884,E,0.41,0.34,110615,,,A*62
-536	2080	12040	-645	770	-4793	1158605	$GPRMC,160637.600,A,5227.2820,N,00722.4884,E,0.47,0.34,110615,,,A*66
-2136	-2092	15440	-4321	3488	-2684	1158810	$GPRMC,160637.800,A,5227.2821,N,00722.4883,E,0.52,0.34,110615,,,A*6A
-3804	-3100	14236	2584	816	-4477	1159006	$GPRMC,160638.000,A,5227.2821,N,00722.4882,E,0.56,276.48,110615,,,A*60
-156	-704	10228	2340	-5507	-10576	1159208	$GPRMC,160638.200,A,5227.2818,N,00722.4884,E,0.55,276.48,110615,,,A*6D
-2788	840	14292	1396	3712	-703	1159408	$GPRMC,160638.400,A,5227.2818,N,00722.4884,E,0.53,276.48,110615,,,A*6D
-1968	-592	10832	-1938	1143	2734	1159608	$GPRMC,160638.600,A,5227.2817,N,00722.4884,E,0.50,276.48,110615,,,A*63
-2160	-20	11540	-4035	-1379	2789	1159808	$GPRMC,160638.800,A,5227.2817,N,00722.4885,E,0.47,276.48,110615,,,A*6A
-4784	-2248	14816	4703	4434	404	1160008	$GPRMC,160639.000,A,5227.2816,N,00722.4885,E,0.45,276.48,110615,,,A*60
-3136	-704	15436	2222	3907	-2305	1160210	$GPRMC,160639.200,A,5227.2817,N,00722.4885,E,0.44,276.48,110615,,,A*62
-2752	-1040	15976	-812	-180	1768	1160409	$GPRMC,160639.400,A,5227.2818,N,00722.4886,E,0.41,276.48,110615,,,A*6D
-2480	492	12940	-2443	-2630	-10452	1160805	$GPRMC,160639.600,A,5227.2819,N,00722.4886,E,0.38,276.48,110615$GPRMC,160639.800,A,5227.2819,N,00722.4886,E,0.36,276.48,110615,,,A*60
-820	840	16356	-2788	-142	-9851	1161005	$GPRMC,160640.000,A,5227.2819,N,00722.4885,E,0.34,276.48,110615,,,A*67
-4120	-832	12788	-4003	-4923	-5964	1161209	$GPRMC,160640.200,A,5227.2820,N,00722.4885,E,0.36,276.48,110615,,,A*6D
928	1072	11144	3886	-1105	-2405	1161408	$GPRMC,160640.400,A,5227.2820,N,00722.4885,E,0.40,276.48,110615,,,A*6A
1048	120	14888	-1829	-866	-761	1161612	$GPRMC,160640.600,A,5227.2822,N,00722.4884,E,0.44,276.48,110615,,,A*6F
-1904	2584	12644	4280	-10024	4109	1161807	$GPRMC,160640.800,A,5227.2824,N,00722.4881,E,0.60,292.02,110615,,,A*60
-1596	-352	11036	-3884	-5773	3431	1162008	$GPRMC,160641.000,A,5227.2827,N,00722.4882,E,0.63,300.66,110615,,,A*62
660	-840	15380	-476	-381	-519	1162208	$GPRMC,160641.200,A,5227.2829,N,00722.4881,E,0.67,305.77,110615,,,A*6C
-656	-876	13656	-4870	-2371	-2104	1162408	$GPRMC,160641.400,A,5227.2830,N,00722.4880,E,0.72,304.89,110615,,,A*67
2888	144	8096	2135	3062	-370	1162610	$GPRMC,160641.600,A,5227.2831,N,00722.4879,E,0.78,304.29,110615,,,A*62
-1264	-376	15560	-1844	-660	-3068	1162808	$GPRMC,160641.800,A,5227.2832,N,00722.4878,E,0.83,301.17,110615,,,A*62
-3236	1272	13096	-47	-1656	-7335	1163008	$GPRMC,160642.000,A,5227.2834,N,00722.4878,E,0.87,300.51,110615,,,A*68
-1268	-424	11804	450	-1007	-3209	1163210	$GPRMC,160642.200,A,5227.2835,N,00722.4876,E,0.92,299.87,110615,,,A*6B
72	-2756	12884	-4298	6458	-5061	1163412	$GPRMC,160642.400,A,5227.2838,N,00722.4869,E,1.11,301.90,110615,,,A*62
-1380	-3908	16376	-1425	587	-848	1163608	$GPRMC,160642.600,A,5227.2841,N,00722.4864,E,1.16,303.67,110615,,,A*6E
1040	-1380	13628	-2490	-1734	-2986	1163807	$GPRMC,160642.800,A,5227.2843,N,00722.4858,E,1.19,304.12,110615,,,A*67
-3104	-1520	14592	-740	-1729	-3801	1164008	$GPRMC,160643.000,A,5227.2844,N,00722.4853,E,1.17,304.57,110615,,,A*6D
-2944	-1116	13172	-2552	2139	-4606	1164207	$GPRMC,160643.200,A,5227.2844,N,00722.4853,E,1.12,305.10,110615,,,A*68852,E,1.09,305.53,110615,,,A*63
-3628	-2896	14204	2051	2847	-2489	1164610	$GPRMC,160643.600,A,5227.2845,N,00722.4851,E,0.61,306.70,110615,,,A*6F
-3788	-4312	13148	1045	840	-1524	1164808	$GPRMC,160643.800,A,5227.2845,N,00722.4850,E,0.60,309.42,110615,,,A*6F
-3736	-2712	13372	849	-72	-3086	1165007	$GPRMC,160644.000,A,5227.2846,N,00722.4850,E,0.56,313.86,110615,,,A*65
-3440	-2512	13704	747	479	-2205	1165207	$GPRMC,160644.200,A,5227.2846,N,00722.4849,E,0.54,318.04,110615,,,A*6C
-2564	-1628	12864	1059	361	-957	1165412	$GPRMC,160644.400,A,5227.2846,N,00722.4849,E,0.46,318.04,110615,,,A*69
-2480	-816	12176	-487	372	-1256	1165608	$GPRMC,160644.600,A,5227.2847,N,00722.4849,E,0.41,318.04,110615,,,A*6D
-2332	-784	9860	-820	308	-559	1165809	$GPRMC,160644.800,A,5227.2847,N,00722.4849,E,0.39,318.04,110615,,,A*6C
-4164	-876	12588	-1580	-205	-1400	1166012	$GPRMC,160645.000,A,5227.2848,N,00722.4848,E,0.57,318.04,110615,,,A*63
-3292	-3484	17888	5472	4658	-4987	1166215	$GPRMC,160645.200,A,5227.2848,N,00722.4848,E,0.58,317.40,110615,,,A*61
-5652	572	20060	-1404	-275	-4582	1166410	$GPRMC,160645.400,A,5227.2848,N,00722.4848,E,0.57,317.46,110615,,,A*6E
-16	1404	12140	1737	-3339	-1408	1166608	$GPRMC,160645.600,A,5227.2849,N,00722.4849,E,0.56,317.34,110615,,,A*68
2248	-920	10760	-5380	-1696	-2447	1166809	$GPRMC,160645.800,A,5227.2850,N,00722.4849,E,0.56,317.23,110615,,,A*68
2196	132	13296	-7682	-4307	6757	1167008	$GPRMC,160646.000,A,5227.2850,N,00722.4848,E,0.54,317.18,110615,,,A*68
-752	-2996	14820	1812	121	11616	1167212	$GPRMC,160646.200,A,5227.2850,N,00722.4849,E,0.51,317.18,110615,,,A*6E
-3380	-868	14640	2944	170	7272	1167408	$GPRMC,160646.400,A,5227.2850,N,00722.4848,E,0.45,317.18,110615,,,A*6C
-2440	-724	12772	-3123	-809	7259	1167607	$GPRMC,160646.600,A,5227.2851,N,00722.4848,E,0.40,317.18,110615,,,A*6A
-904	-420	12596	4078	1	5276	1167807	$GPRMC,160646.800,A,5227.2851,N,00722.4847,E,0.36,317.18,110615,,,A*6A
-2308	-2412	14928	-1242	741	9678	1168008	$GPRMC,160647.000,A,5227.2851,N,00722.4846,E,0.33,317.18,110615,,,4846,E,0.32,317.18,110615,,,A*67
-1312	-680	14664	-1219	-488	3621	1168409	$GPRMC,160647.400,A,5227.2853,N,00722.4846,E,0.31,317.18,110615,,,A*63
1044	-672	12136	1330	-1677	-128	1168607	$GPRMC,160647.600,A,5227.2854,N,00722.4846,E,0.29,317.18,110615,,,A*6F
32	-76	14876	893	394	-3348	1168811	$GPRMC,160647.800,A,5227.2855,N,00722.4846,E,0.28,317.18,110615,,,A*61
-280	1376	14128	-940	-380	-2672	1169007	$GPRMC,160648.000,A,5227.2855,N,00722.4846,E,0.26,317.18,110615,,,A*68

Frek07:
kleines problem:
gelegentlich abgehackte zeilen...

Sollen die Zeilen wirklich so erzeugt werden, wie Du es vorzeigst:
ax;ay;az;gx;gy;gz;ms;GPRMC
Sieht mir etwas merkwürdig aus.

Ansonsten zu den Fehlern: Schwierig zu sagen, ohne den Code zu kennen, der den Fehler produziert.

Aber lasse mich mal raten:

Trotz meiner oben gegebenen Hinweise liest Du das GPS-Modul immer noch mit der "SoftwareSerial" Library aus und hast Dir entgegen meines Ratschlags noch nicht die "AltSoftSerial" Library installiert?

Dann wäre das vollkommen normal: Die gleichzeitige Benutzung von SoftwareSerial mit einer HardwareSerial-Schnittstelle führt immer dazu, dass Softwareserial die Daten verhackstückt. Nur AltSoftSerial kann mit einer HardwareSerial-Schnittstelle problemlos gleichzeitig betrieben werden.

Oder in Frage käme auch ein Pufferüberlauf wegen zu langsamer Verarbeitung Deiner Daten.

Das GPS-Modul sendet mit 9600 Baud, das sind bis zu 960 Zeichen pro Sekunde. Der serielle Eingangspuffer beim Arduino kann maximal 63 Zeichen aufnehmen. D.h. wenn Du Daten vom GPS-Modul in Realzeit verarbeiten möchtest, hast Du vom vollständigen Auslesen des seriellen Eingangspuffers bis Du diesen wieder auslesen mußt nur 63/960= 0,065s = 65 Millisekunden Zeit.

Im schlimmsten Fall kann es bereits länger dauern, eine Datei auf SD-Karte zu schließen und wieder zu öffnen (wobei das typischerweise allerdings schneller geht). Aber wenn Du beispielsweise irgendwo auch nur eine Zehntesekunde delay() drin hast wie ein delay(100), dann ist das bereits schon viel zu viel, um GPS-Daten in Echtzeit zu verarbeiten, ohne dass dabei Daten verloren gehen. Zur Verarbeitung von Echtzeitdaten darf kein delay() in Deiner Datenverarbeitung drin sein.

BTW: Die NMEA-Daten in den GPRMC-Zeilen sind am Ende mit einer CRC-Prüfsumme gesichert, d.h. Du könntest beim Einlesen prüfen, ob die CRC-HEX-Prüfsumme stimmt, das sind die beiden letzten HEX-Ziffern nach dem Sternchen in "*6A" beispielsweise).

ich benutze die NewSoftSerial, welche ich mir bloß umbenannt hatte.
Die Daten wollte ich mir so rausgeben lassen, weil die so erstmal am besten in Excel eintragen kann, damit ich dann nur die Spalte mit GPS auswählen kann.

Gibt es einen großen unterschied zwischen AltSerialSoft und NewSerialSoft ?

Frek07:
Gibt es einen großen unterschied zwischen AltSerialSoft und NewSerialSoft ?

NewSoftSerial von Mikal Hart ist quasi dasselbe wie SoftwareSerial aus der Arduino-IDE.
Da gibt es praktisch keinen großen Unterschied, außer dass die eine Library für die alten Doppelnull-Versionen vor Arduino 1.0 geschrieben wurde und das andere in die Arduino-IDE ab 1.0 und höher direkt integriert worden ist.

Und da es einen sehr großen Unterschied zwischen SoftwareSerial aus der Arduino IDE zu AltSoftSerial gibt, gibt es natürlich denselben sehr großen Unterschied auch zwischen NewSoftSerial von Mikal Hart zur AltSoftSerial Library.

Nur die AltSoftSerial funktioniert mit einer HardwareSerial Schnittstelle zusammen gleichzeitig fehlerfrei.

Dass sich eine solche Datenformatierung, bei der manche Spalten offenbar mit Tabulator-Trennzeichen und andere Spalten mit einem Komma als Trennzeichen abgetrennt sind, besonders lässig in Excel importieren lassen sollen, kann ich kaum glauben.

Ich mache zwar praktisch nichts mit Excel, abe wenn ich mich richtig erinnere, lassen sich Daten am einfachsten importieren, wenn man sich bei der zu importierenden Datei nach den Ländereinstellungen richtet, also zum Beispiel Feldtrennter Tabulator '\t' und das Komma als Dezimaltrennzeichen für die Darstellung von Dezimalwerten verwendet wird und auch das Datum in deutscher Formatierung in der Datei steht.

Um ein wirklich gut zum Import in MS-Excel geeignetes Format schreiben zu können, wirst Du die GPS-Daten beim Einleseh wahrscheinlich doch zeilenweise sammeln und die Inhalte interpretieren müssen. Alleine auch deshalb, weil die Geokordinaten wie "5227.2821,N,00722.4883,E" ja auch nicht in dezimalen Gradzahlen angegeben sind, sondern die Werte noch ein wenig umgestellt/umgerechnet werden müssen, um die tatsächliche Geoposition zu erhalten.

Man kann die Trennzeichen beim Import einstellen. Da gibt es viele Optionen. Tabs, Leerzeichen, Kommas, Strichpunkte ist alles möglich. Es gibt auch ein Feld für frei definierte Trennzeichen

Serenifly:
Man kann die Trennzeichen beim Import einstellen. Da gibt es viele Optionen. Tabs, Leerzeichen, Kommas, Strichpunkte ist alles möglich. Es gibt auch ein Feld für frei definierte Trennzeichen

Ja klar, kann man diverse Optionen beim Datenimport auch jedesmal interaktiv einstellen, wenn man Daten in Excel importiert. Aber wenn man 25 Messreihen am Tag fährt und auswerten möchte, wäre es schon bedeutend bequemer, eine Datei nur per Doppelklick zu öffnen (oder Daten aus der Windows-Zwischenablage mit "Einfügen" zu übernehmen) und mit Default-Einstellungen zu importieren, ohne jedesmal irgendwas haarklein als geänderte Option einstellen zu müssen.

Hallo,

deswegen speicher ich die Datei gleich als .csv, ersetze vorm schreiben in die Datei bei Kommazahlen den Punkt durch ein Komma und nutze als Trennzeichen für Spalten das Semikolon. Dann ist jeder Import sehr einfach.

ok gut, das mit der AltSoftSerial probiere ich mal aus.

hier nochmal der gesammte code.
das übertragen in excel ist für mich jetzt nicht so schlimm.
weiß jemand wie ich die Kurvenlage mit auf der karte anzeigen lassen kann?
Am geilsten wäre, wenn an der Stelle wo der Corser hinzeigt, ein kleines Motorrad von hinten gezeigt wird, welches sich je nach gemessener kurvenlage drecht.

#include <SoftwareSerial.h>
#include <SPI.h>
#include <SD.h>
#include "Wire.h"
#include "I2Cdev.h"
#include "MPU6050.h"

const int chipSelect = 4;
char GPS;
MPU6050 mpu;
int16_t ax, ay, az;
int16_t gx, gy, gz;
SoftwareSerial mySerial(2, 3); // RX, TX ... the 10 is what matters based on my suggested wiring above
#define PMTK_SET_NMEA_UPDATE_1HZ  "$PMTK220,1000*1F"
#define PMTK_SET_NMEA_UPDATE_5HZ  "$PMTK220,200*2C"
#define PMTK_SET_NMEA_UPDATE_10HZ "$PMTK220,100*2F"

// turn on only the second sentence (GPRMC)
#define PMTK_SET_NMEA_OUTPUT_RMCONLY "$PMTK314,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0*29"
// turn on ALL THE DATA
//#define PMTK_SET_NMEA_OUTPUT_ALLDATA "$PMTK314,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0*28"
void setup()
{
  Wire.begin();
  Serial.begin(115200);
  Serial.println("Adafruit MTK3329 NMEA test!");

  Serial.print("Initializing SD card...");
  // see if the card is present and can be initialized:
  if (!SD.begin(chipSelect)) {
    Serial.println("Card failed, or not present");
    // don't do anything more:
    return;
  }
  Serial.println("card initialized.");
  Serial.println("Initialize MPU");
  mpu.initialize();
  Serial.println(mpu.testConnection() ? "Connected" : "Connection failed");



  // 9600 NMEA is the default baud rate
  mySerial.begin(9600);

  // uncomment this line to turn on only the "minimum recommended" data for high update rates!
  mySerial.println(PMTK_SET_NMEA_OUTPUT_RMCONLY);

  // uncomment this line to turn on all the available data - for 9600 baud you'll want 1 Hz rate
  //mySerial.println(PMTK_SET_NMEA_OUTPUT_ALLDATA);

  // Set the update rate
  // 1 Hz update rate
  //mySerial.println(PMTK_SET_NMEA_UPDATE_1HZ);
  // 5 Hz update rate- for 9600 baud you'll have to set the output to RMC only (see above)
  mySerial.println(PMTK_SET_NMEA_UPDATE_5HZ);
  // 10 Hz update rate - for 9600 baud you'll have to set the output to RMC only (see above)
  //mySerial.println(PMTK_SET_NMEA_UPDATE_10HZ);
  File dataFile = SD.open("GPS.txt", FILE_WRITE);
  dataFile.println("");
  dataFile.println("");
  dataFile.println("");
  dataFile.println("");
  dataFile.println("##############################################################################################################");
  dataFile.println("");
  dataFile.println("#################");
  dataFile.println("##Neue Messung###");
  dataFile.println("#################");
  dataFile.println("ax;ay;az;gx;gy;gz;ms");
  dataFile.close();
}
/*
void loop() // run over and over
{

  if (mySerial.available()) {
    GPS = (char)mySerial.read();
    Serial.print(GPS);
    File dataFile = SD.open("GPS.txt", FILE_WRITE);
    dataFile.print(GPS);
    dataFile.close();
  }

if (Serial.available()) {
  mySerial.print((char)Serial.read());
}
}
*/
File dataFile;

void loop() // run over and over
{

  if (mySerial.available()) {
    GPS = (char)mySerial.read();
    dataFile.print(GPS);
    Serial.print(GPS);
    if (GPS == '\n') // bei erkanntem Zeilenende
    {

      mpu.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
      dataFile.print(ax); dataFile.print("\t"); Serial.print(ax); Serial.print("\t");
      dataFile.print(ay); dataFile.print("\t"); Serial.print(ay); Serial.print("\t");
      dataFile.print(az); dataFile.print("\t"); Serial.print(az); Serial.print("\t");
      dataFile.print(gx); dataFile.print("\t"); Serial.print(gx); Serial.print("\t");
      dataFile.print(gy); dataFile.print("\t"); Serial.print(gy); Serial.print("\t");
      dataFile.print(gz); dataFile.print("\t"); Serial.print(gz); Serial.print("\t");
      dataFile.print(millis()); dataFile.print("\t"); Serial.print(millis()); Serial.print("\t");

      // hier ggf. Funktion aufrufen zur Ausgabe von X, Y, Z
      dataFile.close(); // Datei schließen
      dataFile = SD.open("GPS.txt", FILE_WRITE); // und sofort wieder öffnen
    }
  }

  if (Serial.available()) {
    mySerial.print((char)Serial.read());
  }
}

Frek07:
ok gut, das mit der AltSoftSerial probiere ich mal aus.

Mit AltSoftSerial sollten die Datenfehler in der Aufzeichnung verschwinden.
Datenfehler bei gleichzeitiger Verwendung von SoftwareSerial und einer HardwareSerial-Schnittstelle sind ganz typisch und verschwinden, sobald Du auf AltSoftSerial umgestellt hast. Ist ja nicht viel Arbeit: Du mußt ja praktisch nur:

  • die AltSoftSerial Library ins richtige Verzeichnis installieren
  • die #include-Zeile zum Einbinden der Library ändern
  • den GPS-TX Pin an den AltSoftSerial-RX Pin (anstelle des SoftwarSerial-RX Pin) anschließen

Was mir sonst auffällt:
Dass in Deiner Aufzeichnung nun die Sensordaten und die GPS-$GPRMC Daten in einer Zeile immer um eine Sekunde zeitversetzt aufgezeichnet werden, ist Dir klar?

Du zeichnest wie folgt auf:

  • wenn eine $GPRMC-Zeile komplett aufgezeichnet und eine neue Zeile begonnen wurde
  • hole Sensordaten und schreibe sie in die neue Zeile
  • nach einer Sekunde: Die nächste $GPRMC-Zeile wird an die Messdaten drangehängt

D.h. die Messdaten vom Beschleunigungssensor am Anfang der Zeile sind immer bereits eine Sekunde alt, wenn die $GPRMC-Zeile ans Ende der von Dir aufgezeichneten Zeile geschrieben wird.