Réalisation d'un "datalogger GPS" (enregistrement des données gps)

Bonjour à tous,
Je viens de me lancer dans un montage qui me permettrait d’enregistrer des données gps (coordonnées, heure, altitude et vitesse) sur une carte SD.
J’ai donc acheté un lecteur de carte SD (avec 8 broches) et un recepteur gps (à 4 broches). Ayant quelques connaissance en programmation (et avec l’aide de programme trouvé sur internet), j’ai écrit mon programme me permettant d’enregistrer les infos sur la carte SD.
Pour le Gps,j’ai branché le TX sur pin 7 et RX sur 8. Pour le lecteur de cartes SD: CS sur 4, MOSI sur 11, SCK sur 13 et MISO sur 12. Et j’ai rajouté quelques LED me permettant de vérifier le bon fonctionnement. Voici mon code:

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

TinyGPS gps;
SoftwareSerial serialgps(7,6);
int year;
byte month, day, hour, minute, second, hundredths;
unsigned long chars;
unsigned short sentences, failed_checksum;
const int vert = 9;
const int red = 8;
const int blue = 2;
File myFile;


void setup()
{
  serialgps.begin(9600);
  while (!SD.begin(4)) {
    return;
  }
  pinMode(vert,OUTPUT);
  pinMode(red, OUTPUT);
  pinMode(blue, OUTPUT);
  myFile = SD.open("gps.txt", FILE_WRITE);
  if (myFile) 
  {
    myFile.println("Start");
  }
  myFile.close();
}

void loop()
{
  digitalWrite(red, LOW);
  digitalWrite(vert, LOW);
  digitalWrite(blue, HIGH);
  delay(500);
  digitalWrite(blue, LOW);
  if (serialgps.available())
  {
    myFile = SD.open("gps.txt", FILE_WRITE);
    if (myFile) 
    {
      digitalWrite(vert, HIGH);
      int c = serialgps.read(); 
      if(gps.encode(c)) 
      {
        float latitude, longitude;
        gps.f_get_position(&latitude, &longitude);
  
        myFile.print("Lat/Long: "); 
        myFile.print(latitude,5); 
        myFile.print("/"); 
        myFile.print(longitude,5);
        gps.crack_datetime(&year,&month,&day,&hour,&minute,&second,&hundredths);
        myFile.print(" - Date: "); myFile.print(day, DEC); myFile.print("/"); 
        myFile.print(month, DEC); myFile.print("/"); myFile.print(year);
        myFile.print(" - "); myFile.print(hour, DEC); myFile.print(":"); 
        myFile.print(minute, DEC); myFile.print(":"); myFile.print(second, DEC); 
        myFile.print("."); myFile.print(hundredths, DEC);
        myFile.print(" - Altitude: "); myFile.print(gps.f_altitude()); 
   
        myFile.print(" - Speed: "); myFile.print(gps.f_speed_kmph());
        myFile.println();
        gps.stats(&chars, &sentences, &failed_checksum);
      }
      myFile.close();
    }
  } 

   delay(500);
}

Malheureusement, ça ne marche pas toujours du premier coup (aha :)), sur ma carte SD j’ai bien le document texte et à l’intérieur, j’ai parfois une ligne avec un seul ensemble de données (1 seule coordonnée et altitude GPS) et parfois rien. Moi je souhaiterais avoir les données qui s’enregistrent sur la carte environ toute les 1-2 secondes (et du coup une nouvelle ligne à chaque 1-2 secondes). J’ai testé mon GPS seul, il marche très bien. Cela fait plusieurs jour que je me casse la tête sur ça, quelqu’un aurait-il une idée d’où vient mon problème?

PS: j’ai également testé mon lecteur de carte SD avec les exemples de la bibliothèque, et il marche un peu bizarrement car il fonctionne normalement sans avoir à brancher la masse (Gnd) à la carte arduino et dès que je branche la masse il ne fonctionne plus. Bizarre, qu’en pensez-vous?

Merci d’avance de votre aide et de vos réponse,
Clément

Je me sens terriblement seul...

bonjour, au lieu d'ouvrir le fichier et lancer la réception data du gps, tu pourrais pas faire l'inverse? si le gps ne recoit rien, normal que tu ais que quelques datas dans le fichier.

donc

if(gps.encode(c))
      {
... decode toutes les données
....ouverture du fichier
....ecriture des datas
....fermeture fichier

sachant que ca prend un certain temps, tu devrais le faire que toutes les X secondes

Bonjour,

Je n'ai pas pris connaissance de ton programme, mais dans un premier temps, as-tu validé que le module GPS te renvoi les données que tu attends? Dans un premier temps, je vérifierais déjà ce point et une fois valider, l'écriture sur la carte SD ne devrait pas poser de problème majeur :)

Merci pour vos réponses,

Mon GPS me renvoie bien les données NMEA lorsque je le branche sur les pins 0 et 1, il marche fonctionne également avec l'example Tiny GPS test with gps device par contre il ne marche pas avec l'exemple simple test.

J'ai réussi à avancer un peu plus et je me suis rendu compte que c'est le if(gps.encode(c)) qui me bloque les données, quand je l'enlève j'ai les résultats suivant (et toutes les secondes): Lat/Long: 1000.00000/1000.00000 - Date: 0/0/2000 - 198:96:72.95 - Altitude: 1000000.00 - Speed: -1.00