18 votos

Uso de un micrófono con un Arduino

EDITAR : Llevo tiempo investigando este problema. Resulta ser un proyecto mucho más difícil de lo que pensaba y no es algo para principiantes. Esto requiere hardware caro (micrófono y amplificador) y algunos sofisticados audio analyizig en el microcontrolador. Incluso un micrófono completo con un circuito amplificador no proporciona los resultados deseados. (según los comentarios sobre este producto)


Soy totalmente nuevo en el Arduino (pero estoy familiarizado con la programación). Con el fin de construir un Vúmetro Quiero poner un micrófono en el pin analógico 0 del Arduino y mostrar el valor a través de la conexión serie.

Busqué en Google y encontré este circuito:

Simple Audio Pre-Amplifier

... e intenté construirlo con este resultado:

(Ahora estoy utilizando el circuito sugerido por Oli Glaser en su respuesta)

Los valores del monitor de serie no cambian en función del volumen de la música.

¿Cuál es la forma más sencilla de medir el volumen en la entrada analógica del Arduino?

Además, tengo un TDA2822M pero no sé si es útil para este proyecto. La leyenda del micrófono dice XF-18D .

Edita: Mi código de arduino:

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

void loop() {
  Serial.println(analogRead(0));
  delay(300);
}

La salida en serie: 1023 1022 1022 1022 1022 1023 1022 etc.

¿Cómo puedo comprobar si el micrófono funciona? ¿Es direccional?

Edita: Ahora estoy usando un transistor S9014. El ADC y la conexión serie funcionan (los he probado con un potenciómetro).

La salida en serie es ahora de unos 57.

Además, no tengo multímetro o osciloscopio. Ahora tengo un multímetro.

14voto

SandeepJ Puntos 1339

La forma "más fácil" es simplemente aplicar la señal y muestrear con el ADC. Almacene los resultados en un búfer y, a continuación, visualícelos como desee (en su caso, envíelos al PC a través de RS232).
Si quieres el nivel RMS de la señal, tendrás que calcularlo en algún momento, ya sea antes de enviarla al PC o después.

El circuito amplificador tal como se muestra no es ideal, pero debería funcionar razonablemente para un vúmetro básico. EDIT - Acabo de notar C2, eliminar esto, ya que bloqueará el sesgo de CC desde el transistor, y la señal oscilará por debajo del suelo.

EDIT - aquí hay un circuito mejor para el transistor amplificador:

Electret amp

No debería importar demasiado el transistor utilizado, la polarización de salida debería estar en torno a los 2,5V.
Los valores exactos para el divisor de entrada (R3 y R4) no son demasiado importantes, lo es más la proporción de 1:4. Así que puedes usar, por ejemplo, 400k y 100k, o 40k y 10k, etc (intenta no pasar por encima o por debajo de estos valores respectivos). C2 debe ser >10uF. C1 debe ser >1uF (sustituye a C1 en tu esquema)
Sin embargo, R1 y R2 deben tener estos valores.
Todo lo que necesitas es el electret con su resistencia de polarización (R1 en su esquema)

Un punto de preocupación es el Arduino 3.3V y 5V líneas parecen estar atados juntos - Estoy asumiendo que esto es un error esquemático, pero si este es el caso en el circuito real no va a funcionar, y puede dañar algo.
Para identificar el problema, sería útil ver tu código y lo que ves en el PC. ¿También qué transistor usted está utilizando?

Si tienes un osciloscopio, puedes comprobar si tu micro/transistor funcionan correctamente. Si no, entonces se puede utilizar un multímetro para realizar algunas pruebas más básicas (por ejemplo, confirmar la presencia de +5V, confirmar que la base del transistor está a ~ 0,6V, probar el colector para asegurarse de que no está conectado a +5V o tierra sin señal presente).

También es necesario asegurarse de que el RS232 está funcionando correctamente, por lo que escribir algún código simple para enviar algunos valores de prueba sería una buena idea.

Si puede facilitarnos la información solicitada y hacernos saber de qué herramientas dispone, podremos ofrecerle una ayuda más específica.

EDITAR - si está muestreando tan lentamente, entonces necesitará un circuito de detección de picos como este:

Peak Detect

Pondrías este circuito entre el transistor y el pin del Arduino (menos C2)

El diodo puede ser cualquiera. Los valores de la caperuza y la resistencia son orientativos, se pueden cambiar un poco. Sus valores dictan cuánto tardará el voltaje en cambiar con el nivel de la señal. Puedes calcularlo utilizando la constante RC (es decir, R * C - en el ejemplo anterior, la constante RC es 1e-6 * 10e3 = 10ms. El voltaje tardará alrededor de 2,3 veces la constante en caer un 90% de su valor original, por lo que en el ejemplo anterior, si el voltaje comienza en 1V y quitas la señal, habrá caído a 0,1V alrededor de 23ms más tarde.

EDITAR - Vale, creo que he encontrado un problema importante. Tu S9012 transistor es un Transistor PNP (como el S9015), necesita un transistor NPN para este circuito. El S9014 es un transistor NPN, así que tendrás que usar éste.

Los condensadores marcados con "104" son casi con toda seguridad condensadores cerámicos de 0,1uF. El valor (en pF) son los 2 primeros números seguidos de un número de ceros fijados por el último número. Así, para 104, el valor es 10 + 4 ceros, o 100.000pF. 100.000pF son 100nF o 0,1uF.

EDIT - No tener un osciloscopio o multímetro hace la vida muy difícil aquí (usted debe hacerse con uno o ambos tan pronto como sea posible)
Sin embargo, existen algunos osciloscopios básicos para tarjetas de sonido de PC que podrían utilizarse para probar su circuito de electretos/transistores. Analizador visual es un buen ejemplo:

Visual Analyser

Si sustituyes C2 (no es estrictamente necesario pero es una buena idea), deberías poder introducir la señal en el PC directamente y observar en el software si el micrófono y la amplificación funcionan correctamente. Si tu PC tiene entrada de línea utilízala, pero la entrada de micrófono suele ser buena para hasta 2V IIRC. También puedes probar el electret directamente - simplemente quita el transistor y mantén R1 y C1, toma la señal desde el otro lado de C1.
Tenga en cuenta que este método no probar los niveles de CC, sólo la CA (debido a una tapa de bloqueo de CC en la entrada souncard), pero la señal de CA (audio) es lo que te interesa aquí.

Si pruebas esto, publica las capturas de pantalla para que podamos hacernos una idea de lo que ocurre.

4voto

Xster Puntos 147

Suponiendo que tu circuito funcione la señal de audio está en el rango de kHz mientras que el Arduino tiene un ADC adecuado para niveles DC. El componente de CC de tu señal es cero, es decir, flota sobre una tensión fija. Es ese voltaje fijo el que tu ADC está leyendo.

Para solucionarlo pondrías un diodo en serie con tu salida conectando al ADC y a un condensador y resistencia.

El tapón se cargará hasta el valor de pico que se recibe, mientras que la resistencia descargará el tapón cuando la señal se apague.

--|>|---*---- adc
        *---- resistor -----*----ground
        \----- capacitor ---/

Editar: La entrada ADC es en realidad flotante, ya que no tiene sesgo alguno debido al condensador en serie. Si vas a probar mi solución eliminar C2.

4voto

Andrew Walker Puntos 9038

Tus lecturas de 1022, 1023 son básicamente la escala completa en el ADC del Arduino. Asumiendo que instalaste un condensador en serie no defectuoso como se muestra en tu diagrama, este nivel no puede provenir del circuito de micrófono que construiste, ya que eso sólo puede acoplar voltajes cambiantes (es decir, CA).

Como resultado, sospecho que estás leyendo corriente de fuga dentro del propio ATMEGA - probablemente obtendrías el mismo resultado en cualquiera de los otros pines analógicos (no conectados).

Intenta hacer un divisor de tensión muy "ligero" con algunas resistencias de alto valor (entre 10K y 100K) y úsalo para polarizar la entrada analógica a la mitad de la tensión de referencia (también podrías usar un potenciómetro, lo que te da alguna capacidad de prueba extra). Entonces tu lectura sin entrada debería estar en torno a 512.

Una vez que tengas la entrada del ADC convenientemente polarizada, puedes empezar a trabajar probando a ver si consigues variación a través de ella. Puede que estés submuestreando un poco tu ancho de banda, lo que significa que obtendrás aliasing de los componentes de alta frecuencia, pero si todo lo que estás tratando de hacer es estimar el volumen global eso no debería ser demasiado problema.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X