Dans ce tutoriel, vous apprendrez à construire une radio Internet, Bluetooth ou MP3 avec un amplificateur PAM8403, un DAC PCM5102 et un microcontrôleur ESP32.
Bien que le DAC PCM5102 facilite grandement la génération de son avec un ESP32, il ne peut piloter que des casques à haute impédance et des enceintes actives. Si vous souhaitez piloter des enceintes passives, vous aurez besoin d’un amplificateur supplémentaire.
Le PAM8403 est un amplificateur de classe D très petit et efficace, capable de piloter des enceintes passives jusqu’à 3 Watts. Il ne nécessite pas d’alimentation séparée et l’ensemble du système audio peut fonctionner sur batterie. Si vous voulez construire une petite radio Internet, Bluetooth ou MP3 portable, ce tutoriel est fait pour vous.
Pièces requises
Vous aurez besoin d’un module DAC PCM5102, d’une carte amplificatrice PAM8403, d’un ESP32 et d’une paire d’enceintes passives. Vous pouvez utiliser d’autres enceintes que celles que j’ai listées, assurez-vous simplement que leur puissance nominale soit d’environ 3 watts.
Ensuite, il vous faut un microcontrôleur. J’ai choisi un ESP32 lite, mais la plupart des autres cartes ESP32 conviendront également.
Pour lire des fichiers MP3 depuis une carte SD, vous aurez également besoin d’une carte SD et d’un module lecteur de carte SD. Une breadboard et quelques câbles seront utiles pour un montage temporaire.

Amplificateur PAM8403

DAC PCM5102

2 x Enceintes 3 Watts 8 Ohms

Lecteur de carte Micro SD

Carte Micro SD 8GB

ESP32 lite

Câble USB de données

Jeu de fils Dupont

Breadboard
Makerguides is a participant in affiliate advertising programs designed to provide a means for sites to earn advertising fees by linking to Amazon, AliExpress, Elecrow, and other sites. As an Affiliate we may earn from qualifying purchases.
Caractéristiques techniques du PAM8403
Le module PAM8403 est un petit amplificateur audio stéréo conçu autour du circuit intégré PAM8403, qui utilise une topologie d’amplification de classe D. Pour les détails techniques du PAM8403, consultez le lien suivant :
Contrairement aux amplificateurs audio classiques de classe AB, l’architecture de classe D du PAM8403 utilise une modulation de largeur d’impulsion (PWM) à haute fréquence pour convertir un signal audio analogique entrant en une commande numérique à haute efficacité pour les enceintes.
Comme les transistors de commutation fonctionnent soit complètement allumés soit complètement éteints, les pertes par conduction sont fortement réduites, permettant à l’amplificateur d’atteindre des rendements proches de 90 % dans des conditions d’utilisation typiques.
Cette caractéristique d’efficacité rend le module particulièrement adapté aux applications audio alimentées par batterie et basées sur microcontrôleur, comme les projets Arduino ou ESP32 où l’espace sur la carte et la consommation d’énergie sont limités.
Caractéristiques électriques et puissance délivrée
Électriquement, le module PAM8403 accepte une tension d’alimentation DC unique dans une plage relativement large, d’environ 2,5 V à 5,5 V. Avec une alimentation nominale de 5 V et en pilotant des enceintes de 4 Ω, chaque canal peut fournir jusqu’à environ 3 W de puissance de sortie.
Entrées signal, gain et réponse en fréquence
L’interface d’entrée audio d’un module PAM8403 comprend deux entrées niveau ligne pour les canaux gauche et droit.
Le gain de l’amplificateur est fixé en interne avec une valeur typique d’environ 24 dB, ce qui signifie que des niveaux d’entrée modestes de l’ordre de quelques centaines de millivolts crête à crête suffisent pour piloter les sorties près de la puissance maximale sans saturation.
Le rapport signal sur bruit (SNR) interne est suffisamment élevé pour assurer une reproduction audio propre dans la bande audible, d’environ 20 Hz à 20 kHz.
L’image ci-dessous montre le brochage du module PAM8403. Les sorties enceintes sont en haut, tandis que l’entrée audio et l’alimentation sont en bas de la carte :

Protection, comportement thermique et disposition du module
Le circuit intégré PAM8403 intègre plusieurs mécanismes de protection pour améliorer la fiabilité. Ceux-ci incluent généralement la coupure thermique, la protection contre les courts-circuits pour limiter le courant en cas de surcharge sur les sorties enceintes, et la protection contre les sous-tensions.
Le réseau de composants passifs du module assure une opération PWM stable et supprime les interférences électromagnétiques (EMI) à des niveaux acceptables sans nécessiter de filtres externes.
Comme la puce de classe D fonctionne efficacement, elle ne nécessite normalement pas de dissipateur thermique externe pour des charges typiques.
Spécifications techniques
Le tableau suivant résume les spécifications techniques du PAM8403 :
| Paramètre | Spécification |
|---|---|
| Type d’amplificateur | Amplificateur audio stéréo de classe D |
| Nombre de canaux | 2 (Gauche et Droite) |
| Plage de tension d’alimentation | 2,5 V à 5,5 V DC |
| Puissance de sortie typique | Jusqu’à ~3 W par canal sous 4 Ω à 5 V, THD+N = 10 % |
| Puissance de sortie @ 8 Ω | ~1,8 W par canal sous 8 Ω à 5 V, THD+N = 10 % |
| Distorsion harmonique totale + bruit | ~0,15 % à 1 W sous 8 Ω, alimentation 5 V |
| Gain (boucle fermée) | ~24 dB |
| Rapport signal sur bruit (SNR) | ~80 dB |
| Courant au repos | ~8–16 mA à 5 V |
| Courant en veille | < 1 µA |
| Rejet des ondulations d’alimentation (PSRR) | ~-58 dB à 1 kHz |
| Efficacité | ~80–90 % selon la charge |
| Température de fonctionnement | -40 °C à +85 °C |
| Fonctions de protection | Protection contre les courts-circuits, coupure thermique |
| Impédance de charge | 4 Ω à 8 Ω recommandé |
| Fréquence de commutation typique | ~260 kHz |
Connexion du PAM8403 avec PCM5102 et ESP32
Dans cette section, nous connectons l’amplificateur PAM8403 au DAC PCM5102 et au microcontrôleur ESP32. L’image ci-dessous montre le schéma complet de câblage :

Commencez par connecter l’ESP32 au PCM5102 via l’interface I2S. Vous pouvez configurer différents pins dans le code, mais j’utilise ici LCK=32, BCK=25 et DIN=33. Le tableau suivant montre les connexions à réaliser entre l’ESP32 et le PCM5102 :
| PCM5102A | ESP32 |
|---|---|
| VIN | 3V3 |
| GND | G |
| LRCK | 32 |
| BCK | 25 |
| DIN | 33 |
| SCK | G |
Si vous avez soudé le pont SCK sur le PCM5102, vous n’aurez en fait pas besoin de connecter SCK à la masse. Je vous recommande vivement de lire le Playing Audio with ESP32 and PCM5102A tutoriel en premier lieu, si vous n’avez jamais configuré ou utilisé le PCM5102 auparavant. D’autres ponts doivent être soudés pour garantir le bon fonctionnement du PCM5102 !
L’amplificateur PAM8403 est connecté en sortie ligne au PCM5102. Le tableau suivant montre les connexions nécessaires :
| PAM8403 | PCM5102 |
|---|---|
| L | LROUT |
| Ʇ | AGND |
| R | ROUT |
Notez que le marquage des broches du PCM5102 est un peu déroutant. La sortie du canal gauche sur le PCM5102 devrait être étiquetée « ROUT » mais est en réalité marquée « LROUT ».
Polarité des enceintes
Les enceintes droite et gauche sont connectées aux broches R+, R-, L+ et L- du PAM8403. Assurez-vous de respecter la polarité des broches de sortie avec celle des enceintes. En général, les broches des enceintes sont marquées par des signes « + » et « – » ou ont des broches de forme différente (plus fines pour le moins).

S’il n’y a pas de marquage, vous pouvez connecter une pile AA de 1,5 V et si la membrane se déplace vers l’extérieur, le pôle plus de la pile indique le pôle plus de l’enceinte. La polarité des enceintes est définie de sorte qu’une tension positive déplace la membrane vers l’avant.
Câblage sur breadboard
La photo suivante montre mon câblage du PAM8403, du PCM5102, d’un ESP32 et des deux enceintes pour les tests :

Comme le système consomme moins de 200 mA, vous pouvez l’alimenter via le port USB (ou une batterie). Pas besoin d’une alimentation externe.
Connexion du lecteur de carte SD
Si vous souhaitez lire des fichiers MP3, vous devez connecter un lecteur de carte SD qui stocke les fichiers audio sur une carte SD. Le schéma de câblage ci-dessous montre comment connecter ce lecteur de carte SD supplémentaire :

