En este tutorial aprenderás a construir una radio de Internet, Bluetooth o MP3 con un amplificador PAM8403, un DAC PCM5102 y un microcontrolador ESP32.
Aunque el DAC PCM5102 facilita mucho la generación de sonido con un ESP32, solo puede alimentar auriculares de alta impedancia y altavoces activos. Si quieres alimentar altavoces pasivos, necesitas un amplificador adicional.
El PAM8403 es un amplificador Clase D muy pequeño y eficiente que puede alimentar altavoces pasivos con hasta 3 vatios. No necesita una fuente de alimentación separada y todo el sistema de audio puede funcionar con batería. Si quieres construir una radio pequeña y portátil de Internet, Bluetooth o MP3, este tutorial es para ti.
Partes necesarias
Necesitarás un módulo DAC PCM5102, una placa amplificadora PAM8403, un ESP32 y un par de altavoces pasivos. Puedes usar otros altavoces distintos a los que menciono, solo asegúrate de que su potencia nominal sea alrededor de 3 vatios.
Luego necesitas un microcontrolador. Yo elegí un ESP32 lite, pero la mayoría de las otras placas ESP32 también funcionarán bien.
Para reproducir archivos MP3 desde una tarjeta SD, además necesitarás una tarjeta SD y un módulo lector de tarjetas SD. También una protoboard y algunos cables serán útiles para un montaje temporal.

Amplificador PAM8403

DAC PCM5102

2 x Altavoces 3 Vatios 8 Ohmios

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 PAM8403
El módulo PAM8403 es un pequeño amplificador de audio estéreo diseñado alrededor del circuito integrado PAM8403, que implementa una topología de amplificación Clase D. Para detalles técnicos del PAM8403 consulta el siguiente enlace:
A diferencia de los amplificadores de audio Clase AB comunes, la arquitectura Clase D del PAM8403 utiliza modulación por ancho de pulso (PWM) de alta frecuencia para convertir una señal de audio analógica entrante en una señal digital de alta eficiencia para los altavoces.
Como los transistores de conmutación operan completamente encendidos o apagados, las pérdidas por conducción se reducen sustancialmente, permitiendo que el amplificador alcance eficiencias cercanas al 90 % en condiciones típicas de operación.
Esta característica de eficiencia hace que el módulo sea ideal para aplicaciones de audio alimentadas por batería y basadas en microcontroladores como proyectos con Arduino o ESP32, donde el espacio en la placa y el consumo de energía son limitados.
Características eléctricas y entrega de potencia
El módulo PAM8403 acepta una única tensión de alimentación DC en un rango relativamente amplio, desde aproximadamente 2.5 V hasta 5.5 V. Con una alimentación nominal de 5 V y altavoces de 4 Ω, cada canal puede entregar hasta unos 3 W de potencia de salida.
Entradas de señal, ganancia y respuesta en frecuencia
La interfaz de entrada de audio en un módulo PAM8403 consta de dos entradas a nivel de línea para los canales izquierdo y derecho.
La ganancia del amplificador está fijada internamente con un valor típico alrededor de 24 dB, lo que significa que niveles modestos de señal de entrada del orden de unos pocos cientos de milivoltios pico a pico son suficientes para llevar las salidas cerca de la potencia máxima sin distorsión.
La relación señal-ruido (SNR) interna es lo suficientemente alta para soportar una reproducción limpia de audio en la banda audible desde aproximadamente 20 Hz hasta 20 kHz.
La imagen a continuación muestra el pinout del módulo PAM8403. Las salidas de los altavoces están en la parte superior, mientras que la entrada de audio y la alimentación están en la parte inferior de la placa:

Protección, comportamiento térmico y diseño del módulo
El circuito integrado PAM8403 incorpora varios mecanismos de protección para mejorar la fiabilidad. Estos incluyen apagado térmico, protección contra cortocircuitos para limitar la corriente en caso de sobrecarga en las salidas de los altavoces y bloqueo por bajo voltaje.
La red de componentes pasivos del módulo soporta una operación estable del PWM y suprime la interferencia electromagnética (EMI) a niveles aceptables sin requerir filtros externos.
Debido a que el chip Clase D funciona eficientemente, normalmente no requiere un disipador de calor externo para cargas típicas.
Especificaciones técnicas
La siguiente tabla resume las especificaciones técnicas del PAM8403:
| Parámetro | Especificación |
|---|---|
| Tipo de amplificador | Amplificador de audio estéreo Clase D |
| Número de canales | 2 (Izquierdo y Derecho) |
| Rango de voltaje de alimentación | 2.5 V a 5.5 V DC |
| Potencia de salida típica | Hasta ~3 W por canal en 4 Ω a 5 V, THD+N = 10 % |
| Potencia de salida a 8 Ω | ~1.8 W por canal en 8 Ω a 5 V, THD+N = 10 % |
| Distorsión armónica total + ruido | ~0.15 % a 1 W en 8 Ω, alimentación 5 V |
| Ganancia (bucle cerrado) | ~24 dB |
| Relación señal-ruido (SNR) | ~80 dB |
| Corriente en reposo | ~8–16 mA a 5 V |
| Corriente en apagado | < 1 µA |
| Rechazo de rizado de la fuente de alimentación (PSRR) | ~-58 dB a 1 kHz |
| Eficiencia | ~80–90 % dependiendo de la carga |
| Temperatura de operación | -40 °C a +85 °C |
| Características de protección | Protección contra cortocircuitos, apagado térmico |
| Impedancia de carga | 4 Ω a 8 Ω recomendado |
| Frecuencia típica de conmutación | ~260 kHz |
Conexión del PAM8403 con PCM5102 y ESP32
En esta sección conectamos el amplificador PAM8403 al DAC PCM5102 y al microcontrolador ESP32. La imagen a continuación muestra el diagrama completo de conexiones:

Comienza conectando el ESP32 al PCM5102 vía la interfaz I2S. Podrías configurar diferentes pines en el código, pero aquí uso LCK=32, BCK=25 y DIN=33. La siguiente tabla muestra las conexiones que debes hacer 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. Te recomiendo encarecidamente que leas el Playing Audio with ESP32 and PCM5102A tutorial primero, si no has configurado o usado el PCM5102 antes. Hay otros puentes que deben soldarse para asegurar que el PCM5102 funcione correctamente.
El amplificador PAM8403 se conecta vía salida de línea al PCM5102. La siguiente tabla muestra las conexiones necesarias:
| PAM8403 | PCM5102 |
|---|---|
| L | LROUT |
| Ʇ | AGND |
| R | ROUT |
Ten en cuenta que la denominación de los pines del PCM5102 es un poco confusa. La salida del canal izquierdo en el PCM5102 debería estar etiquetada como «ROUT» pero en realidad dice «LROUT».
Polaridad de los altavoces
Los altavoces derecho e izquierdo se conectan a los pines R+, R-, L+ y L- del PAM8403. 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 mueva el cono hacia adelante.
Cableado en protoboard
La siguiente foto muestra mi cableado del PAM8403, el PCM5102, un ESP32 y los dos altavoces para pruebas:

Como el sistema consume menos de 200mA, puedes alimentarlo desde el puerto USB (o una batería). No necesitas una fuente de alimentación externa.
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 cableado a continuación muestra cómo conectar el 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 a nuestro Find I2C and SPI default pins tutorial.
Instalación de librerías
Vamos a usar la arduino-audio-tools librería de Phil Schatzmann para construir el 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 necesitamos 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.
Si es la primera vez que programas una placa ESP32 desde tu Arduino IDE, necesitarás instalar también el core de ESP32. Para detalles consulta el Install ESP32 core in Arduino IDE tutorial.
Las siguientes tres secciones contienen el código para un reproductor Bluetooth, una radio por Internet y un reproductor MP3 que puedes ejecutar en el sistema de audio PAM8403, PCM5102 y ESP32.
Código para un reproductor Bluetooth
Este primer ejemplo de código configura el ESP32 para funcionar como un 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() {
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() { }
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 analógica estéreo, que luego es amplificada por el módulo amplificador PAM8403 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.
Si escuchas un sonido de traqueteo, «tak», «tak» y no música, el volumen está demasiado alto. Reduce el volumen en tu teléfono a cero y luego súbelo lentamente.
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 PAM8403 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.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 configuración, el ESP32 se conecta a una red Wi-Fi especificada usando el SSID y la contraseña proporcionados. Necesitará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 PCM5102. Un objeto VolumeStream se superpone al flujo I2S para aplicar escalado digital de volumen antes de enviar los datos de audio al DAC.
Puedes controlar el volumen mediante la constante VOLUME. Si el volumen es demasiado alto, escucharás un sonido de traqueteo y deberás bajarlo. Como usamos un amplificador de 3W, el sonido no será muy alto antes de saturar.
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. Aquí tienes una lista de URLs de otras estaciones 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/"
Los datos de audio codificados en MP3 de la estación de Internet 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 en 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.
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.
/*
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();
}
Se inicializa un objeto AudioSourceSD 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 que el sistema itere a través de los 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 tubería 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 los pines de bit clock, word select y datos seriales asignados explícitamente y conectados al PCM5102.
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 digital de volumen antes de comenzar la reproducción. De nuevo, no pongas la constante VOLUME demasiado alta, de lo contrario el amplificador comenzará a saturar y escucharás un sonido de traqueteo en lugar de música.
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 PAM8403 junto con un DAC PCM5102. 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 del 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.
Una alternativa al PCM5102 y MAX98357 es el MAX98357, que combina un DAC y un amplificador. Para salida mono esta es la solución más sencilla. Lee el Playing Audio with ESP32 and MAX98357 tutorial para más detalles.
Tanto el MAX98357 como el MAX98357 son amplificadores pequeños con una potencia máxima de salida de 3 vatios. Para potencias mayores, echa un vistazo al TPA31110 XH-A232, que puede alimentar altavoces de 30 vatios. Consulta el Stereo Amplifier with TPA31110 XH-A232, PCM5102 and ESP32 tutorial para aprender a usarlo.
No dudes en dejar cualquier pregunta adicional en la sección de comentarios.
¡Feliz bricolaje ; )

