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; String buffer; 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"); } //Read file byte by byte myFile = SD.open("test.txt"); if (myFile) { Serial.println("Read test.txt byte by byte:"); while (myFile.available()) { Serial.write(myFile.read()); } myFile.close(); } else { Serial.println("error opening test.txt"); } //Read file line by line myFile = SD.open("test.txt"); if (myFile) { Serial.println("Read test.txt line by line:"); while (myFile.available()) { buffer = myFile.readStringUntil('\n'); Serial.println(buffer); } 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
bonjour
1 – y a t il un truc pour dater le ficher (par défaut 01/01/2000 01:00) avec comme source un module genre ds3231 ?
2 – j’ai réussie a concaténer la date du module ds3231 mais pas a l’intégrè dans le nom du ficher pour le moment . (une histoire de char et string)
merci
cordialement
Bonjour,
1- Oui c’est possible il faut rechercher la librairie SdFat
2- Vous pouvez tester cette fonction en remplaçant par vos valeurs
long counter=0;
void getFilename(char *filename) {
long seconds = millis() / 1000;
long minutes = seconds / 60;
counter+=1;
long hours = counter;//minutes / 60;
long days = hours / 24;
filename[0] = 19/10 + ‘0’;
filename[1] = 19%10 + ‘0’;
filename[2] = 1/10 + ‘0’;
filename[3] = 1%10 + ‘0’;
filename[4] = 31/10 + ‘0’;
filename[5] = 31%10 + ‘0’;
filename[6] = hours/10 + ‘0’;
filename[7] = hours%10 + ‘0’;
filename[8] = ‘.’;
filename[9] = ‘t’;
filename[10] = ‘x’;
filename[11] = ‘t’;
}
Ce serait possible de lire le fichier texte ligne par ligne?
J’ai un code qui interprète le G code ligne par ligne à partir de la connexion série. je veux me passer de la connexion série donc je pensais mettre le fichier G code dans une sd et lire ligne par ligne le programme pour ne pas avoir de trop lourdes modifications à faire sur le programme d’interprétation de G code qui, même si il est assez clair est tout de même un peu au dessus de mon niveau en programmation Arduino.
ça m’intéresserait de voir le code pour interpréter un Gcode avec Arduino. Peux-tu me l’envoyer?
Pour lire un fichier ligne par ligne, tu peux écrire:
avec buffer un String
while (printFile.available()) {
buffer = printFile.readStringUntil('\n');
Serial.println(buffer);
}