Enregistrer données carte GPS sur carte SD utilisant toutes les deux le bus SPI

Bonjour ! J’ai une LoRa GPS Shield v1.0, une carte arduino uno et une MicroSD Card Adapter munie d’une carte de 1GB.

Je veux récupérer les données de la carte SD (latitude, longitude, date et heure) dans un fichier du module SD que j’ai nommé gps2.csv.

Les deux modules utilisent le même bus de communication SPI, j’avais déjà essayé à utiliser le protocole I2C en ajoutant une autre carte arduino mais c’était un peu compliqué pour moi donc j’ai recherché un moyen pour que les deux cartes marchent sur un même arduino.

Cela consiste à relier les pins MISO, MOSI et SCK de la carte GPS et de la carte SD à ceux de la carte arduino. Ensuite j’ai lié le pin D5 de l’arduino au pin SS de la carte GPS et le pin D6 au pin SS (ou CS) du module SD.
Dans le code ci-dessous, quand je fais un digitalWrite(SS_SD, LOW) et digitalWrite(SS_GPS, HIGH) le module SD utilise le bus SPI donc écoute et le module GPS est comme mort, il n’écoute pas et n’envoie pas et vice-versa.
Bon les branchements sont bons et tout a l’air impec sauf que quand je fais un file.print() pour récupérer la date ça ne renvoie rien comme vous pouvez le voir sur le moniteur, et aussi la latitude et la longitude est donnée dans le fichier qu’avec 2 chiffres après la virgule. Voilà le code:

/**
 * Exemple de code Arduino pour un datalogger basique avec stockage sur carte SD.
 */

/* Dépendances */
#include <SPI.h> // Pour la communication SPI
#include <SD.h>  // Pour la communication avec la carte SD
#include <SoftwareSerial.h>
#include <TinyGPS.h>
float flat, flon;
char dateEtHeure[32];
char sz[32];
unsigned long age, date, time, chars = 0;
unsigned short sentences = 0, failed = 0;
static const double LONDON_LAT = 51.508131, LONDON_LON = -0.128002;
//Le PIN SS de la carte GPS est relié à D5 et le pin SS de la carte GPS au pin D2 
int GPS_SS=5;
int SD_SS=6;

/** Broche CS de la carte SD */
const byte SDCARD_CS_PIN = 6; // A remplacer suivant votre shield SD

/** Nom du fichier de sortie */
const char* OUTPUT_FILENAME = "gps2.csv";

/** Delai entre deux prise de mesures */
const unsigned long DELAY_BETWEEN_MEASURES = 1000;


/** Fichier de sortie avec les mesures */
File file;

TinyGPS gps;
SoftwareSerial ss(3, 4); // Arduino TX, RX , 

static void smartdelay(unsigned long ms);
static void print_float(float val, float invalid, int len, int prec);
static void print_int(unsigned long val, unsigned long invalid, int len);
static void print_date(TinyGPS &gps);
static void print_str(const char *str, int len);

/** Fonction setup() */
void setup() {
  pinMode(SD_SS, OUTPUT);
  pinMode(GPS_SS,OUTPUT);
  digitalWrite(SD_SS,HIGH);
  digitalWrite(GPS_SS,LOW);
  Serial.begin(9600);           // start serial for output
  ss.begin(9600); // SoftSerial port to get GPS data. 
  while (!Serial) {
     ;
  };

    /* Initialisation du port SPI */
  //Le module SD écoute et le module GPS est comme sourd et muet  
  digitalWrite(SD_SS,LOW);
  digitalWrite(GPS_SS,HIGH);
  /* Initialisation de la carte SD */
  Serial.println(F("Initialisation de la carte SD ... "));
  if (!SD.begin(SDCARD_CS_PIN)) {
    Serial.println(F("Erreur : Impossible d'initialiser la carte SD"));
    Serial.println(F("Verifiez la carte SD et appuyez sur le bouton RESET"));
    for (;;); // Attend appui sur bouton RESET
  }

  /* Ouvre le fichier de sortie en ecriture */
  Serial.println(F("Ouverture du fichier de sortie ... "));
  file = SD.open(OUTPUT_FILENAME, FILE_WRITE);
  if (!file) {
    Serial.println(F("Erreur : Impossible d'ouvrir le fichier de sortie"));
    Serial.println(F("Verifiez la carte SD et appuyez sur le bouton RESET"));
    for (;;); // Attend appui sur bouton RESET
  }
  
  /* Ajoute l'entete CSV si le fichier est vide */
  if (file.size() == 0) {
    Serial.println(F("Ecriture de l'entete CSV ..."));
    file.println(F("Long- Lat- Date et Heure"));
    file.flush();
  }
}


