Publié le 30 juillet 2024 - par

Lecteur mp3 sur carte SD avec Raspberry Pi PICO et ampli I2S

C’est lors d’échanges avec Julien, technicien chez  Kubii, qu’est née l’idée de cet article. La problématique c’était de lire des .mp3 grâce à un Raspberry Pi PICO sous Circuit Python,  monté sur la carte Cytron MakerPi PICO qu’on trouve sur le site Kubii. La carte Maker Pi Pico est décrite plus en détails dans l’article. Les .mp3 sont stockés sur une carte SD et on les envoie sur un ampli I2S de type MAX98357A. Je vous présente ici de quoi démarrer ce genre de projet.

Lecteur mp3 sur carte SD avec Raspberry Pi PICO et ampli I2S

Il existe des lecteurs MP3 et des cartes à quelques euros qui permettent de lire les mp3. Après on peut profiter des vacances pour apprendre un peu plus sur le sujet et fabriquer son propre lecteur, non ?

Le Raspberry Pi PICO

C’est la carte microcontrôleur développée par la fondation Raspberry Pi autour d’un RP2040. Il existe plusieurs version, avec ou sans connecteur soudé, avec ou sans interface wifi/bluetooth…
Pour l’occasion, j’ai choisi un PICO W, c’est le troisième modèle à partir de la gauche sur la photo ci-dessus.
Je vous ai présenté le Raspberry Pi PICO en janvier 2021 lors de sa sortie, et il y a de nombreux articles du blog qui en parlent.

  • Microcontrôleur RP2040 conçu par Raspberry Pi au Royaume-Uni
  • Processeur ARM Cortex M0+ à double cœur, horloge flexible fonctionnant jusqu’à 133 MHz
  • 264 Ko de SRAM et 2 Mo de mémoire Flash embarquée
  • Le module peut se souder directement sur une carte
  • Puce CYW43439 d’Infineon,  2,4GHz  IEEE 802.11 b/g/n
  • Prise en charge de l’hôte et du périphérique USB 1.1 (OTG)
  • Mise en veille à puissance réduite et modes « dormants »
  • Programmation par glisser-déposer en utilisant le stockage de masse via USB
  • 26 broches GPIO multifonctions
  • 2 × SPI, 2 × I2C, 2 × UART, 3 × 12-bit ADC, 16 × canaux PWM contrôlables
  • Horloge et minuterie précises intégrées
  • Capteur de température
  • Bibliothèques accélérées en virgule flottante intégrées
  • 8 × machines d’état à entrées/sorties programmables (PIO) pour le support de périphériques personnalisés

Le Raspberry Pi PICO contrairement à d’autres microcontrôleurs, n’a pas de bus I2S dédié. Vous pouvez le chercher sur l’image ci-dessus… Il n’y est pas !  Ici le bus I2S sera disponible sur les GPIO 0, 1 et 2 et sera fourni par le module audiobusio de circuitPython.

La carte Cytron MAKER PI PICO

C’est une carte de développement pour le Raspberry Pi PICO fabriquée par CYTRON. Elle existe en 2 versions, avec ou sans le Raspberry Pi PICO Soudé sur la carte :


La version de gauche possède le Raspberry Pi PICO monté sur la carte. Celle de droite a un support sur lequel on pourra monter le Raspberry Pi PICO de son choix. Dans les deux cas on dispose de connecteurs Grove pour connecter des modules existants.
La carte est bien documentée, et ses différentes fonctions sont disponibles, avec les ports GPIO utilisés.


La carte sans PICO possède deux rangées de contacts, une rangée sert à connecter le PICO, l’autre accueille les fils Dupont pour connecter des périphériques extérieurs.
La carte avec le PICO a les mêmes fonctions. A noter le switch qui permet de couper le buzzer si besoin. Le GP18 est utilisé pour le buzzer et la sortie canal gauche de la BF sur la prise Jack 3,5mm. Cette carte avec le PICO intégré est disponible chez Kubii.

Schéma de la carte.
Schéma des LEDs de signalisation. Chaque GPIO possède sa LED, ce qui permet de suivre ce qui se passe en temps réel.
L’idée ici c’est de développer un projet avec ce support puis de le porter sur une carte de circuit imprimé (PCB) directement.

Quelques détails de la carte Maker Pi PICO

