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. 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
- 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
- Ajoutez de la mémoire à votre robot
- Donner une voix à votre projet
Source
Retrouvez nos tutoriels et d’autres exemples dans notre générateur automatique de code
La Programmerie