Ritmo musical con max9814

 Buenas!

En este proyecto haremos uso del módulo max9814 un micrófono amplificador para mostrar el ritmo del sonido a través de una salida de leds que se iluminarán de forma progresiva cada vez que el sonido detectado supere un determinado umbral de voltaje.

Sonido

El sonido es una onda de presión que se produce cuando un objeto vibra, este onda de presión genera un movimiento cinético vibratorio en las partículas cercanas que a su vez mueven las partículas anexas transmitiendo el sonido a través del medio (acuoso, gaseoso o sólido, en el espacio no se transmite el sonido)  que  que viene determinada por las características que suelen tener las ondas períodicas, como son el período (en segundos) y la frecuencia (la inversa del período, o ciclos por segundo). 
Fuente: https://es.wikipedia.org/wiki/Longitud_de_onda
La energía de las ondas sonoras  cuando viajan provocan  patrones de compresión, es decir al pasar la onda energiza las moléculas que se mueven de su posición original y esto provoca que las moléculas se encuentren densamente empaquetadas, y rarefacción, cuando la onda ha pasado las moléculas dejan de vibrar y se separan (menos densidad), a la espera de que llegue una nueva onda sonora. Diferentes sonidos provocan diferentes patrones de alta y baja densidad.
 
Cuanto más frecuentes son las vibraciones (más ciclos por segundo) el oído humano percibe el sonido como más agudo, cuando las vibraciones son menos frecuentes, la percepción en nuestro oído es la de un sonido más grave.

Para discretizar (digitalizar) el sonido (que es analógico) se suelen tomar muestras en un período de tiempo , de tal manera que si elegimos 50 milisegundos, tendremos una Frecuencia de 1/0,05 Hz, o lo que es lo mismo 20 Herztios. 

Max9814

Un micrófono es un dispositivo de entrada que se usa para transformar las ondas sonoras en energía eléctrica y viceversa. Max9814 es un micrófono con amplificador y control de ganancia.. Permite detectar el sonido del ambiente y también dispone de pines para poder escuchar el sonido que detecta por ejemplo a través de unos auriculares, para lo cual se puede conectar un jack hembra a la salida de los pines. 

Detalle del módulo
Normalmente se puede adquirir en vendedores internacionales en el formato que se muestra en la imagen. En el modelo que hemos adquirido, es necesario realizar el soldado de los pines sobre las salidas, con nuestro soldador antes de poder integrarlo en nuestro proyecto.


Diagrama de conexión

El diagrama de conexión para este proyecto parece sencillo. GND del módulo a GND Arduino, VCC a VCC Arduino, al igual que GAIN (con lo cual obtenemos una sensibilida de 40 db), mientras que OUT lo conectamos a la salida analógica A0. El led (blanco) lo conectamos como entrada digital al D2 y ponemos una resistencia para limitar la cantidad de voltaje que puede soportar este led (3 Voltios)

Diagrama de conexión de max9814 con un led blanco
Al ejecutar el código que se muestra en el siguiente apartado, podemos lanzar el monitor serie o el serial plotter, para ver la salida de los valores recogidos por el micrófono, cuando hacemos ruido cerca del mismo.

Código

La señal de audio de la salida de un amplificador es un voltaje variable y oscila. 

 

Para obtener el nivel de sonido es preciso tomar varias muestras para obtener las extensiones mínima y máxima de la señal o la amplitud pico entre los valores máximo y mínimo de la señal.

En el código de referencia obtenido del enlace que modificamos levemente para añadir el comportamiento de encendido y apagado de los leds, se elige una muestra de 50 milisegundos, lo cual es suficiente para medir niveles de sonido de hasta 20 herztios el límite más bajo que alcanza el oído humano. 


Fuente: https://www.pasco.com/products/guides/sound-waves


Utilizamos el código de referencia del enlace que se deja en el siguiente apartado. Se calcula la frecuencia cada cierto intervalo y se convierte a voltaje. Si el voltaje supera determinado umbral se enciende el led o los leds si tenemos más de uno.

/****************************************
Example Sound Level Sketch for the
Adafruit Microphone Amplifier
****************************************/
#define LED1 2
#define LED2 3
#define LED3 4
#define UMBRALED1 1.0
#define UMBRALED2 1.1
#define UMBRALED3 1.2


const int sampleWindow = 50; // Sample window width in mS (50 mS = 20Hz)
unsigned int sample;

void setup()
{
   Serial.begin(9600);
   pinMode(LED1, OUTPUT);
   pinMode(LED2, OUTPUT);
   pinMode(LED3, OUTPUT);
}


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 = 1024;

   // collect data for 50 mS
   while (millis() - startMillis < sampleWindow)
   {
      sample = analogRead(0);
      if (sample < 1024)  // toss out spurious readings
      {
         if (sample > signalMax)
         {
            signalMax = sample;  // save just the max levels
         }
         else if (sample < signalMin)
         {
            signalMin = sample;  // save just the min levels
         }
      }
   }
   peakToPeak = signalMax - signalMin;  // max - min = peak-peak amplitude
   double volts = (peakToPeak * 5.0) / 1024;  // convert to volts
 
   Serial.println(volts);
   if(volts > UMBRALED1 && volts < UMBRALED2){
   digitalWrite(LED1,HIGH);
    
   }
   if(volts > UMBRALED2 && volts < UMBRALED3){
   digitalWrite(LED1,HIGH);
   
   digitalWrite(LED2,HIGH);
   }

   if(volts > UMBRALED3){
    digitalWrite(LED1,HIGH);
   
   digitalWrite(LED2,HIGH);
 
   digitalWrite(LED3,HIGH);
   
   }
   
   
 

   if(volts < UMBRALED3)
   {
     digitalWrite(LED3,LOW);
   }

   if(volts < UMBRALED2)
   {
     digitalWrite(LED2,LOW);
     digitalWrite(LED3,LOW);
    
   }
    if(volts < UMBRALED1){
   digitalWrite(LED1,LOW);
   digitalWrite(LED2,LOW);
   digitalWrite(LED3,LOW);
   }
   
}

 Ahora podemos comprobar el comportamiento de nuestro proyecto cuando iniciamos una fuente de sonido o música, los leds se irán iluminando al ritmo de la misma, puedes ver un ejemplo en el canal de youtube.
 
También podemos automatizar alguna acción si el micrófono supera determinado umbral (apagar luces, etc) o algo más complejo como realizar un reconocimiento de voz.

Y esto es todo, espero que haya sido de tu interés

Referencias

  • https://learn.adafruit.com/adafruit-microphone-amplifier-breakout/measuring-sound-levels
  • http://cursoarduinomega.blogspot.com/2015/07/electret-microphone-amplifier-max9814.html
  • https://electropeak.com/learn/interfacing-max9814-electret-microphone-amplifier-module-with-arduino/
  • https://www.pasco.com/products/guides/sound-waves
  • https://es.wikipedia.org/wiki/Longitud_de_onda
  • https://es.wikipedia.org/wiki/Rarefacci%C3%B3n