¿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.
Si únicamente queremos detectar el sonido, y no medir su volumen o frecuencia, podemos emplear un módulo de micrófono con comparador como el KY-038, que proporciona una salida digital cuando el sonido supera un cierto umbral.
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.
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.
Mientras que la conexión vista desde Arduino quedaría así,
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.