Usando un micrófono con Arduino

En este artículo probaremos un módulo de micrófono, para conectar a Arduino. Especifícamente usaremos los pines ADC para representar los valores medidos.

Materiales Usados

La siguiente es la lista de los materiales usados

  • Arduino Uno
  • Cable USB
  • Cables de protoboard macho hembra
  • Módulo Micrófono (usamos este módulo)
  • PC con Arduino IDE 1.0.5

Tras el salto te contamos los detalles y los ejemplos

Introducción

Las ondas de sonido son pequeños cambios en la presión del aire. Un micrófono es el transductor encargado de convertir esa onda en una señal eléctrica medible, análoga a el sonido que se quiere medir. Sin embargo, la señal obtenida del micrófono debemos amplificarla, para eso usualmente esta función se implementa mediante un amplificador operacional, en nuestro caso utilizaremos un módulo de micrófono que ya incluye dicho amplificador.

El siguiente es el diagrama del módulo de micrófono que usamos

 

YwRobot (Sound Sensor) 声音传感器.png

En este módulo se obtiene una señal que es representación de la señal de audio medida por el micrófono pero, como indicamos arriba con niveles de voltaje apropiados para ser capturados por un Arduino.

La salida típica del módulo de micrófono es como se muestra en la figura,

grafica de una salida desde el módulo de micrófono con una señal de 800 Hz
Gráfica de una salida desde el módulo de micrófono con una señal de prueba de 800Hz

En este caso usamos un generador de señales disponible para android 

Conectando el Hardware

Para conectar usamos los cables para protoboard podemos modificar la ganancia del micrófono a través de una resistencia variable.

  • Cable rojo a Vcc, 5V en Arduino
  • Cable negro a GND, GND en Arduino
  • Cable amarillo a OUT, A0 en Arduino

Esto se aprecia en la siguiente figura,

Conectando el módulo de micrófono. Se aprecian los cables y la resistencia ajustable
Conectando el módulo de micrófono. Se aprecian los cables y la resistencia ajustable

Luego conectamos el cable USB para alimentar el Arduino y cargar los sketches.

 

Probando Software

Como estamos leyendo una señal de audio, se requiere algunos cálculos adicionales para desplegar los valores y obtener valores representativos. Mostraremos dos ejemplos de sketch.

 

El siguiente sketch lo usamos  para desplegar los valores por consola, estos valores se despliegan como multiples *. Obtenido del libro  Hacking Electronics

// VU METER

int soundPin = A0;

void setup()
{ 
Serial.begin(9600); 
} 

void loop()
{ 
 int value = analogRead(soundPin);
 int topLED = 1 + abs(value) / 10;
 for (int i =0; i < topLED; i++)
 {
  Serial.print("*");
 }
 Serial.println();
 Serial.println(value); // print value for checking purposes
 delay(100);
} 

Una vez cargado este sketch se debe abrir la consola, para ver el resultado de las medidas.

El siguiente ejemplo, esta vez tomado del libro Arduino Cookbook  implementa una forma de medida llamada  “running Average”, o promedio móvil. Además se usa el led que viene incluido en el Arduino para que se ilumine cada vez que se supera el umbral de sonido.

const int ledPin = 13;            //the code will flash the LED in pin 13
const int middleValue = 0;      //the middle of the range of analog values
const int numberOfSamples = 128;  //how many readings will be taken each time
int sample;                       //the value read from microphone each time
long signal;                      //the reading once you have removed DC offset
long averageReading;              //the average of that loop of readings
long runningAverage=0;          //the running average of calculated values
const int averagedOver= 16;     //how quickly new values affect running average bigger numbers mean slower
const int threshold=400;        //at what level the light turns on

void setup() {
  pinMode(ledPin, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  long sumOfSquares = 0;
  for (int i=0; i<numberOfSamples; i++) { //take many readings and average them     sample = analogRead(0);               //take a reading     signal = (sample - middleValue);      //work out its offset from the center     signal *= signal;                     //square it to make all values positive     sumOfSquares += signal;               //add to the total   }   averageReading = sumOfSquares/numberOfSamples;     //calculate running average   runningAverage=(((averagedOver-1)*runningAverage)+averageReading)/averagedOver;   if (runningAverage>threshold){         //is average more than the threshold ?
    digitalWrite(ledPin, HIGH);          //if it is turn on the LED
  }else{
    digitalWrite(ledPin, LOW);           //if it isn't turn the LED off
     }
  Serial.println(runningAverage);        //print the value so you can check it
}

El objetivo de usar un promedio móvil es que funciona como un filtro pasa-bajos, eliminando los valores que cambian muy rápido.

Hemos visto dos ejemplos de programas para representar los valores obtenidos desde un micrófono. EL primer ejemplo muesta los valores por consola como un gráfico. El segundo ejemplo es algo más complejo pero usa una técnica de promedio para eliminar las fuertes variaciones que tiene un sonido capturado.

Las aplicaciones con otros actuadores, como motores por ejemplo, las veremos en otro post.

 

Bibliografía

Arduino CookBook
Hacking Electronics

Author: manuel

Ingeniero Eléctrico, Institutano, instructor certificado Cisco, en twitter @mcarrasco con comentarios y opiniones personales.

9 thoughts

  1. ¿Como podría hacer que el led de arduino se encienda si se sopla por un instrumento de viento una nota concreta? Llevo varias semanas buscando y todo lo que encuentro es muy difícil para mi. Gracias.

    1. Hola Manuel, para hacer lo que requieres necesitas analizar la frecuencia de entrada, una puerta analoga del Arduino te servira para eso, busca en Google “arduino frequency detection”

      Saludos

    1. Hola Iván,

      Londres e requiere entonces es usar la función de sd para arduino que esta disponible como shield o como un elemento externo así puedes grabar sobre la tarjeta SD. Aunque no tengo los detalles lo mas probable es que sea el archivo “raw”.

      Saludos
      Manuel Carrasco

  2. Buenos días 🙂
    Necesito hacer un “sensor de ruido” para ubicarlo en un aula de clases y que este encienda un led cuando el ruido sea demasiado alto. Logré que funcionara, pero no tiene la sensibilidad que requiero. Estoy utilizando el modulo KY-037. Mi pregunta es si hay alguna manera de mejorar la sensibilidad del microfono que trae el modulo (electret) ?, he leído que un amplificador operacional serviría, pero no tengo los suficientes conocimientos para lograr aplicarlo 🙁

    ¡Gracias!

    1. Hola Valentina, el modulo KY-037 deberia ser suficiente para lo que requieres, has probado ajustando el potenciomentro variable que tiene? Si necesitas un amplificador puedes usar este otro modulo que viene con ganancia ajustable “Adafruit Electret Microphone Amplifier Module MAX4466”.
      Saludos

  3. Hola. Buen día.
    Excelente aporte.
    Sería posible enviar el sonido captado por el micrófono y oírlo en un arduino distante ??
    Con que módulos sería posible?
    Muchas gracias.

    1. Hola, es posible enviar el sonido en un arduino distante, lo deseas hacer usando cables o inalambrico? en todo caso la pregunta es, para que deseas hacer eso? hay microfonos inalambricos que hacen el trabajo mejor. Ahora si deseas hacerlo, necesitaras dos Arduinos, un modulo de microfono para Arduino, un modulo de audio y usar los puertos seriales de cada Arduino uno para enviar la señal de un Arduino al otro y decodificarla para generar sonido en el modulo de audio. No es muy simple.
      Saludos

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *