samedi 29 juin 2013

Lecture de fichiers mp3 avec Arduino et VS1053


Cet article a été mis à jour le 29 mars 2021.


Le VS1053 est un circuit intégré spécialement conçu pour décoder les principaux formats de fichiers musicaux: Ogg Vorbis, MP3, AAC, FLAC, WMA, MIDI...

Dans cet article, j'explique comment j'ai procédé pour lire les fichiers mp3 stockés sur une carte SD au moyen d'un carte Arduino Uno et d'un module VS1053.




Il existe quelques modèles différents de modules ("breakouts") qui permettent de brancher facilement un VS1053 à un microcontrôleur. Celui que j'ai utilisé a été fabriqué par LCSOFT STUDIO et porte la mention "VS1003/1053 MP3 CODEC".
Adaptation des niveaux logiques

Mêmes s'ils sont munis d'un régulateur de tension qui permet de les alimenter avec une tension de 5 V, le module VS1053 et le module carte SD ont tous les deux un inconvénient un brin irritant lorsqu'on désire les utiliser avec un Arduino Uno: ils sont conçus pour communiquer à un niveau logique de 3,3 V. Pour éviter des les endommager, il est très fortement conseillé d'abaisser à 3,3 V les signaux de 5 V générés par l'Arduino.

Dans un premier temps, j'avais utilisé des diviseurs de tension, tel que je l'avais décrit dans ce premier article sur le VS1053.  Mais avec ce circuit, le lecteur de carte SD cessait souvent de fonctionner aussitôt que j'ajoutais le module VS1053 ...

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. Mon circuit est donc le suivant:

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 broche 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.



Installation de la bibliothèque VS1053 d'Adafruit

Même si elle a été conçue pour être utilisée avec un autre module VS1053 commercialisé par Adadruit, la bibliothèque VS1053 d'Adafruit fonctionne très bien avec mon module LCSoft Studio.

Seule petite imperfection: dans mon cas, la fonction musicPlayer.begin() ne retourne rien, ce qui devrait arriver uniquement lors de l'échec de l'initialisation du module VS1053. Mais puisque mon module VS1053 se comporte ensuite tout à fait normalement, je me suis contenté d'ignorer cette anomalie (j'ignore s'il s'agit d'un problème exclusif à mon exemplaire, ou si tous les modules VS1053 de LCSoft Studio se comportent de cette façon).

L'exemple ci-dessous joue un après l'autres tous les fichiers mp3 qui se trouvent à la racine de la carte SD. Grâce au moniteur série de l'IDE Arduino, il est possible de monter (+) ou diminuer (-) le volume sonore, de passer à la piste suivante (n), de mettre à pause (p)...

-
-

À lire également:


Yves Pelletier (TwitterFacebook)

mardi 25 juin 2013

Saisie de données (data logging) avec un Arduino



Mise à jour (31 octobre 2016):  voici une version plus récente dans laquelle j'utilise un "data logging shield" plutôt que des composants individuels.

Voici un projet classique qui montre de façon éloquente l'efficacité de l'Arduino pour la conception de systèmes de mesures scientifiques: un "data logger".


Dans ce projet, l'Arduino consigne à toutes les minutes, sur une carte SD,  les valeurs de température et de luminosité mesurées par des capteurs appropriés.

En plus d'un Arduino Uno, j'ai donc utilisé un lecteur de cartes SD muni d'un adapteur lui permettant de recevoir les signaux de 5 V,  un capteur de température numérique DS18B20, une photorésistance et une horloge temps réel (RTC).

Tous ces périphériques étaient déjà prêts à l'emploi, puisqu'ils ont déjà été utilisés dans des articles précédents (que vous pouvez consulter en cliquant les liens du paragraphe précédent).

La seule nouveauté, c'est la sonde d'intensité lumineuse constituée d'une photorésistance branchée en diviseur de tension avec une résistance de 10 kΩ (ma photorésistance varie entre 50 Ω et 200 kΩ, avec une valeurs moyenne d'environ 10 kΩ avec un éclairage moyen).   Cette sonde indique presque 0 dans l'obscurité complète, et pas très loin de 5 V en plein soleil.   Par contre, il ne s'agit que d'une tension donnant une indication grossière de l'intensité lumineuse:  quand l'intensité double, la tension ne va probablement pas doubler.

