Skip to Content

Amplificador Estéreo com TPA31110 XH-A232, PCM5102 e ESP32

Amplificador Estéreo com TPA31110 XH-A232, PCM5102 e ESP32

Neste tutorial, vais aprender a construir um amplificador estéreo de 30 Watts e um rádio de Internet, Bluetooth ou MP3 com um amplificador TPA31110 XH-A232, um DAC PCM5102 e um microcontrolador ESP32.

O ESP32 produz um sinal de áudio digital, que é convertido em sinal de áudio analógico usando o Conversor Digital-Analógico PCM5102, que é depois amplificado pelo TPA31110 XH-A232.

Enquanto o PCM5102 só pode alimentar auscultadores de alta impedância e colunas ativas, o TPA31110 XH-A232 pode alimentar colunas passivas com até 30 Watts. Se queres construir um rádio de Internet, Bluetooth ou MP3 com maior potência de saída, este tutorial é para ti.

Peças Necessárias

Para este projeto, vamos precisar de um módulo DAC PCM5102, uma placa amplificadora TPA31110 XH-A232, um ESP32 e um par de colunas passivas. Podes usar outras colunas que não as que listei – apenas certifica-te de que a sua potência nominal é cerca de 30 watts.

De forma semelhante, podes usar uma placa ESP32 diferente. A maioria das placas ESP32 serve, mas deves optar por uma placa ESP32-S3 com PSRAM se planeias armazenar e reproduzir música a partir da memória.

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.

Por fim, uma breadboard e alguns cabos serão úteis para uma montagem temporária. Ou podes soldar tudo junto.

Amplificador TPA31110 XH-A232

DAC PCM5102

2 x Colunas 4 Ohm 25 Watts

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

O TPA3110 XH-A232 é uma placa amplificadora estéreo compacta construída em torno do chip amplificador de áudio Classe-D TPA3110 da Texas Instruments. Este módulo é projetado como uma etapa completa de amplificação adequada para sistemas de áudio pequenos a médios.

A placa integra os circuitos necessários de entrada, alimentação e saída numa única placa de circuito impresso, permitindo fácil interface com microcontroladores como Arduino ou ESP32 para tarefas de reprodução e amplificação de áudio.

Arquitetura do Amplificador e Gestão de Potência

No coração da placa está o TPA3110 núcleo amplificador Classe-D, uma arquitetura de amplificador comutado que usa modulação por largura de pulso (PWM) de alta frequência para alcançar amplificação eficiente de potência de áudio com geração mínima de calor. Ao contrário dos amplificadores lineares, os estágios Classe-D comutam rapidamente os transistores de saída entre os estados ligado e desligado, reduzindo significativamente as perdas por condução e permitindo maior eficiência geral do sistema.

O TPA3110 nesta placa está configurado para fornecer até aproximadamente 30 W por canal em cargas de 4 Ω–8 Ω quando alimentado por uma tensão DC suficientemente alta, preferencialmente na faixa de 12 V a 24 V. A configuração de dois canais permite saídas estéreo esquerda e direita simultâneas a partir de uma única placa amplificadora. A imagem abaixo mostra o pinout da placa TPA31110 XH-A232.

Pinout of TPA31110 XH-A232
Pinout do TPA31110 XH-A232

Em operação normal, o amplificador requer uma fonte DC capaz de fornecer cerca de 3 A para suportar a saída de áudio próxima do máximo. A placa inclui componentes de desacoplamento e filtragem para estabilizar essas correntes e reduzir o ruído da alimentação. O casamento de impedância de saída é tipicamente adequado para colunas de 4 Ω a 8 Ω.

Manuseamento do Sinal e Desempenho de Áudio

A placa TPA3110 XH-A232 aceita entrada de áudio analógico em nível de linha, que é amplificada pelo TPA3110 interno. A sensibilidade de entrada é cerca de 0,775 V. A resposta em frequência é tipicamente plana de aproximadamente 20 Hz até 20 kHz. A relação sinal-ruído é cerca de 100 dB, e a distorção harmónica total é ≤ 0,1 % em condições normais.

Características de Proteção

A placa incorpora vários mecanismos de proteção para melhorar a fiabilidade no uso prático. A proteção contra sobretensão protege contra tensões de alimentação excessivas, enquanto a proteção contra curto-circuito e sobrecorrente ajuda a evitar danos se as saídas das colunas forem inadvertidamente curto-circuitadas ou sobrecarregadas. A proteção térmica também está presente, ativando-se se as temperaturas do CI do amplificador ou da placa excederem os limites seguros. O módulo é projetado para recuperar automaticamente assim que as condições voltam a níveis seguros.

Especificações Técnicas

Parâmetro Especificação
Modelo do Módulo XH-A232
CI do Amplificador TPA3110 Classe-D
Canais 2.0 (estéreo)
Potência Nominal de Saída 30 W + 30 W (em cargas de 4 Ω, dependente da alimentação e carga)
Tensão de Alimentação DC ~8 V a 26 V (operação típica entre 12 – 24 V)
Corrente Recomendada de Alimentação ≥ 3 A
Sensibilidade de Entrada ~0,775 V (nível de linha)
Impedância de Entrada ~20 kΩ
Impedância da Carga das Colunas 4 Ω – 8 Ω
Relação Sinal-Ruído (SNR) ~100 dB
Distorção Harmónica Total (THD) ≤ 0,1 %
Resposta em Frequência ~20 Hz – 20 kHz
Características de Proteção Proteção contra sobretensão, sobrecorrente/curto-circuito, proteção térmica
Dimensões Físicas Aprox. 53 × 45 × 14 – 15 mm
Peso Aproximado ~20 – 25 g

Ligação do TPA31110 XH-A232 com PCM5102 e ESP32

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

Connecting TPA31110 XH-A232 to PCM5102 and ESP32
Ligação do TPA31110 XH-A232 ao PCM5102 e ESP32

Começamos por ligar o ESP32 ao PCM5102 via interface I2S. Podes configurar pinos diferentes (ver o código nas secções seguintes), mas aqui estou a usar LCK=32, BCK=25 e DIN=33. A tabela seguinte mostra as ligações completas 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, mas não faz mal nenhum. Recomendo fortemente que leias o Playing Audio with ESP32 and PCM5102A tutorial, se nunca configuraste ou usaste o PCM5102 antes. Existem outras pontes que precisam ser soldadas para garantir que o PCM5102 funcione!

De seguida, ligamos o amplificador TPA31110 XH-A232 via saída de linha ao PCM5102. A tabela seguinte mostra as ligações que precisas de fazer:

TPA31110 XH-A232 PCM5102
L LROUT
bJ AGND
R ROUT

Note que a rotulagem dos pinos do TPA31110 XH-A232 e do PCM5102 é confusa. A saída do canal esquerdo no PCM5102 deveria estar rotulada como “ROUT”, mas na verdade está como “LROUT”. O pino do meio para a entrada de linha está rotulado como “bJ”, mas deveria ser “G” para terra.

Também nota que vais precisar de uma fonte de alimentação separada para o TPA31110 XH-A232 que possa fornecer entre 12V até 24V e 3A.

Polaridade das Colunas

As colunas direita e esquerda ligam-se aos pinos R+, R-, L+ e L- do TPA31110 XH-A232. Certifica-te de que corresponderes 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,5V 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 produza movimento do cone para a frente.

Ligação do Leitor de Cartão SD

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

Connecting TPA31110 XH-A232 to PCM5102 and ESP32 with SD Card Reader
Ligação do TPA31110 XH-A232 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 de 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 Find I2C and SPI default pins tutorial.

A foto seguinte mostra a minha ligação do TPA31110 XH-A232 e PCM5102A com um leitor de cartão SD, um ESP32 e duas colunas para teste:

Instalação das Bibliotecas

Vamos usar a arduino-audio-tools biblioteca de Phil Schatzmann para construir o nosso 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 github, clica no botão verde “<> Code” para descarregar as bibliotecas (arduino-libhelix-main.zip, ESP32-A2DP-main.zip) e depois instala-as.

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

Nas próximas três secções, vou mostrar-te o código para construir um leitor Bluetooth, um rádio de Internet e um leitor MP3 usando a biblioteca arduino-tools-library.

Código para um Leitor Bluetooth

Este primeiro exemplo de código configura um 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 o 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() { }

O código inicializa uma interface I2SStream com os pinos atribuídos para bit clock, word select e dados seriais, que estão ligados a um conversor digital-analógico PCM5102. O PCM5102 converte o sinal de áudio digital I2S recebido num sinal estéreo analógico, que é depois amplificado pelo módulo amplificador XH-A232 baseado no TPA3110 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 do 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 permanece vazio porque o manuseamento do áudio e a comunicação Bluetooth são geridos internamente pelas bibliotecas subjacentes e correm de forma assíncrona em segundo plano.

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 novamente envia o sinal de áudio via I2S para o DAC PCM5102A. O sinal analógico gerado pelo DAC é depois amplificado pelo TPA31110 XH-A232 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.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 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 PCM5102A. Um objeto VolumeStream é colocado sobre o fluxo I2S para aplicar controlo digital de volume antes de os dados de áudio serem enviados para o DAC.

O programa abre uma ligação HTTP para a URL de streaming especificada usando um ICYStream que suporta metadados ICY, comuns em estações de rádio de Internet. Os dados de áudio codificados em MP3 recebidos 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 depois 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.

Segue-se uma lista de URLs para algumas outras estações de rádio de 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/"

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. A saída analógica do DAC é depois amplificada pelo TPA31110 XH-A232 e enviada para as colunas.

/*
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();
}

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 fluxo 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 pinos explicitamente atribuídos para bit clock, word select e dados seriais ligados ao PCM5102A. 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 do início da reprodução.

No loop principal, a função player.copy() processa continuamente o fluxo 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 TPA31110 XH-A232 em conjunto com um DAC PCM5102. Explorámos os detalhes técnicos do TPA31110 XH-A232 e como o ligar ao ESP32. Também aprendeste a transmitir rádio de Internet, reproduzir ficheiros MP3 a partir de um cartão SD e reproduzir áudio via Bluetooth. Para mais exemplos de código, vê a pasta de exemplos da 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.

Finalmente, se não precisares de 30 Watts de saída estéreo e quiseres uma solução mais simples, lê o nosso Playing Audio with ESP32 and MAX98357 tutorial. O MAX98357A é um DAC com amplificador incorporado que pode alimentar pequenas colunas de 3 Watts. Não será tão potente como com o amplificador TPA31110 XH-A232, mas o circuito é mais simples e podes usar colunas mais pequenas e baratas.

Sente-te à vontade para deixar quaisquer outras perguntas na secção de comentários.

Boas experiências a criar ; )