Recents in Beach


Receba o meu conteúdo GRATUITAMENTE


MP3 Player com ESP32 e I2S



Inter-Integrated Circuit Sound, ou seja, o I2S. É sobre esse protocolo que vamos falar hoje. Vou, portanto, te apresentar um exemplo de utilização do protocolo I2S, usando o ESP32 e o módulo decodificador estéreo I2S, CJMCU-1334, baseado no integrado UDA1334A.
Conectamos, então, o ESP32 e o módulo decodificador estéreo I2S. O primeiro vai enviar áudio de alta qualidade ao segundo, que recebe o som em protocolo I2S e o transforma em analógico.






RECURSOS USADOS

  • ESP32 Wroom 32.
  • Módulo de cartão SD.
  • Cartão SD (formatado FAT).
  • Módulo decodificador CJMCU-1334.
  • Fios.





I2S

O I2S ou IIS, é um protocolo de transferência de dados (originalmente dados de áudio), criado pela Philips Semicondutores, com o objetivo de atender e servir como padrão para o emergente mercado de áudio digital no inicio dos anos 80.
O Bus de dados I2S bus tem o objetivo de interligar circuitos integrados, daí o nome: Inter Integrated Circuit Sound Bus.

É formado por três linhas de sinais: um clock para sincronização, um sinal que indica se o canal é direito ou esquerdo e uma linha para os dados multiplexados.
Não confundir com o I2C, também da Philips Semicondutores, pois são distintos, embora muito próximos.




BUS I2S

O sinal SCK é utilizado para a sincronização entre o transmissor e o receptor dos dados. Existe uma forma atual de I2S onde esse sinal é suprimido e a sincronização é realizada através da detecção do clock pelo receptor usando um circuito PLL.
A linha WS indica se os dados referem-se ao canal direito (quando em nível alto) ou esquerdo (quando em nível baixo).
A linha SD (Dados Seriais) contem os dados em si. Comumente uma série da amostras obtidas por um conversor analógico digital de certa profundidade. Estes dados são normalmente transmitidos usando uma Modulação por Código de Pulso (PCM), em algum dos seus vários formatos. (Não compactados como WAV e AIFF, ou compactados como MP3 e outros).



Mais alguns detalhes do barramento I2S, segundo a definição da Philips Semicondutores.






TOPOLOGIAS SUGERIDAS PARA O I2S

Ainda segundo a definição da Philips Semicondutores, as seguintes topologias poderiam ser utilizadas usando o I2S. O circuito que controla o sinal de clock e/ou sinal de canal, é considerado o mestre na topologia.






I2S NO ESP32

No diagrama de blocos do SoC Esp32 podemos notar a presença do periférico I2S... Neste caso, trata-se de dois periféricos I2S (I2S0 e I2S1), disponíveis.


As duas interfaces I2S padrão disponíveis, podem operar em modo Mestre ou Escravo, em full-duplex ou Half-duplex.
As resoluções podem ser de 8, 16,32,48 e 64 bits, como canais de entrada ou saída.
 O sinal de clock (BCK) vai de 10kHz a 40MHz.




UDA1334A

UDA1334 DAC de áudio de baixa potência com PLL

O módulo CJMCU-1334 é baseado no chip UDA1334, um DAC de áudio de dois canais. Por possuir um PLL, pode operar em sistemas onde o sinal de clock do I2S não está disponível.
Suporta I2S Bus com comprimento de palavra de até 24 bits MSB e LSB com comprimentos 16,20 e 24 bits.
A frequência de amostragem de 44,1kHz é suportada somente no modo MONO.



Sugestão de Aplicação

O datasheet do fabricante sugere o seguinte circuito para uma aplicação de áudio.






CIRCUITO






CÓDIGO-FONTE

Código-fonte: Biblioteca

Para esse exemplo, vamos utilizar a biblioteca ESP32-audioI2S que pode ser encontrada no link abaixo.

O código será uma variação do exemplo apresentado na mesma biblioteca.
Para esse exemplo, vamos utilizar a biblioteca ESP32-audioI2S que pode ser encontrada no link abaixo.




Código-fonte:

Declarações

//Bibliotecas utilizadas
#include "Arduino.h"
#include "WiFiMulti.h"
#include "Audio.h"
#include "SPI.h"
#include "SD.h"
#include "FS.h"

