Scrivere su SD card

Ciao a tutti!
Io ho un Arduino Ethernet con SD card.
Sto facendo alcune prove di scrittura ma non riesco. Vi posto il codice:

void LoadConfig() {
  
  // Inizializzo microSD
  if (!SD.begin(4)) {
    Log("Impossibile inizializzare la microSD");
    return;
  }
 
  if(!SD.exists("File.cfg")) {
    Log("Salvo valori nella microSD");
    File f = SD.open("File.cfg", FILE_WRITE);
    // Se riesco ad utilizzare il file
    if(f) {
      // Salvo valori
      f.println("prova");
      // Chiudo il file
      f.close();
    }
    else {
      Log("Impossibile salvare i valori nella microSD"); 
      return;
    }  
  }  
}

La microSD la inizializza ma non riesce ad aprire il file. Ho impostato i piedini nel seguente modo:

pinMode(10, OUTPUT);

Vi ringrazio.

schema del circuito?

Ho un arduino Ethernet, non ho collegato niente... ho sbagliato?

non vorrei dire boiate, ma mi pare che non sia utilizzabile dall'arduino. Dovresti identificare il modello dal tuo ethernet shield e cercare un po' sul forum. comunque se non erro le SD si possono usare anche con dei collegamenti minimi, ma non so se va in conflitto con l'ethernet

Ma io non ho ethernet shield, almeno se ho capito bene la shield sono i moduli aggiuntivi da attaccarci sopra no?
Io ho questa scheda http://arduino.cc/en/Main/ArduinoBoardEthernet e mi sono bastato su quello che c'è scritto in questa pagina:

The onboard microSD card reader is accessible through the SD Library. When working with this library, SS is on Pin 4.

ma nel setup hai dichiarato anche il pin 4 ? perche' vedo che tu hai messo solo il pin10

cmq e' la nuova scheda ufficiale che comprende sia il 328 che l'ethernet, che la sd
non ho mai fatto prove ma dovrebbe funzionare.
credo l'abbiano in pochi ancora quella scheda, spero ti aiutino altri, altrimenti vedo di leggere qualcosa in merito

ah ho fatto confusione io, non ho letto bene e come dice testato le board sono molto recenti, quindi non ci ho pensato.

da quanto leggo negli esempi:

// On the Ethernet Shield, CS is pin 4. It's set as an output by default.
// Note that even if it's not used as the CS pin, the hardware SS pin
// (10 on most Arduino boards, 53 on the Mega) must be left as an output
// or the SD library functions will not work.

quindi normalmente SS è sul pin 10, mentre in quella nuova è sul 4

When working with this library, SS is on Pin 4.

Quindi dovrai dichiarare il pin 4 come output al posto del 10, e usare un altro pin come CS

Ma devo fare qualche collegamento?
Ora il mio codice è così:

pinMode(4, OUTPUT);
if (!SD.begin(10)) {
    Log("Impossibile inizializzare la microSD - caricati valori di default");
    return;
  }

Ma non riesce ancora ad inizializzare la SD :frowning:

Grazie dell'aiuto :slight_smile:

Ciao

in realtà non è proprio così: il PIN di CS (chip select) serve quando hai più dispositivi SPI slave ad indicare con quale dispositivo vuoi "parlare".
Normalmente la SPI di arduino utilizza il PIN 10 con tale funzionalità, il problema è che su ethernet shield (o in quello integrato) SIA il modulo ethernet SIA la SD sono sullo stesso bus SPI, quindi devono avere due piedini di CS diversi, ecco perché hanno messo il CS della SD sul PIN 4.

la nota indica che comunque - anche se usi un pin diverso dal 10 per CS - devi definire il 10 output perché la libreria SD funzioni.

Tornando a D4nger92: se non ti fallisce l'inizializzazione, significa che arduino riesce a parlare con la SD... il problema dell'apertura del file è quindi causato da qualcos'altro.

Prova come prima cosa ad eseguire il semplice sketch di diagnostica della SD e vedi se è tutto ok (tipo, dimensioni...):

facci sapere!

infatti io avevo scritto di aggiungere il pin4 nel setup, non ti sostituirlo al 10 :slight_smile:

si si io prendevo spunto dalla risposta di lesto... :slight_smile:
non è comunque necessario definire il pinMode del PIN4, ci pensa la libreria a farlo... la nota dice che se non usi il PIN 10 come CS (e quindi la libreria non lo mette a output) comunque lo devi fare tu a mano altrimenti non funziona la periferica SPI.
bye

Ho fatto altre prove:
ora il codice è così:

// Impostazioni piedini OUTPUT
  pinMode(4, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(_LED9OUT, OUTPUT);

 // Inizializzo microSD
  if (!SD.begin(10)) {
    Log("Impossibile inizializzare la microSD - caricati valori di default");
    return;
  }

ma niente solito errore: "Impossibile inizializzare la microSD - caricati valori di default"

Ho provato anche con lo sketch di diagnostica sia con CS = 4 sia con CS = 10
Mi dice:

    Serial.println("initialization failed. Things to check:");
    Serial.println("* is a card is inserted?");
    Serial.println("* Is your wiring correct?");
    Serial.println("* did you change the chipSelect pin to match your shield or module?");

:frowning: :frowning: :frowning:

Ho provato a cambiare microSD! Ora mi dà errore nel momento in cui prova a scivere il file ma non sul begin della SD! E' stranissimo...

EDIT:
Ho riformattato la micro con master boot record e fat, ora dà errore sul salvataggio del file.
Perchè devo settare il pin10 com out? Sulla mia scheda è segnato come ethcs.

Terzo post ed ora mi uccidete...
Ho trovato il problema = nome del file troppo lungo -.-''
Maledetto FAT

Grazie del supporto :slight_smile:

Grazie a te del feedback

FAT usa nomi nel formato 8.3.

D4ng3R92:
Perchè devo settare il pin10 com out? Sulla mia scheda è segnato come ethcs.

come ti dicevo:

  • il PIN 10 ha la funzione di CS per il modulo ethernet (sempre connesso via SPI all'Atmel di Arduino)
  • anche se non lo usi come CS, comunque perché la libreria SD funzioni devi impostarlo come output

bye

Stesso problema, grazie per la dritta