En este tutorial aprenderás a construir un amplificador estéreo de 30 vatios y una radio por Internet, Bluetooth o MP3 con un amplificador TPA31110 XH-A232, un DAC PCM5102 y un microcontrolador ESP32.
El ESP32 genera una señal de audio digital, que se convierte en una señal de audio analógica mediante el convertidor digital-analógico PCM5102, y luego es amplificada por el TPA31110 XH-A232.
Mientras que el PCM5102 solo puede alimentar auriculares de alta impedancia y altavoces activos, el TPA31110 XH-A232 puede alimentar altavoces pasivos con hasta 30 vatios. Si quieres construir una radio por Internet, Bluetooth o MP3 con mayor potencia de salida, este tutorial es para ti.
Piezas necesarias
Para este proyecto necesitaremos un módulo DAC PCM5102, una placa amplificadora TPA31110 XH-A232, un ESP32 y un par de altavoces pasivos. Puedes usar otros altavoces distintos a los que mencioné, solo asegúrate de que su potencia nominal sea alrededor de 30 vatios.
De igual forma, puedes usar una placa ESP32 diferente. La mayoría de las placas ESP32 funcionarán bien, pero te recomiendo una placa ESP32-S3 con PSRAM si planeas almacenar y reproducir música desde la memoria.
Para reproducir archivos MP3 desde una tarjeta SD también necesitarás una tarjeta SD y un módulo lector de tarjetas SD.
Finalmente, una protoboard y algunos cables serán útiles para un montaje temporal. O puedes soldar todo directamente.

Amplificador TPA31110 XH-A232

DAC PCM5102

2 x Altavoces 4 Ohm 25 Vatios

Lector de tarjeta Micro SD

Tarjeta Micro SD 8GB

ESP32 lite

Cable USB de datos

Juego de cables Dupont

Protoboard
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.
Características técnicas del TPA31110 XH-A232
El TPA3110 XH-A232 es una placa amplificadora de audio estéreo compacta basada en el chip amplificador de audio Clase D TPA3110 de Texas Instruments. Este módulo está diseñado como una etapa de amplificación completa adecuada para sistemas de audio pequeños a medianos.
La placa integra la circuitería necesaria de entrada, alimentación y salida en un solo circuito impreso, permitiendo su conexión directa con microcontroladores como Arduino o ESP32 para tareas de reproducción y amplificación de audio.
Arquitectura del amplificador y manejo de potencia
En el corazón de la placa está el TPA3110 núcleo amplificador Clase D, una arquitectura de amplificador conmutado que utiliza PWM (modulación por ancho de pulso) de alta frecuencia para lograr una amplificación eficiente de potencia de audio con mínima generación de calor. A diferencia de los amplificadores lineales, las etapas Clase D conmutan rápidamente los transistores de salida entre estados encendido y apagado, reduciendo significativamente las pérdidas por conducción y permitiendo una mayor eficiencia general del sistema.
El TPA3110 en esta placa está configurado para entregar hasta aproximadamente 30 W por canal en cargas de 4 Ω a 8 Ω cuando se alimenta con un voltaje DC suficientemente alto, preferiblemente en el rango de 12 V a 24 V. La configuración de doble canal permite salidas estéreo izquierda y derecha simultáneas desde una sola placa amplificadora. La imagen a continuación muestra el pinout de la placa TPA31110 XH-A232.

