detectar-sonido-con-arduino-y-microfono-ky-038

Detectar sonido con Arduino y micrófono KY-038

¿Qué es un micrófono?

Un micrófono es un transductor que convierte las ondas sonoras en señales eléctricas. Podemos conectar un micrófono a un procesador como Arduino para detectar sonidos.

La salida producida por un micrófono es una señal eléctrica analógica que representa el sonido recibido. Sin embargo, en general, esta señal demasiado baja para ser medida y tiene que ser amplificada.

arduino-microfono-ky-038-funcionamiento

Existen placas como la KY-038 que incorporan un micrófono junto con un comparador LM393, que permite obtener la lectura tanto como un valor analógico como de forma digital.

El uso habitual de este tipo de sensores no amplificados es emplear la salida digital para detectar el sonido cuando este supera un cierto umbral, regulado a través de un potenciómetro ubicado en la placa.

La salida analógica permite obtener una estimación del volumen registrado. Sin embargo, como hemos comentado, este tipo de módulos con micrófono no resultan adecuados para medir el sonido de forma analógica ya que carecen de amplificación.

Si solo queremos detectar el sonido, y no medirlo, este tipo de sensores son más apropiados ya que únicamente requieren la lectura de una señal digital, sin necesitar realizar más cálculos.

Este tipo de sensores pueden ser útiles, por ejemplo, para encender un dispositivo cuando se detecte sonido, encender una lámpara con una palmada, o incluso orientar un robot o una torre con servos mediante sonido.

Si queremos medir el sonido es mejor que emplear un módulo amplificado, como los módulos con amplificador MAX9812.

Precio

Este tipo de sensores son muy baratos. Podemos encontrar módulos con micrófono como la KY-038 por unos 0.80€, buscando en vendedores internacionales de eBay o AliExpress.

Según el modelo el micrófono puede estar instalado apuntando hacia el frente o hacia arriba, pero la electrónica es la misma. Elegiremos uno o otro según resulta más conveniente para nuestro proyecto.

arduino-microfono-ky-038-componete

El precio de este tipo de sensores es muy reducido, pero debemos tener en cuenta que por un precio similar podemos encontrar sensores amplificados como el MAX9812.

Escoger entre uno u otro, como hemos comentado, depende de únicamente queremos detectar sonido o si queremos medirlo, en cuyo caso optaríamos por módulo amplificado. Ante la duda, los módulos amplificados son más versátiles e interesantes.

Esquema de montaje

El esquema eléctrico es sencillo. Alimentamos el módulo conectando GND y 5V a los pines correspondientes de Arduino.

Ahora si queremos usar la lectura digital, conectamos la salida DO a una de las entradas digitales de Arduino.

arduino-microfono-montaje

Deberemos calibrar el umbral de disparo de la salida digital con el potenciómetro instalado en el módulo para el nivel de sonido deseado.

Mientras que la conexión vista desde Arduino quedaría así,

arduino-microfono-montaje-esquema

Si quisiéramos emplear el valor analógico, simplemente conectaríamos la salida AO del sensor a una entrada analógica de Arduino. Aunque, como hemos dicho, en este caso sería mejor optar por un modelo amplificado.

Ejemplos de código

En el primer ejemplo de código, empleamos la señal digital del sensor para encender el LED integrado en Arduino si se detecta sonido, y apagarlo en caso contrario.

const int pinLED = 13;
const int pinMicrophone = 9;

void setup ()
{
  pinMode (pinLED, OUTPUT);
  pinMode (pinMicrophone, INPUT);
}
 
void loop ()
{
  bool soundDetected = digitalRead(pinMicrophone);
  if (soundDetected)
  {
    digitalWrite (pinLED, HIGH);
    delay(1000);
  }
  else
  {
    digitalWrite (pinLED, LOW);
    delay(10);
  }
}

En el siguiente ejemplo almacenamos un estado (ON/OFF) y hacemos que varíe cada vez que se detecte un sonido. En el ejemplo empleamos el estado para encender o apagar el LED integrado, pero en un caso real realizaríamos las acciones oportunas como activar un relé.

const int pinLED = 13; 
const int pinMicrophone = 9;
bool state;

void setup()
{
  pinMode(pinLED, OUTPUT);
  pinMode(pinMicrophone, INPUT_PULLUP);
}

void loop()
{
  bool soundDetected = digitalRead(pinMicrophone); 
  if (soundDetected == true)
  {
    state = ! state;    
    digitalWrite(pinLED , state);
    delay (1000);
  }
  delay(10);
}

Descarga el código

Todo el código de esta entrada está disponible para su descarga en Github. github-full