Gpsdaten auf Sd karte loggen

Moinsen!
Ich bin relativ neu im Umgang mit den Arduino und hab ein paar fragen.

#include <nmea.h>
#include <SoftwareSerial.h>

#define rxPin 9
#define txPin 3
// create a GPS data connection to GPRMC sentence type
NMEA gps(GPRMC);
SoftwareSerial portOne(rxPin, txPin);
void setup() {
  Serial.begin(9600);
  portOne.begin(9600);
}
String dataString = "";
void loop() {
  if (portOne.available() > 0 ) {
    // read incoming character from GPS
    char c = portOne.read();

    // check if the character completes a valid GPS sentence
    if (gps.decode(c)) {
      // check if GPS positioning was active
      dataString = gps.sentence();
      delay(10);
      Serial.print(dataString);
    }
  }
}

Ausgabe ist wunderbar:
$GPRMC,095453.00,V,,,,,,,270412,,,N71$GPRMC,095453.99,V,,,,,,,270412,,,N71$GPRMC,095455.00,V,,,,,,,270412,,,N77$GPRMC,095456.00,V,,,,,,,270412,,,N74$GPRMC,095456.99,V,,,,,,,270412,,,N74$GPRMC,095458.00,V,,,,,,,270412,,,N7A$GPRMC,095459.00,V,,,,,,,270412,,,N7B$GPRMC,095459.99,V,,,,,,,270412,,,N7B$GPRMC,095501.00,V,,,,,,,270412,,,N77$GPRMC,095502.00,V,,,,,,,270412,,,N74$GPRMC,095502.99,V,,,,,,,270412,,,N74$GPRMC,095504.00,V,,,,,,,270412,,,N72$GPRMC,095505.00,V,,,,,,,270412,,,N73$GPRMC,095505.99,V,,,,,,,270412,,,N73$GPRMC,095507.00,V,,,,,,,270412,,,N*71

Ich befinde mich im Raum, deswegen nur so halbe GPS Daten...
Jetzt möchte ich diese daten auf Sd-Karte wegspeichern.

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

#define rxPin 9
#define txPin 3
// create a GPS data connection to GPRMC sentence type
NMEA gps(GPRMC);
SoftwareSerial portOne(rxPin, txPin);
const int D1_PIN = A1;
const int D2_PIN = 4;
const int chipSelect = 10;
void setup() {
  pinMode(D1_PIN, OUTPUT);
  pinMode(D2_PIN, OUTPUT);
  Serial.begin(9600);
  portOne.begin(9600);
  Serial.print("Initializing SD card...");
  
  pinMode(10, OUTPUT);
   digitalWrite(D1_PIN, HIGH); 
  if (!SD.begin(chipSelect)) {
    digitalWrite(D1_PIN, LOW); 
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("initialization done.");
}

void err_out(int err_code){
  digitalWrite(D1_PIN, HIGH); 
  digitalWrite(D2_PIN, LOW); 
  while(true){
    delay(1000);
    for(int i=0; i < err_code; i++){
      digitalWrite(D2_PIN, HIGH); 
      delay(200);
      digitalWrite(D2_PIN, LOW); 
      delay(200);
    }
  }
}
unsigned long count = 0;
String dataString = "";
void loop() {
  if (portOne.available() > 0 ) {
    // read incoming character from GPS
    char c = portOne.read();

    // check if the character completes a valid GPS sentence
    if (gps.decode(c)) {
      // check if GPS positioning was active
      dataString = gps.sentence();
      delay(10);
      Serial.print(dataString);
      File myFile = SD.open("test.txt", FILE_WRITE);
      
      if (myFile) {
    digitalWrite(D1_PIN, LOW); 
    digitalWrite(D2_PIN, HIGH); 
    delay(30);
    Serial.println("Writing to test.txt...");
    myFile.println(dataString);
    // close the file:
    myFile.close();
    count++;
  } 
  else {
    // if the file didn't open, print an error:
    Serial.println("error opening test.txt");
    err_out(1);
  }
  
    }
  }
  if(count == 10){
    while(1) delay(1000); // stop it already
  }
}

Ausgabe :
Initializing SD card... initialization done.
Initializing SD card... initialization done.
Initializing SD card... initialization done.
Initializing SD card... initialization done.
Dabei dachte ich, dass void setup() immer nur genau einmal ausgeführt wird. Wie kann es dann, dass er das void setup() als schleife durchläuft?
Hoffe ihr könnt mir helfen..

Dieses Sd karten breadboard benutze ich:

Sieht so aus, als würde Dein Arduino resets bekommen / ausführen, denn dann wird jedesmal wieder die setup() aufgerufen.
Wie schnell hintereinander kommen denn die Ausgaben?

Nur so'n Schuss ins Blaue: versorgst Du das Ganze nur über USB mit Strom, oder hast Du 'ne externe Stromversorgung? Ich hatte so einen Effekt mal, weil das ganze angeschlossen Zeugs zu viel Strom gezogen hat, und dann die Spannung zusammengebrochen ist. USB liefert nicht sooo viel.

viele Grüße
Andreas

Darüber hab ich auch schon nachgedacht.. Die Werte kommen ca. jede Sekunde.. Ich hab mir ein standalone arduino mit dem 328p nachgebaut. Ich habe den Bootloader mit meine avrispmkII drauf gepackt und so war dann ein delay(1000) auch eine sekunde Verzögerung. Ich habe den reset taster nicht implementiert, somit kann es auch nicht daran liegen. Kann mir nicht erklären, wie es zu einem reset kommen kann..

Ps: externe Stromversorgung

Chillkroete:
Darüber hab ich auch schon nachgedacht.. Die Werte kommen ca. jede Sekunde.. Ich hab mir ein standalone arduino mit dem 328p nachgebaut. Ich habe den Bootloader mit meine avrispmkII drauf gepackt und so war dann ein delay(1000) auch eine sekunde Verzögerung. Ich habe den reset taster nicht implementiert, somit kann es auch nicht daran liegen. Kann mir nicht erklären, wie es zu einem reset kommen kann..

Ps: externe Stromversorgung

/*

Blink
  Turns on an LED on for one second, then off for one second, repeatedly.

This example code is in the public domain.
*/

void setup() {               
  // initialize the digital pin as an output.
  // Pin 13 has an LED connected on most Arduino boards:
  pinMode(13, OUTPUT);
  pinMode(2, OUTPUT);
  digitalWrite(2, HIGH);  // set the LED on
  delay(1000);              // wait for a second
  digitalWrite(2, LOW);    // set the LED off
  delay(1000); 
  Serial.begin(9600);
  Serial.println("hallo");
}

void loop() {
  digitalWrite(13, HIGH);  // set the LED on
  delay(1000);              // wait for a second
  digitalWrite(13, LOW);    // set the LED off
  delay(1000);              // wait for a second
}




recht einfach und funktioniert. Led blink einmal auf und geht wieder aus. Seriellen Monitor zeigt einmal "hallo" an und danach blink die andere Led die ganze Zeit.

kann es denn an der Sd.h liegen? Am Anfang fande ich die Arduinos noch ganz cool, da alles recht einfach und schnell zu implementieren ist, allerdings finde ich verliert man schnell den Überblick bei der Fehlersuche. Nach diesem Projekt werde ich wohl wieder auf die normalen AVR´s um switchen und in C proggn. Da kann ich mir meine eigenen Routinen erstellen und steig da besser durch.

Hallo,

ich habe ähnliche Probleme beim Loggen von GPS-Koordinaten auf eine µSD-Karte. Ich verwende als HW-Komponenten ein Display (24x2 Zeilen), eine 2GB µSD-Karte, ein Temperatursensor sowie ein GPS-Empfänger EM-406A. Auf die SD-Karte wird über SPI zugegriffen. Das Loggen von Sensoren wie dem Temperaursensor funktioniert ohne Probleme. Wenn ich das GPS-Modul anschließe kann ich z.B. die Uhrzeit (UTC) auf dem Display ausgeben und die empfangenen NMEA-Daten kann ich über den "Serial Monitor" am Computer sehen. Wenn ich jetzt die SD-Karte zur Aufzeichnung in den Adapter einsetze, wird die Karte nicht erkannt und es werden keine Daten mitgeloggt.
Das Pinning am Arduino Duemilanove sieht wie folgt aus:
SD-Karte: SCK=Pin13,MOSI=Pin12,MISO=Pin11,/CS=Pin10
Display : Pin7 - Pin2
GPS : RXD=Pin9, TXD=Pin8
CardDetect wird über Analogeingang erkannt
Temperatursensor wird über Analogeingang erkannt

Ich dachte mir auch schon, dass es eventuell an der Stromversorgung über USB liegt, jedoch verbraucht das GPS-Modul nur wenige mA.
Könnte es eventuell auch an etwas anderem liegen? Darf ich vielleicht das GPS nicht an den Ports 8 und 9 betreiben? Falls ja, wie kann ich das GPS-Modul über Pin 0 und 1 (UART) betreiben?
Ich hoffe ihr könnt mir weiterhelfen...

Gruß, Tim

@Chillkroete, Du sagst Du hast keinen Resettaster montiert. Hast Du den Widerstand von Reset-Pin auf +5V vorgesehen? Den braucht es.
Mit welchen Spannungsteilern betreibst Du die SD-Karte? Woher bekommst Du die 3,3V für die SD-Karte? Welche Taktfrequenz hast Du?

Grüße Uwe

Die SD-Karte wird mit 10k- und 15k-Widerständen betrieben, also 2/3 der Ausgangsspannung. Die 3,3V für die SD-Karte greife ich direkt vom Arduinoboard ab. Ich habe bisher auch keine weitere Betrachtung durchgeführt in wie fern die Spannung am Board einbricht. Zur Taktfrequenz kann ich garnicht so viel sagen, denke aber, da ich nichts weiter zur Taktfrequenz programmiert habe, dass der µC mit 16 Mhz taktet.
Ich verwende die SD-Lib, die TinyGPS-Lib und die SoftwareSerial-Lib in der Programmierung.

Vielleicht hat ja jemand noch eine Idee,
beste Grüße, Tim

@tim0312, Die Fragen waren eigentlich für Chillkroete gedacht der einen Arduino-Selbstaufbau betreibt.
Veileicht ist es besser Du öffnest eine neuen tread damit wir auf Deine Probleme eingehen können.
Viele Grüße Uwe

Hallo uwefed,
ich dachte, da ich ähnliche Probleme habe und für später auch einen Selbstaufbau plane (Layout in EAGLE ist schon so gut wie fertig), muss ich nicht einen neuen Thread eröffnen.
Gruß, Tim

HI uwefed,

ich habe den Widerstand zwischen reset und +5V vorgesehen. Ich betreibe das ganze mit 16Mhz quarz und die 3,3 V für die Sd karte bekommt ich von einem sog. LF33cvhttp://www.reichelt.de/ICs-KA-LF-/LF-33-CV/index.html?ACTION=3&GROUPID=2911&ARTICLE=39414&SHOW=1&START=0&OFFSET=16&

Ich kann es mir echt nicht erklären...

Sobald #include <SD.h> auskommentiert, läuft das programm so wie ich es mir vorstelle.. Es muss also wohl an der Sd lib liegen.. Ich werd wohl mal die lib genauer analysieren...