En operación normal, el amplificador requiere una fuente de alimentación DC capaz de entregar alrededor de 3 A para soportar una salida de audio cercana al máximo. La placa incluye componentes de desacoplo y filtrado para estabilizar estas corrientes y reducir el ruido de la fuente. La impedancia de salida está típicamente adaptada para altavoces de 4 Ω a 8 Ω.
Manejo de señal y rendimiento de audio
La placa TPA3110 XH-A232 acepta entrada de audio analógica a nivel de línea, que es amplificada internamente por el TPA3110. La sensibilidad de entrada es alrededor de 0.775 V. La respuesta en frecuencia es típicamente plana desde aproximadamente 20 Hz hasta 20 kHz. La relación señal-ruido es de alrededor de 100 dB, y la distorsión armónica total es ≤ 0.1 % en condiciones normales.
Características de protección
La placa incorpora varios mecanismos de protección para mejorar la fiabilidad en uso práctico. La protección contra sobretensión evita voltajes excesivos de alimentación, mientras que la protección contra cortocircuitos y sobrecorriente ayuda a prevenir daños si las salidas de los altavoces se cortocircuitan o sobrecargan accidentalmente. También hay protección térmica que se activa si las temperaturas del IC amplificador o de la placa superan límites seguros. El módulo está diseñado para recuperarse automáticamente una vez que las condiciones vuelven a niveles seguros.
Especificaciones técnicas
| Parámetro | Especificación |
|---|---|
| Modelo del módulo | XH-A232 |
| IC amplificador | TPA3110 Clase D |
| Canales | 2.0 (estéreo) |
| Potencia nominal de salida | 30 W + 30 W (en cargas de 4 Ω, depende de la alimentación y carga) |
| Voltaje de alimentación | DC ~8 V a 26 V (operación típica entre 12 y 24 V) |
| Corriente recomendada de alimentación | ≥ 3 A |
| Sensibilidad de entrada | ~0.775 V (nivel de línea) |
| Impedancia de entrada | ~20 kΩ |
| Impedancia de carga del altavoz | 4 Ω – 8 Ω |
| Relación señal-ruido (SNR) | ~100 dB |
| Distorsión armónica total (THD) | ≤ 0.1 % |
| Respuesta en frecuencia | ~20 Hz – 20 kHz |
| Características de protección | Protección contra sobretensión, sobrecorriente/cortocircuito, protección térmica |
| Dimensiones físicas | Aprox. 53 × 45 × 14 – 15 mm |
| Peso aproximado | ~20 – 25 g |
Conexión del TPA31110 XH-A232 con PCM5102 y ESP32
En esta sección conectamos el amplificador TPA31110 XH-A232 al DAC PCM5102 y al microcontrolador ESP32. La imagen a continuación muestra el diagrama completo de conexiones:

Comenzamos conectando el ESP32 al PCM5102 mediante la interfaz I2S. Podrías configurar diferentes pines (ver el código en secciones posteriores), pero aquí uso LCK=32, BCK=25 y DIN=33. La siguiente tabla muestra las conexiones completas entre el ESP32 y el PCM5102:
| PCM5102A | ESP32 |
|---|---|
| VIN | 3V3 |
| GND | G |
| LRCK | 32 |
| BCK | 25 |
| DIN | 33 |
| SCK | G |
Si has soldado el puente SCK en el PCM5102, en realidad no necesitarás la conexión SCK a tierra, pero no hace daño. Te recomiendo encarecidamente que leas el Playing Audio with ESP32 and PCM5102A tutorial, si no has configurado o usado el PCM5102 antes. Hay otros puentes que deben soldarse para asegurar que el PCM5102 funcione correctamente.
Luego conectamos el amplificador TPA31110 XH-A232 vía salida de línea al PCM5102. La siguiente tabla muestra las conexiones que debes hacer:
| TPA31110 XH-A232 | PCM5102 |
|---|---|
| L | LROUT |
| bJ | AGND |
| R | ROUT |
Ten en cuenta que la denominación de los pines del TPA31110 XH-A232 y del PCM5102 es confusa. La salida del canal izquierdo en el PCM5102 debería estar etiquetada como «ROUT» pero en realidad dice «LROUT». El pin central para la entrada de línea está marcado como «bJ» pero debería estar etiquetado como «G» para tierra.
También ten en cuenta que necesitarás una fuente de alimentación separada para el TPA31110 XH-A232 que pueda entregar entre 12V y 24V y 3A.
Polaridad de los altavoces
Los altavoces derecho e izquierdo se conectan a los pines R+, R-, L+ y L- del TPA31110 XH-A232. Asegúrate de que coincida la polaridad de los pines de salida con la polaridad de los pines del altavoz. Normalmente los pines del altavoz están marcados con signos «+» y «-» o tienen pines de forma diferente (más delgado para el negativo).

Si no hay marcas, puedes conectar una pila AA de 1.5V y si la membrana se mueve hacia afuera, el polo positivo de la pila indica el polo positivo del altavoz. La polaridad del altavoz se define para que un voltaje positivo produzca movimiento hacia adelante del cono.
Conexión del lector de tarjeta SD
Si quieres reproducir archivos MP3 necesitas conectar un lector de tarjeta SD que almacene los archivos de audio en una tarjeta SD. El diagrama de conexiones a continuación muestra cómo conectar un lector de tarjeta SD adicional:

El lector de tarjeta SD se comunica vía SPI y los pines SPI por defecto del ESP32 son CS=5, MOSI=23, CLK=18 y MISO=19. La tabla siguiente resume las conexiones que debes hacer entre el lector de tarjeta SD y el ESP32:
| Lector de tarjeta SD | ESP32 |
|---|---|
| 3V3 | 3V |
| GND | G |
| CS/SS | 5 |
| MOSI | 23 |
| CLK/SCK | 18 |
| MISO | 19 |
Si no estás seguro de cuáles son los pines SPI por defecto de tu ESP32, echa un vistazo al Find I2C and SPI default pins tutorial.
La siguiente foto muestra mi cableado del TPA31110 XH-A232 y PCM5102A con un lector de tarjeta SD, un ESP32 y dos altavoces para pruebas:

Instalación de librerías
Vamos a usar la arduino-audio-tools librería de Phil Schatzmann para construir nuestro reproductor de Internet, Bluetooth y MP3. Para instalar esta librería, ve al arduino-audio-tools repositorio, haz clic en el botón verde «<> Code» y luego en «Download ZIP» para descargar la librería como un archivo ZIP, como se muestra a continuación:

Luego abre un Sketch, ve a Sketch -> Include Library -> Add .ZIP Library … para instalar la librería ZIP descargada (arduino-audio-tools-main.zip):

Para algunos ejemplos de código necesitaremos dos librerías más de Phil Schatzmann; concretamente la arduino-libhelix librería y la ESP32-A2DP librería. Puedes instalarlas de la misma manera. Haz clic en el enlace para ir al repositorio de GitHub, haz clic en el botón verde «<> Code» para descargar las librerías (arduino-libhelix-main.zip, ESP32-A2DP-main.zip) y luego instálalas.
Finalmente, si es la primera vez que programas una placa ESP32 desde tu Arduino IDE, necesitarás instalar también el core de ESP32. Para más detalles, consulta el Install ESP32 core in Arduino IDE tutorial.
En las siguientes tres secciones te mostraré el código para construir un reproductor Bluetooth, una radio por Internet y un reproductor MP3 usando la librería arduino-tools-library.
Código para un reproductor Bluetooth
Este primer ejemplo de código configura un ESP32 para funcionar como receptor de audio Bluetooth A2DP que recibe flujos de audio estéreo desde un dispositivo emparejado, como un smartphone, y envía los datos digitales de audio a través del periférico 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() { }
El código inicializa una interfaz I2SStream con los pines asignados para bit clock, word select y datos seriales, que están conectados a un convertidor digital-analógico PCM5102. El PCM5102 convierte la señal digital I2S entrante en una señal estéreo analógica, que luego es amplificada por el módulo amplificador XH-A232 basado en TPA3110 para alimentar dos altavoces conectados.
Durante la configuración, el ESP32 inicializa el driver I2S con la configuración de pines especificada y arranca el receptor Bluetooth A2DP con el nombre de dispositivo «MyMusic», haciendo que el ESP32 sea detectable como receptor de audio Bluetooth.
Una vez emparejado y conectado, el audio transmitido por Bluetooth se enruta directamente a través de la interfaz I2S al DAC y posteriormente se amplifica para la reproducción. El bucle principal queda vacío porque el manejo del audio y la comunicación Bluetooth se gestionan internamente por las librerías subyacentes y se ejecutan de forma asíncrona en segundo plano.
Código para una radio por Internet
Este ejemplo de código usa un ESP32 como receptor de radio por Internet Wi-Fi que transmite un flujo de audio MP3 en línea, lo decodifica en tiempo real y vuelve a enviar la señal de audio vía I2S al DAC PCM5102A. La señal analógica generada por el DAC es amplificada por el TPA31110 XH-A232 para alimentar los altavoces conectados.
/*
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 la configuración, el ESP32 se conecta a una red Wi-Fi especificada usando el SSID y la contraseña proporcionados. Deberás reemplazar las cadenas «ssid» y «pwd» con las credenciales de tu red Wi-Fi.
Una vez establecida la conexión inalámbrica, el código inicializa el periférico I2S en modo transmisión y asigna los pines de bit clock, word select y datos seriales para coincidir con la interfaz hardware del PCM5102A. Un objeto VolumeStream se superpone al flujo I2S para aplicar control digital de volumen antes de enviar los datos de audio al DAC.
El programa abre una conexión HTTP a la URL de streaming especificada usando un ICYStream, que soporta metadatos ICY comúnmente usados por estaciones de radio por Internet. Los datos de audio codificados en MP3 entrantes se pasan a un EncodedAudioStream configurado con el decodificador Helix MP3, que realiza la decodificación en tiempo real de los cuadros de audio comprimidos a muestras PCM sin procesar. Estas muestras decodificadas se envían luego a través de la etapa de control de volumen y finalmente se transmiten por I2S al DAC.
Se registra una función de callback para metadatos que recibe e imprime metadatos del flujo, como el título de la pista actual, en el monitor serial. En el bucle principal, el objeto StreamCopy transfiere continuamente datos desde el flujo de red a través del decodificador y la cadena de procesamiento de audio, asegurando una reproducción ininterrumpida mientras el flujo esté disponible.
A continuación, una lista de URLs de algunas otras emisoras de radio por Internet que puedes probar:
"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/"
Código para un reproductor MP3
Este último programa usa el ESP32 como reproductor de audio MP3 independiente que lee archivos de audio desde una tarjeta SD, los decodifica en tiempo real y envía la señal PCM resultante vía la interfaz I2S al DAC PCM5102A. La salida analógica del DAC es amplificada por el TPA31110 XH-A232 y enviada a los altavoces.
/*
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 objeto AudioSourceSD se inicializa para acceder a archivos MP3 almacenados en la tarjeta SD en el directorio raíz. La fuente está configurada para seleccionar archivos con la extensión “mp3”, permitiendo al sistema iterar a través de archivos de audio compatibles disponibles en la tarjeta. El objeto AudioPlayer combina la fuente de la tarjeta SD, un flujo de salida I2S y el decodificador Helix MP3 en una única cadena de reproducción.
Durante la configuración, el ESP32 inicializa la comunicación serial para depuración y configura el periférico I2S en modo transmisión con pines asignados explícitamente para bit clock, word select y datos seriales conectados al PCM5102A. El reproductor de audio se configura con una función callback para metadatos que imprime información como título de pista o artista en el monitor serial cuando está disponible. También se establece un nivel de volumen digital antes de comenzar la reproducción.
En el bucle principal, la función player.copy() procesa continuamente el flujo de audio. El reproductor lee datos MP3 de la tarjeta SD, los decodifica usando el decodificador Helix en muestras PCM sin procesar y envía el audio procesado a través de la interfaz I2S al DAC para su reproducción. Este mecanismo de streaming basado en bucle asegura una salida de audio continua mientras haya archivos MP3 válidos en la tarjeta SD.
Conclusiones
En este proyecto aprendiste a reproducir audio usando el ESP32 y el amplificador TPA31110 XH-A232 junto con un DAC PCM5102. Exploramos los detalles técnicos del TPA31110 XH-A232 y cómo conectarlo al ESP32. También aprendiste a transmitir radio por Internet, reproducir archivos MP3 desde una tarjeta SD y reproducir audio vía Bluetooth. Para más ejemplos de código, consulta la carpeta de ejemplos de la arduino-tools-library.
Este tutorial está basado en el DAC PCM5102. Para más información sobre el PCM5102, consulta el Playing Audio with ESP32 and PCM5102A tutorial. De igual forma, si necesitas más información sobre el módulo lector de tarjeta SD usado aquí, echa un vistazo al SD Card Module with ESP32 tutorial.
Finalmente, si no necesitas 30 vatios de salida estéreo y quieres una solución más sencilla, lee nuestro Playing Audio with ESP32 and MAX98357 tutorial. El MAX98357A es un DAC con amplificador integrado que puede alimentar altavoces pequeños de 3 vatios. No será tan potente como con el amplificador TPA31110 XH-A232, pero el circuito es más simple y puedes usar altavoces más pequeños y económicos.
No dudes en dejar cualquier pregunta adicional en la sección de comentarios.
¡Feliz bricolaje ; )