La carte SD se place ici. c’est un connecteur type clic-clic tu enfonces la carte, il clic et verrouille. Pour sortir la carte tu appuies dessus à nouveau, ça clic et elle sort ! A côté la sortie SON sur les GP18 et 19. LE GP18 va aussi sur le buzzer mais on a un switch pour le couper.
La LED WS2812B Neopixel permet de mettre de la couleur sur la carte. Chaque patte du Pico est bien repérée et possède une diode LED.
Rangée de diodes LED et transis de commandes + les prises Grove.

Le switch du buzzer à gauche et les 3 boutons sur GP20, GP21 et GP22.

Les GP utilisés pour la SD sont indiqués sous la carte

Si besoin on peut couper cette piste et éteindre les LEDs

Matériel utilisé pour cette application


La carte avec les LED allumées

Pour ce développement, j’ai opté pour la carte sans Raspberry Pï PICO, ce qui permet de monter son propre PICO (ici un picoW) mais aussi de changer le PICO en fonction du projet tout en conservant programme et bibliothèques sur le PICO utilisé pour un projet particulier. Vous travaillez toujours sur un seul projet à la fois, vous ?

L’amplificateur I2S MAX98357A

Ici c’est Adafruit qui a créé le module amplificateur I2S. Cette carte combine un DAC I2S et un ampli BF en classe D.

I2S

Le bus I2S du Raspberry Pi PICO est utilisé pour transférer l’audio vers le DAC de l’ampli.

Source https://infocenter.nordicsemi.com/index.jsp?topic=%2Fps_nrf9160%2Fi2s.html

I2S, également appelé Inter-IC Sound, Integrated Interchip Sound, ou IIS, un standard d’interface électrique de type bus série pour connecter des matériels audio numériques ensemble. Il est principalement utilisé pour transporter des informations PCM entre le CD et le DAC dans un lecteur de CD.

Le bus I2S est synchrone, et sépare l’horloge et les signaux de données, contrairement à la liaison asynchrone S/PDIF qui les mélange, ce qui simplifie et fiabilise le traitement de l’horloge. (source Wikipedia)

Amplificateur classe D  MAX98357A

Les informations ci-dessous sont traduites depuis la page Adafruit du MAX98357A sauf mention particulière.

Présentation

Si votre microcontrôleur ou votre micro-ordinateur peut sortir de l’ audio numérique, cet amplificateur est fait pour vous ! Il accepte en entrée de l’audio numérique standard I2S, la transforme en signal analogique, et l’amplifie pour le haut-parleur.

I2S (à ne pas confondre avec I2C) est un protocole sonore numérique utilisé sur les circuits imprimés pour transmettre des données audio. De nombreuses puces et processeurs haut de gamme gèrent tout l’audio au format numérique I2S. Ensuite, pour entrer ou sortir des données, trois ou quatre broches sont utilisées (entrée de données, sortie de données, horloge et sélection du canal gauche-droit). En général, pour les appareils audio, il y a une puce DAC qui prend l’entrée I2S et la convertit en signal analogique qui peut alimenter un casque.

 

Source Audiophonics

Ce petit amplificateur mono est étonnamment puissant – capable de délivrer 3,2 watts de puissance dans un haut-parleur d’une impédance de 4 ohms (puissance sous 5V @ 10% THD). À l’intérieur de la puce miniature se trouve un contrôleur de classe D, capable de fonctionner de 2,7V à 5,5VDC. Comme l’ampli est de classe D, il est très efficace, ce qui le rend parfait pour les projets portables et alimentés par batterie. Il est doté d’une protection thermique et d’une protection contre les surintensités, mais vous verrez qu’il chauffe à peine car il travaille en commutation.

L’entrée audio est au standard I2S, vous pouvez utiliser des données logiques de 3,3V ou 5V. Les sorties sont « Bridge Tied » – ce qui signifie qu’elles sont connectées directement aux sorties, sans connexion à la masse. La sortie est une onde carrée PWM de ~300KHz qui est ensuite «moyennée» par la bobine du haut-parleur – les hautes fréquences ne sont pas entendues. Vous ne pouvez pas connecter la sortie à un autre amplificateur, elle doit alimenter les haut-parleurs directement.

La carte possède une entrée Gain qui peut être manipulée pour changer le gain. Par défaut, l’ampli donne 9dB de gain. En connectant une résistance pullup ou pull down, ou en la reliant directement, la broche Gain peut régler le gain à 3dB, 6dB, 9dB, 12dB ou 15dB.

