Usando un micrófono con un Arduino


18

EDITAR : He estado investigando este problema durante bastante tiempo. Resulta ser un proyecto mucho más difícil de lo que pensaba y no es algo para principiantes. Esto requiere hardware costoso (micrófono y amplificador) y un sofisticado análisis de audio en el microcontrolador. Incluso un micrófono completo con circuito amplificador no proporciona los resultados deseados (de acuerdo con los comentarios sobre este producto)


Soy completamente nuevo en Arduino (pero estoy familiarizado con la programación). Para construir un medidor de VU , quiero poner un micrófono al pin analógico 0 del Arduino y mostrar el valor a través de la conexión en serie.

Busqué en Google y encontré este circuito:

Preamplificador de audio simple

... e intenté construirlo con este resultado:

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

Los valores en el monitor en serie no cambian según el volumen de la música.

¿Cuál es la forma más fácil 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. El subtítulo en el micrófono lee XF-18D .

Editar: Mi código 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 y así sucesivamente

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

Editar: ahora estoy usando un transistor S9014. El ADC y la conexión en serie funcionan (los probé con un potenciómetro).

La salida en serie ahora es de alrededor de 57.

Además, no tengo un multímetro u osciloscopio. Tengo un multímetro ahora.


¿Ha verificado con un alcance que puede ver una forma de onda de audio en la salida de su circuito?
HikeOnPast

Whoa, ¿por qué el pin 3V3 y 5V está corto en el esquema? Eso podría ser un problema.
Connor Wolf

No, simplemente no dibujé el esquema correctamente.
Brindis

Respuestas:


14

La forma "más fácil" es simplemente aplicar la señal y la muestra con el ADC. Almacene los resultados en un búfer y luego visualícelos como desee (en su caso, envíelos a la PC a través de RS232)
Si desea el nivel RMS de la señal, deberá calcular esto en algún momento, antes de enviarlo a la PC o después.

Su circuito amplificador como se muestra no es ideal, pero debería funcionar razonablemente para un medidor de VU básico. EDITAR - Acabo de notar C2, elimine esto ya que bloqueará la polarización de CC del transistor, y la señal oscilará bajo tierra.

EDITAR: aquí hay un mejor circuito para el transistor amplificador:

Amplificador Electret

Esto no debería preocuparse demasiado por el transistor utilizado, el sesgo de salida debe ser de alrededor de 2.5V.
Los valores exactos para el divisor de entrada (R3 y R4) no son demasiado importantes, es la relación de 1: 4 lo que es más. Por lo tanto, puede usar, por ejemplo, 400k y 100k, o 40k y 10k, etc. (trate de no ir por encima o por debajo de estos valores respectivos). C2 debe ser> 10uF. C1 debería ser> 1uF (reemplaza a C1 en su esquema)
. Sin embargo, R1 y R2 deben ser estos valores.
Todo lo que necesitas es el electret con su resistencia de polarización (R1 en tu esquema)

Un punto de preocupación es que las líneas Arduino 3.3V y 5V parecen estar unidas entre sí; supongo que este es un error esquemático, pero si este es el caso en el circuito real, no funcionará y puede dañar algo.
Para identificar los problemas, sería útil ver su código y lo que está viendo en el lado de la PC. ¿También qué transistor estás usando?

Si tiene un osciloscopio, puede verificar si su micrófono / transistor funciona correctamente. De lo contrario, se puede usar un multímetro para realizar algunas pruebas más básicas (por ejemplo, confirmar que haya más de 5 V presente, confirmar que la base del transistor esté a ~ 0.6 V, probar el colector para asegurarse de que no esté fijado a + 5 V o tierra sin señal presente)

También debe asegurarse de que el RS232 funciona correctamente, por lo que sería una buena idea escribir un código simple para enviar algunos valores de prueba.

Si puede proporcionar la información solicitada y hacernos saber qué herramientas tiene disponibles, se puede proporcionar ayuda más específica.

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

Detección de pico

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

El diodo puede ser casi cualquier diodo. Los valores de tapa y resistencia son solo una guía, se pueden cambiar un poco. Sus valores dictan cuánto tiempo tomará cambiar el voltaje con el nivel de señal. Puede calcular esto usando la constante RC (es decir, R * C - en el ejemplo anterior, la constante RC es 1e-6 * 10e3 = 10ms. El voltaje tomará alrededor de 2.3 constantes de tiempo para caer en un 90% de su valor original, entonces en el ejemplo anterior, si el voltaje comienza a 1V y elimina la señal, habrá caído a 0.1V alrededor de 23ms más tarde.

EDITAR - bien, creo que encontré un problema importante. Su transistor S9012 es un transistor PNP (como lo es el S9015), necesita un transistor NPN para este circuito. El S9014 es un transistor NPN, por lo que tendrá que usar este.

Los condensadores marcados "104" son casi seguramente condensadores cerámicos de 0.1uF. El valor (en pF) son los primeros 2 números seguidos de un número de ceros establecidos por el último número. Entonces, para 104, el valor es 10 + 4 ceros, o 100,000pF. 100,000pF es 100nF o 0.1uF.

EDITAR: no tener un telescopio o un multímetro hace que la vida sea muy difícil aquí (debe obtener uno o ambos tan pronto como sea posible)
Sin embargo, hay algunos osciloscopios de tarjeta de sonido de PC básicos que podrían usarse para probar su circuito de electret / transistor. Visual Analyzer es un buen ejemplo:

Analizador visual

Si reemplaza C2 (no es estrictamente necesario pero es una buena idea), debería poder enviar la señal directamente a la PC y observar en el software para ver si el micrófono y la amplificación funcionan correctamente. Si su PC tiene una línea en uso, pero la entrada del micrófono generalmente es buena para hasta 2V IIRC. También puede probar el electret directamente: simplemente retire el bit del transistor y mantenga R1 y C1, tome la señal del otro lado de C1.
Tenga en cuenta que este método no probará los niveles de CC, solo la CA (debido a un límite de bloqueo de CC en la entrada de la tarjeta de sonido), pero la señal de CA (audio) es lo que le interesa aquí.

Si intenta esto, publique las capturas de pantalla para que podamos tener una idea de lo que está sucediendo.


3.3V y 5V no están unidos. Es la primera vez que uso este software, lo siento. Pondré mi código en la pregunta, pero no hay nada que pueda salir mal. Además, hice un proyecto hoy que usa una fotorresistencia y muestra el valor en seis leds como si quisiera que mi medidor vu se viera y probé la conexión en serie con eso. No tengo osciloscopio ni multímetro. El transistor tiene el subtítulo "S9012 H 331" También tengo "S9014 C 331" y S9015.
Brindis

@Toast: vea la edición sobre C2, elimínela y conéctese directamente.
Oli Glaser

Quité C2 y agregué las partes como Kristoffon lo describió en su respuesta. Sigue siendo el mismo resultado.
Brindis

1
Si tiene un potenciómetro o una fuente de voltaje variable, puede aplicar una entrada de 0-5 V a la entrada del ADC para probar su código, independientemente de su circuito de entrada. Está intentando depurar dos cosas a la vez: aislar el circuito y verificar su comportamiento utilizando un osciloscopio y / o aislar su código y proporcionar una entrada predecible pero variable para validar su código.
HikeOnPast

1
@OliGlaser Estoy confundido por el circuito. El "electret" es un micrófono? ¿A dónde va el otro cable del micrófono, GND o VCC? ¿Conecto 5 o 3.3V a ese circuito? ¿Podría por favor, de alguna manera, eliminar los EDITbloques y editarlo para que se pueda entender sin leer el hilo de comentarios? También soy un principiante y no entiendo cómo se resolvió el problema y si puedo usar el circuito que publicaste tal cual.
Tomáš Zato - Restablece a Monica el

4

Suponiendo que su circuito funciona, la señal de audio está en el rango de kHz, mientras que el Arduino tiene un ADC adecuado para niveles de CC. El componente de CC en su señal es cero, lo que significa que flota sobre un voltaje fijo. Es ese voltaje fijo que está leyendo su ADC.

Para solucionarlo, colocaría un diodo en serie con su salida conectada al ADC y a un condensador y una resistencia.

La tapa se cargará hasta el valor máximo que se recibe, mientras que la resistencia descargará la tapa cuando la señal se apague.

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

Editar: La entrada ADC está flotando, ya que no tiene ningún sesgo debido al condensador en serie. Si vas a probar mi solución, elimina C2.


Bien, agregué esto al circuito y la señal en el monitor en serie ahora es 458 (pero todavía no cambia cuando hay ruido).
Brindis

Cambié el transistor de "S9012 H 331" a "S9014 C 331" y el valor es 56.
Brindis el

1
El Arduino ADC es capaz de muestrear lo suficientemente rápido para el audio. No los uso, pero creo que 10ksps (hasta 5kHz de ancho de banda) es posible con las funciones de la biblioteca, lo cual está bien para cosas de baja fidelidad (estoy bastante seguro de que ATMega puede muestrear más rápido si se usa normalmente)
Oli Glaser

@Toast: ¿qué tan rápido estás probando? Si es muy lento, entonces el detector de picos es una buena idea. Sin embargo, puedes hacer esto en software.
Oli Glaser

2
@ Kristoffon: no con un Arduino no, pero he usado micros similares de 8 bits (por ejemplo, PIC16F, 18F, etc.) para muestrear y reproducir audio muchas veces. 10ksps es fácilmente factible. Para citar este documento AVR ADC :When using single-ended mode, the ADC bandwidth is limited by the ADC clock speed. Since one conversion takes 13 ADC clock cycles, a maximum ADC clock of 1 MHz means approximately 77k samples per second. This limits the bandwidth in single-ended mode to 38.5 kHz, according to the Nyquist sampling theorem.
Oli Glaser

4

Sus lecturas de 1022, 1023 son básicamente a escala completa en el ADC de Arduino. Suponiendo que instaló un condensador en serie no defectuoso como se muestra en su diagrama, este nivel no puede provenir del circuito del micrófono que construyó, ya que eso solo puede acoplar los voltajes cambiantes (es decir, CA).

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

Intente hacer un divisor de voltaje muy "liviano" con algunas resistencias de alto valor (entre 10K y 100K) y use esto para sesgar la entrada analógica a la mitad del voltaje de referencia (también podría usar un potenciómetro, que le brinda una capacidad de prueba adicional). Entonces su lectura sin entrada debe estar en el vecindario de 512.

Una vez que tenga la entrada de ADC adecuadamente sesgada, puede comenzar a trabajar tratando de ver si obtiene variación a través de ella. Es posible que esté submuestreando un poco su ancho de banda, lo que significa que obtendrá un alias de los componentes de alta frecuencia, pero si todo lo que está tratando de hacer es estimar el volumen general, eso no debería ser un gran problema.


Eso suena bien, supongo que está sobrecargado. OP, ¿ha pensado en conectar un pequeño altavoz para depurar esa línea analógica de su lectura? Cuando hice un medidor vu tomé las líneas de un conector para auriculares, básicamente directamente en AnalogRead y mapeé el resultado.
Hellonearthis
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.