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

Medir sonido con Arduino y micrófono amplificado MAX9812

  • 4 min

¿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í,

5V
Vcc
3V3
GND
Gnd
Vin
RST
AREF
A0
OUT
A1
A2
A3
A4
A5
ARDUINO
Power
Analog Input
Digital Input / Output
D13
D12
D11
D10
D9
D8
D7
D6
D5
D4
D3
D2
D1
D0
## 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