la broche ShutDown/Mode peut être utilisée pour mettre la puce en veille ou pour définir le canal audio I2S qui sera envoyé au haut-parleur. Par défaut, l’ampli délivre un mixage stéréo (L+R)/2 dans une sortie mono. En ajoutant une résistance, vous pouvez modifier la sortie pour qu’elle soit juste canal gauche ou juste canal droite, ce qui permet de monter un ampli stéréo avec 2 cartes MAX98357A.

La carte fonctionne parfaitement avec Raspberry Pi, Arduino, PICO, et tout autre microcontrôleur ou micro-ordinateur avec des sorties audio I2S.

Spécifications

      •  Puissance de sortie : 3,2W à 4Ω, 10% THD, 1,8W à 8Ω, 10% THD, avec alimentation 5V
      • PSRR : 77 dB typ @ 1KHz
      • Taux d’échantillonnage I2S de 8kHz à 96kHz
      • MCLK pas obligatoire
      • Réduction des clics et des bruits parasites
      • Cinq gains sélectionnables par broche : 3dB, 6dB, 9dB, 12dB, 15dB
      • Excellente suppression des clics et des pops
      • Protection thermique

Connexions

Le MAX98357A est un amplificateur I2S – il ne possède pas d’entrées analogiques, il ne supporte que les entrées audio numériques ! Ne pas confondre I2S et I2C : I2S est un protocole audio alors que I2C est pour de petites quantités de données.

Sortie Haut-parleur

Cet amplificateur est conçu pour piloter uniquement des haut-parleurs à bobine mobile. L’impédance du haut-parleur doit être de 4Ω ou plus. Le signal de sortie est une onde carrée PWM de 330 kHz avec un rapport cyclique proportionnel au signal audio. L’inductance de la bobine du haut-parleur sert de filtre passe-bas pour atténuer les composantes à haute fréquence. N’essayez pas d’utiliser cet appareil comme préamplificateur.

Les sorties de chaque canal sont « pontées » sans connexion à la masse. Cela signifie que pour chaque canal, le + et le – alternent la polarité pour créer un amplificateur à canal unique avec deux fois la tension disponible.

Connectez vos haut-parleurs à l’aide d’un borniers à vis de 3,5 mm.

  • 5V dans 4Ω @ 10% THD – 3W max
  • 5V dans 4Ω @ 1% THD – 2.5W max
  • 3,3V dans 4Ω @ 10% THD – 1,3W max
  • 3,3V dans 4Ω @ 1% THD – 1,0W max
  • 5V dans 8Ω @ 10% THD – 1.8W max
  • 5V dans 8Ω @ 1% THD – 1.4W max
  • 3,3V dans 8Ω @ 10% THD – 0,8W max
  • 3,3V dans 8Ω @ 1% THD – 0,6W max

Alimentation

Il s’agit de l’alimentation de l’amplificateur et de la logique de l’amplificateur. Vous pouvez alimenter entre 2,5V et 5,5V. Notez qu’à 5V, vous pouvez fournir jusqu’à 2,8W dans votre haut-parleur, alors assurez-vous que votre alimentation peut fournir au moins 650mA et il vaut mieux prévoir une alimentation spécifiée pour au moins 800mA afin d’avoir un peu de  marge.

Si vous disposez d’un appareil qui fournit des signaux logiques de 3,3 V, vous pouvez quand même alimenter l’amplificateur en 5 V. C’est d’ailleurs ce que je fais dans mon application pour obtenir la plus grande puissance possible !

Pins I2S

Trois broches sont utilisées pour recevoir les données audio. Elles peuvent recevoir des signaux logiques de 3,3 à 5 V.

  • LRC (Left/Right Clock) – c’est la broche qui indique à l’amplificateur quand les données sont pour le canal gauche et quand elles sont pour le canal droit.
  • BCLK (Bit Clock) – C’est la broche qui indique à l’amplificateur quand lire les données sur la broche de données.
  • DIN (Data In) – C’est la broche qui reçoit les données réelles, les données gauche et droite sont envoyées sur cette broche, la broche LRC indique quand la gauche ou la droite est transmise.
  • Notez que cet amplificateur ne nécessite pas de broche MCLK, si vous avez une sortie MCLK, vous pouvez la laisser déconnectée !

Autres broches

Les autres réglages sont gérés par les broches GAIN et SD

Gain

GAIN c’est… le réglage du gain. Vous pouvez avoir un gain de 3dB, 6dB, 9dB, 12dB ou 15dB.

  • 15dB si une résistance de 100K est connectée entre GAIN et GND
  • 12dB si le GAIN est connecté directement à GND
  • 9dB si GAIN n’est connecté à rien (c’est la valeur par défaut)
  • 6dB si GAIN est connecté directement à Vin
  • 3dB si une résistance de 100K est connectée entre GAIN et Vin

De cette façon, le gain par défaut est de 9dB mais vous pouvez facilement le changer en modifiant la connexion à la broche GAIN. Notez qu’il peut être nécessaire d’effectuer une réinitialisation de l’alimentation pour ajuster le gain. Sur mon montage j’ai relié GAIN à la masse pour avoir un gain de 9dB

SD / MODE

Cette broche est utilisée pour le mode Shutdown (Silencieux) mais elle est également utilisée pour définir le canal de sortie. C’est un peu déroutant, mais en gros, ça se passe comme ça :

  • Si SD est connectée directement à la masse (tension inférieure à 0,16V), l’ampli s’éteint.
  • Si la tension sur SD est comprise entre 0,16V et 0,77V, la sortie est (gauche + droite)/2, c’est-à-dire un signal mono qui représente la somme des deux canaux stéréo..
  • Si la tension sur le SD est comprise entre 0,77V et 1,4V, la sortie est uniquement le canal droit.
  • Si la tension sur SD est supérieure à 1,4V, la sortie est uniquement le canal gauche.

La broche SD est reliée à la masse par une résistance interne de pulldown de 100KΩ, vous devez donc utiliser une résistance de pullup sur SD pour équilibrer le pulldown interne de 100KΩ.

Sur la carte breakout, il y a une résistance de 1MΩ entre SD et Vin qui, lorsqu’elle est alimentée par 5V, vous donnera la sortie « moyenne stéréo ». Si vous voulez le canal gauche ou droit seulement, ou si vous alimentez à partir d’une alimentation autre que 5V, vous devrez peut-être expérimenter avec différentes résistances pour obtenir la tension désirée sur SD. ( ça se calcule…)

Câblage du projet

On va passer à la partie matérielle du projet avec le câblage de l’ampli sur la carte Maker Pi Pico. Pour ma part ce sont des fils Dupont qui font les liaisons.

Le bouton 1 permet de passer à la chanson suivante, le 2 baisse le volume, le 3 augmente le volume (de 0 à 10). Il n’y a que 3 fils pour le bus I2S, plus deux pour l’alimentation et un pour le gain. Les connexions sont les suivantes :

Amplificateur Maker Pi Pico
Vin VBUS
GND GND
GAIN GND
DIN GP2
BCLK GP0
LRC GP1

Préparer les .mp3

Les .mp3 répondent à la demande de julien : il faut des fichiers MONO, 16bits à 22050 Hz de fréquence d’échantillonnage. Les essais que j’ai faits montrent qu’avec ces critères et un débit de 128Kbits/s on obtient un son « correct ». Bon, c’est sûr avec ces paramètres, on n’a pas une qualité audiophile, mais pour l’application envisagée, c’était bien suffisant.

Avec Audacity

 


Dans Audacity, ouvrez votre fichier stéréo

Pistes > Mix > Mix stéréo vers mono
Audacity fait la somme des signaux gauche et droit

Vous pouvez normaliser (ou pas) l’audio pour avoir un son toujours à peu près constant

> Exporter l’audio

>Export to computer


Débit 128 Kb/s

> Échantillonnage à 22050 Hz

> Exporter

Avec ces valeurs le .mp3 est lu par le programme. Je n’ai pas testé d’autres combinaisons. I existe un mode « macro » sur Audacity mais apparemment on ne peut pas encore paramétrer la fréquence d’échantillonnage. Pour la modif en batch j’ai opté pour ffmpeg.

Avec ffmpeg

Après avoir cherché qques tutoriels j’en ai trouvé un qui transforme les .mp3 en .wav mono  à 22050 Hz , puis un autre qui transforme mes .wav en .mp3. Ça fonctionne. Je n’ai pas été plus loin, on peut sans doute faire la manip en une seule fois, je vous laisse vous amuser avec ça 😛

Conversion mp3 => wav

for i in *.mp3; do ffmpeg -i « $i » -acodec pcm_s16le -ac 1 -ar 22050 « ${i%.mp3}-encoded.wav »; done

Conversion Wav => mp3

for i in *.wav; do ffmpeg -i « $i » -ac 1 -ar 22050 « ${i%.mp3}-pico.mp3 »; done

Circuit Python

Une autre demande, c’était d’utiliser Circuit Python pour réaliser le player. Circuit Python est basé sur Python et destiné à la programmation des microcontrôleurs. C’est le langage choisi par Adafruit. Il en existe des versions pour le PICO et le Raspberry Pi, mais aussi pour de nombreuses autres cartes. Vous trouverez ces versions sur cette page qui les regroupe.

