vendredi 29 juin 2012

Carte SD et Arduino


Voici une marche à suivre pour brancher un lecteur de carte SD (le modèle fabriqué par LC Studio qu'on feut facimement trouver sur eBay pour une bouchée de pain).

Veuillez remarquer que cet article n'est pas l'article d'origine que j'avais rédigé et publié le 29 juin 2012:  ce que vous lisez en ce moment a plutôt été rédigé le 5 mai 2013, alors que j'ai une bien meilleure expérience des lecteurs de carte SD.

Dans mon article initial, je branchait directement le lecteur SD à l'Arduino, sans prendre la précaution d'abaisser le signal.  Il faut éviter de procéder de cette façon:  l'Arduino produit un signal de 5 V, alors que les cartes SD sont conçues pour fonctionner sous 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. Les résistances que vous voyez sur la carte sont les "pull ups" et non des diviseurs de tension.

Qu'arrive-t-il si vous acheminez à votre lecteur de carte SD des signaux de 5 V?  Je l'ai fait par erreur pendant plusieurs mois, et mon lecteur n'a pas été endommagé.  Toutefois, je soupçonne que l'utilisation de signaux de 5 volts était la cause d'un fonctionnement assez erratique:  mon lecteur fonctionnait parfois, et à d'autres moments il refusait de fonctionner sans que j'aie changé quoi que ce soit au circuit ou au sketch exécuté par l'Arduino.

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 librairie 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.  Certaines personnes rapportent avoir obtenu d'excellents résultats en utilisant des diviseurs de tension, dans mon cas ça fonctionnait très mal.

Il faut plutôt abaisser le signal au moyen d'un circuit intégré spécialisé, capable de réagir suffisemment rapidement:  le 74HC125.  Il contient 4 buffers qui produisent à leur sortie une copie du signal logique d'entrée, mais à un voltage égal à celui qui l'alimente.  Dans notre cas, nous allons alimenter le CI à 3,3 V: chaque fois qu'il recevra un signal logique de 5 V à l'entrée, il émettra un signal logique de 3,3 V à la sortie.

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

Le lecteur de cartes SD est muni de deux rangées de connecteurs mâles identiques, probablement pour faciliter le branchement simultané de plusieurs périphériques SPI au même Arduino.  Vous pouvez évidemment utiliser infiféremment n'importe quelle de ces deux rangées.

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 (ou 50 si c'est un Mega)

Trois autres connecteurs du module SD sont plutôt branchés au 74HC125 (voir l'illustration ci-dessous):  les signaux émis respectivement par les sorties 10, 11 et 13 de l'Arduino n'atteindront les entrées "CS", "MOSI" et "SCK" du module de carte SD qu'après avoir été abaissé à 3,3 V par le 74HC125.

Pour tester le fonctionnement correct de votre carte SD, vous pouvez exécuter l'exemple "CardInfo" distribué avec la version 1.0 de l'environnement de programmation 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é.  Voilà qui sera certainement utile dans un futur projet plus ambitieux...

Cliquez ici pour voir le sketch.

Yves Pelletier (Twitter: @ElectroAmateur)


9 commentaires:

  1. Salut Yves,
    En cherchant sur internet j'ai trouvé ce site mettant en oeuvre un module SD semblable au votre: http://www.instructables.com/id/Arduino-DIY-SD-Card-Logging-Shield/#intro
    Cependant ils utilisent un 4050 pour adapter les entrees/sorties de 5v a 3.3v.
    Est-ce necessaire?

    RépondreSupprimer
  2. Oui, j'ai découvert plus tard que les modules de carte SD sont conçus pour fonctionner sous 3,3 V. Mon propre module a résisté, mais c'est plus prudent de travailler à 3,3 V (ça me rappelle qu'il faudra que je modifie mon article en conséquence).

    RépondreSupprimer
  3. bonjour.
    je n'arrive pas à faire fonctionner le même lecteur avec un MEGA :-(
    Qui y arrive avec les pin 50 51 52 53 ?

    RépondreSupprimer
  4. Salut SpaceMan88,

    Oui, je viens de faire des essais avec un Mega, et ça fonctionne. Les branchements sont:
    MOSI: 51
    MISO: 50
    SCK: 52
    CS: 53

    (donc pas exactement ce que disait mon article, que je vais immédiatement corriger!!!)

    Si tu utilises l'exemple "CardInfo", il faut remplacer "10" par "53" à deux endroits.

    RépondreSupprimer
  5. Merci pour la correction. ce coup-ci ça passe :-))
    Et comme tout problème résolu amène une nouvelle question : si pour une raison d'occupation des pin 51 52 53 54, on voulait placer le lecteur SD ailleurs, sur quel fichier faudrait il intervenir?

    RépondreSupprimer
  6. Je crois que pour un périphérique qui utilise le protocole SPI, on ne peut pas changer les pins MOSI, MISO et CLK: il faut que ce soit 50-51-52 (ou 11-12-13 sur le Uno).

    Par contre plusieurs périphériques SPI différents peuvent partager ces 3 pins (pourvu qu'ils aient chacun leur propre pin CS); l'Arduino peut converser avec chacun des périphériques tour à tour en sélectionnant la pin CS appropriée.

    RépondreSupprimer
  7. ok ça veut dire qu'on peut prendre pour CS une pin disponible. Testé avec succès 40 et 48...
    On devrait pouvoir dialoguer avec plusieurs modules SD si besoin en branchant ensemble les MOSI, MISO, CLK, et en donnant à chacun son CS.
    Je n'ai pas de quoi tester ça...

    RépondreSupprimer
  8. Bonjour,

    Je n'est pas réussi à faire fonctionner ma carte LC Studio et mon MEGA avec le 74HC125. Par contre nickel avec un BC4050.

    Le fonctionnement est identique sauf qu'il n'y a pas besoin de mettre les commandes des buffer à la masse. Donc plus simple comme schéma.

    Merci malgré tout car même si cela n'a pas fonctionné pour moi cela ma mis sur la bonne voie. Merci

    RépondreSupprimer
  9. Bonjour,

    Alors moi ça ne marchait pas comme indiqué avec un 74HC125 sauf avec mon oscillo branché ! J'ai donc rajouté des pull ups de 10K sur SCK et CS coté arduino (donc pin 13 et 10) et ca a résolu le problème.

    Merci pour l'article !

    RépondreSupprimer

Related Posts Plugin for WordPress, Blogger...