Avançar para o conteúdo

Sensor de som com ESP32

Vamos estudar o MAX4466, um sensor de som com ESP32 e código em Arduino. Vamos implementar o exemplo de um detector de sons agudos e rápidos, como palmas por exemplo.

O sensor de som com MAX4466 (datasheet aqui) é composto por um microfone de eletreto e o chip MAX4466 em sí. É um módulo pequeno que se “comunica” via sinais analógicos. Isso significa que qualquer microcontrolador com uma entrada analógica pode lê-lo.

Sua faixa de alimentação é de 2,5V até 5,5V, o que significa que ele pode operar tanto em 3,3V como em 5V. No caso do nosso experimento eu vou trabalhar com 3,3V, visto que vou usar um ESP32. Falando em ESP32, utilizarei o modelo Xiao ESP32-C6 da SeeedStudio.

Eu fiz uma placa de circuito impresso para este microcontrolador, veja aqui. Ele trabalha alimentado pela própria porta USB, conectado ao computador. No caso deste experimento nós não vamos usar Wi-Fi nem Bluetooth, mas ele é capaz destes dois protocolos.

O MAX4466 é apenas um amplificador, ele não é detector nem processador de voz. Então o experimento que faremos hoje aqui é somente detectar “aumento” ou “diminuição” da intensidade sonora. Portanto sem discriminar o tipo ou a origem do som.

MAX4466 sensor de som

Este pequeno módulo de detecção de som pode ser obtido no Aliexpress, através deste meu link (com desconto).

Hardware

Como é de costume aqui no blog, os experimentos são simples e as ligações eletrônicas e elétricas também são simples. No caso do nosso detector de som, conectaremos a placa do MAX4466 ao ESP32 através de uma entrada analógica (A1). Conectaremos também um LED vermelhor ao pino D8 do ESP32.

Eu resolvi usar uma protoboard de 400 pinos, pequena. Isto porque a placa que fiz para meu ESP32-C6 disponibiliza todos os seus pinos em uma única linha. Assim eu economizo espaço de protoboard enquanto tenho todos os pinos do ESP32 disponíveis.

O diagrama esquemático está abaixo, completo e inclusive com uma imagem da montagem.

Diagrama esquemático MAX4466 com ESP32
Diagrama esquemático MAX4466 com ESP32
Montagem do MAX4466 em protoboard
Montagem do MAX4466 em protoboard

Lembrando que você pode utilizar qualquer microcontrolador que tenha entradas analógicas para este experimento. Eu estou usando o ESP32-C6 porque tenho um disponível aqui na bancada. Nada especial. Inclusive a maioria das pessoas tem o Arduino UNO disponível, ele é perfeito para nosso experimento.

Firmware/código

Fiz um código bem simples para este experimento, baseado naquele encontrado neste link. A ideia é detectar os picos de pressão sonora, em intervalos de 50ms (cinquenta milisegundos). Para isto o código usa uma laço while() que fica verificando se já se passaram 50ms.

Enquanto este tempo não passa, fica-se obtendo valores analógicos do microfone. Os valores são então tratados para achar sempre o maior e o menor valores. O código está abaixo, completo e pronto para uso. Também pode ser obtido neste Github.

const int sampleWindow = 50;  // Sample window width in mS (50 mS = 20Hz)
int const AMP_PIN = A1;       // Preamp output pin connected to A0
unsigned int sample;

void setup()
{
  Serial.begin(115200);
  pinMode(D8, OUTPUT);
  analogReadResolution(12);
}

void loop()
{
  unsigned long startMillis = millis(); // Start of sample window
  unsigned int peakToPeak = 0;   // peak-to-peak level

  unsigned int signalMax = 0;
  unsigned int signalMin = 3300;

  while (millis() - startMillis < sampleWindow)
  {
    sample = analogRead(AMP_PIN);

    if (sample > signalMax){
      signalMax = sample;
      
    }
    if (sample < signalMin){
      signalMin = sample;
      
    } 
  }

  peakToPeak = signalMax - signalMin;
  if(peakToPeak > 2000){
    digitalWrite(D8, HIGH);
  }else{
    digitalWrite(D8, LOW);
  }
  Serial.println(peakToPeak);

  //double volts = (peakToPeak * 5.0) / 1024;  // convert to volts
  //Serial.println(volts);
}

Veja que após a passagem de 50ms o valor de pico do sinal é calculado. Caso ele for maior que 2000 (2V) o LED D8 é ligado. Se ele ficar menor que 2000 (2V) o LED D8 é desligado. O código fica constantemente neste loop: lê valor analógico, acha máximo e mínimo. Então calcula valor pico a pico e liga/desliga o LED de acordo.

A cada fim de ciclo de 50ms o valor obtido (pico a pico) é impresso no monitor serial da IDE do Arduino. Pode-se observar este valor de forma gráfica abrindo-se a função “serial plotter”.

Sensor de som

Copie o código acima cole no seu software IDE do Arduino. Eu uso a versão 2.3.8, porém qualquer versão acima de 1.8.x já é suficiente. Este código não exige nenhuma biblioteca especial a ser instalada. Tudo que é necessário já vem com o suporte ao ESP32 adicionado à IDE.

Então conecte seu ESP32 ao computador via cabo USB e clique em “upload” no canto superior esquerdo da IDE do Arduino. Então faça sons agudos, como por exemplo bater palmas ou assoviar. Observe o LED no pino D8 acendendo e apagando.

Eu fiz um vídeo sobre o funcionamento deste sensor de som, veja mais acima no início do texto. Se você tiver dúvidas comente logo abaixo ou então nos comentário do Youtube, Instagram ou TikTok do Fritzenlab_br. Lembrando que você pode comprar este módulo através deste link. Aproveite!.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *