Skip to Content

Amplificatore stereo con TPA31110 XH-A232, PCM5102 e ESP32

Amplificatore stereo con TPA31110 XH-A232, PCM5102 e ESP32

In questo tutorial imparerai come costruire un amplificatore stereo da 30 Watt e una radio Internet, Bluetooth o MP3 con un amplificatore TPA31110 XH-A232, un DAC PCM5102 e un microcontrollore ESP32.

L’ESP32 produce un segnale audio digitale, che viene convertito in segnale audio analogico tramite il Digital-Analog-Converter PCM5102, quindi amplificato dal TPA31110 XH-A232.

Mentre il PCM5102 può pilotare solo cuffie ad alta impedenza e altoparlanti attivi, il TPA31110 XH-A232 può pilotare altoparlanti passivi fino a 30 Watt. Se vuoi costruire una radio Internet, Bluetooth o MP3 con un’uscita audio più potente, questo tutorial fa per te.

Componenti necessari

Per questo progetto serviranno un modulo DAC PCM5102, una scheda amplificatore TPA31110 XH-A232, un ESP32 e una coppia di altoparlanti passivi. Puoi usare altoparlanti diversi da quelli elencati, assicurandoti però che la loro potenza nominale sia intorno ai 30 watt.

Allo stesso modo, puoi usare una scheda ESP32 diversa. La maggior parte delle schede ESP32 va bene, ma ti consiglio una scheda ESP32-S3 con PSRAM se prevedi di memorizzare e riprodurre musica dalla memoria.

Per riprodurre file MP3 da una scheda SD ti serviranno inoltre una scheda SD e un modulo lettore di schede SD.

Infine, una breadboard e alcuni cavi saranno utili per un montaggio temporaneo. Oppure puoi saldare tutto insieme.

Amplificatore TPA31110 XH-A232

DAC PCM5102

2 x Altoparlanti 4 Ohm 25 Watt

Lettore Micro SD Card

Micro SD Card 8GB

ESP32 lite Lolin32

ESP32 lite

USB data cable

Cavo USB dati

Dupont wire set

Set di fili Dupont

Half_breadboard56a

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 TPA31110 XH-A232

Il TPA3110 XH-A232 è una scheda amplificatore audio stereo compatta basata sul chip amplificatore audio Class-D TPA3110 di Texas Instruments. Questo modulo è progettato come uno stadio di amplificazione completo adatto a sistemi audio da piccoli a medi.

La scheda integra i circuiti di ingresso, alimentazione e uscita necessari su un singolo circuito stampato, permettendo un facile collegamento con microcontrollori come Arduino o ESP32 per la riproduzione e amplificazione audio.

Architettura dell’amplificatore e gestione della potenza

Al cuore della scheda c’è il TPA3110 core amplificatore Class-D, un’architettura di amplificatore a commutazione che utilizza PWM (modulazione di larghezza di impulso) ad alta frequenza per ottenere un’amplificazione efficiente della potenza audio con minima generazione di calore. A differenza degli amplificatori lineari, gli stadi Class-D commutano rapidamente i transistor di uscita tra gli stati acceso e spento, riducendo significativamente le perdite di conduzione e permettendo una maggiore efficienza complessiva del sistema.

Il TPA3110 su questa scheda è configurato per erogare fino a circa 30 W per canale su carichi da 4 Ω a 8 Ω quando alimentato da una tensione DC sufficientemente alta, preferibilmente tra 12 V e 24 V. La configurazione a doppio canale consente uscite stereo sinistra e destra simultanee da un singolo amplificatore. L’immagine sotto mostra il pinout della scheda TPA31110 XH-A232.

Pinout of TPA31110 XH-A232
Pinout del TPA31110 XH-A232

Durante il normale funzionamento, l’amplificatore richiede un’alimentazione DC in grado di fornire circa 3 A per supportare un’uscita audio quasi massima. La scheda include componenti di disaccoppiamento e filtraggio per stabilizzare queste correnti e ridurre il rumore di alimentazione. L’impedenza di uscita è tipicamente adatta per altoparlanti da 4 Ω a 8 Ω.