Programme en circuit Python

Le code Circuit Python

Programme code.py que vous pouvez télécharger en cliquant sur ce lien.

Il y a pas mal de commentaires dans le programme cela devrait vous guider si vous voulez le modifier. Comme je dis souvent « C’est un programme de Maker ! » Qu’est ce que ça veut dire ? Que l’appli fonctionne mais que c’est codé « avec les pieds ». On peut certainement faire mieux, alors n’hésitez pas à améliorer le programme, je publierai vos versions ci-dessous !

Comment ça marche

Avec Circuit Python il faut créer un dossier vide appelé /sd à la racine du PICO. C’est ce dossier qui servira au montage de la carte SD. J’ai formaté la carte SD « à blanc » avec SD formater pour être certain qu’elle soit propre. C’est un modèle Samsung 8Go.

Lorsqu’on connecte le lecteur (on branche la prise USB sur le PICO), le lecteur monte la carte SD, fait la liste des fichiers .mp3 présents sur la carte puis les joue 1 par 1. Si vous êtes connecté(e) avec Thonny par exemple, des messages dans la console permettent de suivre ce qui se passe.

Lorsqu’un fichier est en cours la LED du PICO est allumée et la LED de la MakerPiPico est allumée en vert. Le bouton 1 permet de passer à la plage .mp3 suivante et les boutons 2 et 3 règlent le volume en 10 niveaux (de 0 à 10, avec 0 = son coupé)

Je n’ai pas mis d’anti rebond sur les boutons, juste une tempo de 0,5 sec qui suffit sur ce genre d’appli sauf si vous tapez sur les boutons comme un forcené ! Sans cette tempo et avec la boucle, le volume passe de 0 à 10 et de 10 à 0 trop vite ! Là aussi si vous voulez vous amusez le code est fourni en CC BY NC SA et vous en faites ce que vous voulez !

Une démo du lecteur MP3 en vidéo

Désolé, je ne peux pas mettre le fichier sur Youtube car les qques secondes de musique font que la vidéo est BLOQUÉE ! allez faire des essais dans ces conditions !

La vidéo est disponible ici :
https://drive.google.com/file/d/182sbeBFPUy1ADY30CMNx4cs8Kra6oSir/view?usp=sharing

Vous entendez 2 fois le même morceau au changement de mp3 car j avais les 2 versions faites avec Audacity et ffmpeg pour comparer.

 

Conclusion

Cette collaboration distante avec Julien m’a permis de découvrir une utilisation du Raspberry Pi PICO que je n’avais pas encore abordée. Quelques problèmes à résoudre pour faire fonctionner tout ça ensemble mais ça pourra resservir quand il faudra attaquer un ampli directement depuis un Raspberry Pi PICO.
Je pense à Vador qui tourne actuellement sur Raspberry Pi Zero 2 W mais qui pourrait se voir doter dans une prochaine version d’un simple PICO à 5€ !

Sources

https://www.kubii.com/fr/malettes-plateformes-d-experimentation/3474-maker-pi-pico-3272496308244.html

https://www.adafruit.com/product/3006

https://learn.adafruit.com/adafruit-max98357-i2s-class-d-mono-amp

https://learn.adafruit.com/adafruit-max98357-i2s-class-d-mono-amp/assembly

Conversion mp3 avec ffmpeg
https://gist.github.com/whizkydee/804d7e290f46c73f55a84db8a8936d74

https://www.cytron.io/p-maker-pi-pico

À propos François MOCQ

Électronicien d'origine, devenu informaticien, et passionné de nouvelles technologies, formateur en maintenance informatique puis en Réseau et Télécommunications. Dès son arrivée sur le marché, le potentiel offert par Raspberry Pi m’a enthousiasmé j'ai rapidement créé un blog dédié à ce nano-ordinateur (www.framboise314.fr) pour partager cette passion. Auteur de plusieurs livres sur le Raspberry Pi publiés aux Editions ENI.

4 réflexions au sujet de « Lecteur mp3 sur carte SD avec Raspberry Pi PICO et ampli I2S »

  1. sophie

    Merci Francois pour cet article.

    Cela peux fonctionner sous micropython également, même si cela reste encore ‘expérimental’ pour ceux intéressé je vous conseil github.com/miketeachman/micropython-i2s-examples

    Cordialement

    Répondre

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Complétez ce captcha SVP *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.