fbpixel
Étiquettes : , , ,

Une des faiblesses du microcontrôleur Arduino est qu’il a peu de mémoire. Lorsqu’on veut traiter un nombre important de données (enregistrer des mesures ou écrire ou lire des fichiers, etc.), il est nécessaire de rajouter de la mémoire. Pour cela, on peut utiliser un carte Secure Digital ou carte SD qui permet d’allouer de la mémoire supplémentaire tout en conservant un encombrement réduit.

Matériel

  • Ordinateur
  • Arduino UNO x1
  • câble USB pour connecter l’Arduino à l’ordinateur x1
  • Shield ou module pour carte SD

Présentation du shield SD Card

Quelque soit le module que vous choisissez, il se présentera de la même façon: un emplacement pour la carte SD et des pins pour pouvoir s’y interfacer.

sd-card-module Lire et écrire sur une carte SD avec Arduino
sd-card-shield-v4 Lire et écrire sur une carte SD avec Arduino

Le module de carte SD présente 6 broches pour permettre d’établir la connexion. 2 connexions pour l’alimentation et 4 pour établir la liaison SPI (Serial Peripheral Interface)

  • 5V ou 3.3V pour l’alimentation du module
  • GND la masse du module
  • CS ou ChipSelect pour activer la communication
  • MISO (Master Input, Slave Output) broche de transmission. Sortie du module.
  • MOSI (Master Output, Slave Input) broche de réception. Entrée du module.
  • SCK (Clock) horloge permettant de synchroniser la communication

Dans le cas d’un shield les branchements sont prédéfinis. Vérifiez bien dans la documentation technique du composant comment l’utiliser.

Schéma de câblage

arduino-sd-module_bb Lire et écrire sur une carte SD avec Arduino
  • 3.3V sur 3.3V
  • GND sur GND
  • CS généralement sur 4 (ici sur 10)
  • MISO sur 12
  • MOSI sur 11
  • SCK sur 13

Code pour récupérer les info d’une carte SD

Pour interagir avec votre carte SD, il existe un librairie dans l’IDE Arduino :  SD.h.  Des exemples sont disponibles sur le logiciel et sur internet.

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

Sd2Card card;
SdVolume volume;
SdFile root;

const int chipSelect = 10;

void setup() {
  Serial.begin(9600);
  while (!Serial) {
  } 
  


  Serial.print("\nInitializing SD card...");

  if (!card.init(SPI_HALF_SPEED, chipSelect)) {
    Serial.println("initialization failed");
    return;
  } else {
    Serial.println("Wiring is correct and a card is present.");
  }

  Serial.print("\nCard type: ");
  switch (card.type()) {
    case SD_CARD_TYPE_SD1:
      Serial.println("SD1");
      break;
    case SD_CARD_TYPE_SD2:
      Serial.println("SD2");
      break;
    case SD_CARD_TYPE_SDHC:
      Serial.println("SDHC");
      break;
    default:
      Serial.println("Unknown");
  }

  if (!volume.init(card)) {
    Serial.println("Could not find FAT16/FAT32 partition.\nMake sure you've formatted the card");
    return;
  }

  uint32_t volumesize;
  Serial.print("\nVolume type is FAT");
  Serial.println(volume.fatType(), DEC);
  Serial.println();

  volumesize = volume.blocksPerCluster();    // clusters are collections of blocks
  volumesize *= volume.clusterCount();       // we'll have a lot of clusters
  volumesize *= 512;                            // SD card blocks are always 512 bytes
  Serial.print("Volume size (bytes): ");
  Serial.println(volumesize);
  Serial.print("Volume size (Kbytes): ");
  volumesize /= 1024;
  Serial.println(volumesize);
  Serial.print("Volume size (Mbytes): ");
  volumesize /= 1024;
  Serial.println(volumesize);


  Serial.println("\nFiles found on the card (name, date and size in bytes): ");
  root.openRoot(volume);

  root.ls(LS_R | LS_DATE | LS_SIZE);
}


void loop(void) {}

Code pour lire et écrire des données dans un fichier stocké sur la carte SD

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

File myFile;

String buffer;
String filename = "test";

void setup() {
  Serial.begin(9600);
  while (!Serial) {
  }


  Serial.print("Initializing SD card...");

  if (!SD.begin(4)) {
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("initialization done.");

  myFile = SD.open(filename + ".txt", FILE_WRITE);

  if (myFile) {
    Serial.print("Writing to " + filename + ".txt...");
    myFile.println("testing 1, 2, 3.");
    myFile.close();
    Serial.println("done.");
  } else {
    Serial.println("error opening " + filename + ".txt");
  }
  //Read file byte by byte
  myFile = SD.open(filename + ".txt");
  if (myFile) {
    Serial.println("Read " + filename + ".txt byte by byte:");

    while (myFile.available()) {
      Serial.write(myFile.read());
    }

    myFile.close();
  } else {

    Serial.println("error opening " + filename + ".txt");
  }

  //Read file line by line
  myFile = SD.open(filename + ".txt");
  if (myFile) {
    Serial.println("Read " + filename + ".txt line by line:");

    while (myFile.available()) {
      buffer = myFile.readStringUntil('\n');
      Serial.println(buffer);
    }
    myFile.close();
  } else {
    Serial.println("error opening " + filename + ".txt");
  }

}

void loop() { }

Il est possible d’effacer le fichier en utilisant la fonction:

SD.remove("test.txt");

Attention: Si vos fichiers ne sont pas reconnus, essayez d’utiliser un nom court pour le fichier enregistré sur la carte SD (max 8 caractères).  En effet, le nombre de caractères pour un fichier sur une carte SD est limité avec Arduino.

Testez et mélangez ces exemples pour obtenir les fonctionnalités que vous désirez. Si vous rencontrez un soucis pour utiliser votre carte SD avec le microcontrôleur Arduino, n’hésitez pas à nous laisser un commentaire ou à nous envoyer un message.

Bonus: Affichez les fichiers stockés sur la carte SD

Pour vérifier que les fichiers sont bien enregistrés sur la carte SD, il est possible d’afficher les fichiers stockés à la racine. Il suffit pour cela d’utiliser l’objet File qui permet de parcourir les répertoires de la carte SD.

//Libraries
#include <SD.h>//https://www.arduino.cc/en/reference/SD 
#include <SPI.h>//https://www.arduino.cc/en/Reference/SPI 

//Constants
#define SD_ChipSelectPin 4

//Objects
File root;

void setup() {
  //Init Serial USB
  Serial.begin(9600);
  Serial.println(F("Initialize System"));
  //Init sd shield
  if (!SD.begin(SD_ChipSelectPin)) {
    Serial.println(F("SD fail"));
    return;
  }
  printFilenames();
}

void loop() {

}

void printFilenames(void ) { /* function printFilenames */
  ////find files in SD card
  root = SD.open("/");
  while (true) {
    File entry =  root.openNextFile();
    if (! entry) {
      break;// no more files
    }
    Serial.println(entry.name());
    entry.close();
  }
  root.close();

}

Application

Source

Retrouvez nos tutoriels et d’autres exemples dans notre générateur automatique de code
La Programmerie