35

Arduino SD card module

In questa pagina vediamo come usare Arduino per leggere e scrivere file posti in una scheda SD ad un prezzo molto contenuto.

 

Ci sono molti modi per usare le SD Card con Arduino. Ci sono shield che hanno integrato lettori SD Card: ad esempio la Ethernet Shield o la Wireless Shield.

Altrimenti si possono acquistare moduli appositi che svolgano solo questa funzione. Basta fare ricerche sul web per trovare varie soluzioni (cercate ad esempio “Arduino SD Module”).

Acquista il modulo SD.
Inserite la SD Card nell’apposita slot (come la figura seguente):

 

IMG_20150620_135630

 

Infine effettuiamo questi collegamenti con i Pin di Arduino:

  • MOSI = Pin 11 (Nella versione Arduino MEGA il 50);
  • MISO = Pin 12 (Nel MEGA 51);
  • CLK (a volte troverete SCK) = Pin 13 (Nel MEGA 52);
  • CS = Pin 4 (Se doveste avere errori provate il 10, modificandolo anche nello sketch, oppure nel MEGA il 53);
  • GND = GND;
  • VCC = 5V (se non indicato diversamente dal venditore).

Fatto questo vediamo lo sketch da caricare su Arduino.

In particolare questo semplice sketch (ispirato a quello che potete trovare tra gli esempi della libreria SD di Arduino) permette di aprire la card SD, aprire il file numeri.txt (se non esiste lo crea), estrarre un numero intero casuale compreso tra 0 e 999, scriverlo sul file, chiuderlo, riaprirlo e rileggerne il contenuto. Queste operazioni sono ripetute o 5 secondi.

Lo sketch:

 

/* Sketch che permette di aprire un file numeri.txt su SD Card
 * scrivere un numero casuale tra 0 e 999, chiudere il file
 * e rileggerne il contenuto
 */


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



File file;




void setup()
{
  Serial.begin(9600);
  Serial.print("Inizializzazione Card: ");

  if (!SD.begin(4)) //il Pin 4 è collegato a CS
  {
    Serial.println("FALLITA!");
    return;
  }
  Serial.println("ESEGUITO!");
  
}






void loop()
{
  int c = random(0,1000); //Estraggo numero casuale tra 0 e 999
  
  file = SD.open("numeri.txt", FILE_WRITE); //File in scrittura

  if (file) //Se il file è stato aperto correttamente
  { 
    Serial.print("Numero casuale scelto: ");
    Serial.println(c);
    Serial.println("Scrittura su file: ");
    file.println(c); //Scrivo su file il numero
    
    file.close(); //Chiusura file
    Serial.println("ESEGUITO!");
  } 
  else 
  {
    Serial.println("ERRORE: apertura file numeri.txt");
  }

  file = SD.open("numeri.txt"); //Riapro il file
  if (file) //Se il file è stato aperto correttamente
  {
    Serial.println("Contenuto file numeri.txt: ");

    //Continua fino a che c'è qualcosa
    while (file.available()) 
    {
      Serial.write(file.read());
    }
    
    file.close(); //Chiudo file
  } 
  else 
  {
    Serial.println("ERRORE: apertura file numeri.txt");
  }
  
  delay(5000); //Attendi 5 secondi prima di ricominciare
}

 

Nello sketch vengono rilevati anche eventuali errori dovuti all’apertura fallita di SD e file.
Si può poi verificare l’effettivo caricamento del file anche da pc (se si dispone di un lettore di SD Card):

 

CartellaSD CartellaSD2

Vi lascio il collegamento alla guida ufficiale dove si può avere un elenco di tutte le funzioni che si possono usare con questa libreria e con quella file: clicca qui.

 

 

Share This:

Simone

Studente Data di nascita: 12/07/1990 - Parma, IT Hobbies: Informatica, acquariofilia, viaggi, tecnologia, aria aperta, sport, web.

35 Comments

  1. Pur avendo copia-incollato lo sketch, su serial monitor mi da errore e nella sd non scrive nulla.
    Hai idea di quale possa essere il problema?

    • Buonasera Gianni,
      l’errore è: “Inizializzazione Card: FALLITA”?

      Nei primi test anche a me usciva questo errore ed era dovuto al fatto che la SD era danneggiata, ho dovuto cambiare SD.
      Si potrebbe, in modo da verificare questo, provare ad aprire la SD con un PC o con un altro dispositivo e formattarla.
      Un altro motivo potrebbe essere che la SD è impostata in modalità solo lettura e si potrebbe risolvere spostando la piccola “linguetta” che c’è a lato della SD (ci si accorge di questo problema perchè anche da PC non sarà permesso inserire file o formattarla).
      Un altro problema potrebbe anche essere qualche errore nei collegamenti.
      Il modulo di SD READER è lo stesso che c’è nella foto oppure è differente?

    • la SD funziona se collegata in una shield RTC+SD, quindi escludo un suo malfunzionamento.
      Linguetta verso i pin, quindi non è in sola lettura.
      il modulo è praticamente uguale, cambia solo la posizione di C4

          • Molto strano. Purtroppo allora non saprei.
            A parte consigliarti di ricontrollare i collegamenti o pensare che sia danneggiato il modulo della SD non saprei che altro pensare.
            Ho controllato anche online e, per quanto riguarda i collegamenti, sono sempre gli stessi che anche io ho usato.
            Fai queste ultime prove, altrimenti non saprei che fare..

            Prova ad usare il pin 10 al posto del 4 (cambiandolo anche nello sketch).
            Prova altrimenti a controllare se dove hai acquistato il modulo sono specificati diversi pin di collegamento

          • si, sto già usando il pin 10.
            potresti casomai caricare una foto in cui si vedano per intero i collegamenti tra arduino e il lettore sd? grazie

          • Ciao. Ho provato sia con Arduino Nano sia con Uno e funzionano entrambi. Sicuro di aver messo il pin 10 anche nello sketch? Hai detto di usare il 10. Nel mio sketch io uso il 4.

            In ogni caso i collegamenti sono scritti nell’articolo. Te li riporto:
            – MOSI = Pin 11 (Nella versione Arduino MEGA il 50);
            – MISO = Pin 12 (Nel MEGA 51);
            – CLK (a volte troverete SCK) = Pin 13 (Nel MEGA 52);
            – CS = Pin 4 (Se doveste avere errori provate il 10, modificandolo anche nello sketch, oppure nel MEGA il 53);
            – GND = GND;
            – VCC = 5V (se non indicato diversamente dal venditore).

            Prova a copiare-incollare il mio sketch ma ad usare il pin 4 al posto del 10.

          • ho provato cambiando 3 diversi arduino UNO e 2 diverse SD.
            nessun risultato, sia con pin 4 che pin 10.
            Qualche idea?

          • Purtroppo non saprei. Prova, se vuoi, a mandarmi una e-mail con la foto del modulo SD reader che hai tu. Trovi l’indirizzo nei contatti. Magari, se ti ricordi, dimmi dove l’hai comprata.

          • Ho risolto.
            Funziona se collego al pin 3,5 volt dell’SD reader i 5v di arduino.

            Immagino possa essere errata la serigrafia (curioso però che non funzioni collegando 3,5-> 5, oltre che con i collegamenti classici)

          • Perfetto. Sono contento che tu sia riuscito. Sì, il problema sarà stato sicuramente quello. Che strano però

  2. Ciao, sto provando lo sketch con l’arduino Mega2560, ho collegato CS sia al 4-10-53 cambiando i pin nello sketch e ho fatto il resto dei collegamenti, ho provato il cambio dell’alimentazione credendo che avessi lo stessi problema dell’utente ma nulla, ho formattato e messo in modalità scrittura la linguetta e nulla, cosa credi possa essere?
    Grazie per il tuo tempo

    • Ciao Gabriele, molto strano.
      Quindi se usi un pc o altro dispositivo riesci ad accedere al contenuto della chiavetta?
      Purtroppo non mi viene in mente nulla… I pin indicati per Arduino MEGA sono quelli consigliati da tutti

      • si riesco ad accedervi, per permettere la sovrascrizione di dati sulla sd la linguetta “lock” deve essere posta in alto, o sbaglio?
        Per il resto ricontrollo i collegamenti ma penso di aver collegato giusto avendo seguito il tuo esempio

        • Esatto. Purtroppo non riesco a capire nemmeno io… Ho provato a cercare in rete ma trovo solo questa configurazione consigliata

          • Eppure i collegamenti sono giusti… non riesco a capire, il modulo SD è identico a quello che hai te in foto e l’ho comprato su amazon.it

  3. ciao simone…..ho un piccolo problemino…..
    salvo su sd card un dato che contiene un numero…..quando lo apro, posso fare delle somme?
    arduino me lo legge come dato o come numero?

    perchè non riesco a fare una semplice somma!!!

    dove sbaglio?

  4. grazie simone sei stato gentilissimo……però purtroppo il mio numero da trattare è molto grande perciò dovrei usare sicuramente unsigned long() come variabile……spero che funzioni….altrimenti hai altri suggerimenti in proposito?

    • è davvero così lungo? Nel caso magari potresti provare con una soluzione poco elegante ma, a mio avviso, funzionale. Hai la stringa, parti dal fondo e procedi verso la testa e ad ogni elemento (carattere) fai questo:
      – converti in numero
      – moltiplichi subito per 1 (il primo), poi per 10 (il secondo), poi per 100
      – sommi ogni volta il risultato in una variabile
      – alla fine la variabile sarà il tuo numero

      Esempio:
      se hai 145 fai 5*1 + 4*10 + 1*100

      Bruttino da vedere ma secondo me funziona

  5. simone ti ringrazio per la tempestività ma essendo alle prime armi con la programmazione mi viene difficile seguirti…mi spiego meglio:

    sono riuscito a salvare in un file txt su sd card i secondi che il mio rtc ds3231 conta dal 1/1/1970 fino ad oggi…
    pensa che numero grande….parliamo di un ordine di miliardi…..

    quello che voglio fare è usare questo numero come variabile e sommarli ,per esempio 10 giorni trasformati ovviamente in secondi, e attivare un dispositivo….

    il mio progetto prevede la pesatura di materiale e dovrei attivare l’aertura di alcune valvole ogni 10 giorni…ma il tutto deve avvenire in automatico senza settare nessuna data…..

    • Allora intanto prova a vedere se con stringtoint riesci a estrarre un long int. Altrimenti, per non fare come ti avevo detto poco fa che magari può essere un po’ complicato potresti salvare sul file txt direttamente la data e non i secondi trascorsi dal 1970. Poi quando estrai la data dalla SD farai fare ad Arduino la differenza tra le due date. Non so se esiste una libreria che faccia questo, altrimenti potresti estrarre la data (in formato stringa) poi la suddividi in giorno mese anno e trasformi ciascun campo in numero (stringtoint) e poi fai la differenza a mano con la data attuale considerando giorni nei vari mesi a seconda del mese, ecc.. Ricordati di considerare le eccezioni: primo mese maggiore del secondo, anni bisestili, ecc

  6. ciao simone…..sono riuscito ad inserire quella stringa (numero enorme) dentro una variabile del tipo unsigned long, e l’ho anche stampata sul serial monitor…..però poi se chiedo di accendere un led dopo, per esempio 10 secondi, non me lo fa……nn capisco…..
    posso allegarti lo sketche cortesemente gli dai un’occhiata?

  7. sei veramente gentile……io sono alle prime armi come ti ho scritto in precedenza perciò ho bisogno di un pò di aiuto e soprattutto chiarimenti perchè la voglia di imparare nn finisce mai….cmq ti sistemo lo sketch e te lo invio per email….nn è lungo perchè al momento prevede solo la lettura dell’ora e della data su un lcd e la memorizzazione di questa benedetta data in secondi su sdcard……nella mail ti descrivo tutto il mio progetto così la cosa ti sarà più chiara….
    grazie simone

  8. Ciao Simone,
    il messaggio di errore che ho io è:
    Initializing SD card…Wiring is correct and a card is present.

    Card type: SD2
    Could not find FAT16/FAT32 partition.
    Make sure you’ve formatted the card
    ho provato 3 sd di capacità diverse e formattate sia in Fat32 che fat “normale” ma l’errore è sempre quello…
    hai qualche suggerimento?

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *