Skip to Content

Detetar som com MAX4466 e Arduino

Detetar som com MAX4466 e Arduino

Neste tutorial, vais aprender a detetar som com um microfone MAX4466 e um Arduino ou ESP32. Vamos usar o MAX4466 para medir o volume, ligar um LED se estiver muito alto e controlar um dispositivo, como uma lâmpada, com palmas.

Vamos começar com as peças necessárias.

Peças Necessárias

Vais precisar de um Arduino, ESP32, ESP8266 ou microcontrolador semelhante e do Módulo de Microfone MAX4466. Para construir os exemplos de aplicação, também vais precisar de um módulo de relé, alguns fios, resistores e LEDs.

Arduino

Arduino Uno

Microfone MAX4466

Relay Module

Módulo de Relé

Dupont wire set

Conjunto de Fios Dupont

Half_breadboard56a

Breadboard

USB Data Sync cable Arduino

Cabo USB para Arduino UNO

Kit de Resistores & LED

Makerguides is a participant in affiliate advertising programs designed to provide a means for sites to earn advertising fees by linking to Amazon, AliExpress, Elecrow, and other sites. As an Affiliate we may earn from qualifying purchases.

Características do Módulo de Microfone MAX4466

O módulo de microfone MAX4466 é uma placa breakout com um microfone eletreto de 20-20KHz e o MAX4466 circuito integrado pré-amplificador. Na parte de trás da placa há um pequeno trimmer que permite ajustar o ganho de 25x a 125x. A imagem abaixo mostra a frente e o verso da placa:

Frente e Verso do Módulo de Microfone MAX4466

O módulo funciona com 2.4…5.5V com uma corrente de alimentação em repouso muito baixa, inferior a 24μA. Para um bom desempenho, usa a fonte de alimentação mais “silenciosa” disponível. Esta seria o pino de 3.3V de um Arduino ou ESP32.

Note que a tensão máxima de saída no pino OUT varia de 0 V a VCC. Se ligares a saída ao Conversor Analógico-Digital (ADC) do teu microcontrolador, certifica-te de que ele suporta a tensão máxima de saída! A saída terá um viés de VCC/2. Portanto, quando estiver completamente silencioso, a tensão de saída será VCC/2 V.

Para mais detalhes técnicos, consulta o Datasheet do MAX4466 que está ligado abaixo:

Ligação do MAX4466 ao Arduino/ESP32

Ligar o módulo MAX4466 a um Arduino UNO é fácil. Basta ligar GND a GND, VCC a 3.3V e o pino de saída OUT do MAX4466 à entrada analógica A0, como mostrado abaixo:

Connect MAX4466 to Arduino
Ligar MAX4466 ao Arduino

Também podes ligar o pino VCC do módulo MAX4466 a 5V para obteres melhor resolução na entrada analógica A0, mas a entrada ficará um pouco mais ruidosa.

Se usares um ESP32, deves alimentar o módulo MAX4466 com 3.3V, pois a saída máxima do módulo depende do VCC e com 5V a tensão na entrada analógica seria demasiado alta!

Exemplos de Código

Nas secções seguintes encontrarás três exemplos de código sobre como usar o MAX4466.

Código: Mostrar Medições do MAX4466

Neste primeiro exemplo mostramos as leituras do MAX4466 no Monitor Serial ou Plotter:

const byte micPin = A0;

void setup() {
  Serial.begin(115200);
  pinMode(micPin, INPUT);
}

void loop() {
  int value = analogRead(micPin);
  Serial.println(value);
  delay(100);  
}

O código é muito simples. Primeiro definimos o pino onde o microfone MAX4466 está ligado (micPin = A0).

Na função setup inicializamos a comunicação serial e declaramos o micPin como entrada. Na função loop lemos o sinal do microfone do micPin e imprimimos o valor medido no monitor serial.

O gráfico seguinte mostra a saída no Serial Plotter ao bater palmas três vezes. É possível ver claramente os três picos no sinal no gráfico:

Values measured by MAX4466 on Serial Plotter
Valores medidos pelo MAX4466 no Serial Plotter

Usei um ESP32 para este gráfico, que tem melhor resolução na entrada analógica. Se usares um Arduino UNO, verás valores entre 0 e 1024 no eixo y.

Note que o sinal em silêncio total está cerca de metade do máximo da entrada analógica. No caso do ESP32, onde a resolução da entrada analógica é 0…4095, o valor ronda os 2000. No Arduino UNO, o valor em silêncio será cerca de 500.

Se olhares novamente para o gráfico, vais notar que os picos podem ser positivos e negativos. Isto acontece porque o microfone MAX4466 mede essencialmente a variação da pressão do ar causada por um som. Dependendo do momento em que a medição é feita durante a onda sonora, pode ser pressão baixa ou alta.

Isto significa que, para medir o volume de um som, não podemos apenas usar o valor máximo, mas devemos calcular a diferença em relação à linha base (silêncio). E é isso que vamos fazer no próximo exemplo para controlar um LED.

Código: Ligar LED se estiver muito alto

Neste exemplo vamos ligar um LED se o microfone detetar um som alto. Abaixo está a ligação. É igual à anterior, com a adição de um LED ligado ao pino 11. Nota que precisas de um resistor de 220 Ω para o LED para limitar a corrente.

Connect MAX4466 and LED to Arduino
Ligar MAX4466 e LED ao Arduino

O código seguinte lê o sinal do microfone, calcula um valor de volume e, se o volume for maior que um determinado limiar, liga o LED durante um segundo:

const byte micPin = A0;
const byte ledPin = 11;
const int threshold = 100;

void setup() {
  pinMode(micPin, INPUT);
  pinMode(ledPin, OUTPUT);
}

void loop() {
  static int last = 0;

  int value = analogRead(micPin);
  int loudness = abs(last-value);

  if (last && loudness > threshold) {
    digitalWrite(ledPin, HIGH);
    delay(1000);
    digitalWrite(ledPin, LOW);
  }
  last = value;
  delay(1);  
}

O código começa por definir os pinos do microfone e do LED, e o limiar de volume. Na função setup declaramos o pino do microfone como entrada e o do LED como saída.

Na função setup declaramos uma variável estática last que guarda o valor last (anterior) que o microfone registou. Calculando a diferença absoluta abs entre o last e o valor atual value, obtemos uma medida do volume:

int loudness = abs(last-value);

Se tivermos um valor last e o loudness for maior que o threshold, ligamos o LED durante um segundo e depois desligamos:

  if (last && loudness > threshold) {
    digitalWrite(ledPin, HIGH);
    delay(1000);
    digitalWrite(ledPin, LOW);
  }

Podes ajustar o quão alto o som precisa de ser para ativar o LED alterando o limiar. Um limiar mais baixo torna a deteção mais sensível. De igual forma, podes alterar o tempo que o LED fica ligado.

Este circuito é adequado como um sistema simples de luz ou alarme sem toque que ativa uma lâmpada quando um som é detetado.

Código: Controlar Relé/Luz com Palmas

Neste exemplo ligamos um relé quando uma primeira palma é detetada e desligamos quando uma segunda palma é detetada. Abaixo está a ligação para este exemplo. Basicamente substitui o LED do exemplo anterior por um relé.

Connect MAX4466 and Relay to Arduino
Ligar MAX4466 e Relé ao Arduino

O pino DC+ (VCC) do relé está ligado a 5V e o pino DC- (GND) está ligado a GND. O pino de entrada IN está ligado ao pino 11 do Arduino.

O relé pode ser usado para ligar dispositivos de alta tensão e corrente, como uma lâmpada, conforme mostrado no circuito. Tem muito cuidado ao trabalhar com tensões de 110 ou 220 volts! Também certifica-te de que o teu relé tem a classificação adequada para os dispositivos que queres controlar.

Se quiseres aprender mais sobre relés, dá uma vista de olhos ao nosso How To Use A Relay With Arduino ou ao tutorial Interfacing a Relay Module With ESP32. O tutorial sobre How To Control a Fan using Arduino também pode ser útil.

Abaixo está o código para este exemplo. Como antes, mede o volume, mas também guarda o estado state do relé (HIGH ou LOW). Se o loudnes ultrapassar o threshold, o state do relé é alterado. Isto significa que bater palmas duas vezes, por exemplo, liga o relé na primeira e desliga na segunda. Não há tempo fixo ligado, como no exemplo anterior.

const byte micPin = A0;
const byte relayPin = 11;
const int threshold = 100;

void setup() {
  pinMode(micPin, INPUT);
  pinMode(relayPin, OUTPUT);
}

void loop() {
  static uint8_t state = LOW;
  static int last = 0;

  int value = analogRead(micPin);
  int loudness = abs(last-value);

  if (last && loudness > threshold) {
    state = state == HIGH ? LOW : HIGH;
    digitalWrite(relayPin, state);
    value = 0;
    delay(100);
  }

  last = value;
  delay(1);
}

De resto, o código é praticamente igual ao exemplo anterior. A única diferença é o tratamento do evento quando o volume ultrapassa o limiar. Neste caso, o estado do relé é invertido e o novo estado é escrito na saída digital:

  if (last && loudness > threshold) {
    state = state == HIGH ? LOW : HIGH;
    digitalWrite(relayPin, state);
    value = 0;
    delay(100);
  }

Como antes, podes alterar o nível de som necessário para ativar o relé ajustando o parâmetro threshold.

Conclusões

Este artigo apresentou o módulo de microfone MAX4466 para detetar som com um Arduino, ESP32 ou microcontroladores semelhantes.

Usámos o MAX4466 para medir o volume do som, ligar um LED por um período fixo se o som ultrapassar um certo limiar, e controlar um relé com palmas. Se tiveres alguma dúvida, deixa nos comentários.

Boas experiências ; )