Problema scrittura SD Card

Ciao a tutti,
spero possiate aiutarmi perchè oramai ho spremuto tutto (poco) lo spremibile della mia poltiglia-grigia-separa-orecchie!

Ho collegato un Adafruit 9-DOF IMU Breakout della Adafruit al mio Arduino Uno attraverso un GPS Logging Ultimate Shield, anch’esso della Adafruit.

A parte aver “impilato” lo shield, ho collegato il pin A4 al SCL e il pin A5 al SDA dell’IMU .

Ho un problema:
se lancio la lettura del valore di accelerazione sugli assi X e Y attraverso questo codice è tutto ok:

void ReadXAcceleration(){
  
  sensors_event_t Xaccel_event;
  accel.getEvent(&Xaccel_event);
  
  
  char value[6];
  String finalStringXacc = "1-";
  dtostrf(Xaccel_event.acceleration.x,3,2, value);
  finalStringXacc += String(value);
  
  Serial.println(finalStringXacc);
  
  myFile = SD.open("log.txt", FILE_WRITE);
  if (myFile){
    myFile.println(finalStringXacc);
  } else {
    Serial.println("File error...");
  }
  myFile.close();
  
  
}

Appena cerco di leggere anche il “Roll” attraverso il seguente codice:

void ReadXAcceleration(){
  
  sensors_event_t Xaccel_event;
  accel.getEvent(&Xaccel_event);
  sensors_vec_t   orientation;
  
  if (!dof.accelGetOrientation(&Xaccel_event, &orientation))
  {
    Serial.println("accelGetOrientation error...");
  }
    
  char value[6];
  String finalStringXacc = "1-";
  dtostrf(Xaccel_event.acceleration.x,3,2, value);
  finalStringXacc += String(value);
  
  char rollValue[20];
  String finalStringRoll = "3-";
  dtostrf(orientation.roll,3,2, rollValue);
  finalStringRoll += String(rollValue);
    
  Serial.println(finalStringXacc);
  Serial.println(finalStringRoll);
  
  myFile = SD.open("log.txt", FILE_WRITE);
  if (myFile){
    myFile.println(finalStringXacc);
    myFile.println(finalStringRoll);
  } else {
    Serial.println("File error...");
  }
  myFile.close();
  
  
}

L’istruzione " if (myFile)" genera risposta negativa e sulla seriale viene scritto “File error…”.

Queste le librerie importate, la dichiarazione delle variabili e il metodo “setup()”:

#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_LSM303_U.h>
#include <Adafruit_9DOF.h>
#include <SPI.h>
#include <SD.h>


//Variabili
Adafruit_9DOF                dof   = Adafruit_9DOF();
Adafruit_LSM303_Accel_Unified accel = Adafruit_LSM303_Accel_Unified(54321);
String firmwareVersion = "Firmware000000.ino";
File myFile;
int timeBetweenReadings = 100;
boolean readingRequested = 0;


//Costanti
//pin di CS
const int chipSelect = 10;

void setup(){
   Serial.begin(9600); 
 
   //Inizializzo l'accelerometro
   if(!accel.begin()){
     PrintError(1);
     return;
   }

    //Inizializzo la SD
   pinMode(SS, OUTPUT);
 
   if (!SD.begin(chipSelect)){
     PrintError(2);
     return;
   } else {
   //Se è tutto ok scrivo l'inizializzazione nel file sulla SD
   //(Start e dichiarazione sensori)
     InitializeLogFile();
   }
  Serial.println("Ready...");
}

Notare che il metodo “InitializeLogFile()” chiamato al termine della routine di Setup riesce SEMPRE a scrivere sulla SD!

Qualcuno ha qualche idea? :cold_sweat: :cold_sweat: :cold_sweat: :0 :0 :0 :0 $) $) $) $) :stuck_out_tongue_closed_eyes: :stuck_out_tongue_closed_eyes: :stuck_out_tongue_closed_eyes: :stuck_out_tongue_closed_eyes:

nel terzo sketch che hai incluso leggo:

//Costanti //pin di CS const int chipSelect = 10; ... //Inizializzo la SD pinMode(SS, OUTPUT);

dove viene definito SS il Chip Select della schedina SD?

Ciao Uwe

In effetti non l'ho assegnato, pensi possa essere questo il problema?

La cosa strana è che l'Arduino scrive sulla SD (l'inizializzazione del file è corretta), ma non nella routine in cui fa l'acquisizione del valore.

Ho scoperto il problema, si trattava di una cattiva gestione della memoria. Ho utilizzato F() con tutte le stringhe ed ora funziona tutto perfettamente!

uwefed: dove viene definito SS il Chip Select della schedina SD?

Viene definito dal compilatore. E' una costante predefinita come i nomi dei registri del chip.