/** Fonction loop() */
void loop() {
  /*Le module GPS écoute et le module SD est comme sourd et muet*/  
  digitalWrite(SD_SS,HIGH);
  digitalWrite(GPS_SS,LOW);
  
  gps.f_get_position(&flat, &flon, &age);
  print_float(flat, TinyGPS::GPS_INVALID_F_ANGLE, 10, 6);
  print_float(flon, TinyGPS::GPS_INVALID_F_ANGLE, 11, 6);
  print_date(gps);
  gps.stats(&chars, &sentences, &failed);
  Serial.println();
  
  smartdelay(1000);
  //delay(1000);
  digitalWrite(SD_SS,LOW);
  digitalWrite(GPS_SS,HIGH);
  // Temps de la precedente mesure et de la mesure actuelle
  static unsigned long previousMillis = 0;
  unsigned long currentMillis = millis();

  /* Realise une prise de mesure toutes les DELAY_BETWEEN_MEASURES millisecondes */
  if (currentMillis - previousMillis >= DELAY_BETWEEN_MEASURES) {
    previousMillis = currentMillis;
    measure();
  }
}


static void smartdelay(unsigned long ms)
{
  digitalWrite(SD_SS,HIGH);
  digitalWrite(GPS_SS,LOW);
  unsigned long start = millis();
  do 
  {
    while (ss.available())
    {
      //ss.print(Serial.read());
      gps.encode(ss.read());
    }
  } while (millis() - start < ms);
}

static void print_float(float val, float invalid, int len, int prec)
{
  digitalWrite(SD_SS,HIGH);
  digitalWrite(GPS_SS,LOW);
  if (val == invalid)
  {
    while (len-- > 1)
      Serial.print('*');
    Serial.print(' ');
  }
  else
  {
    Serial.print(val, prec);
    int vi = abs((int)val);
    int flen = prec + (val < 0.0 ? 2 : 1); // . and -
    flen += vi >= 1000 ? 4 : vi >= 100 ? 3 : vi >= 10 ? 2 : 1;
    for (int i=flen; i<len; ++i)
      Serial.print(' ');
  }
  smartdelay(0);
}

static void print_int(unsigned long val, unsigned long invalid, int len)
{
  digitalWrite(SD_SS,HIGH);
  digitalWrite(GPS_SS,LOW);
  if (val == invalid)
    strcpy(sz, "*******");
  else
    sprintf(sz, "%ld", val);
  sz[len] = 0;
  for (int i=strlen(sz); i<len; ++i)
    sz[i] = ' ';
  if (len > 0) 
    sz[len-1] = ' ';
  Serial.print(sz);
  smartdelay(0);
}

static void print_date(TinyGPS &gps)
{
  digitalWrite(SD_SS,HIGH);
  digitalWrite(GPS_SS,LOW);
  int year;
  byte month, day, hour, minute, second, hundredths;
  unsigned long age;
  gps.crack_datetime(&year, &month, &day, &hour, &minute, &second, &hundredths, &age);
  if (age == TinyGPS::GPS_INVALID_AGE)
    Serial.print("********** ******** ");
  else
  {
    
    sprintf(sz, "%02d/%02d/%02d %02d:%02d:%02d ",
        day, month, year, hour, minute, second);
    Serial.print(sz);
  }
  smartdelay(0);
}

static void print_str(const char *str, int len)
{
  digitalWrite(SD_SS,HIGH);
  digitalWrite(GPS_SS,LOW);
  int slen = strlen(str);
  for (int i=0; i<len; ++i)
    Serial.print(i<slen ? str[i] : ' ');
  smartdelay(0);
}


/** Fonction de recuperation des donnees du GPS */

void measure() {
  digitalWrite(SD_SS,LOW);
  digitalWrite(GPS_SS,HIGH);
  /* Recupere les valeurs */
  float lon=flon;
  float lat=flat;
  dateEtHeure[32] =sz[32];
  
  /* Affiche les donnees sur le port serie pour tester si les valeurs sont bien recuperees */ 
  Serial.print(lon);
  Serial.print(F("-  "));
  Serial.print(lat);
  Serial.print(F("-  "));
  Serial.println(dateEtHeure);
    
  /* Enregistre les donnees sur la carte SD */
  file.print(lon);
  file.print(F("- "));
  file.print(lat);
  file.print(F("- "));
  file.println(dateEtHeure);
  file.flush();
}

J’ai joint la capture du moniteur au message. Excusez moi de la longueur et merci d’avoir pris le temps de lire :slight_smile:

*je veux récupérer les données de la carte GPS je voulais dire :grinning:

J'ai résolu le problème, j'ai juste écrit directement la variable sz dans file.print() au lieu de dateEtHeure. Mercii :slight_smile: