Construí el siguiente circuito basado en un diseño de circuito probado basado en MSGEQ7 , que proviene de la hoja de datos y en otras partes de Internet. He construido y codificado este circuito previamente, con una fuente de alimentación de 5V, no hay problema.
La entrada de audio es una placa de conexión de micrófono electret sparkfun con un circuito de amplificación integrado basado en un amplificador operacional. Esto también lo he usado con éxito en un proyecto anterior conectado al MSGEQ7. Funcionó bien allí, pero en ese momento usé un pin Arduino 3.3v para alimentar esto (aquí tanto el MIC BoB como el MSGEQ7 están en rieles de 3.3V).
La única diferencia entre este circuito y el último que construí (que puedo decir de todos modos) es el hecho de que ahora estoy ejecutando MSGEQ7 y BOB en un riel de 3.3V .
El circuito "algo" funciona, pero las lecturas analógicas no parecen calibradas correctamente.
Aquí hay una muestra de la salida que estoy obteniendo:
RAW EQ 392 406 630 803 842 973 886
RAW EQ 341 818 936 1022 1022 1022 1021
RAW EQ 590 812 950 860 1023 1023 1021
RAW EQ 550 894 1022 1022 1023 1022 1020
RAW EQ 561 926 953 1023 1023 1022 1006
RAW EQ 565 805 918 966 1022 1023 1013
RAW EQ 525 835 1013 999 1023 1023 1022
RAW EQ 611 862 884 1015 1022 1023 1012
RAW EQ 541 794 802 849 1023 1023 1012
RAW EQ 449 759 993 928 1023 1022 1002
RAW EQ 400 858 1006 1013 1023 1022 1015
RAW EQ 460 876 934 1023 1022 1023 1013
RAW EQ 617 845 869 976 1023 1022 1022
RAW EQ 729 814 981 1023 1023 1022 1015
Como puede ver, ¡las últimas 3/4 bandas están prácticamente al máximo!
Aquí está el código Arduino relevante:
rutina inicial
//initialise MSGEQ7 chip
void initMSGEQ7(int analog, int strobe, int reset)
{
#if defined DEBUG
Serial.println("MSGEQ init");
Serial.print("Analog Pin");
Serial.println(analog);
Serial.print("Strobbe Pin");
Serial.println(strobe);
Serial.print("Reset Pin");
Serial.println(reset);
#endif
//set up MSGEQ7 pins
pinMode(analog, INPUT);
pinMode(strobe, OUTPUT);
pinMode(reset, OUTPUT);
analogReference(DEFAULT);
//turn off comms to MSGEQ7 to start with
digitalWrite(reset, LOW);
digitalWrite(strobe, HIGH);
//prep the MSGEQ7 to read in the frequency bands
digitalWrite(reset, HIGH);
digitalWrite(reset, LOW);
}
Código de lectura
//read the EQ
void readEQ(int strobe, int analog, int (&bands)[7])
{
#if defined DEBUG
Serial.print("RAW EQ\t\t");
#endif
//read in the bands
for (int i = 0; i < 7; i++)
{
digitalWrite(strobe, LOW);
bands[i] = analogRead(analog);
delay(5);
#if defined DEBUG
Serial.print(bands[i]);
Serial.print("\t");
#endif
digitalWrite(strobe, HIGH);
}
#if defined DEBUG
Serial.println();
#endif
}
La pregunta: ¿Cómo hago para que esto me dé lecturas en una mejor distribución de 0 a 1023 a través de las entradas analógicas de Arduino?
He reconstruido el circuito varias veces, usando componentes completamente nuevos (pasivos, IC, cable y BoB), los resultados son los mismos.
También tengo un riel de 3.7V no regulado (de una batería LIPO) que podría usar: el suministro regulado de 3.3V proviene de una edición Arduino Pro Mini 8MHz 3.3V que admite la fuente de alimentación LIPO de 3.7V no regulada.
Observaciones de los datos:
Esto indica que la señal generada por el micrófono electret preamplificado es muy alta en las bandas de frecuencia representadas por las salidas 4, 5 y 6. Esto se puede verificar utilizando un diodo de avalancha con polarización inversa o un diodo zener (V zener > 7 voltios ) como fuente de ruido blanco reemplazando el micrófono electret en el preamplificador del BoB y verificando la salida usando un osciloscopio en modo de análisis de espectro.
Esto no es sorprendente en absoluto, ya que los micrófonos electret no son muy lineales y el preamplificador en la placa de salida no tiene ninguna ecualización incorporada, según el esquema de SparkFun. Por lo tanto, se espera que el resultado neto sea un perfil de salida bastante no lineal.
La respuesta de frecuencia de MSGEQ7 , por otro lado, es bastante lineal en todas las bandas:
Si el problema consiste simplemente en conseguir que los niveles de señal para todas las bandas estén dentro del rango utilizable, un simple divisor de tensión de resistencia para atenuar la señal entrante a quizás un 50 o un 75 % debería ser la solución, en todas las bandas. El 50 % dejará mucho margen para capturar picos de señal en cualquier banda, como ocurre invariablemente con el audio normal.
simular este circuito : esquema creado con CircuitLab
Si también es necesario ecualizar la señal de manera que las bandas de rango medio y tweeter se atenúen mientras que las bandas de woofer relativamente débiles no se vean afectadas, entonces se puede usar un circuito como un filtro de supresión de banda , con un Q muy bajo , y el frecuencia de polo entre las frecuencias de la banda 5 (~ 2200 Hz) y la banda 6 (~ 6000 Hz). En efecto, esto será más un filtro de "atenuación de banda", para las bandas problemáticas, con algún efecto también en las bandas más bajas y más altas:
( fuente )
Dicho filtro no es trivial y tal vez merezca una pregunta por separado si es necesario.
Transeúnte
Puntilla
Esteban Miller
Roberto Atkins