Gestione del segnale e prestazioni audio

La scheda TPA3110 XH-A232 accetta un ingresso audio analogico a livello di linea, che viene amplificato dall’interno TPA3110. La sensibilità di ingresso è circa 0,775 V. La risposta in frequenza è tipicamente piatta da circa 20 Hz fino a 20 kHz. Il rapporto segnale-rumore è circa 100 dB e la distorsione armonica totale è ≤ 0,1 % in condizioni normali.

Funzioni di protezione

La scheda incorpora diversi meccanismi di protezione per migliorare l’affidabilità nell’uso pratico. La protezione da sovratensione protegge da tensioni di alimentazione eccessive, mentre la protezione da cortocircuito e sovracorrente aiuta a prevenire danni se le uscite degli altoparlanti vengono accidentalmente cortocircuitate o sovraccaricate. È presente anche la protezione termica, che si attiva se la temperatura del circuito integrato o della scheda supera i limiti di sicurezza. Il modulo è progettato per riprendersi automaticamente una volta che le condizioni tornano sicure.

Specifiche tecniche

Parametro Specifiche
Modello modulo XH-A232
Circuito integrato amplificatore TPA3110 Class-D
Canali 2.0 (stereo)
Potenza nominale in uscita 30 W + 30 W (su carichi da 4 Ω, dipendente da alimentazione e carico)
Tensione di alimentazione DC ~8 V a 26 V (tipicamente operazione tra 12 – 24 V)
Corrente di alimentazione raccomandata ≥ 3 A
Sensibilità di ingresso ~0,775 V (livello linea)
Impedenza di ingresso ~20 kΩ
Impedenza carico altoparlante 4 Ω – 8 Ω
Rapporto segnale-rumore (SNR) ~100 dB
Distorsione armonica totale (THD) ≤ 0,1 %
Risposta in frequenza ~20 Hz – 20 kHz
Funzioni di protezione Protezione da sovratensione, sovracorrente/cortocircuito, protezione termica
Dimensioni fisiche Circa 53 × 45 × 14 – 15 mm
Peso approssimativo ~20 – 25 g

Collegamento del TPA31110 XH-A232 con PCM5102 e ESP32

In questa sezione colleghiamo l’amplificatore TPA31110 XH-A232 al DAC PCM5102 e al microcontrollore ESP32. L’immagine sotto mostra lo schema completo dei collegamenti:

Connecting TPA31110 XH-A232 to PCM5102 and ESP32
Collegamento TPA31110 XH-A232 a PCM5102 e ESP32

Iniziamo collegando l’ESP32 al PCM5102 tramite l’interfaccia I2S. Potresti configurare pin diversi (vedi il codice nelle sezioni successive) ma qui uso LCK=32, BCK=25 e DIN=33. La tabella seguente mostra i collegamenti completi tra ESP32 e PCM5102:

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 serve il collegamento SCK a massa, ma non fa male averlo. Ti consiglio vivamente di leggere il Playing Audio with ESP32 and PCM5102A tutorial, se non hai mai configurato o usato il PCM5102 prima. Ci sono altri ponti da saldare per assicurare il corretto funzionamento del PCM5102!

Successivamente colleghiamo l’amplificatore TPA31110 XH-A232 tramite l’uscita linea al PCM5102. La tabella seguente mostra i collegamenti da effettuare:

TPA31110 XH-A232 PCM5102
L LROUT
bJ AGND
R ROUT

Nota che la denominazione dei pin del TPA31110 XH-A232 e del PCM5102 è confusa. L’uscita canale sinistro sul PCM5102 dovrebbe essere etichettata “ROUT” ma in realtà è “LROUT”. Il pin centrale per l’ingresso linea è indicato come “bJ” ma dovrebbe essere “G” per massa.

Nota anche che ti servirà un’alimentazione separata per il TPA31110 XH-A232 in grado di fornire tra 12V e 24V e 3A.

Polarità degli altoparlanti

Gli altoparlanti destro e sinistro sono collegati ai pin R+, R-, L+ e L- del TPA31110 XH-A232. 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,5V 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 produca il movimento in avanti del cono.

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 un lettore di schede SD aggiuntivo:

Connecting TPA31110 XH-A232 to PCM5102 and ESP32 with SD Card Reader
Collegamento TPA31110 XH-A232 a PCM5102 e ESP32 con lettore di schede SD

Il lettore di schede SD comunica via SPI e i pin SPI predefiniti dell’ESP32 sono CS=5, MOSI=23, CLK=18 e MISO=19. La tabella sotto riassume i collegamenti da effettuare 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 predefiniti del tuo ESP32, dai un’occhiata al Find I2C and SPI default pins tutorial.

La foto seguente mostra il mio cablaggio del TPA31110 XH-A232 e PCM5102A con un lettore di schede SD, un ESP32 e due altoparlanti per i test:

Installazione delle librerie

Useremo la arduino-audio-tools library di Phil Schatzmann per costruire il nostro 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.

Infine, 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.

Nelle prossime tre sezioni ti mostrerò il codice per costruire un lettore Bluetooth, una radio Internet e un lettore MP3 usando la arduino-tools-library.

Codice per un lettore Bluetooth

Questo primo esempio di codice configura un ESP32 per funzionare come ricevitore audio Bluetooth A2DP che riceve flussi audio stereo da un dispositivo abbinato 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() {
  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 XH-A232 basato su TPA3110 per pilotare due altoparlanti collegati.

Durante il setup, 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 abbinato e connesso, l’audio trasmesso via Bluetooth viene instradato direttamente tramite 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.

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 TPA31110 XH-A232 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.3   // 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 il setup, 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 PCM5102A. Un oggetto VolumeStream è sovrapposto allo stream I2S per applicare la regolazione digitale del volume prima che i dati audio vengano inviati al DAC.

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. I dati audio codificati in MP3 in ingresso 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 lo stadio di 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 dati dallo stream di rete attraverso il decoder e la catena di elaborazione audio, garantendo una riproduzione ininterrotta finché lo stream è disponibile.

Segue 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/"

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. L’uscita analogica del DAC è poi amplificata dal TPA31110 XH-A232 e inviata agli altoparlanti.

/*
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.5   // 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 viene 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 il setup, 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 PCM5102A. Il lettore audio è configurato con una funzione di callback per i metadati per stampare informazioni come titolo o artista sul monitor seriale quando disponibili. Viene anche impostato un livello di volume digitale prima dell’inizio della riproduzione.

Nel loop principale, la funzione player.copy() processa continuamente lo stream audio. Il lettore legge dati MP3 dalla scheda SD, li decodifica usando il decoder Helix in campioni PCM grezzi e invia l’audio elaborato 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 TPA31110 XH-A232 insieme a un DAC PCM5102. Abbiamo esplorato i dettagli tecnici del TPA31110 XH-A232 e come collegarlo all’ESP32. Hai anche imparato a trasmettere radio Internet, riprodurre file MP3 da una scheda SD e riprodurre audio via Bluetooth. Per altri esempi di codice vedi la cartella examples della 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.

Infine, se non ti servono 30 Watt di uscita stereo e vuoi una soluzione più semplice, leggi il nostro Playing Audio with ESP32 and MAX98357 tutorial. Il MAX98357A è un DAC con amplificatore integrato che può pilotare piccoli altoparlanti da 3 Watt. Non sarà potente come con l’amplificatore TPA31110 XH-A232 ma il circuito è più semplice e puoi usare altoparlanti più piccoli e meno costosi.

Sentiti libero di lasciare ulteriori domande nella sezione commenti.

Buon divertimento con il fai-da-te ; )