Le lecteur de carte SD communique via SPI et les broches SPI par défaut de l’ESP32 sont CS=5, MOSI=23, CLK=18 et MISO=19. Le tableau ci-dessous résume les connexions à réaliser entre le lecteur de carte SD et l’ESP32 :
| Lecteur de carte SD | ESP32 |
|---|---|
| 3V3 | 3V |
| GND | G |
| CS/SS | 5 |
| MOSI | 23 |
| CLK/SCK | 18 |
| MISO | 19 |
Si vous ne savez pas quelles sont les broches SPI par défaut de votre ESP32, consultez notre Find I2C and SPI default pins tutoriel.
Installation des bibliothèques
Nous allons utiliser la bibliothèque arduino-audio-tools de Phil Schatzmann pour construire le lecteur Internet, Bluetooth et MP3. Pour installer cette bibliothèque, allez sur le arduino-audio-tools dépôt, cliquez sur le bouton vert « <> Code » puis sur « Download ZIP » pour télécharger la bibliothèque au format ZIP comme montré ci-dessous :

Ensuite, ouvrez un Sketch, allez dans Sketch -> Include Library -> Add .ZIP Library … pour installer la bibliothèque ZIP téléchargée (arduino-audio-tools-main.zip) :

Pour certains exemples de code, nous avons besoin de deux autres bibliothèques de Phil Schatzmann ; à savoir la bibliothèque arduino-libhelix et la bibliothèque ESP32-A2DP. Vous pouvez les installer de la même manière. Cliquez sur le lien pour accéder au dépôt GitHub, cliquez sur le bouton vert « <> Code » pour télécharger les bibliothèques (arduino-libhelix-main.zip, ESP32-A2DP-main.zip) puis installez-les.
Si c’est la première fois que vous programmez une carte ESP32 depuis votre IDE Arduino, vous devrez également installer le core ESP32. Pour plus de détails, consultez le Install ESP32 core in Arduino IDE tutoriel.
Les trois sections suivantes contiennent le code pour un lecteur Bluetooth, une radio Internet et un lecteur MP3 que vous pouvez exécuter sur le système audio PAM8403, PCM5102 et ESP32.
Code pour un lecteur Bluetooth
Ce premier exemple de code configure l’ESP32 pour fonctionner comme un récepteur audio Bluetooth A2DP qui reçoit des flux audio stéréo d’un appareil appairé, comme un smartphone, et transmet les données audio numériques via le périphérique I2S.
/*
www.makerguides.com
Libraries:
- ESP32 Core 3.3.6
- [arduino-audio-tools](https://github.com/pschatzmann/arduino-audio-tools)
Version: 1.2.2
- [arduino-libhelix](https://github.com/pschatzmann/arduino-libhelix)
Version: 0.9.2
- [ESP32-A2DP](https://github.com/pschatzmann/ESP32-A2DP)
Version: 1.8.8
*/
#include "AudioTools.h"
#include "BluetoothA2DPSink.h"
#define DIN_PIN 33 // serial data
#define LRCK_PIN 32 // word select
#define BCLK_PIN 25 // serial clock
I2SStream i2s;
BluetoothA2DPSink a2dp_sink(i2s);
void setup() {
Serial.begin(115200);
AudioLogger::instance().begin(Serial, AudioLogger::Info);
auto config = i2s.defaultConfig();
config.pin_bck = BCLK_PIN;
config.pin_ws = LRCK_PIN;
config.pin_data = DIN_PIN;
i2s.begin(config);
a2dp_sink.start("MyMusic");
}
void loop() { }
Le code initialise une interface I2SStream avec les broches d’horloge, de sélection de mot et de données série assignées, connectées à un convertisseur numérique-analogique PCM5102. Le PCM5102 convertit le signal audio numérique I2S entrant en un signal stéréo analogique, qui est ensuite amplifié par le module amplificateur PAM8403 pour piloter deux enceintes connectées.
Lors de l’initialisation, l’ESP32 configure le pilote I2S avec la configuration de broches spécifiée et démarre le récepteur Bluetooth A2DP avec le nom d’appareil « MyMusic », rendant l’ESP32 détectable comme récepteur audio Bluetooth.
Une fois appairé et connecté, l’audio diffusé via Bluetooth est directement acheminé via l’interface I2S vers le DAC puis amplifié pour la lecture. La boucle principale reste vide car la gestion audio et la communication Bluetooth sont prises en charge en interne par les bibliothèques sous-jacentes et s’exécutent de manière asynchrone en arrière-plan.
Si vous entendez un bruit de cliquetis, « tak », « tak » et pas de musique, le volume est trop élevé. Réduisez le volume de votre téléphone à zéro puis augmentez-le lentement.
Code pour une radio Internet
Cet exemple de code utilise un ESP32 comme récepteur radio Internet Wi-Fi qui diffuse un flux audio MP3 en ligne, le décode en temps réel, et transmet à nouveau le signal audio via I2S au DAC PCM5102A. Le signal analogique généré par le DAC est ensuite amplifié par le PAM8403 pour piloter les enceintes connectées.
/*
www.makerguides.com
Libraries:
- ESP32 Core 3.3.6
- [arduino-audio-tools](https://github.com/pschatzmann/arduino-audio-tools)
Version: 1.2.2
- [arduino-libhelix](https://github.com/pschatzmann/arduino-libhelix)
Version: 0.9.2
*/
#include <Arduino.h>
#include <WiFi.h>
#include <Wire.h>
#include "AudioTools.h"
#include "AudioTools/AudioCodecs/CodecMP3Helix.h"
#include "AudioTools/Communication/HTTP/ICYStream.h"
// PCM5102A
#define DIN_PIN 33 // serial data
#define LRCK_PIN 32 // word select
#define BCLK_PIN 25 // serial clock
#define VOLUME 0.05 // Volume
const char* ssid = "ssid";
const char* password = "pwd";
const char* url = "https://jazz.stream.laut.fm/jazz";
ICYStream icystream;
I2SStream i2s;
VolumeStream volume(i2s);
EncodedAudioStream mp3decode(&volume, new MP3DecoderHelix());
StreamCopy copier(mp3decode, icystream);
void callbackMetadata(MetaDataType type, const char* str, int len) {
Serial.printf("%s: %s\n", toStr(type), str);
}
void setup() {
Serial.begin(115200);
AudioLogger::instance().begin(Serial, AudioLogger::Warning);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
}
auto config = i2s.defaultConfig(TX_MODE);
config.pin_bck = BCLK_PIN;
config.pin_ws = LRCK_PIN;
config.pin_data = DIN_PIN;
i2s.begin(config);
volume.begin(config);
volume.setVolume(VOLUME);
mp3decode.begin();
icystream.begin(url);
icystream.setMetadataCallback(callbackMetadata);
}
void loop() {
copier.copy();
}
Lors de l’initialisation, l’ESP32 se connecte à un réseau Wi-Fi spécifié en utilisant le SSID et le mot de passe fournis. Vous devrez remplacer les chaînes « ssid » et « pwd » par les identifiants de votre réseau Wi-Fi.
Une fois la connexion sans fil établie, le code initialise le périphérique I2S en mode transmission et assigne les broches d’horloge, de sélection de mot et de données série pour correspondre à l’interface matérielle du PCM5102. Un objet VolumeStream est superposé au flux I2S pour appliquer une mise à l’échelle numérique du volume avant que les données audio ne soient envoyées au DAC.
Vous pouvez contrôler le volume via la constante VOLUME. Si le volume est trop élevé, vous entendrez un bruit de cliquetis et devrez baisser le volume. Comme nous utilisons un amplificateur 3W, le son ne sera pas très fort avant d’atteindre la saturation.
Le programme ouvre une connexion HTTP vers l’URL de streaming spécifiée en utilisant un ICYStream, qui supporte les métadonnées ICY couramment utilisées par les stations de radio Internet. Voici une liste d’URLs pour d’autres stations de radio Internet que vous pouvez essayer :
"https://jazz.stream.laut.fm/jazz" "http://vis.media-ice.musicradio.com/CapitalMP3"; "http://stream.srg-ssr.ch/m/rsj/mp3_128" "http://stream.live.vc.bbcmedia.co.uk/bbc_world_service" "http://icecast.omroep.nl/radio1-bb-mp3" "http://stream-02-eu.relaxingjazz.com/stream/1/"
Les données audio encodées en MP3 de la station Internet sont transmises à un EncodedAudioStream configuré avec le décodeur MP3 Helix, qui effectue le décodage en temps réel des trames audio compressées en échantillons PCM bruts. Ces échantillons décodés sont ensuite transmis à travers l’étage de contrôle du volume et finalement envoyés via I2S au DAC.
Une fonction de rappel de métadonnées est enregistrée pour recevoir et afficher les métadonnées du flux, comme le titre du morceau en cours, sur le moniteur série. Dans la boucle principale, l’objet StreamCopy transfère continuellement les données du flux réseau à travers le décodeur et la chaîne de traitement audio, assurant une lecture ininterrompue tant que le flux est disponible.
Code pour un lecteur MP3
Ce dernier programme utilise l’ESP32 comme lecteur audio MP3 autonome qui lit des fichiers audio depuis une carte SD, les décode en temps réel, et transmet le signal PCM résultant via l’interface I2S au DAC PCM5102A.
/*
www.makerguides.com
Libraries:
- ESP32 Core 3.3.6
- [arduino-audio-tools](https://github.com/pschatzmann/arduino-audio-tools)
Version: 1.2.2
- [arduino-libhelix](https://github.com/pschatzmann/arduino-libhelix)
Version: 0.9.2
*/
#include "AudioTools.h"
#include "AudioTools/Disk/AudioSourceSD.h"
#include "AudioTools/AudioCodecs/CodecMP3Helix.h"
// PCM5102A
#define DIN_PIN 33 // serial data
#define LRCK_PIN 32 // word select
#define BCLK_PIN 25 // serial clock
#define VOLUME 0.05 // Volume
#define PATH "/"
#define EXT "mp3"
AudioSourceSD source(PATH, EXT);
I2SStream i2s;
MP3DecoderHelix decoder;
AudioPlayer player(source, i2s, decoder);
void printMetaData(MetaDataType type, const char* str, int len){
Serial.printf("%s: %s\n", toStr(type), str);
}
void setup() {
Serial.begin(115200);
AudioToolsLogger.begin(Serial, AudioToolsLogLevel::Warning);
auto config = i2s.defaultConfig(TX_MODE);
config.pin_bck = BCLK_PIN;
config.pin_ws = LRCK_PIN;
config.pin_data = DIN_PIN;
i2s.begin(config);
player.setMetadataCallback(printMetaData);
player.setVolume(VOLUME);
player.begin();
}
void loop() {
player.copy();
}
Un objet AudioSourceSD est initialisé pour accéder aux fichiers MP3 stockés sur la carte SD dans le répertoire racine. La source est configurée pour sélectionner les fichiers avec l’extension “mp3”, permettant au système de parcourir les fichiers audio compatibles disponibles sur la carte. L’objet AudioPlayer combine la source carte SD, un flux de sortie I2S, et le décodeur MP3 Helix en une seule chaîne de lecture.
Lors de l’initialisation, l’ESP32 configure la communication série pour le débogage et configure le périphérique I2S en mode transmission avec les broches d’horloge, de sélection de mot et de données série explicitement assignées, connectées au PCM5102.
Le lecteur audio est configuré avec une fonction de rappel de métadonnées pour afficher des informations telles que le titre ou l’artiste sur le moniteur série lorsque disponibles. Un niveau de volume numérique est également défini avant le début de la lecture. Là encore, ne réglez pas la constante VOLUME trop haut, sinon l’amplificateur commencera à saturer et vous entendrez un bruit de cliquetis au lieu de la musique.
Dans la boucle principale, la fonction player.copy() traite continuellement le flux audio. Le lecteur lit les données MP3 depuis la carte SD, les décode avec le décodeur Helix en échantillons PCM bruts, et envoie l’audio traité via l’interface I2S au DAC pour la lecture. Ce mécanisme de streaming piloté par boucle assure une sortie audio continue tant que des fichiers MP3 valides sont disponibles sur la carte SD.
Conclusions
Dans ce projet, vous avez appris à lire de l’audio avec l’ESP32 et l’amplificateur PAM8403 en conjonction avec un DAC PCM5102. Vous avez également appris à diffuser une radio Internet, lire des fichiers MP3 depuis une carte SD et lire de l’audio via Bluetooth. Pour plus d’exemples de code, consultez le dossier examples de la arduino-tools-library.
Ce tutoriel est basé sur le DAC PCM5102. Pour plus d’informations sur le PCM5102, consultez le Playing Audio with ESP32 and PCM5102A tutoriel. De même, si vous avez besoin de plus d’informations sur le module lecteur de carte SD utilisé ici, jetez un œil au SD Card Module with ESP32 tutoriel.
Une alternative au PCM5102 et au MAX98357 est le MAX98357, qui combine un DAC et un amplificateur. Pour une sortie mono, c’est la solution la plus simple. Lisez le Playing Audio with ESP32 and MAX98357 tutoriel pour plus de détails.
Le MAX98357 et le MAX98357 sont tous deux de petits amplificateurs avec une puissance maximale de sortie de 3 Watts. Pour une puissance plus élevée, regardez le TPA31110 XH-A232, qui peut piloter des enceintes de 30 Watts. Voir le Stereo Amplifier with TPA31110 XH-A232, PCM5102 and ESP32 tutoriel pour savoir comment l’utiliser.
N’hésitez pas à poser d’autres questions dans la section commentaires.
Bon bricolage ; )

