Skip to Content

Áudio com PAM8403, PCM5102 e ESP32

Áudio com PAM8403, PCM5102 e ESP32

Neste tutorial, vais aprender a construir um rádio de Internet, Bluetooth ou MP3 com um amplificador PAM8403, um DAC PCM5102 e um microcontrolador ESP32.

Embora o DAC PCM5102 facilite muito a geração de som com um ESP32, ele só pode alimentar auscultadores de alta impedância e colunas ativas. Se quiseres alimentar colunas passivas, precisas de um amplificador adicional.

O PAM8403 é um amplificador Classe D muito pequeno e eficiente que pode alimentar colunas passivas com até 3 Watts. Não precisa de uma fonte de alimentação separada e todo o sistema de áudio pode funcionar a bateria. Se queres construir um rádio pequeno e portátil de Internet, Bluetooth ou MP3, este tutorial é para ti.

Peças Necessárias

Vais precisar de um módulo DAC PCM5102, uma placa amplificadora PAM8403, um ESP32 e um par de colunas passivas. Podes usar outras colunas além das que listei – só certifica-te de que a potência nominal delas é cerca de 3 watts.

Depois precisas de um microcontrolador. Eu escolhi um ESP32 lite, mas a maioria das outras placas ESP32 também serve.

Para reproduzir ficheiros MP3 a partir de um cartão SD, vais também precisar de um cartão SD e de um módulo leitor de cartão SD. Uma breadboard e alguns cabos serão úteis para uma montagem temporária.

Amplificador PAM8403

DAC PCM5102

2 x Colunas 3 Watt 8 Ohm

Leitor de Cartão Micro SD

Cartão Micro SD 8GB

ESP32 lite Lolin32

ESP32 lite

USB data cable

Cabo USB de Dados

Dupont wire set

Conjunto de Cabos 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.

Características Técnicas do PAM8403

O módulo PAM8403 é um pequeno amplificador de áudio estéreo baseado no circuito integrado PAM8403, que implementa uma topologia de amplificação Classe D. Para detalhes técnicos do PAM8403, consulta o seguinte link:

Ao contrário dos amplificadores de áudio Classe-AB comuns, a arquitetura Classe-D do PAM8403 usa modulação por largura de pulso (PWM) de alta frequência para converter um sinal de áudio analógico de entrada num sinal digital eficiente para os altifalantes.

Como os transístores de comutação operam totalmente ligados ou desligados, as perdas por condução são substancialmente reduzidas, permitindo que o amplificador alcance eficiências próximas de 90 % em condições normais de operação.

Esta característica de eficiência torna o módulo ideal para aplicações de áudio alimentadas a bateria e baseadas em microcontroladores, como projetos Arduino ou ESP32, onde o espaço na placa e o consumo de energia são limitados.

Características Elétricas e Potência Fornecida

Eletricamente, o módulo PAM8403 aceita uma tensão de alimentação DC única numa gama relativamente ampla, de aproximadamente 2,5 V até 5,5 V. Com uma alimentação nominal de 5 V e a alimentar colunas de 4 Ω, cada canal pode fornecer até cerca de 3 W de potência de saída.

Entradas de Sinal, Ganho e Resposta em Frequência

A interface de entrada de áudio no módulo PAM8403 compreende duas entradas de nível de linha para os canais esquerdo e direito.

O ganho do amplificador é fixo internamente com um valor típico em torno de 24 dB, o que significa que níveis modestos de sinal de entrada na ordem de algumas centenas de milivolts pico a pico são suficientes para conduzir as saídas perto da potência máxima sem distorção.

A relação sinal-ruído (SNR) interna é suficientemente alta para suportar reprodução limpa de áudio na faixa audível, aproximadamente de 20 Hz até 20 kHz.

A imagem abaixo mostra o pinout do módulo PAM8403. As saídas para as colunas estão na parte superior, enquanto a entrada de áudio e a alimentação estão na parte inferior da placa:

Pinout do Amplificador PAM8403

Proteção, Comportamento Térmico e Layout do Módulo

O CI PAM8403 incorpora vários mecanismos de proteção para melhorar a fiabilidade. Estes incluem normalmente desligamento térmico, proteção contra curto-circuito para limitar a corrente em caso de sobrecarga nas saídas das colunas, e bloqueio por subtensão.

A rede de componentes passivos do módulo suporta operação estável do PWM e suprime interferências eletromagnéticas (EMI) a níveis aceitáveis sem necessidade de componentes de filtro externos.

Como o chip Classe-D funciona eficientemente, normalmente não requer dissipador de calor externo para cargas típicas.

Especificação Técnica

A tabela seguinte resume a Especificação Técnica do PAM8403:

Parâmetro Especificação
Tipo de Amplificador Amplificador de áudio estéreo Classe-D
Número de Canais 2 (Esquerdo e Direito)
Faixa de Tensão de Alimentação 2,5 V a 5,5 V DC
Potência de Saída Típica Até ~3 W por canal em 4 Ω a 5 V, THD+N = 10 %
Potência de Saída @ 8 Ω ~1,8 W por canal em 8 Ω a 5 V, THD+N = 10 %
Distorção Harmónica Total + Ruído ~0,15 % a 1 W em 8 Ω, alimentação 5 V
Ganho (Malha Fechada) ~24 dB
Relação Sinal-Ruído (SNR) ~80 dB
Corrente em Repouso ~8–16 mA a 5 V
Corrente de Desligamento < 1 µA
Rejeição de Ripple da Fonte de Alimentação (PSRR) ~-58 dB a 1 kHz
Eficiência ~80–90 % dependendo da carga
Temperatura de Operação -40 °C a +85 °C
Características de Proteção Proteção contra curto-circuito, desligamento térmico
Impedância da Carga 4 Ω a 8 Ω recomendado
Frequência de Comutação Típica ~260 kHz

Ligação do PAM8403 com PCM5102 e ESP32

Nesta secção, vamos ligar o amplificador PAM8403 ao DAC PCM5102 e ao microcontrolador ESP32. A imagem abaixo mostra o diagrama completo de ligações:

Ligação do PAM8403 ao PCM5102 e ESP32

Começa por ligar o ESP32 ao PCM5102 via interface I2S. Podes configurar pinos diferentes no código, mas aqui estou a usar LCK=32, BCK=25 e DIN=33. A tabela seguinte mostra as ligações que precisas fazer entre o ESP32 e o PCM5102:

PCM5102A ESP32
VIN 3V3
GND G
LRCK 32
BCK 25
DIN 33
SCK G

Se soldaste a ponte SCK no PCM5102, na verdade não precisas da ligação SCK a terra. Recomendo fortemente que leias o Playing Audio with ESP32 and PCM5102A tutorial primeiro, se nunca configuraste ou usaste o PCM5102 antes. Existem outras pontes que precisam ser soldadas para garantir que o PCM5102 funcione!

O amplificador PAM8403 é ligado via saída de linha ao PCM5102. A tabela seguinte mostra as ligações necessárias:

PAM8403 PCM5102
L LROUT
AGND
R ROUT

Note que a identificação dos pinos do PCM5102 é um pouco confusa. A saída do canal esquerdo no PCM5102 deveria estar rotulada como “ROUT”, mas na verdade está como “LROUT”.

Polaridade das Colunas

As colunas direita e esquerda são ligadas aos pinos R+, R-, L+ e L- do PAM8403. Certifica-te de que corres a polaridade dos pinos de saída com a polaridade dos pinos das colunas. Normalmente, os pinos das colunas estão marcados com sinais “+” e “-” ou têm pinos de formas diferentes (mais finos para o menos).

Se não houver marcações, podes ligar uma pilha AA de 1,5 V e se a membrana se mover para fora, o polo positivo da pilha indica o polo positivo da coluna. A polaridade da coluna é definida para que uma tensão positiva mova o cone para a frente.

Ligação na Breadboard

A foto seguinte mostra a minha ligação do PAM8403, do PCM5102, de um ESP32 e das duas colunas para teste:

Como o sistema consome menos de 200mA, podes alimentá-lo pela porta USB (ou por bateria). Não precisas de fonte de alimentação externa.

Ligação do Leitor de Cartão SD

Se quiseres reproduzir ficheiros MP3, precisas de ligar um leitor de cartão SD que armazene os ficheiros de áudio num cartão SD. O diagrama de ligações abaixo mostra como ligar o leitor de cartão SD adicional:

Connecting PAM8403 to PCM5102 and ESP32 with SD Card Reader
Ligação do PAM8403 ao PCM5102 e ESP32 com Leitor de Cartão SD

