mercredi 6 février 2019

Carte SD et STM32 "Blue Pill"

Cet article a été mis à jour le 4 janvier 2020 (ajout d'un schéma de connexion pour la carte Nucleo).

Je continue mon exploration de la carte STM32F103 "Blue Pill" en l'associant, cette fois-ci,  à un lecteur de carte SD, afin d'écrire et lire des fichiers sur une carte SD.

Comme d'habitude, j'utiliserai l'IDE Arduino pour programmer la carte (la marche à suivre a été expliquée ici).

Mon lecteur de carte SD est un module qui communique au moyen du protocole SPI. C'est le modèle économique qu'on trouve facilement sur les sites de vente asiatiques. Il est conçu pour être utilisé à un niveau logique de 3,3 V, ce qui est parfait pour notre Blue Pill.

Connexions

Le module lecteur de carte SD est branché à la Blue Pill de la façon suivante:
  • GND du module carte SD --- GND de la Blue Pill
  • +3.3 du module carte SD --- 3.3 de la Blue Pill
  • +5 du module carte SD --- pas connecté
  • CS du module carte SD --- A4 de la Blue Pill
  • MOSI du module carte SD --- A7 de la Blue Pill
  • SCK du module carte SD --- A5 de la Blue Pill
  • MISO du module carte SD --- A6 de la Blue Pill


Puisqu'il est maintenant possible de programmer à peu près n'importe quelle carte STM32 avec l'IDE Arduino, vous pourriez aussi utiliser, par exemple, une carte Nucleo. Dans ce cas, les connexions sont les mêmes que sur une carte Arduino conventionnelle (dans le cas illustré ci-dessous, il faudrait utiliser "10" dans les sketches, comme numéro de broche "chip select").




Vérification du bon fonctionnement

Une fois le lecteur de carte SD branché à la Blue Pill, l'exemple "CardInfo" de la bibliothèque "SD" est la première chose à essayer: il permet de vérifier que tout fonctionne correctement (notez qu'il n'est pas nécessaire d'installer la bibliothèque SD: il s'agit d'une bibliothèque déjà incluse par défaut avec l'IDE Arduino).



La seule modification à apporter au sketch "Cardinfo" est le numéro de la broche utilisée pour le "chip select", à la ligne 36: il faut remplacer "4" par "PA4":

const int chipSelect = PA4;

Si tout va bien, le moniteur série de l'IDE Arduino devrait montrer un message donnant diverses informations concernant la carte SD insérée dans le lecteur.


Si vous obtenez plutôt un message du genre "initialization failed", il y a un problème quelque part (et il faut le régler). Ces modules pour cartes SD ont la réputation d'être capricieux. Parfois, ça fonctionne avec une carte, et pas avec une autre!


Écriture et lecture d'un fichier

L'exemple "ReadWrite", situé dans le même répertoire que "CardInfo" montre assez clairement comment procéder pour écrire à l'intérieur d'un fichier texte sur la carte SD. Je vous propose ci-dessous une variante commentée en français et prête à être utilisée sans modifications sur votre Blue Pill.

Nous branchons deux boutons poussoir à la Blue Pill: un bouton qui nous permettra d'écrire quelque chose dans un fichier chaque fois qu'il sera enfoncé, et un deuxième bouton qui lira le contenu du fichier (et le transmettra au moniteur série) chaque fois qu'il sera enfoncé.  J'ai branché ces boutons (associés à des résistances pull-down) aux broches B12 et B13 de la Blue Pill.




La bibliothèque SD permet d'interagir avec notre fichier sans trop de difficulté:
  • File monFichier: création d'une variable de type "File" nommée "monFichier".
  • SD.begin(PA4): Initialise la communication avec la carte, PA4 étant la broche de la Blue Pill reliée à la broche "chip select" du lecteur de carte.
  • monFichier = SD.open("Archives.txt", FILE_WRITE) : Ouverture du fichier texte intitulé "Archives.txt", dans le but de modifier son contenu. Si ce fichier n'existe pas, il sera créé, puis ouvert.
  • monFichier.print("Valeur du compteur:  "): écriture des mots "Valeur du compteur:  " à l'intérieur du fichier actuellement ouvert (qui est "Archives.txt").
  • monFichier.println(compteur): écriture de la valeur numérique de la variable "compteur" dans le fichier actuellement ouvert, suivi d'un saut de ligne.
  • monFichier.close(): fermeture du fichier.
  • SD.open("Archives.txt"): ouverture du fichier texte "Archives.txt" dans le but de le lire.
  • monFichier.available(): retourne le nombre de bytes du fichier disponibles pour la lecture
  • monFichier.read(): retourne le prochain caractère à lire dans le fichier (ou -1 s'il ne reste plus rien à lire).
  • monFichier.close(): fermeture du fichier.
Il est important de toujours ouvrir le fichier avant de pouvoir le lire ou y écrire, et on n'oublie pas de le refermer ensuite.

Je n'ai pas utilisé toutes les classes disponibles dans la bibliothèque SD: il en existe d'autres pour, par exemple, faire la liste des fichiers d'un répertoire, effacer un fichier, etc. La liste et la description de toutes les classes peut être consultée sur le site officiel arduino.



Mise à l'essai



Au départ, la carte SD était vide.


J'ai appuyé deux fois sur le bouton "écrire", puis une fois sur le bouton "lire". Le moniteur série m'indique le contenu du fichier (2 lignes de texte). J'appuie encore deux autres fois sur le bouton "écrire", et une fois sur le bouton lire: le moniteur série me montre les 4 lignes de texte maintenant enregistrées dans le fichier.



La carte SD contient maintenant un fichier intitulé "ARCHIVES.TXT dans lequel 4 lignes de texte ont été enregistrées.



Yves Pelletier   (TwitterFacebook)

Aucun commentaire:

Enregistrer un commentaire