//Pinos de conexão do ESP32 e o módulo de cartão SD
#define SD_CS          5
#define SPI_MOSI      23
#define SPI_MISO      19
#define SPI_SCK       18

//Pinos de conexão do ESP32-I2S e o módulo I2S/DAC CJMCU 1334
#define I2S_DOUT      25
#define I2S_BCLK      27
#define I2S_LRC       26

//Cria o objeto que representará o áudio
Audio audio;

//Cria o objeto que representará o Wi-Fi
WiFiMulti wifiMulti;

// Definições da Rede Wi-Fi
String ssid =     "Seu_SSID";
String password = "Sua_Senha";


Setup()

void setup()
{
  //Inicia o Serial para debug
  Serial.begin(115200);

  //Configura e inicia o SPI para conexão com o cartão SD
  pinMode(SD_CS, OUTPUT);
  digitalWrite(SD_CS, HIGH);
  SPI.begin(SPI_SCK, SPI_MISO, SPI_MOSI);
  SPI.setFrequency(1000000);
  SD.begin(SD_CS);

  //Configura e inicia o Wi-Fi
  WiFi.mode(WIFI_STA);
  wifiMulti.addAP(ssid.c_str(), password.c_str());
  wifiMulti.run();
  if (WiFi.status() != WL_CONNECTED)
  {
    WiFi.disconnect(true);
    wifiMulti.run();
  }

  //Ajusta os pinos de conexão I2S
  audio.setPinout(I2S_BCLK, I2S_LRC, I2S_DOUT);

  //Ajusta o volume de saída
  audio.setVolume(20); // 0...21

  //Para executar um arquivo MP3 no cartão SD, descomente esta linha
  //audio.connecttoSD("nome_do_arquivo.mp3");

  //Para executar uma síntese de voz, descomente esta linha
  audio.connecttospeech("Este é um exemplo de síntese de voz usando esp 32, o protocolo i2s e um módulo d.a.c.", "pt");

  //Para executar um streaming, descomente esta linha
  //audio.connecttohost("http://mp3.ffh.de/radioffh/hqlivestream.mp3"); //  128k mp3
}


Loop()

void loop()
{
  audio.loop(); //Executa o loop interno da biblioteca audio
}


Funções opcionais

// As seguintes funções são opcionais e retornam informações sobre a execução
void audio_info(const char *info)
{
  Serial.print("info        "); Serial.println(info);
}

void audio_id3data(const char *info)
{ //id3 metadata
  Serial.print("id3data     "); Serial.println(info);
}

void audio_eof_mp3(const char *info)
{ //end of file
  Serial.print("eof_mp3     "); Serial.println(info);
}

void audio_showstation(const char *info)
{
  Serial.print("station     "); Serial.println(info);
}

void audio_showstreaminfo(const char *info)
{
  Serial.print("streaminfo  "); Serial.println(info);
}

void audio_showstreamtitle(const char *info)
{
  Serial.print("streamtitle "); Serial.println(info);
}

void audio_bitrate(const char *info)
{
  Serial.print("bitrate     "); Serial.println(info);
}

void audio_commercial(const char *info)
{ //duração
  Serial.print("commercial  "); Serial.println(info);
}

void audio_icyurl(const char *info)
{ //homepage
  Serial.print("icyurl      "); Serial.println(info);
}

void audio_lasthost(const char *info)
{ //stream URL played
  Serial.print("lasthost    "); Serial.println(info);
}

void audio_eof_speech(const char *info)
{
  Serial.print("eof_speech  "); Serial.println(info);
}



CAPTURA

Alguns dados fornecidos pelas funções opcionais:



Uma amostra das linhas I2S







FAÇA O DOWNLOAD DOS ARQUIVOS:





Postar um comentário

2 Comentários

  1. É possivel comunicar o ESP32 com um fone Bluetooth? E fazer o caminho inverso? Tenho uma saida de P2 estério e gostaria de mandar para um fone blue ... Sempre para o mesmo fone mas não sei como comunicar pois não sabemos qual o fone está "visualizando" ... no computador (que seria o master dessa conexão) você "visualiza" o fone e manda comunicar ... NO fone com o ESP já fica mais difícil ... Existe a possibilidade??

    ResponderExcluir