Lecteur de carte SD pour Arduino

Utilisation de capteurs et composants électroniques avec Arduino.
Une fiche de tutoriel pour chaque.

Lecteur de carte SD pour Arduino

Messagepar tiptop » Jeu 5 Déc 2013 22:41

Arduino et lecteur de carte mémoire SD

Image

Composants utilisés

Principe de fonctionnement
Un lecteur de carte SD permet de lire et écrire sur toutes les cartes mémoires SD au format standard. Le shield Internet W5100 utilise par exemple les cartes micro-SD plus petites (un adaptateur permet de s'en servir aussi dans les appareils utilisant le format large).

Ces cartes SD sont compatibles avec les téléphones mobiles, ordinateurs portables, appareils photos, caméscopes, caméras GoPro, dictaphones, etc...
On peut y stocker toutes sortes de formats de fichiers.

Montage
Formater une carte SD avec un système de fichiers Fat32 depuis son ordinateur (attention ceci efface toute la carte).
Image
Les cartes sont souvent vendues déjà formatées.

Insérer le shield Ethernet W5100 (ou un autre dispositif compatible SD) sur la carte Arduino Uno.
Mettre la carte micro-SD formatée dans le lecteur intégré et raccorder le tout par câble USB à l'ordinateur pour la programmation via l'IDE Arduino.
La carte SD fonctionne en 3.3V, le shield réalise automatiquement les conversions de niveaux 5V - 3.3V.

Utilisation
La librairie SD permet de formater, lire et écrire sur la carte, en formatage Fat16 et Fat 32. On peut y créer des dossiers (répertoires) comme sur un PC.
La communication se fait par le bus SPI, utilisant les pins 11 (MOSI), 12 (MISO) et 13 (CLK) sur la carte Uno (et 50 51, 52 sur la carte Mega).

Une broche sert de SS pour sélectionner le lecteur de carte SD (à maintenir impérativement en sortie). Utiliser selon le lecteur de carte :
  • Pin 10 (ou pin 53 sur la carte Mega) pour les shields et modules Adafruit
  • Pin 8 pour le shield Sparkfun SD
  • Pin 4 pour notre shield Ethernet W5100.

Important, la sortie pin 10 (53 pour la carte Mega) doit être laissé en sortie sinon la librairie SD ne fonctionnera pas, même si on ne s'en sert pas comme CS pin.

Contenu de la librairie SD
Les fonctions de la classe SD sont détaillées ici http://arduino.cc/en/Reference/SD
  • begin () initialise la librairie et la carte SD.
  • exists () vérifie si un fichier ou un dossier existe sur la carte SD.
  • mkdir () crée un dossier (répertoire) sur la carte SD, et les répertoires intermédiaires d'accès.
  • open () ouvre un fichier sur la carte SD, le crée s'il n'existe pas encore pour l'écriture.
  • remove () efface un fichier de la carte SD.
  • rmdir () efface un répertoire (qui doit être vide) de la carte SD.
.

Les fonctions de manipulation de fichiers
  • available() vérifie s'il y a des octets à lire dans le fichier.
  • close() ferme le fichier et vérifie qu'il a bien été écrit et sauvegardé physiquement dans la carte SD.
  • flush() s'assure que les octets écrits sur la carte SD l'ont bien été physiquement (à la fermeture c'est automatique).
  • peek() lit un octet dans un fichier sans avancer au suivant.
  • position() retourne la position actuelle du curseur dans le fichier où sera écrit le prochain octet.
  • print() écrire des données dans le fichier ouvert en écriture au préalable, en ASCII.
  • println()
  • seek() cherche une nouvelle position dans le fichier, entre 0 et la taille de fichier.
  • size() retourne la taille du fichier.
  • read() lit un octet dans le fichier.
  • write() écrit des données dans le fichier.
  • isDirectory() les répertoires sont des types de fichiers particuliers, cette fonction reconnaît les répertoires.
  • openNextFile() ouvre le fichier suivant dans un répertoire.
  • rewindDirectory() on retourne sur le premier fichier d'un dossier, à utiliser avec openNextFile.

Exemples de programmes pour Arduino

CardInfo retourne des informations sur la carte SD (type de volume, espace libre...)
Ce code examine la carte, puis lit / écrit un fichier à créer puis à effacer.
Code: Tout sélectionner
//=============================================================
// CardInfo
// Vérifie la présence d'une carte SD dans le lecteur, son formatage
// affiche la liste des répertoires et fichiers présents
// tiptopboards.com
// Traduit de Arduino.cc Limor Fried, Tom Igoe  // 03 12 2013
//=============================================================
#include <SD.h>    //Utiliser la librairie SD


Sd2Card card;     //Variables utilisées par le programme
SdVolume volume;
SdFile root;
File myFile;    //Fichier à créer et effacer


// Modifier ceci selon le module utilisé, pour le shield Ethernet utilsier pin 4
// Pour les shields et modules Adafruit : pin 10; Sparkfun SD shield: pin 8
const int chipSelect = 4;      //Configuré en sortie

void setup()
{
  Serial.begin(9600);   //Affichage série
  Serial.print("\nInitialisation SD ...");
  //Laisser en sortie pin 10 sinon SD ne fonctionnera pas
  pinMode(10, OUTPUT);     // pin 53 si carte Mega

  //Tster si la carte fonctionne
  if (!card.init(SPI_HALF_SPEED, chipSelect)) {
    Serial.println("Echec de l initialisation. Choses a verifier :");
    Serial.println("* la carte est elle inseree ?");
    Serial.println("* le cablage est il correct ?");
    Serial.println("* avez vous reglé le chipSelect pin selon votre shield ou module ?");
    return;
  } else {
   Serial.println("Montage correct et carte presente");
  }

  // Afficher le type de carte
  Serial.print("\nType de carte : ");
  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("Inconnu");
  }

  // Maintenant on va essayer d'ouvrir le 'volume'/'partition' -  FAT16 ou FAT32
  if (!volume.init(card)) {
    Serial.println("Ne trouve pas de partition FAT16 / FAT32 .\nAssurez vous d avoir formate la carte");
    return;
  }


  // Affiche le type le la taille de la première FAT-type volume
  uint32_t volumesize;
  Serial.print("\nVolume type FAT");
  Serial.println(volume.fatType(), DEC);
  Serial.println();
 
  volumesize = volume.blocksPerCluster();    // clusters = collections de  blocks
  volumesize *= volume.clusterCount();       // On a un lot de clusters
  volumesize *= 512;                         // SD card blocks de toujours 512 octets
  Serial.print("Taille de volume (octets): ");
  Serial.println(volumesize);
  Serial.print("Taille de volume (Koctets): ");
  volumesize /= 1024;
  Serial.println(volumesize);
  Serial.print("Taille de volumee (Moctets): ");
  volumesize /= 1024;
  Serial.println(volumesize);

 
  Serial.println("\nFichiers trouves sur la carte (nom, date et taille en octets): ");
  root.openRoot(volume);
 
  // liste de tous les fichiers sur la carte avec leur date et taile
  root.ls(LS_R | LS_DATE | LS_SIZE);
}  //Fin du setup

void loop(void) {
 //============= Essai de lecture / ecriture
//Test de création de fichier  (pin 4 pour le shield Ethernet)
 if (!SD.begin(4)) {
    Serial.println("Echec de l initialisation !");
    delay(1500);
    return;
  }
  Serial.println("Initialisation OK");
 
  if (SD.exists("example.txt")) {
    Serial.println("Le fichier example.txt existe deja");
  }
  else {
    Serial.println("Le fichier example.txt n existe pas encore");
  }

  // Ouvrir un nouveau fichier et le refermer aussitôt
  Serial.println("Creation de example.txt...");
  myFile = SD.open("example.txt", FILE_WRITE);
  myFile.close();

  // Vérifier si ce fichier existe
  if (SD.exists("example.txt")) {
    Serial.println("Maintenant example.txt existe");
  }
  else {
    Serial.println("Erreur de creation example.txt n existe pas"); 
  }

  // Effacer ce fichier
  Serial.println("Effacer example.txt...");
  SD.remove("example.txt");

  if (SD.exists("example.txt")){
    Serial.println("example.txt existe encore");
  }
  else {
    Serial.println("example.txt n existe plus"); 
  }
delay(5000); //5 sec

} //Fin de programme


Carte absente :
Image

Carte non formatée :
Image

Carte correcte, liste des fichiers et dossiers présents :
Image


Astuces importantes
Si ça ne fonctionne pas directement, retirer et remettre la carte SD dans le lecteur pour forcer sa reconnaissance, puis appuyer sur le bouton reset du shield pour relancer le programme.
Il semble que le code Arduino ne trouve pas toujours la carte SD si elle est déjà insérée au lancement.

Les cartes SD sont prévues pour marcher sous 3.3V, et Arduino en 5V. L'utilisation d'un simple lecteur nécessite d'adapter les signaux (sinon le fonctionnement peut être erratique) avec un circuit 74HC125 (ou un pont diviseur à résistances) pour les signaux CS (chip enable), SCK (serial clock), Mosi (Master Out, Slave In) et Miso (Master In, Slave Out).
Le shield Ethernet réaliser directement ces conversions de tensions.

On peut par exemple réaliser un data logger avec une carte Arduino et un lecteur SD.

Références
Le lecteur de carte SD pour Arduino, la librairie SD http://arduino.cc/en/Reference/SD

Si on utilise le lecteur de carte SD , adapter les niveaux à 3.3V
http://electroniqueamateur.blogspot.fr/ ... duino.html

Adaptation 3.3V
http://forum.arduino.cc/index.php?actio ... 6735;image
tiptopboards - admin
Avatar de l’utilisateur
tiptop
Administrateur du site
 
Messages: 93
Inscription: Mar 13 Aoû 2013 20:38
Localisation: 38

Re: Lecteur de carte SD pour Arduino

Messagepar nico » Mer 13 Aoû 2014 21:37

bonjour à tous

je ne comprend pas pourquoi, mais le programme ne fonctionne pas chez moi !
nico
 
Messages: 1
Inscription: Mar 12 Aoû 2014 22:35

Re: Lecteur de carte SD pour Arduino

Messagepar tiptop » Mer 13 Aoû 2014 22:00

quel est le message d'erreur ?
tiptopboards - admin
Avatar de l’utilisateur
tiptop
Administrateur du site
 
Messages: 93
Inscription: Mar 13 Aoû 2013 20:38
Localisation: 38

Re: Lecteur de carte SD pour Arduino

Messagepar Clément » Lun 11 Jan 2016 15:10

Bonjour, lorsque je tente de créer le dossier "Photo" Sur la carte Arduino, rien ne se passe. Et lorsque je relance le code comme si je n'avais rien écrit, elle m'affiche le dossier mais avec une date et une heure faussées. Comment régler ça?
Clément
 
Messages: 1
Inscription: Mar 8 Déc 2015 10:48


Retourner vers Capteurs et composants

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 10 invités