EchoVision: Ouvindo o Mundo com Microfones MEMS Estéreo

Seja bem-vindo de volta ao ecossistema Zion!

No último tutorial, fizemos a sua EchoVision “falar” com alta fidelidade. Mas comunicação é uma via de mão dupla, certo? Se ela já fala, agora ela precisa ouvir.

Hoje vamos ativar os “ouvidos” da sua placa: os dois microfones MSM261DGT003 integrados. Não estamos falando de microfones comuns de eletreto, mas sim de tecnologia MEMS com interface PDM (Pulse Density Modulation). Isso significa áudio digital direto na fonte, imune a ruídos elétricos e com sensibilidade incrível.

Vamos configurar o ESP32-S3 para capturar esse áudio e plotar a forma de onda em tempo real na sua tela. Bora?


O que você vai precisar:

  • Placa Zion EchoVision (ESP32-S3)
  • Cabo USB-C de dados
  • Arduino IDE configurada
  • Silêncio (ou sua playlist favorita para testar!)

Passo 1: Entendendo o Hardware (O Pulo do Gato)

Aqui está o segredo que diferencia a EchoVision. A maioria dos tutoriais de I2S na internet usa o padrão “Standard I2S” (que precisa de 3 fios: BCLK, WS, SD).

Os nossos microfones usam o modo PDM (Pulse Density Modulation). Neste modo, a mágica acontece com menos pinos e uma lógica diferente:

  • Clock (WS/CLK): GPIO 39
  • Data (SD): GPIO 38

Nota Técnica: “Ué, cadê o BCLK?” No modo PDM do ESP32-S3, não precisamos conectar um pino de Bit Clock externo. O clock do PDM é derivado da linha WS. Economizamos pinos e ganhamos performance!


Passo 2: O Código (Sketch)

Vamos direto ao código. Este exemplo configura o driver I2S nativo do ESP32 para ler os dados digitais e jogar na Serial. Simples, direto e eficiente.

Copie e cole na sua IDE:

#include <driver/i2s.h>

// --- Configuração dos Pinos da EchoVision ---
#define I2S_WS 39  // Clock (Word Select / CLK do PDM)
#define I2S_SD 38  // Dados (Serial Data)
#define I2S_PORT I2S_NUM_0

void setup() {
  // Inicializa a Serial com alta velocidade para plotagem fluida
  Serial.begin(115200);
  
  // 1. Configuração do Driver I2S
  i2s_config_t i2s_config = {
    .mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_RX | I2S_MODE_PDM), // ATENÇÃO: Modo PDM!
    .sample_rate = 44100, // Qualidade de CD
    .bits_per_sample = I2S_BITS_PER_SAMPLE_16BIT,
    .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT, // Estéreo
    .communication_format = I2S_COMM_FORMAT_STAND_I2S,
    .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1,
    .dma_buf_count = 8,
    .dma_buf_len = 64,
    .use_apll = false
  };

  // 2. Configuração dos Pinos
  i2s_pin_config_t pin_config = {
    .bck_io_num = I2S_PIN_NO_CHANGE, // No modo PDM, o BCLK não é usado fisicamente
    .ws_io_num = I2S_WS,             // Nosso Clock (GPIO 39)
    .data_out_num = I2S_PIN_NO_CHANGE,
    .data_in_num = I2S_SD            // Nossos Dados (GPIO 38)
  };

  // 3. Instala e inicia o driver
  i2s_driver_install(I2S_PORT, &i2s_config, 0, NULL);
  i2s_set_pin(I2S_PORT, &pin_config);
  
  Serial.println("Microfones EchoVision Iniciados...");
}

void loop() {
  int16_t sample[64]; // Buffer temporário
  size_t bytes_read;
  
  // Lê os dados do microfone via DMA
  i2s_read(I2S_PORT, &sample, sizeof(sample), &bytes_read, portMAX_DELAY);
  
  // Se leu algo, imprime o primeiro sample do buffer
  if (bytes_read > 0) {
    // Imprime o valor bruto para o Plotter
    Serial.println(sample[0]); 
  }
}

Passo 3: Visualizando a “Voz” (Plotter)

Se você abrir apenas o Monitor Serial, verá uma chuva de números estilo Matrix. Funciona, mas não é emocionante.

Dica de Mestre: Na Arduino IDE, vá em Ferramentas > Serial Plotter (ou pressione Ctrl+Shift+L).

Agora, assobie, bata palmas ou fale perto da placa. Você verá a onda sonora sendo desenhada em tempo real no gráfico! Isso é o sinal bruto que sua EchoVision está captando.


Desafio Zion

Agora que você tem o áudio entrando (Microfone) e saindo (Amplificador do post anterior), o céu é o limite. Que tal tentar:

  1. Criar um VU Meter usando os LEDs endereçáveis da placa que reage à batida da música?
  2. Implementar um sistema de Switch de Palma (bateu palma, acendeu o LED)?

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *