jeudi 29 novembre 2012

Lecture de fichiers mp3 avec Arduino et VS1053 (première exploration)

Note: Vous devriez plutôt lire cet article plus récent et plus complet, sur le même sujet:


Voici un résumé de mes premières explorations d'un module MP3 VS1053 (ou VS1003) fabriqué en Chine par LCSoft Studio et vendu sur eBay pour une douzaine de dollars environ.   Lorsqu'il est piloté par un microcontrôleur, le circuit intégré VS1053 permet de lire un grand nombre de formats de fichiers musicaux (Ogg Vorbis, MP3, AAC, WMA, FLAC, MIDI):  on peut tout de suite saliver en imaginant une chaîne stéréo de fabrication maison, réalisée au moyen d'un Arduino et de notre propre amplificateur stéréo...  De plus, le module est muni d'un petit microphone permettant, au besoin, d'enregistrer du son.

Je n'en suis pas tout à fait là, toutefois.  Dans un premier temps, je me suis mis à la recherche d'un peu de documentation afin de savoir comment brancher le module à l'Arduino.   Puisqu'il s'agit d'un périphérique "SPI", nous savons déjà que les sorties 11, 12 et 13 de l'Arduino seront sollicitées.

Même si le module demande une alimentation de 5 volts, il semble préférable (et peut-être même nécessaire, pour éviter tout dégât regrettable) que l'Arduino lui envoie des signaux numériques de 3,3 volts:  il faut donc prévoir 5 diviseurs de tension constitués, par exemple, d'une résistance de 2,2K et d'une autre de 3,3K (un diviseur de tension n'est toutefois pas pertinent lorsque le signal va du module vers l'Arduino).

Voici donc le détail des branchements:

VS1053 5 V → Arduino 5 V *
VS1053 DGND → Arduino GND
VS1053 XDCS → diviseur de tension → Arduino 6
VS1053 DREQ → Arduino 7
VS1053 XRST → diviseur de tension → Arduino 8
VS1053 XCS → diviseur de tension → Arduino 9
VS1053 SCK → diviseur de tension → Arduino 13
VS1053 MOSI → diviseur de tension → Arduino 11
VS1053 MISO →  Arduino 12

* Les deux entrées 5 V du module VS1053 communiquent ensemble:  une seule d'entre elles est suffisante.

Vous pouvez consulter ici un schéma montrant clairement comment disposer les diviseurs de tension (toutefois, ce circuit comporte aussi un lecteur de carte SD et les sorties utilisées sur l'Arduino ne sont pas les mêmes).


Finalement, la partie logicielle:  j'ai trouvé cette librairie conçue par Andy Karpov.  Après l'avoir installée dans le dossier "libraries",  j'ai uploadé dans l'Arduino le sketch d'exemple "vs1003_hello":  lorsqu'on branche une paire d'écouteurs dans le jack du module mp3, on entend le mot "hello" répété sans arrêt (le fichier mp3 se trouve à l'intérieur même du sketch).

Ça fonctionne!   Mais ça devient vite irritant, et on espère un peu mieux d'un module à $12...mais ce sera pour la prochaine fois!

Yves Pelletier (Twitter: @ElectroAmateur)

dimanche 18 novembre 2012

Contrôle d'un moteur pas à pas avec un ULN2003

Voici une petite marche à suivre pour contrôler un moteur pas à pas unipolaire au moyen d'un Arduino et d'un ULN2003.

L'ULN2003 regroupe sur un même circuit intégré 7 transistors darlington, ce qui permet d'alimenter un moteur avec un courant beaucoup plus intense que ce que peut tolérer un microcontrôleur comme l'Arduino. Des modules à base d'ULN2003 sont vendus sur eBay pour moins de $2 (il s'agit de faire une recherche avec les mots clés "stepper motor driver board UL2003").

Commençons par une mise au point importante:  l'ULN2003 fonctionne très bien pour des moteurs pas à pas unipolaires (ceux qui sont munis de 5 ou 6 fils), mais il n'est pas du tout conçu pour piloter des moteurs pas à pas bipolaires (ceux qui ne comportent que 4 fils).  Pour un moteur bipolaire, il faudra utiliser un autre circuit intégré, comme par exemple le L293D ou le L297. Si j'avais su ça avant, je n'aurais pas perdu quelques heures à tenter sans succès de faire tourner un moteur bipolaire avec ce module!

Quatre connecteurs situés du côté gauche de la carte permettent de brancher les sorties numériques de l'Arduino.  Si vous désirez utiliser les exemples fournis avec l'environnement de programmation Arduino, vous branchez la sortie 8 de l'Arduino à l'entrée "IN1", la sortie 9 à "IN2, la sortie 10 à "IN3", et la sortie 11 à "IN4".

Les connecteurs situés dans le bas de la carte, juste en dessous de l'ULN2003 servent à brancher la source de tension qui alimentera le moteur:  pas question d'utiliser la sortie 5 volts de l'Arduino car le moteur risquerait de demander beaucoup trop de courant!  On suggère ici de 5 à 12 volts, même si l'ULN2003 peut en principe tolérer jusqu'à 30 V (en dépassant 12 V, je suppose qu'on risquerait de griller les LEDs indicatrices présentes sur la carte).

Il ne reste plus qu'à brancher le moteur, ce qui n'est pas tout à fait évident si votre moteur provient d'une vieille imprimante et que vous ne disposez d'aucune documentation à son sujet.  Au moyen d'un multimètre, vous pourrez probablement identifier le fil qui est commun aux deux bobines:  c'est celui qui présente la plus faible résistance électrique par rapport aux autres fils.

Par exemple, le moteur que j'ai utilisé (un moteur Mitsumi pris dans une vieille imprimante StyleWriter d'Apple) comporte 5 fils:  blanc, jaune, noir, rouge et brun.   La résistance entre le fil noir et n'importe lequel des autres fils est de 80 Ω, alors que la résistance pour toutes les autres paires (excluant le fil noir) est de 160 Ω.  Il fallait donc relier le fil noir à la cinquième sortie de la carte (celle que j'ai identifiée "Moteur commun" dans la photo ci-dessus).

Pour brancher les 4 autres fils au bon endroit, j'y suis allé par essai-erreur!  Quand le moteur est mal branché, il vibre à la place de tourner...  Après 4 tentatives infructueuses, j'ai fini par faire tourner mon moteur correctement en branchant son fil blanc à "Moteur 1", son fil brun à "Moteur 2", son fil jaune à "Moteur 3", et son fil rouge à "Moteur 4"  (ce code de couleur n'a rien d'universel:  il faut essayer de trouver l'agencement qui conviendra à votre propre moteur).

Je n'inclus pas de sketch puisque je me suis contenté d'utiliser (avec des modifications mineures) les exemples "stepper_oneRevolution" et "stepper_oneStepAtATime" qui sont fournis dans l'environnement de programmation Arduino (vous y accédez au moyen du menu Fichier / Exemples / Stepper).

Lorsque votre moteur fonctionne, vous pouvez, en l'observant, déterminer le nombre de "steps" qu'il fait à chaque tour (c'était 48 pour mon moteur).

Et si on remplaçait l'Arduino par un MSP430 Launchpad?  À la condition d'utiliser Energia, c'est exactement la même chose qu'avec un Arduino!  La librairie "Stepper" est fonctionnelle, et les mêmes exemples sont disponibles dans les menus.  Si vous ne modifiez pas les exemples, vous reliez la sortie P2.0 du Launchpad à l'entrée "Moteur 1" de la carte ULN2003 (voir photo plus haut), P2.1 à "Moteur 2", P2.2 à "Moteur 3" et P2.3 à "Moteur 4".  La tension de sortie de 3,3 volts du Launchpad est suffisante pour faire réagir l'ULN2003.

À lire aussi:  Contrôle d'un moteur pas à pas avec un L293

Yves Pelletier (Twitter: @ElectroAmateur)

samedi 10 novembre 2012

Détecter la présence d'un train dans une gare cachée

Un sympathique adepte de modélisme ferroviaire répondant au nom de jpp (ou pn62) m'a demandé si j'avais une idée pour réaliser un circuit permettant de détecter la présence d'un train à l'intérieur d'une gare cachée:  "Au pupitre de commande, une Led rouge sera allumée si le rayon IR est coupé (train présent) une Led verte sera allumée  si le rayon n’est pas coupé ( emplacement libre).  J’utilise du 5 volts."

Je présente donc fièrement la solution que j'ai trouvée:  une LED infrarouge éclaire un phototransistor qui forme un diviseur de tension avec une résistance de 33 kΩ:  la tension aux bornes du phototransistor est d'environ 2 volts lorsqu'aucun train ne se trouve entre la LED infrarouge et le phototransistor, mais il s'élève à presque 5 volts lorsqu'un train intercepte le signal.

Cette tension est acheminée à l'entrée inverseuse d'un comparateur LM393, et sera...comparée à une tension de référence d'environ 2,5 volts (produite par les deux résistances de 180 kΩ) acheminée à l'entrée non-inverseuse.  Lorsqu'aucun train n'est présent, le comparateur produit une tension de sortie élevée (presque 5 volts), ce qui allume la LED verte (puisqu'un troisième diviseur de tension soumet l'autre électrode de cette LED à une tension d'environ 2,5 volts).  Lorsqu'un train est présent, le signal de sortie devient pratiquement nul, ce qui allume la LED rouge (branchée tête-bêche avec la LED verte).

On peut probablement remplacer le LM393 par à peu près n'importe quel amplificateur opérationnel, et les valeurs des résistances ne sont pas critiques.

Il existe certainement d'autres circuits permettant d'en arriver au même résultat:  si vous avez d'autres idées, n'hésitez pas à laisser un commentaire...

Yves Pelletier (Twitter: @ElectroAmateur)