Cet article a été mis à jour le 17 décembre 2020.
Voici quelques recommandations pour brancher un lecteur de carte SD à une carte Arduino Uno (il s'agit du modèle fabriqué par LC Studio qu'on peut facilement trouver sur eBay pour une bouchée de pain).
Ces petits modules comportent 16 connecteurs, mais la plupart d'entre eux sont redondants et dans les faits 6 connexions sont nécessaires pour les faire fonctionner: "+3.3" et "GND" pour l'alimentation, "SCK", "MOSI", "MISO" et "CS" pour la communication SPI.
Bien qu'ils soit possible de les alimenter avec une tension de 5 V, ces modules sont conçus pour communiquer à un niveau logique de 3,3 V. Certains modules de cartes SD (plus élaborés, et donc plus coûteux) comportent déjà un circuit qui abaisse à 3,3 V les tensions d'entrée, mais ce n'est pas le cas du module fabriqué par LC Studio. L'entrée "+5" est la seule qui puisse être branchée à 5 volts, parce qu'elle est munie d'un régulateur de tension.
Une façon possible d'abaisser à 3,3 volts le signal de 5 volts émis par l'Arduino consisterait à utiliser un simple diviseur de tensions (deux résistances en série). Cette pratique est toutefois déconseillée par l'auteur de la bibliothèque SD, car le signal de 3,3 V risque d'être déformé par des transitions exponentielles qui perturbent l'interprétation correcte des signaux.
Il faut plutôt abaisser le signal au moyen d'un circuit intégré spécialisé, capable de réagir suffisamment rapidement, comme le 4050 (74HC4050 ou CD4050), qui permet d'abaisser jusqu'à 6 signaux logiques simultanément.
Cette transformation doit être effectuée pour les signaux SPI qui vont de l'Arduino vers le lecteur de cartes SD: CS (chip enable), SCK (serial clock) et MOSI (master out, slave in). Toutefois, il ne serait pas approprié d'altérer le signal MISO (master in, slave out) qui est émis à 3,3 V par le lecteur SD (l'Arduino interprète un signal de 3,3 V comme une valeur logique haute).
Notez également qu'il faut éviter que les fils utilisés pour les branchements soient trop longs.
Les connexions
Trois connecteurs du module SD sont branchés directement à l'Arduino:
Il faut plutôt abaisser le signal au moyen d'un circuit intégré spécialisé, capable de réagir suffisamment rapidement, comme le 4050 (74HC4050 ou CD4050), qui permet d'abaisser jusqu'à 6 signaux logiques simultanément.
Cette transformation doit être effectuée pour les signaux SPI qui vont de l'Arduino vers le lecteur de cartes SD: CS (chip enable), SCK (serial clock) et MOSI (master out, slave in). Toutefois, il ne serait pas approprié d'altérer le signal MISO (master in, slave out) qui est émis à 3,3 V par le lecteur SD (l'Arduino interprète un signal de 3,3 V comme une valeur logique haute).
Notez également qu'il faut éviter que les fils utilisés pour les branchements soient trop longs.
Les connexions
Trois connecteurs du module SD sont branchés directement à l'Arduino:
- GND du module SD ---> GND de l'Arduino
- +5 du module SD ----> 5 V de l'Arduino (OU +3.3 du module SD ---> 3V3 de l'Arduino)
- MISO du module SD ----> 12 de l'Arduino Uno (ou 50 si c'est un Mega)
Toutefois, les broches SCK, MOSI et CS du lecteur de carte SD sont branchées à des sorties du 4050. De cette façon, les signaux de 5 V générés par les broches 13, 11 et 10 de l'Arduino seront transformés en signaux de 3,3 V:
- Broche CS du module SD: broche 2 du 4050
- Broche 10 de l'Arduino Uno: broche 3 du 4050
- Broche MOSI du module SD: broche 4 du 4050
- Broche 11 de l'Arduino Uno: broche 5 du 4050
- Broche SCK du module SD: broche 6 du 4050
- Broche 13 de l'Arduino Uno: broche 7 du 4050
De plus, il faut correctement alimenter le circuit intégré:
- Broche 1 du 4050: sortie 3,3 V de l'Arduino Uno
- Broche 8 du 4050: broche GND de l'Arduino Uno
Il est également conseillé de relier à la masse (GND) toutes les sorties inutilisées, soit les broches 9, 11 et 14 du 4050.
Dans le passé, j'ai aussi utilisé avec succès le 74HC125 plutôt qu'un 4050. Les connexions sont indiquées sur le schéma ci-dessous.
Pour tester le fonctionnement correct de votre carte SD, vous pouvez exécuter l'exemple "CardInfo" distribué avec l'IDE Arduino.
J'ai aussi fait ce petit sketch en pigeant dans les exemples officiels: après avoir vérifié la présence de la carte SD, je vérifie son contenu, puis je créé un nouveau fichier pour y écrire une quelconque banalité.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
Experimentations avec le lecteur de carte SD. | |
Branchements: | |
CS -> pin 10 (53 sur mega) | |
MOSI -> pin 11 (50 sur mega) | |
MISO -> pin 12 (51 sur mega) | |
SCK -> pin 13 (52 sur mega) | |
Basé sur les exemples pris sur arduino.cc | |
https://electroniqueamateur.blogspot.com/2012/06/carte-sd-et-arduino.html | |
*/ | |
#include <SD.h> | |
// déclaration de quelques variables | |
const int chipSelect = 10; //pin de l'Arduino reliee au CS du module SD | |
Sd2Card card; | |
SdVolume volume; | |
SdFile root; | |
File myFile; | |
void setup() | |
{ | |
// Ouverture du port serie | |
Serial.begin(9600); | |
while (!Serial) { | |
; | |
} | |
Serial.print("\nRecherche de la carte SD..."); | |
pinMode(10, OUTPUT); // 53 si ArduinoMega. Peu importe la valeur de chipSelect. | |
// On vérifie si une carte est présente | |
if (!card.init(SPI_HALF_SPEED, chipSelect)) { | |
Serial.println("pas de carte?"); | |
return; | |
} | |
else { | |
Serial.println("la carte est bien la."); | |
} | |
// On trouve le volume | |
if (!volume.init(card)) { | |
Serial.println("La carte n'est pas formatee?"); | |
return; | |
} | |
// on sort la liste des fichiers déjà présents | |
Serial.println("\nFichiers trouves sur la carte (nom, date et taille): "); | |
root.openRoot(volume); | |
root.ls(LS_R | LS_DATE | LS_SIZE); | |
// On se prepare a jouer dans les fichiers | |
if (!SD.begin(chipSelect)) { | |
Serial.println("Echec de l'initialisation"); | |
return; | |
} | |
Serial.println("Initialisation OK."); | |
// ouverture du fichier pour ecriture (il sera créé s'il n'existait pas déjà) | |
myFile = SD.open("SECRET.txt", FILE_WRITE); | |
// Si l'ouverture du fichier a fonctionné, on écrit quelque chose à l'intérieur | |
if (myFile) { | |
Serial.print("Ecriture dans le fichier..."); | |
myFile.println("Arduino est venu ici!"); | |
// fermeture du fichier | |
myFile.close(); | |
Serial.println("c'est fait."); | |
} | |
else { | |
// si l'ouverture du fichier a échoué, on l'indique | |
Serial.println("impossible d'ouvrir le fichier pour l'ecriture"); | |
} | |
// on ouvre le fichier, et on vérifie son contenu | |
myFile = SD.open("SECRET.txt"); | |
if (myFile) { | |
Serial.println("Contenu du fichier:"); | |
// read from the file until there's nothing else in it: | |
while (myFile.available()) { | |
Serial.write(myFile.read()); | |
} | |
// Fermeture du fichier | |
myFile.close(); | |
} | |
else { | |
// si l'ouverture du fichier a échoué, on l'indique | |
Serial.println("impossible d'ouvrir le fichier pour la lecture"); | |
} | |
} | |
void loop(void) { | |
} |
Yves Pelletier (Twitter: @ElectroAmateur)