Les branchements des différents périphériques à l'Arduino sont les suivants:

Le lecteur de cartes SD occupe les pins 10, 11, 12, 13 de l'Arduino (SPI).  Mais prenez garde d'abaisser à 3,3 V les signaux qui doivent l'être (plus d'informations à ce sujet ici).

L'horloge RTC est branchées aux pins A4 et A5 (i2c) de l'Arduino (plus d'infos ici).

Le thermomètre DS18B20 est branché à la pin 7 de l'Arduino (plus d'infos ici).

La sonde à base de photorésistance est branchées à la pin A0 de l'Arduino.

Les données sont enregistrées sur la carte SD sous la forme d'un fichier CSV:  "comma-separated value".  Il s'agit d'un fichier texte destiné à être ouvert dans un tableur comme Excel.  Dans mon sketch, j'ai choisi de respecter la convention adoptée par la version française d'Excel:  les valeurs d'une même ligne sont séparées par des points virgules (plutôt que par des virgules).  De plus, je remplace le point décimal de la température par une virgule.

Pendant le fonctionnement, on peut observer le fonctionnement correct du data logger grâce au moniteur série du programme Arduino:  chaque minute, l'Arduino consigne le temps en secondes depuis le début de la prise de mesure, la date, l'heure, une tension proportionnelle à l'intensité lumineuse, et la température en degrés celcius.

Tel que prévu, les fichier CSV enregistré sur la carte SD s'ouvre facilement dans Excel, et on peut alors effectuer des calculs sur les données, les mettre en graphique, etc.

Ci-contre:  un graphique de la température en fonction du temps pendant quelques heures aujourd'hui.  Journée chaude et humide, puis averse pendant laquelle la température a diminué pour devenir plus confortable.


Il serait utile d'ajouter un dispositif permettant de s'assurer que tout fonctionne correctement pendant que l'Arduino n'est pas branché à un ordinateur.  Car ça doit être un peu frustrant de mettre en place le système pour une série de mesures d'une durée de plusieurs jours, pour ensuite se rendre compte que la carte SD a refusé de s'initialiser au départ.  Ça pourrait être une simple LED qui s'allume en cas d'erreur, ou un afficheur LCD indiquant la dernière valeur mesurée, etc.

Notez qu'Adafruit fabrique un "Data Logging Shield" spécialement conçu pour ce genre d'exercice:  puisque le shield contient déjà un lecteur de carte SD et une horloge RTC, il ne reste plus qu'à brancher les capteurs désirés.

Yves Pelletier (Twitter: @ElectroAmateur)

vendredi 21 juin 2013

Contrôle d'un moteur pas à pas au moyen d'un L6205 (et d'un Arduino)

Le double pont en H L6205 dont je parlais plus tôt cette semaine peut également être utilisé pour contrôler un moteur pas à pas.  Le schéma ci-dessous, largement inspiré de la fiche technique du L6205, fonctionne bien avec les exemples fournis dans l'environnement de programmation Arduino (Menu Fichier / Exemples / Stepper).  Il s'agit de modifier au besoin le contenu de la variable "stepsPerRevolution" pour qu'il concorde avec les caractéristiques de votre moteur.

Ajoutez de préférence deux condensateurs (100 µF et 100 nF) en parallèle avec les deux bornes de la source d'alimentation, le plus proche possible du circuit intégré. Tous les GND sont connectés ensemble (et avec le GND de l'Arduino). Les Power GND sont branchés aux GND à un seul endroit, le plus proche possible de la source d'alimentation.

Tel qu'indiqué, les extrémités des bobinages de votre moteur pas à pas seront branchées aux pins 4, 18, 7 et 13 du circuit intégré.  Si votre moteur est unipolaire (il comporte 5 ou 6 fils), le ou les fils correspondant au centre des bobinages se branchent à la pin 17 (ou, en d'autres mots, à la borne positive de la source d'alimentation du moteur).

Si vous avez de la difficulté à identifier les connexions de votre moteur, cette précédente rubrique pourrait contenir des informations pertinentes pour vous.  Il n'est pas toujours évident de savoir où placer quel fil du moteur mais vous ne risquez pas grand chose si vous faites le mauvais choix:  essayez de permuter des paires de fils si vous constatez que le moteur vibre à la place de tourner...

Yves Pelletier (Twitter: @ElectroAmateur)