In questo tutorial imparerai come costruire una radio Internet, Bluetooth o MP3 con un amplificatore PAM8403, un DAC PCM5102 e un microcontrollore ESP32.
Mentre il DAC PCM5102 rende molto semplice generare suoni con un ESP32, può pilotare solo cuffie ad alta impedenza e altoparlanti attivi. Se vuoi pilotare altoparlanti passivi, hai bisogno di un amplificatore aggiuntivo.
Il PAM8403 è un amplificatore di Classe D molto piccolo ed efficiente che può pilotare altoparlanti passivi fino a 3 Watt. Non necessita di un’alimentazione separata e l’intero sistema audio può funzionare a batteria. Se vuoi costruire una piccola radio Internet, Bluetooth o MP3 portatile, questo tutorial fa per te.
Parti Necessarie
Ti serviranno un modulo DAC PCM5102, una scheda amplificatore PAM8403, un ESP32 e una coppia di altoparlanti passivi. Puoi usare altoparlanti diversi da quelli che ho elencato, assicurati solo che la loro potenza nominale sia intorno ai 3 watt.
Poi ti serve un microcontrollore. Ho scelto un ESP32 lite, ma la maggior parte delle altre schede ESP32 andranno bene.
Per riprodurre file MP3 da una scheda SD ti serviranno inoltre una scheda SD e un modulo lettore di schede SD. Anche una breadboard e qualche cavo saranno utili per un montaggio temporaneo.

Amplificatore PAM8403

DAC PCM5102

2 x Altoparlanti 3 Watt 8 Ohm

Lettore di schede Micro SD

Scheda Micro SD 8GB

ESP32 lite

Cavo USB dati

Set di fili 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.
Caratteristiche Tecniche del PAM8403
Il modulo PAM8403 è un piccolo amplificatore audio stereo progettato attorno al circuito integrato PAM8403, che implementa una topologia di amplificazione di Classe D. Per i dettagli tecnici del PAM8403 vedi il seguente link:
A differenza dei comuni amplificatori audio di Classe AB, l’architettura di Classe D nel PAM8403 utilizza una modulazione di larghezza di impulso (PWM) ad alta frequenza per convertire un segnale audio analogico in ingresso in un segnale digitale ad alta efficienza per pilotare gli altoparlanti.
Poiché i transistor di commutazione operano completamente accesi o spenti, le perdite di conduzione sono sostanzialmente ridotte, permettendo all’amplificatore di raggiungere efficienze vicine al 90% in condizioni operative tipiche.
Questa caratteristica di efficienza rende il modulo adatto per applicazioni audio alimentate a batteria e basate su microcontrollore come progetti Arduino o ESP32, dove lo spazio sulla scheda e il consumo energetico sono limitati.
Caratteristiche Elettriche e Potenza Erogata
Elettricamente, il modulo PAM8403 accetta una tensione di alimentazione DC singola in un intervallo relativamente ampio, da circa 2,5 V fino a 5,5 V. Con una tensione nominale di 5 V e pilotando altoparlanti da 4 Ω, ogni canale può erogare fino a circa 3 W di potenza in uscita.
Ingressi Segnale, Guadagno e Risposta in Frequenza
L’interfaccia di ingresso audio su un modulo PAM8403 comprende due ingressi a livello di linea per i canali sinistro e destro.
Il guadagno dell’amplificatore è fissato internamente con un valore tipico intorno a 24 dB, il che significa che livelli di segnale in ingresso modesti, dell’ordine di qualche centinaio di millivolt picco-picco, sono sufficienti per pilotare le uscite vicino alla potenza massima senza distorsioni.
Il rapporto segnale-rumore (SNR) interno è sufficientemente alto da supportare una riproduzione audio pulita nella banda udibile da circa 20 Hz fino a 20 kHz.
L’immagine sotto mostra il pinout del modulo PAM8403. Le uscite per gli altoparlanti sono in alto, mentre l’ingresso audio e l’alimentazione sono in basso sulla scheda:

Protezione, Comportamento Termico e Layout del Modulo
Il circuito integrato PAM8403 incorpora diversi meccanismi di protezione per migliorare l’affidabilità. Questi includono tipicamente lo spegnimento termico, la protezione da cortocircuito per limitare la corrente in caso di sovraccarico sulle uscite degli altoparlanti, e il blocco per sottotensione.
La rete di componenti passivi del modulo supporta un funzionamento stabile del PWM e sopprime le interferenze elettromagnetiche (EMI) a livelli accettabili senza richiedere filtri esterni.
Poiché il chip di classe D funziona in modo efficiente, normalmente non richiede un dissipatore esterno per carichi tipici.
Specifiche Tecniche
La tabella seguente riassume le specifiche tecniche del PAM8403:
| Parametro | Specifiche |
|---|---|
| Tipo di Amplificatore | Amplificatore audio stereo di Classe D |
| Numero di Canali | 2 (Sinistro e Destro) |
| Intervallo di Tensione di Alimentazione | 2,5 V a 5,5 V DC |
| Potenza di Uscita Tipica | Fino a ~3 W per canale su 4 Ω a 5 V, THD+N = 10 % |
| Potenza di Uscita a 8 Ω | ~1,8 W per canale su 8 Ω a 5 V, THD+N = 10 % |
| Distorsione Armonica Totale + Rumore | ~0,15 % a 1 W su 8 Ω, alimentazione 5 V |
| Guadagno (ad Anello Chiuso) | ~24 dB |
| Rapporto Segnale-Rumore (SNR) | ~80 dB |
| Corrente a Riposo | ~8–16 mA a 5 V |
| Corrente di Spegnimento | < 1 µA |
| Reiezione del Ripple di Alimentazione (PSRR) | ~-58 dB a 1 kHz |
| Efficienza | ~80–90 % a seconda del carico |
| Temperatura di Funzionamento | -40 °C a +85 °C |
| Caratteristiche di Protezione | Protezione da cortocircuito, spegnimento termico |
| Impedenza del Carico | 4 Ω a 8 Ω raccomandati |
| Frequenza di Commutazione Tipica | ~260 kHz |
Collegamento del PAM8403 con PCM5102 e ESP32
In questa sezione colleghiamo l’amplificatore PAM8403 al DAC PCM5102 e al microcontrollore ESP32. L’immagine sotto mostra lo schema completo dei collegamenti:

Inizia collegando l’ESP32 al PCM5102 tramite l’interfaccia I2S. Puoi configurare pin diversi nel codice, ma qui uso LCK=32, BCK=25 e DIN=33. La tabella seguente mostra i collegamenti tra ESP32 e PCM5102 da effettuare:
| PCM5102A | ESP32 |
|---|---|
| VIN | 3V3 |
| GND | G |
| LRCK | 32 |
| BCK | 25 |
| DIN | 33 |
| SCK | G |
Se hai saldato il ponte SCK sul PCM5102, in realtà non ti servirà il collegamento SCK a massa. Ti consiglio vivamente di leggere il Playing Audio with ESP32 and PCM5102A tutorial prima, se non hai mai configurato o usato il PCM5102. Ci sono altri ponti da saldare per assicurare il corretto funzionamento del PCM5102!
L’amplificatore PAM8403 è collegato tramite l’uscita linea al PCM5102. La tabella seguente mostra i collegamenti richiesti:
| PAM8403 | PCM5102 |
|---|---|
| L | LROUT |
| Ʇ | AGND |
| R | ROUT |
Nota che la denominazione dei pin del PCM5102 è un po’ confusa. L’uscita del canale sinistro sul PCM5102 dovrebbe essere etichettata “ROUT” ma in realtà è indicata come “LROUT”.
Polarità degli Altoparlanti
Gli altoparlanti destro e sinistro sono collegati ai pin R+, R-, L+ e L- del PAM8403. Assicurati di rispettare la polarità dei pin di uscita con quella degli altoparlanti. Tipicamente i pin degli altoparlanti sono contrassegnati con i segni “+” e “-” o hanno pin di forma diversa (più sottili per il meno).

Se non ci sono marcature, puoi collegare una batteria AA da 1,5 V e se la membrana si muove verso l’esterno, il polo positivo della batteria indica il polo positivo dell’altoparlante. La polarità degli altoparlanti è definita in modo che una tensione positiva spinga il cono in avanti.
Collegamenti su Breadboard
La foto seguente mostra il mio cablaggio del PAM8403, del PCM5102, di un ESP32 e dei due altoparlanti per i test:

Poiché il sistema consuma meno di 200mA, puoi alimentarlo dalla porta USB (o da una batteria). Non serve un’alimentazione esterna.
Collegamento del Lettore di Schede SD
Se vuoi riprodurre file MP3 devi collegare un lettore di schede SD che memorizza i file audio su una scheda SD. Lo schema di collegamento sotto mostra come collegare il lettore di schede SD aggiuntivo:

Il lettore di schede SD comunica via SPI e i pin SPI di default dell’ESP32 sono CS=5, MOSI=23, CLK=18 e MISO=19. La tabella sotto riassume i collegamenti da fare tra il lettore di schede SD e l’ESP32:
| Lettore di Schede SD | ESP32 |
|---|---|
| 3V3 | 3V |
| GND | G |
| CS/SS | 5 |
| MOSI | 23 |
| CLK/SCK | 18 |
| MISO | 19 |
Se non sei sicuro di quali siano i pin SPI di default del tuo ESP32, dai un’occhiata al nostro Find I2C and SPI default pins tutorial.
Installazione delle Librerie
Useremo la arduino-audio-tools library di Phil Schatzmann per costruire il lettore Internet, Bluetooth e MP3. Per installare questa libreria vai al arduino-audio-tools repo, clicca sul pulsante verde “<> Code” e poi su “Download ZIP” per scaricare la libreria come file ZIP come mostrato sotto:

Poi apri uno Sketch, vai su Sketch -> Include Library -> Add .ZIP Library … per installare la libreria ZIP scaricata (arduino-audio-tools-main.zip):

Per alcuni esempi di codice servono altre due librerie di Phil Schatzmann; cioè la arduino-libhelix library e la ESP32-A2DP library. Puoi installarle allo stesso modo. Clicca sul link per andare al repo github, clicca sul pulsante verde “<> Code” per scaricare le librerie (arduino-libhelix-main.zip, ESP32-A2DP-main.zip) e poi installale.
Se è la prima volta che programmi una scheda ESP32 dal tuo Arduino IDE, dovrai installare anche il core ESP32. Per dettagli vedi il Install ESP32 core in Arduino IDE tutorial.
Le prossime tre sezioni contengono il codice per un lettore Bluetooth, una radio Internet e un lettore MP3 che puoi eseguire sul sistema audio PAM8403, PCM5102 e ESP32.
Codice per un Lettore Bluetooth
Questo primo esempio di codice configura l’ESP32 per operare come ricevitore audio Bluetooth A2DP che riceve flussi audio stereo da un dispositivo accoppiato come uno smartphone e invia i dati audio digitali tramite la periferica 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() { }
Il codice inizializza un’interfaccia I2SStream con i pin assegnati per bit clock, word select e serial data, collegati a un convertitore digitale-analogico PCM5102. Il PCM5102 converte il segnale audio digitale I2S in ingresso in un segnale stereo analogico, che viene poi amplificato dal modulo amplificatore PAM8403 per pilotare due altoparlanti collegati.
Durante la configurazione, l’ESP32 inizializza il driver I2S con la configurazione pin specificata e avvia il ricevitore Bluetooth A2DP con il nome dispositivo “MyMusic”, rendendo l’ESP32 rilevabile come ricevitore audio Bluetooth.
Una volta accoppiato e connesso, l’audio trasmesso via Bluetooth viene instradato direttamente attraverso l’interfaccia I2S al DAC e successivamente amplificato per la riproduzione. Il loop principale rimane vuoto perché la gestione audio e la comunicazione Bluetooth sono gestite internamente dalle librerie sottostanti e funzionano in modo asincrono in background.
Se senti un suono di rattling, “tak”, “tak” e nessuna musica, il volume è troppo alto. Abbassa il volume sul tuo telefono a zero e poi aumentalo lentamente.
Codice per una Radio Internet
Questo esempio di codice usa un ESP32 come ricevitore radio Internet Wi-Fi che trasmette in streaming un feed audio MP3 online, lo decodifica in tempo reale e invia il segnale audio tramite I2S al DAC PCM5102A. Il segnale analogico generato dal DAC viene poi amplificato dal PAM8403 per pilotare gli altoparlanti collegati.
/*
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();
}
Durante la configurazione, l’ESP32 si connette a una rete Wi-Fi specificata usando SSID e password forniti. Dovrai sostituire le stringhe “ssid” e “pwd” con le credenziali della tua rete Wi-Fi.
Una volta stabilita la connessione wireless, il codice inizializza la periferica I2S in modalità trasmissione e assegna i pin bit clock, word select e serial data per corrispondere all’interfaccia hardware PCM5102. Un oggetto VolumeStream è sovrapposto allo stream I2S per applicare una regolazione digitale del volume prima che i dati audio vengano inviati al DAC.
Puoi controllare il volume tramite la costante VOLUME. Se il volume è troppo alto, sentirai un suono di rattling e dovrai abbassarlo. Poiché usiamo un amplificatore da 3W, il suono non sarà molto forte prima di saturare.
Il programma apre una connessione HTTP all’URL di streaming specificato usando un ICYStream, che supporta i metadati ICY comunemente usati dalle stazioni radio Internet. Ecco una lista di URL di altre stazioni radio Internet che puoi provare:
"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/"
I dati audio codificati MP3 dalla stazione Internet sono passati a un EncodedAudioStream configurato con il decoder MP3 Helix, che esegue la decodifica in tempo reale dei frame audio compressi in campioni PCM grezzi. Questi campioni decodificati sono poi inoltrati attraverso il controllo del volume e infine trasmessi via I2S al DAC.
Una funzione di callback per i metadati è registrata per ricevere e stampare i metadati dello stream come il titolo del brano corrente sul monitor seriale. Nel loop principale, l’oggetto StreamCopy trasferisce continuamente i dati dallo stream di rete attraverso il decoder e la catena di elaborazione audio, garantendo una riproduzione ininterrotta finché lo stream è disponibile.
Codice per un Lettore MP3
Quest’ultimo programma usa l’ESP32 come lettore audio MP3 standalone che legge file audio da una scheda SD, li decodifica in tempo reale e invia il segnale PCM risultante tramite l’interfaccia I2S al 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 oggetto AudioSourceSD è inizializzato per accedere ai file MP3 memorizzati nella directory root della scheda SD. La sorgente è configurata per selezionare file con estensione “mp3”, permettendo al sistema di scorrere i file audio compatibili disponibili sulla scheda. L’oggetto AudioPlayer combina la sorgente della scheda SD, uno stream di uscita I2S e il decoder MP3 Helix in una singola pipeline di riproduzione.
Durante la configurazione, l’ESP32 inizializza la comunicazione seriale per il debug e configura la periferica I2S in modalità trasmissione con pin bit clock, word select e serial data assegnati esplicitamente e collegati al PCM5102.
Il lettore audio è configurato con una funzione di callback per i metadati per stampare informazioni come titolo del brano o artista sul monitor seriale quando disponibili. Viene anche impostato un livello digitale di volume prima dell’inizio della riproduzione. Ancora una volta, non impostare la costante VOLUME troppo alta, altrimenti l’amplificatore inizierà a distorcere e sentirai un suono di rattling invece della musica.
Nel loop principale, la funzione player.copy() elabora continuamente lo stream audio. Il lettore legge i dati MP3 dalla scheda SD, li decodifica usando il decoder Helix in campioni PCM grezzi e invia l’audio processato tramite l’interfaccia I2S al DAC per la riproduzione. Questo meccanismo di streaming basato sul loop garantisce un’uscita audio continua finché sono disponibili file MP3 validi sulla scheda SD.
Conclusioni
In questo progetto hai imparato come riprodurre audio usando l’ESP32 e l’amplificatore PAM8403 insieme a un DAC PCM5102. Hai anche imparato come trasmettere radio Internet, riprodurre file MP3 da una scheda SD e riprodurre audio via Bluetooth. Per altri esempi di codice vedi la cartella examples di arduino-tools-library.
Questo tutorial si basa sul DAC PCM5102. Per maggiori informazioni sul PCM5102 vedi il Playing Audio with ESP32 and PCM5102A tutorial. Analogamente, se ti serve più background sul modulo lettore di schede SD usato qui, dai un’occhiata al SD Card Module with ESP32 tutorial.
Un’alternativa al PCM5102 e MAX98357 è il MAX98357, che combina un DAC e un amplificatore. Per uscita mono questa è la soluzione più semplice. Leggi il Playing Audio with ESP32 and MAX98357 tutorial per maggiori dettagli.
Sia il MAX98357 che il MAX98357 sono piccoli amplificatori con una potenza massima di 3 Watt. Per potenze maggiori dai un’occhiata al TPA31110 XH-A232, che può pilotare altoparlanti da 30 Watt. Vedi il Stereo Amplifier with TPA31110 XH-A232, PCM5102 and ESP32 tutorial su come usarlo.
Sentiti libero di lasciare ulteriori domande nella sezione commenti.
Buon divertimento con il fai-da-te ; )

