Ce qui suit est le résultat de mes recherches et mes essais.
Les librairies disponibles pour interfacer Arduino et les cartes SD
- La librairie SD, intégrée à l'IDE Arduino depuis la version 0.22.
- La librairie sdfat créée par William Greiman, d'où est tirée la librairie SD.
Principaux points communs entre ces 2 librairies
- Les 2 librairies gèrent les noms de fichier au format 8.3 (et seulement ceux-ci) et gèrent les FAT 16 et 32
- Les 2 librairies permettent (bien-sûr !) la création, lecture, écriture, suppression de fichiers
Principales différences entre ces 2 librairies
- La librairie SD est fournie dans le package de l'IDE (depuis la version 0.22). Il faut par contre installer la librairie sdfat (dispo sur ce site)
- La librairie SD ne lit que les fichiers situés à la racine de la SD. sdfat supporte la gestion des répertoires (que ce soit en lecture, création, suppression)
- sdfat permet bien d'autres opérations, telles que l'écriture en mode raw (permettant des accès plus rapides), et d'autres fonctions poussées, comme la gestion de la carte SD (comme l'analyse de la carte)
Mise en oeuvre des bibliothèques
Initialisation de la carte
- Lib SD:
#include <SD.h>
- Lib sdfat:
#include <SdFat.h>
#include <SdFatUtil.h> // l'utilité de cet include reste à vérifier dans le cas d'une utilisation limitée à l'écriture/lecture de données sur la carte SD
Contrôle de l'accès à la carte
- Lib SD:
if (!SD.begin(4)) {
Serial.println("Erreur à l'init!");
return;
}
Serial.println("init Ok.");
- Lib sdfat:
Sd2Card card;
SdVolume volume;
SdFile root;
SdFile file;
if (!card.init(SPI_HALF_SPEED))
{
Serial.println("Erreur à l'init de carte");
}
// initialize a FAT volume
if (!volume.init(&card))
{
Serial.println("Erreur à l'init du volume");
}
// Ouverture du volume
if (!root.openRoot(&volume))
{
Serial.println("Erreur à l'ouverture du volume");
}
Ouverture d'un fichier et écriture de données
- Lib SD:
File theFile;
theFile = SD.open("fichier.txt", FILE_WRITE); // ouverture de fichier.txt en écriture
if (theFile) {
Serial.print("Ecriture de données sur la premiere ligne");
theFile.println(", fin de la ligne et passage a la ligne suivante");
// Fermeture du fichier:
theFile.close();
Serial.println("C'est écrit !");
} else {
// impossible d'ouvrir/créer le fichier:
Serial.println("Erreur d'ouverture de fichier.txt");
}
- Lib sdfat:
// ce qui suit est tiré du sketch de l'avertisseur radar /Flash disponible en téléchargement sur ce blog
void writeCRLF(SdFile& f) {
f.write((uint8_t*)"\r\n", 2);
}
void writeNumber(SdFile& f, uint32_t n) {
uint8_t buf[10];
uint8_t i = 0;
do {
i++;
buf[sizeof(buf) - i] = n%10 + '0';
n /= 10;
} while (n);
f.write(&buf[sizeof(buf) - i], i);
}
void writeString(SdFile& f, char *str) {
uint8_t n;
for (n = 0; str[n]; n++);
f.write((uint8_t *)str, n);
}
// Fonction principale:
if (file.open(&root, "fichier.txt", O_CREAT | O_APPEND | O_WRITE)){
// Crée le fichier s'il n'existe pas, sinon l'ouvre en mode Ajout, en lecture
writeString(file, "Ecriture d'une chaine de caractères");
writeNumber(file, millis()); // Ecriture d'un nombre
writeCRLF(file); // Ecriture d'un retour chariot
}
else
{
Serial.println("Ouverture impossible du fichier");
}
Ouverture d'un fichier et lecture des données
- Lib SD:
theFile = SD.open("fichier.txt");
if (theFile) {
Serial.println("fichier.txt:");
// lecture du fichier jusqu'à la fin:
while (theFile.available()) {
Serial.write(theFile.read());
}
// Fermeture du fichier:
theFile.close();
}
else {
// Ouverture impossible:
Serial.println("Ouverture impossible de fichier.txt");
}
- Lib sdfat:
int16_t n;
uint8_t buf[7];// ce chiffre n'a a priori pas d'importance. Il défini la longueur de la chaine lue à chaque itération
while ((n = file.read(buf, sizeof(buf))) > 0) {
for (uint8_t i = 0; i < n; i++) Serial.print(buf[i]);
}
Voilà.
J'espère que ces quelques exemples vont vous aider à aborder le traitement de fichiers sur carte SD.
Les librairies sont aussi fournies avec des exemples, pour aller plus loin ... au risque de me répéter, la librairie sdfat propose d'autres fonctions expliquées dans ces exemples