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.

 

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 équivalent à la borne Tx d’un port série. Sortie du module.
  • MOSI (Master Output, Slave Input) broche de réception équivalent à la borne Rx d’un port série. 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

  • 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 disponible 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;
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("test.txt", FILE_WRITE);
 if (myFile) {
   Serial.print("Writing to test.txt...");
   myFile.println("testing 1, 2, 3.");
   myFile.close();
   Serial.println("done.");
 } else {
   Serial.println("error opening test.txt");
 }
 myFile = SD.open("test.txt");
 if (myFile) {
   Serial.println("test.txt:");
   while (myFile.available()) {
     Serial.write(myFile.read());
   }
   myFile.close();
 } else {
   Serial.println("error opening test.txt");
 }
}
void loop() { }

 

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.

 

Application

Ajoutez de la mémoire à votre robot

Donner une voix à votre robot

 

Source

La référence Arduino

Seeed Stufio SD Card shield V4.0