medir-sonido-con-arduino-y-microfono-amplificado-max9812

Medir sonido con Arduino y micrófono amplificado MAX9812

¿Qué es un MAX9812?

El MAX9812 es un amplificador de sonido especialmente diseñado para tratar la señal proveniente de micrófonos. Podemos emplearlo junto con Arduino para medir sonido desde un procesador como Arduino.

Cuando vimos los módulos con micrófono comentamos que, en general, la señal generada es demasiado baja para ser registrada correctamente. Si queremos poder medir sonidos, deberemos amplificar la señal.

El MAX9812 dispone de entradas single/dual, ganancia fija de 20dB, ancho de banda de 500 kHz, bajo ruido y baja distorsión de señal 0.015% THD. Existen dos modelos, el MAX9812L tiene una tensión de alimentación de 2.7V a 3.6V, y el MAX9812H tensión de alimentación de 45V a 5.5V.

Podemos emplear los sensores con MAX9812 para aplicaciones que requieran medir la intensidad o frecuencia del sonido. Por ejemplo, podemos variar la iluminación de una tira LED en función del sonido, o mostrar un ecualizador en una pantalla TFT.

Precio

Los sensores con MAX9812 son sensores muy baratos. Podemos encontrar módulos como el FC-109, que incorporan el micrófono y amplificador MAX9812 en una placa fácil de conectar a Arduino por 0.85€, buscando en vendedores internacionales de eBay o AliExpress.

arduino-microfono-amplificador-max9812-componete

También existe una versión mejorada, el MAX9814, que dispone de una ganancia variable a 40, 50 o 60DB, aunque el precio es muy superior, unos 2.45€.

Esquema de montaje

El esquema eléctrico es sencillo. Alimentamos el módulo conectando GND y 5V a los pines correspondientes de Arduino. Por otro lado, conectamos la salida analógica del sensor a una entrada analógica de Arduino.

arduino-microfono-amplificador-max9812-esquema

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

arduino-microfono-amplificador-max9812-conexion

Ejemplos de código

Cuando manejemos sonidos lo primero que debemos entender es que la señal que obtenemos varia rápidamente y además tiene mucho ruido. De esta forma, el valor puntual de una medición no suele tener importancia, y deberemos realizar la integración en un determinado periodo. Para ello lo habitual es trabajar con ventanas temporales, es decir, un intervalo en el que realizamos la medición.

Para ello, definimos una ventana temporal de 50 ms, equivalente a una frecuencia de 20 Hz, y calculamos el máximo y mínimo registrado dentro de la ventana. A continuación mostramos el valor registrado por puerto serie.

const int sensorPIN = A0;
const int sampleWindow = 50; // Ancho ventana en mS (50 mS = 20Hz)

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

void loop() 
{
   unsigned long startMillis= millis();

   unsigned int signalMax = 0;
   unsigned int signalMin = 1024;
 
   // Recopilar durante la ventana
   unsigned int sample;
   while (millis() - startMillis < sampleWindow)
   {
      sample = analogRead(sensorPIN);
      if (sample < 1024)
      {
         if (sample > signalMax)
         {
            signalMax = sample;  // Actualizar máximo
         }
         else if (sample < signalMin)
         {
            signalMin = sample;  // Actualizar mínimo
         }
      }
   }
   unsigned int peakToPeak = signalMax - signalMin;  // Amplitud del sonido
   double volts = (peakToPeak * 5.0) / 1024;  // Convertir a tensión
   Serial.println(volts);
}

Descarga el código

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