O leitor de cartão SD comunica via SPI e os pinos SPI padrão do ESP32 são CS=5, MOSI=23, CLK=18 e MISO=19. A tabela abaixo resume as ligações que precisas fazer entre o leitor de cartão SD e o ESP32:

Leitor de Cartão SD ESP32
3V3 3V
GND G
CS/SS 5
MOSI 23
CLK/SCK 18
MISO 19

Se não tens a certeza quais são os pinos SPI padrão do teu ESP32, dá uma vista de olhos no nosso Find I2C and SPI default pins tutorial.

Instalação das Bibliotecas

Vamos usar a arduino-audio-tools biblioteca de Phil Schatzmann para construir o leitor de Internet, Bluetooth e MP3. Para instalar esta biblioteca, vai ao arduino-audio-tools repositório, clica no botão verde “<> Code” e depois em “Download ZIP” para descarregar a biblioteca como um ficheiro ZIP, como mostrado abaixo:

Depois abre um Sketch, vai a Sketch -> Include Library -> Add .ZIP Library … para instalar a biblioteca ZIP descarregada (arduino-audio-tools-main.zip):

Para alguns exemplos de código, precisamos de mais duas bibliotecas de Phil Schatzmann; nomeadamente a arduino-libhelix biblioteca e a ESP32-A2DP biblioteca. Podes instalá-las da mesma forma. Clica no link para ir ao repositório do github, clica no botão verde “<> Code” para descarregar as bibliotecas (arduino-libhelix-main.zip, ESP32-A2DP-main.zip) e depois instala-as.

Se esta é a primeira vez que programas uma placa ESP32 a partir do Arduino IDE, vais precisar de instalar o core ESP32 também. Para detalhes, vê o Install ESP32 core in Arduino IDE tutorial.

As próximas três secções contêm o código para um leitor Bluetooth, um rádio de Internet e um leitor MP3 que podes executar no sistema de áudio PAM8403, PCM5102 e ESP32.

Código para um Leitor Bluetooth

Este primeiro exemplo de código configura o ESP32 para funcionar como um receptor de áudio Bluetooth A2DP que recebe streams de áudio estéreo de um dispositivo emparelhado, como um smartphone, e envia os dados digitais de áudio via 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() { }

O código inicializa uma interface I2SStream com os pinos de bit clock, word select e dados seriais atribuídos, que estão ligados a um conversor digital-analógico PCM5102. O PCM5102 converte o sinal digital I2S recebido num sinal analógico estéreo, que é amplificado pelo módulo amplificador PAM8403 para alimentar duas colunas ligadas.

Durante a configuração, o ESP32 inicializa o driver I2S com a configuração de pinos especificada e inicia o receptor Bluetooth A2DP com o nome de dispositivo “MyMusic”, tornando o ESP32 descobrível como receptor de áudio Bluetooth.

Uma vez emparelhado e ligado, o áudio transmitido via Bluetooth é encaminhado diretamente pela interface I2S para o DAC e subsequentemente amplificado para reprodução. O loop principal fica vazio porque o tratamento do áudio e a comunicação Bluetooth são geridos internamente pelas bibliotecas subjacentes e correm de forma assíncrona em segundo plano.

Se ouvires um som de estalido, “tak”, “tak” e nenhuma música, o volume está demasiado alto. Reduz o volume no teu telemóvel para zero e depois aumenta lentamente.

Código para um Rádio de Internet

Este exemplo de código usa um ESP32 como receptor de rádio de Internet Wi-Fi que transmite um feed de áudio MP3 online, decodifica-o em tempo real e volta a enviar o sinal de áudio via I2S para o DAC PCM5102A. O sinal analógico gerado pelo DAC é então amplificado pelo PAM8403 para alimentar as colunas ligadas.

/*
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 a configuração, o ESP32 liga-se a uma rede Wi-Fi especificada usando o SSID e a password fornecidos. Terás de substituir as strings “ssid” e “pwd” pelas credenciais da tua rede Wi-Fi.

Uma vez estabelecida a ligação sem fios, o código inicializa o periférico I2S em modo de transmissão e atribui os pinos de bit clock, word select e dados seriais para corresponder à interface de hardware do PCM5102. Um objeto VolumeStream é colocado por cima do stream I2S para aplicar controlo digital de volume antes de os dados de áudio serem enviados para o DAC.

Podes controlar o volume através da constante VOLUME. Se o volume ficar muito alto, ouvirás um som de estalido e precisarás de baixar o volume. Como estamos a usar um amplificador de 3W, o som não ficará muito alto antes de saturar.

O programa abre uma ligação HTTP para o URL de streaming especificado usando um ICYStream, que suporta metadados ICY usados frequentemente por estações de rádio na Internet. Aqui está uma lista de URLs para algumas outras estações de rádio na Internet que podes experimentar:

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

Os dados de áudio codificados em MP3 da estação de Internet são passados para um EncodedAudioStream configurado com o decodificador Helix MP3, que realiza a decodificação em tempo real dos frames de áudio comprimidos em amostras PCM brutas. Estas amostras decodificadas são então encaminhadas pela etapa de controlo de volume e finalmente transmitidas via I2S para o DAC.

Uma função de callback de metadados é registada para receber e imprimir metadados do stream, como o título da faixa atual, no monitor serial. No loop principal, o objeto StreamCopy transfere continuamente dados do stream de rede através do decodificador e da cadeia de processamento de áudio, garantindo reprodução ininterrupta enquanto o stream estiver disponível.

Código para um Leitor MP3

Este último programa usa o ESP32 como leitor de áudio MP3 autónomo que lê ficheiros de áudio de um cartão SD, decodifica-os em tempo real e envia o sinal PCM resultante via interface I2S para o 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();
}

Um objeto AudioSourceSD é inicializado para aceder a ficheiros MP3 armazenados no cartão SD no diretório raiz. A fonte é configurada para selecionar ficheiros com a extensão “mp3”, permitindo ao sistema iterar pelos ficheiros de áudio compatíveis disponíveis no cartão. O objeto AudioPlayer combina a fonte do cartão SD, um stream de saída I2S e o decodificador Helix MP3 numa única pipeline de reprodução.

Durante a configuração, o ESP32 inicializa a comunicação serial para depuração e configura o periférico I2S em modo de transmissão com os pinos de bit clock, word select e dados seriais explicitamente atribuídos e ligados ao PCM5102.

O leitor de áudio é configurado com uma função de callback de metadados para imprimir informações como título da faixa ou artista no monitor serial quando disponíveis. Um nível digital de volume também é definido antes de começar a reprodução. Novamente, não definas a constante VOLUME muito alta, caso contrário o amplificador começa a saturar e ouvirás um som de estalido em vez de música.

No loop principal, a função player.copy() processa continuamente o stream de áudio. O leitor lê dados MP3 do cartão SD, decodifica-os usando o decodificador Helix em amostras PCM brutas e envia o áudio processado através da interface I2S para o DAC para reprodução. Este mecanismo de streaming baseado em loop garante saída contínua de áudio enquanto existirem ficheiros MP3 válidos no cartão SD.

Conclusões

Neste projeto, aprendeste a reproduzir áudio usando o ESP32 e o amplificador PAM8403 em conjunto com um DAC PCM5102. Também aprendeste a transmitir rádio de Internet, reproduzir ficheiros MP3 de um cartão SD e reproduzir áudio via Bluetooth. Para mais exemplos de código, vê a pasta de exemplos do arduino-tools-library.

Este tutorial baseia-se no DAC PCM5102. Para mais informações sobre o PCM5102, vê o Playing Audio with ESP32 and PCM5102A tutorial. De forma semelhante, se precisares de mais informações sobre o módulo leitor de cartão SD usado aqui, dá uma vista de olhos no SD Card Module with ESP32 tutorial.

Uma alternativa ao PCM5102 e MAX98357 é o MAX98357, que combina um DAC e um amplificador. Para saída mono, esta é a solução mais simples. Lê o Playing Audio with ESP32 and MAX98357 tutorial para mais detalhes.

Ambos, o MAX98357 e o MAX98357, são pequenos amplificadores com uma potência máxima de saída de 3 Watts. Para potências mais elevadas, vê o TPA31110 XH-A232, que pode alimentar colunas de 30 Watts. Consulta o Stereo Amplifier with TPA31110 XH-A232, PCM5102 and ESP32 tutorial sobre como usá-lo.

Sente-te à vontade para deixar quaisquer dúvidas adicionais na secção de comentários.

Boas montagens ; )