Índice:
- Suprimentos
- Etapa 1: Construção - a placa de ensaio
- Etapa 2: Construção - Cabeçalhos de pressão / solda
- Etapa 3: Construção - Conecte os pinos de alimentação
- Etapa 4: Construção - Fiação I2S
- Etapa 5: Instalando a Biblioteca BtAudio
- Etapa 6: usando a biblioteca BtAudio
- Etapa 7: DSP - Filtragem
- Etapa 8: DSP - Compressão de faixa dinâmica
- Etapa 9: A interface Wifi
- Etapa 10: Planos Futuros
2024 Autor: John Day | [email protected]. Última modificação: 2024-01-30 11:35
Resumo
Quando penso em Bluetooth, penso em música, mas infelizmente a maioria dos microcontroladores não consegue tocar música via Bluetooth. O Raspberry Pi pode, mas isso é um computador. Quero desenvolver uma estrutura baseada em Arduino para microcontroladores para reproduzir áudio via Bluetooth. Para flexionar totalmente os músculos do meu microcontrolador, adicionarei Processamento de Sinal Digital (DSP) em tempo real ao áudio (filtragem passa-alta, filtragem passa-baixa e compressão de faixa dinâmica). Para a cereja no topo, adicionarei um servidor web que pode ser usado para configurar o DSP sem fio. O vídeo integrado mostra os fundamentos do áudio Bluetooth em ação. Ele também me mostra usando o servidor da web para realizar alguma filtragem passa-alta, filtragem passa-baixa e compressão de faixa dinâmica. O primeiro uso da compressão de faixa dinâmica causa distorção propositalmente como um exemplo de escolhas de parâmetros ruins. O segundo exemplo elimina essa distorção.
Para este projeto, o ESP32 é o microcontrolador de escolha. Custa menos de £ 10 e vem com ADCs, DACs, Wifi, Bluetooth Low Energy, Bluetooth Classic e um processador dual-core de 240MHz. O DAC integrado pode tecnicamente reproduzir áudio, mas não soará muito bem. Em vez disso, usarei o decodificador estéreo Adafruit I2S para produzir um sinal de saída de linha. Este sinal pode ser facilmente enviado para qualquer sistema HiFi para adicionar instantaneamente áudio sem fio ao seu sistema HiFi existente.
Suprimentos
Felizmente, a maioria dos fabricantes terá placas de ensaio, jumpers, cabos USB, ferros de solda de fonte de alimentação e terá de gastar apenas £ 15 no ESP32 e no decodificador estéreo. Caso contrário, todas as peças necessárias estão listadas abaixo.
- Um ESP32 - testado no ESP32-PICO-KIT e no TinyPico - £ 9,50 / £ 24
- Decodificador Estéreo Adafruit I2S - £ 5,51
- Breadboard - £ 3- £ 5 cada
- Fios de ligação - £ 3
- Fones de ouvido com fio / sistema de alta fidelidade - £ £ £
- Cabeçalhos de pressão ou ferro de soldar - £ 2,10 / £ 30
- Cabo micro USB - £ 2,10 / £ 3
- 3,5 mm para conector RCA / 3,5 mm para conector (ou o que quer que seu alto-falante precise) - £ 2,40 / £ 1,50
- Fonte de alimentação USB - £ 5
Etapa 1: Construção - a placa de ensaio
Se você comprou o ESP32-PICO-KIT, não precisará soldar nenhum pino, pois ele vem pré-soldado. Basta colocá-lo na placa de ensaio.
Etapa 2: Construção - Cabeçalhos de pressão / solda
Se você tiver um ferro de solda, solde os pinos no decodificador estéreo de acordo com as instruções no site da Adafruit. No momento em que este artigo foi escrito, meu ferro de soldar estava em funcionamento, mas estava travado. Eu não queria pagar por um ferro de solda temporário, então cortei alguns cabeçotes de pimoroni. Cortei-os para que se ajustassem ao decodificador estéreo. Esta não é a melhor solução (e não como os cabeçalhos deveriam ser usados), mas é a alternativa mais barata para um ferro de solda. Encaixe o cabeçalho de corte na placa de ensaio. Você deve precisar apenas de 1 linha de 6 pinos para o decodificador. Você pode adicionar mais seis ao outro lado para estabilidade, mas isso não é necessário para este sistema de protótipo. Os pinos para encaixar os cabeçalhos são vin, 3vo, gnd, wsel, din e bclk.
Etapa 3: Construção - Conecte os pinos de alimentação
Coloque o decodificador estéreo nos cabeçalhos de pressão (pinos vin, 3vo, gnd, wsel, din e bclk) e empurre-os firmemente juntos. Novamente, isso idealmente deveria ser feito com um ferro de solda, mas eu tive que improvisar. Você notará que todos os fios neste instrutível são azuis. Isso porque eu não tinha nenhum fio de ligação, então cortei 1 fio longo em pedaços menores. Além disso, sou daltônico e não me importo muito com a cor dos fios. Os pinos de alimentação são conectados da seguinte forma:
3v3 (ESP32) -> para vin no decodificador estéreo
gnd (ESP32) -> para encontrar no decodificador estéreo
Etapa 4: Construção - Fiação I2S
Para enviar o áudio Bluetooth do ESP32 para o decodificador estéreo, usaremos um método de comunicação digital chamado I2S. O decodificador estéreo pegará esse sinal digital e o transformará em um sinal analógico que pode ser conectado a um alto-falante ou HiFi. I2S requer apenas 3 fios e é razoavelmente simples de entender. A linha do bit clock (bclk) fica alta e baixa para indicar que um novo bit é transmitido. A linha de saída de dados (dout) fica alta ou baixa para indicar se esse bit tem um valor de 0 ou 1 e a linha de seleção de palavra (wsel) fica alta ou baixa para indicar se o canal esquerdo ou direito está sendo transmitido. Nem todo microcontrolador suporta I2S, mas o ESP32 tem 2 linhas I2S. Isso o torna uma escolha óbvia para este projeto.
A fiação é a seguinte:
27 (ESP32) -> wsel (decodificador estéreo)
25 (ESP32) -> din (decodificador estéreo)
26 (ESP32) -> bclk (decodificador estéreo)
Etapa 5: Instalando a Biblioteca BtAudio
Se você ainda não os instalou, instale o Arduino IDE e o núcleo do Arduino para ESP32. Depois de instalá-los, visite minha página do Github e baixe o repositório. No IDE Arduino em Sketch >> Incluir Biblioteca >> selecione "Adicionar biblioteca. ZIP". Em seguida, selecione o arquivo zip baixado. Isso deve adicionar minha biblioteca btAudio às suas bibliotecas do Arduino. Para usar a biblioteca, você terá que incluir o cabeçalho relevante no esboço do Arduino. Você verá isso na próxima etapa.
Etapa 6: usando a biblioteca BtAudio
Depois de instalado, conecte o ESP32 ao computador via micro USB e, em seguida, conecte o decodificador estéreo ao alto-falante com o fio de 3,5 mm. Antes de fazer o upload do esboço, você precisará alterar algumas coisas no editor do Arduino. Depois de selecionar sua placa, você precisará editar o esquema de partição em Ferramentas >> Esquema de partição e selecionar "Sem OTA (APP grande)" ou "SPIFFS mínimo (APPS grande com OTA)". Isso é necessário porque este projeto usa WiFi e Bluetooth, que são bibliotecas com muita memória. Depois de fazer isso, carregue o seguinte esboço para o ESP32.
#incluir
// Define o nome do dispositivo de áudio btAudio audio = btAudio ("ESP_Speaker"); void setup () {// transmite dados de áudio para o ESP32 audio.begin (); // envia os dados recebidos para um I2S DAC int bck = 26; int ws = 27; int dout = 25; audio. I2S (bck, dout, ws); } void loop () {}
O esboço pode ser amplamente dividido em 3 etapas:
- Crie um objeto btAudio global que defina o "nome Bluetooth" do seu ESP32
- Configure o ESP32 para receber áudio com o método btAudio:: begin
- Defina os pinos I2S com o método btAudio:: I2S.
É isso no lado do software! Agora, tudo o que você precisa fazer é iniciar a conexão Bluetooth com o ESP32. Basta procurar novos dispositivos em seu telefone / laptop / MP3 player e "ESP_Speaker" aparecerá. Quando estiver satisfeito por tudo estar funcionando (a música toca), você pode desconectar o ESP32 do computador. Ligue-o com a fonte de alimentação USB e ele se lembrará do último código que você carregou. Desta forma, você pode deixar o seu ESP32 escondido atrás do seu sistema HiFi para sempre.
Etapa 7: DSP - Filtragem
Estendendo o receptor com processamento de sinal digital
Se você seguiu todas as etapas (e não deixei nada de fora), agora você tem um receptor Bluetooth totalmente funcional para o seu sistema HiFi. Embora seja legal, ele realmente não leva o microcontrolador aos seus limites. O ESP32 tem dois núcleos operando a 240 MHz. Isso significa que este projeto é muito mais do que apenas um receptor. Ele tem a capacidade de ser um receptor Bluetooth com um Processador de Sinal Digital (DSP). Os DSPs essencialmente executam operações matemáticas no sinal em tempo real. Uma operação útil é chamada de Filtragem Digital. Este processo atenua as frequências em um sinal abaixo ou acima de uma certa frequência de corte, dependendo se você está usando um filtro passa-altas ou passa-baixas.
Filtros passa-alta
Os filtros passa-altas atenuam as frequências abaixo de uma certa banda. Eu construí uma biblioteca de filtros para sistemas Arduino com base no código do Earlevel.com. A principal diferença é que mudei a estrutura de classes para permitir a construção de filtros de ordem superior com mais facilidade. Os filtros de ordem superior suprimem as frequências além do seu corte de forma mais eficaz, mas exigem muito mais computação. No entanto, com a implementação atual, você pode até usar filtros de 6ª ordem para áudio em tempo real!
O esboço é igual ao encontrado na etapa anterior, exceto que alteramos o loop principal. Para habilitar os filtros, usamos o método btAudio:: createFilter. Este método aceita 3 argumentos. O primeiro é o número de cascatas de filtro. O número de cascatas de filtro é metade da ordem do filtro. Para um filtro de 6ª ordem, o primeiro argumento deve ser 3. Para um filtro de 8ª ordem, seria 4. O segundo argumento é o corte do filtro. Eu configurei isso para 1000 Hz para ter um efeito realmente dramático nos dados. Finalmente, especificamos o tipo de arquivador com o terceiro argumento. Deve ser passa-alta para um filtro passa-alta e passa-baixa para um filtro passa-baixa. O script abaixo muda o corte desta frequência entre 1000Hz e 2Hz. Você deve ouvir um efeito dramático nos dados.
#incluir
áudio btAudio = btAudio ("ESP_Speaker"); void setup () {audio.begin (); int bck = 26; int ws = 27; int dout = 25; audio. I2S (bck, dout, ws); } loop vazio () {atraso (5000); audio.createFilter (3, 1000, passa-alto); atraso (5000); audio.createFilter (3, 2, passa-alto); }
Filtros passa-baixo
Os filtros de passagem baixa fazem o oposto dos filtros de passagem alta e suprimem as frequências acima de uma certa frequência. Eles podem ser implementados da mesma maneira que os filtros passa-altas, exceto pelo fato de exigirem a alteração do terceiro argumento para passa-baixa. Para o esboço abaixo, alterno o corte de passagem baixa entre 2.000 Hz e 20.000 Hz. Com sorte, você ouvirá a diferença. Deve soar bastante abafado quando o filtro passa-baixa está em 2000Hz.
#incluir
áudio btAudio = btAudio ("ESP_Speaker"); void setup () {audio.begin (); int bck = 26; int ws = 27; int dout = 25; audio. I2S (bck, dout, ws); } loop vazio () {atraso (5000); audio.createFilter (3, 2000, passa-baixo); atraso (5000); audio.createFilter (3, 20000, passa-baixo); }
Etapa 8: DSP - Compressão de faixa dinâmica
Fundo
A compressão de faixa dinâmica é um método de processamento de sinal que tenta equilibrar o volume do áudio. Comprime os sons altos, que ultrapassam um determinado limiar, ao nível dos silenciosos e depois, opcionalmente, amplifica ambos. O resultado é uma experiência de audição muito mais uniforme. Isso foi realmente útil enquanto eu estava assistindo a um show com música de fundo muito alta e vocais muito baixos. Nesse caso, apenas aumentar o volume não ajudou, pois isso apenas amplificou a música de fundo. Com a compressão de faixa dinâmica, eu poderia reduzir a música de fundo alta ao nível dos vocais e ouvir tudo corretamente novamente.
O código
A compressão da faixa dinâmica não envolve apenas diminuir o volume ou limitar o sinal. É um pouco mais inteligente do que isso. Se você diminuir o volume, os sons baixos serão reduzidos, assim como os altos. Uma maneira de contornar isso é limitar o sinal, mas isso resulta em distorção severa. A compressão de faixa dinâmica envolve uma combinação de limite suave e filtragem para minimizar a distorção que se obteria se você fizesse o limite / corte do sinal. O resultado é um sinal em que os sons altos são "cortados" sem distorção e os baixos são deixados como estão. O código abaixo alterna entre três níveis diferentes de compressão.
- Compressão com distorção
- Compressão sem distorção
- Sem compressão
#incluir
áudio btAudio = btAudio ("ESP_Speaker"); void setup () {audio.begin (); int bck = 26; int ws = 27; int dout = 25; audio. I2S (bck, dout, ws); } loop vazio () {atraso (5000); audio.compress (30, 0,0001, 0,0001, 10, 10, 0); atraso (5000); audio.compress (30, 0,0001, 0,1, 10, 10, 0); atraso (5000); audio.decompress (); }
A compressão de faixa dinâmica é complicada e os métodos btAudio:: compress têm muitos parâmetros. Vou tentar explicá-los (em ordem) aqui:
- Limiar - o nível em que o áudio é reduzido (medido em decibéis)
- Tempo de ataque - O tempo que leva para o compressor começar a trabalhar, uma vez que o limite foi excedido
- Tempo de liberação - O tempo que o compressor leva para parar de funcionar.
- Taxa de redução - o fator pelo qual o áudio é compactado.
- Largura do joelho - a largura (em decibéis) em torno do limite no qual o compressor funciona parcialmente (som mais natural).
- O ganho (decibéis) adicionado ao sinal após a compressão (aumentar / diminuir o volume)
A distorção muito audível no primeiro uso da compressão ocorre porque o limite é muito baixo e tanto o tempo de ataque quanto o tempo de liberação são muito curtos, resultando em um comportamento de limite difícil. Isso é claramente resolvido no segundo caso, aumentando o tempo de liberação. Isso basicamente faz com que o compressor atue de uma maneira muito mais suave. Aqui, eu apenas mostrei como alterar 1 parâmetro pode ter um efeito dramático no áudio. Agora é sua vez de experimentar diferentes parâmetros.
A implementação (a matemática mágica - opcional)
Descobri que implementar ingenuamente a compressão de faixa dinâmica é um desafio. O algoritmo requer a conversão de um número inteiro de 16 bits em decibéis e, em seguida, a transformação de volta em um número inteiro de 16 bits depois de processar o sinal. Percebi que uma linha de código estava demorando 10 microssegundos para processar dados estéreo. Como o áudio estéreo amostrado a 44,1 KHz deixa apenas 11,3 microssegundos para o DSP, isso é inaceitavelmente lento … No entanto, combinando uma pequena tabela de pesquisa (400 bytes) e um procedimento de interpolação baseado nas diferenças divididas de Netwon, podemos obter uma precisão de quase 17 bits em 0,2 microssegundos. Anexei um documento pdf com todas as matemáticas para os realmente interessados. É complicado, você foi avisado!
Etapa 9: A interface Wifi
Agora você tem um receptor Bluetooth capaz de rodar DSP em tempo real. Infelizmente, se você quiser alterar qualquer um dos parâmetros do DSP, precisará desconectar-se do HiFi, fazer upload de um novo esboço e reconectar. Isso é desajeitado. Para corrigir isso, desenvolvi um servidor web que você pode usar para editar todos os parâmetros do DSP sem se reconectar ao computador. O esboço para usar o servidor da web está abaixo.
#incluir
#include btAudio audio = btAudio ("ESP_Speaker"); webDSP web; void setup () {Serial.begin (115200); audio.begin (); int bck = 26; int ws = 27; int dout = 25; audio. I2S (bck, dout, ws); // substitua pelo seu WiFi ID e senha const char * ssid = "SSID"; const char * password = "SENHA"; web.begin (ssid, senha e áudio); } void loop () {web._server.handleClient (); }
O código atribui um endereço IP ao ESP32, que você pode usar para acessar a página da web. A primeira vez que você executar este código, deverá tê-lo conectado ao computador. Dessa forma, você pode ver o endereço IP atribuído ao ESP32 no monitor serial. Se você deseja acessar esta página da web, basta inserir este endereço IP em qualquer navegador da web (testado no Chrome).
Agora devemos estar familiarizados com o método de ativação do Bluetooth e I2S. A principal diferença é o uso de um objeto webDSP. Este objeto leva seu SSID Wifi e senha como argumentos, bem como um ponteiro para o objeto btAudio. No loop principal, obtemos continuamente o objeto webDSP para ouvir os dados de entrada da página da web e, em seguida, atualizar os parâmetros DSP. Como ponto de fechamento, deve-se notar que tanto o Bluetooth quanto o Wifi usam o mesmo rádio no ESP32. Isso significa que você pode ter que esperar até 10 segundos desde o momento em que insere os parâmetros na página da Web até o momento em que as informações realmente chegam ao ESP32.
Etapa 10: Planos Futuros
Esperançosamente, você gostou deste instrutível e agora tem Bluetooth Audio e DSP adicionado ao seu HiFi. No entanto, acho que há muito espaço para crescimento neste projeto e só queria apontar algumas direções futuras que posso tomar.
- Ative o streaming de áudio por Wifi (para a melhor qualidade de áudio)
- Use um microfone I2S para habilitar comandos de voz
- desenvolver um equalizador controlado por WiFi
- Deixe-o bonito (a placa de ensaio não é sinônimo de ótimo design de produto)
Quando começar a implementar essas idéias, farei mais instrutíveis. Ou talvez outra pessoa consiga implementar esses recursos. Essa é a alegria de tornar tudo de código aberto!
Recomendado:
Estrutura de LED controlada por MIDI: 7 etapas
Estrutura de LED controlada por MIDI: Como um verdadeiro amante da música e um estudante de eletrônica e ciência da computação, sempre quis construir dispositivos MIDI, que pudesse usar para criação de música eletrônica. Depois de assistir a muitos shows e festivais de música, comecei para ficar realmente interessado
Lâmpada Led Interativa - Estrutura de tensegridade + Arduino: 5 etapas (com imagens)
Lâmpada Led Interativa | Estrutura de tensegridade + Arduino: esta peça é uma lâmpada com resposta a movimentos. Concebida como uma escultura de tensão mínima, a lâmpada muda sua configuração de cores em resposta à orientação e aos movimentos de toda a estrutura. Em outras palavras, dependendo de sua orientação, o
Uma introdução ao processamento de imagens: Pixy e suas alternativas: 6 etapas
Uma introdução ao processamento de imagens: Pixy e suas alternativas: Neste artigo, explicaremos o significado do processamento digital de imagens (DIP) e as razões para usar hardware como Pixy e outras ferramentas para fazer um processo em fotos ou vídeos. No final deste artigo, você aprenderá: Como uma imagem digital se forma
Investigação do efeito da estrutura ressonante com favo de mel de papel: 6 etapas
Investigação do efeito da estrutura ressonante com o favo de mel de papel: Achei que aqueles que gostam de se envolver em tópicos de energia alternativa gostariam de tentar isso. É baseado na descoberta de Viktor Grebennkov. A história pode ser encontrada em muitos lugares, mas esta na keelynet foi a que eu encontrei http://www.keelynet.com/gr
Criação de uma lâmpada de sinal para Arduino: 3 etapas
Criação de uma lâmpada de sinal para Arduino: Este tutorial pretende explicar como a lâmpada de sinal brilha em cores diferentes, o que também sugere informações díspares. Não é complicado, mas interessante. Todos os materiais que você pode obter facilmente em www.ICStation.com.Acessórios: 1. Placa Arduino Air x