samedi 29 juin 2013

Lecture de fichiers mp3 avec Arduino et VS1053 (2e partie...enfin!)

Cet article fait suite à ma première exploration du module VS1053 publié il y a... 6 mois!  À ce moment, j'avais branché le module VS1053 à l'Arduino, puis utilisé une librairie conçue par Andy Karpov pour faire jouer un très bref fichier mp3 situé à l'intérieur même du sketch.

L'étape suivante était évidente:  faire jouer des fichiers mp3 se trouvant à l'intérieur d'une carte SD.  Et c'est là que les choses se sont sérieusement compliquées!  Ce qui semblait pouvoir être réalisé en quelques heures de travail s'est transformé en quelques dizaines d'heures de troubleshooting fort peu productives.  M'inspirant d'un projet similaire réalisé par un certain Kalum (dont la page kalum.posterous.com n'existe malheureusement plus), j'utilisais des diviseurs de tension (résistances en série) pour abaisser à 3,3 V les signaux de 5 V émis par l'Arduino.  Le circuit fonctionnait parfois, mais très souvent le lecteur de carte SD cessait de fonctionner aussitôt que j'ajoutais le module VS1053 dans le circuit...


La stabilité du circuit s'est grandement améliorée lorsque j'ai remplacé les diviseurs de tension par des circuits intégrés 74HC125 (malgré tout, le protocole SPI est capricieux:  il n'aime pas tellement les breadboard, ni les fils trop longs).

D'autre part, je disposais d'un sketch assez complexe qui fonctionnait relativement bien pour lire de façon séquentielle les fichiers mp3 situés sur la carte SD, mais qui avait la malencontreuse habitude de s'écrouler chaque fois que j'essayais de lui apporter des modifications.  J'aurai certainement l'occasion, un de ces jours, de lire avec attention les 89 pages de la fiche technique du VS1053, mais en attendant, j'étais à la recherche d'une solution plus simple...

Les choses se sont améliorées lorsque j'ai découvert la librairie SFEMP3Shield de Bill Porter et Michael P. Flaga.  Cette librairie a été conçue spécialement pour le shield mp3 de Sparkfun, ce qui explique pourquoi j'ai mis autant de temps à la découvrir (le shield mp3 de Sparkfun semble un excellent produit, mais le radin que je suis avait opté pour une option plus économique).  Le shield comporte un VS1053 et un lecteur de carte SD:  à la condition de brancher mes périphériques aux mêmes pins de l'Arduino, la librairie est parfaitement utilisable avec le matériel dont je dispose.  Et la conception de sketch s'en trouve grandement simplifiée!

Afin d'utiliser la librairie, les branchements à respecter sont donc les suivants:

Module de carte SD:
SD GND // Arduino GND
SD +5 // Arduino 5 V
SD CS // Conversion 5 V à 3,3 V // Arduino 9
SD MOSI // Conversion 5V à 3,3 V // Arduino 11
SD MISO // Arduino 12
SD SCK // Conversion 5 V à 3,3 V // Arduino 13

Module VS1053:
VS1053 5V // Arduino 5 V
VS1053 DGND // Arduino GND
VS1053 DREQ // Arduino 2
VS1053 XCS // Conversion 5 V à 3,3 V // Arduino 6
VS1053 XDCS // Conversion 5 V à 3,3 V // Arduino 7
VS1053 XRST // Conversion 5 V à 3,3 V // Arduino 8
VS1053 MOSI // Conversion 5 V à 3,3 V // Arduino 11
VS 1053 MISO // Arduino 12
VS1053 SCK // Conversion 5 V à 3,3 V // Arduino 13

Le schéma ci-dessous montre comment je m'y suis pris pour abaisser les signaux de 5 V émis par l'Arduino avec deux CI 74HC125.  Remarquez que j'aurais pu brancher le MOSI des deux périphériques sur la pin 6 du même 74HC125, comme je l'ai fait pour les deux signaux d'horloge SCK, plutôt que les abaisser séparément pour chaque périphérique.  Peu importe l'option choisie, le résultat est le même.



Seul pépin avec la librairie SFEMP3:  au début, l'initialisation du VS1053 était interrompue par une erreur de type 4, parce que son registre SCI_MODE contenait une valeur différente de ce qu'elle aurait dû être.  Je ne connais pas la cause exacte de cette anomalie, mais j'ai trouvé le remède:  j'ai ouvert le fichier "SFEMP3Shield.cpp"  de la librairie, et j'ai effacé la ligne " if(MP3Mode != (SM_LINE1 | SM_SDINEW)) return 4; ".  Maintenant, tout fonctionne à merveille.

La librairie est accompagnée d'un exemple très bien commenté qui permet de contrôler la lecture des fichiers mp3 au moyen du moniteur série.  J'ai pour ma part réalisé un petit sketch permettant de jouer des fichiers mp3 au moyen de boutons branchés aux pins analogiques de l'Arduino (car il ne restait plus beaucoup de pins numériques disponibles).  Ces boutons permettent de passer au fichier suivant (ou au fichier précédent), d'interrompre/continuer la lecture d'un fichier, et de modifier le volume sonore.  Le sketch est très court, car c'est la librairie qui fait tout le travail!

Contrainte importante, toutefois: pour que ce sketch fonctionne, il faut que tous les fichiers mp3 portent un nom standardisé de la forme "Track001.mp3", "Track002.mp3", etc.  Et ils ne peuvent pas se trouver à l'intérieur de dossiers.  Évidemment, ce n'est pas l'idéal, et il me reste donc encore des choses à apprendre...

Yves Pelletier (Twitter: @ElectroAmateur)

4 commentaires:

  1. Bonjour

    J'ai fait exactement le même montage et j'ai visiblement quasiment le même matériel.

    La lecture sur SD fonctionne correctement jusqu'au moment où je branche le VS1053

    Auriez vous une piste svp ?

    RépondreSupprimer
    Réponses
    1. J'ai eu exactement le même problème au début, quand j'utilisais des résistances pour abaisser la tension à 3,3 V. Ce problème a disparu quand j'ai remplacé les résistances par le circuit intégré.

      D'autre part, j'ai souvent lu des commentaires concernant l'importance d'utiliser des fils très courts lorsqu'on branche des périphériques SPI.

      Supprimer
  2. Mes fils ne font pas plus de 10cm pour les plus longs et j'utilise un CI pour abaisser la tension.

    Mais merci tout de même

    RépondreSupprimer
  3. Bonjour,
    je voudrais faire une WebRadio pour radin, sur la base d'un wemos (2.5€), d'un VS1053(6€) et d'une paire d'écouteur(2€) soit 10.5€. comment orienter le flux du wemos sur le VS1053 ?

    RépondreSupprimer

Related Posts Plugin for WordPress, Blogger...