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
3 Comentários
Muito bom.
ResponderExcluirÉ 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??
ResponderExcluireu usei essa biblioteca e meu ESP32 EXPLODIU NO MEU BRAÇO
ResponderExcluir