Usando un micrófono con un Arduino

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


Soy completamente nuevo en Arduino (pero estoy familiarizado con la programación). Para construir un medidor de VU , quiero colocar un micrófono en el 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

... y traté de construirlo con este resultado:

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

Los valores en el monitor serial no cambian dependiendo del 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. La leyenda en el micrófono dice XF-18D .

Editar: 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 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 serial funcionan (los probé con un potenciómetro).

La salida en serie ahora es alrededor de 57.

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

¿Ha verificado con un alcance que puede ver una forma de onda de audio en la salida de su circuito?
Vaya, ¿por qué el pin 3V3 y 5V está en cortocircuito en el esquema? Eso podría ser un problema.
No, simplemente no dibujé el esquema correctamente.

Respuestas (3)

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 muéstrelos 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á calcularlo en algún momento, ya sea antes de enviar 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, elimínelo ya que bloqueará la polarización de CC del transistor y la señal oscilará bajo tierra.

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

amplificador de electreto

A esto no debería importarle demasiado el transistor utilizado, la polarización de salida debería ser de alrededor de 2,5 V.
Los valores exactos para el divisor de entrada (R3 y R4) no son demasiado importantes, es la proporción de 1:4 lo que lo 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 debe ser> 1uF (reemplaza a C1 en su esquema)
Sin embargo, R1 y R2 deben tener estos valores.
Todo lo que necesita es el electret con su resistencia de polarización (R1 en su esquema)

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

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

También debe asegurarse de que el RS232 funcione 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 brindar ayuda más específica.

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

Detección de picos

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

El diodo puede ser casi cualquier diodo. Los valores de límite y resistencia son solo una guía, se pueden cambiar un poco. Sus valores dictan cuánto tardará el voltaje en cambiar con el nivel de la señal. Puede calcular esto usando la constante RC (es decir, R * C; en el ejemplo anterior, la constante RC es 1e-6 * 10e3 = 10 ms. El voltaje tardará alrededor de 2,3 constantes de tiempo en caer en un 90 % de su valor original, por lo que en el ejemplo anterior, si el voltaje comienza en 1 V y elimina la señal, habrá caído a 0,1 V alrededor de 23 ms después.

EDITAR : está bien, creo que encontré un problema importante. Su transistor S9012 es un transistor PNP (al igual que 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 como "104" son casi con seguridad condensadores cerámicos de 0,1 uF. El valor (en pF) son los 2 primeros 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 000 pF. 100.000pF es 100nF o 0,1uF.

EDITAR: no tener un osciloscopio o un multímetro hace que la vida sea muy difícil aquí (debe obtener uno o ambos tan pronto como pueda).
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 a la PC directamente 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 suele ser buena para hasta 2V IIRC. También puede probar el electret directamente: simplemente retire la parte 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 LED como quiero que se vea mi medidor vu y probé la conexión en serie con eso. No tengo osciloscopio ni multímetro. El transistor tiene la leyenda "S9012 H 331". También tengo "S9014 C 331" y S9015.
@Toast: vea la edición sobre C2, elimine esto y conéctese directamente.
Eliminé C2 y agregué las partes como Kristoffon lo describió en su respuesta. Todavía los mismos resultados.
@Toast: es muy difícil depurar esto sin un alcance o un multímetro. Sus valores de 1024 muestran que el voltaje está sujeto al voltaje de suministro. Esto puede deberse a que el transistor está polarizado incorrectamente; verifique los valores de resistencia (bandas de color) con cuidado. Desea que la salida esté a la mitad del voltaje de suministro sin señal presente. Con el detector de picos, el voltaje debe variar entre la mitad y el voltaje de suministro y completo cuando se enciende la señal.
Después de reemplazar el transistor por otro, el valor es 54. Agregué el círculo como se describe en la imagen. Puedes ver las resistencias que usé en la foto que subí. Estoy bastante seguro de que son correctos. Además, aún no he descubierto cómo determinar la capacidad de un condensador. Los dos que estoy usando ahora tienen el título 104.
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á tratando de depurar dos cosas a la vez: aislar el circuito y verificar su comportamiento con un osciloscopio y/o aislar su código y proporcionar una entrada predecible pero variable para validar su código.
@DeanB: buena idea, retroceder algunos pasos aquí y confirmar cada parte individualmente probablemente ayudaría mucho. El potenciómetro es una prueba simple/fácil que puede confirmar que el ADC funciona correctamente.
@Toast: el transistor que está utilizando es incorrecto, consulte la edición para responder.
Cambié el transistor y me aseguré de que la conexión en serie y el código funcionaran. Pero no sé si el micrófono funciona.
También probé con otro micrófono con el mismo resultado. Pero ambos con ambos micrófonos no obtengo señal si los pruebo con una computadora, aunque no sé si lo hice bien.
@Toast: intente cambiar R3 a 1k.
Compré un multímetro. ¿Dónde debo medir?
Comience midiendo el voltaje de CC en el colector del transistor (sin ninguna entrada significativa en el micrófono). Desea que esté en algún lugar alrededor de la mitad del voltaje de suministro, por lo tanto, +2.5V para un suministro de 5V.
@Toast: vea la respuesta editada para el circuito alternativo. Prueba esto si todavía tienes problemas.
¿Tengo que medir el voltaje entre tierra y el colector? (eso es 0)
Sí, entre suelo y colector. Si es 0V, entonces su transistor está completamente encendido o tiene algún otro problema. ¿Qué circuito estás usando? Desconéctese de la entrada ADC mientras realiza la prueba, en caso de que tenga el pin configurado en salida baja accidentalmente.
Lo probé con el circuito en la pregunta con los cambios que usted y Kristoffon sugirieron. Ahora ensamblaré el circuito en su respuesta y luego informaré los resultados.
El otro pin del micrófono va a tierra, ¿verdad?
No tengo condensadores superiores a 104 (0.1uF). Los usé en tu circuito y no funciona. El voltaje del colector (y el pin analógico 0) es de 5 V y el arduino lee 1023.
Los límites de 0.1uF no deberían causar un problema de polarización, simplemente eliminarán la ganancia de frecuencia más baja. El circuito debería funcionar como se muestra (al igual que el otro), por lo que debe ser un error que haya cometido en alguna parte. ¿Podría actualizar su pregunta para mostrar exactamente qué circuito y componentes (número de pieza del transistor, valores de condensador/resistencia, etc.) está utilizando actualmente? Además, mida todos los voltajes relativos a tierra y márquelos en el esquema (p. ej., base a tierra, colector a tierra, emisor a tierra, etc.). Si analizamos esto metódicamente, es más probable que encontremos el problema.
Este es mi resultado: enlace Los valores de la resistencia son los mismos que en el circuito, los valores del condensador son ambos de 0,1 uF ("104"), el transistor es un tansistor "S9014" (NPN). Las piezas son de aquí . Tengo dos micrófonos disponibles, uno de desmontar un juguete, uno de un auricular (estoy bastante seguro de que este funciona, pero me encantaría encontrar una manera de probarlos)
Vale, hay un problema en la base de la NPN. R3 y R4 deben estar conectados a la base. El voltaje debe estar alrededor de 0.7V en la base. El hecho de que sea 0V nos dice que hay una conexión mala (o incorrecta) o posiblemente el transistor está defectuoso. Sin el transistor enchufado, el voltaje entre R3 y R4 debería ser de alrededor de 1V. Compruébalo con cuidado y hazme saber cómo va.
Bien, encontré un error. R3 estaba "perdido" (qué vergüenza para mí). Aquí están los nuevos valores .
Está bien, no hay problema. Eso se ve un poco mejor, pero algo sigue mal. El voltaje en la base debe ser de alrededor de 950 mV y el voltaje en la parte superior de R2 debe ser de alrededor de 250 mV. Mi sospecha es que uno o más de los valores de resistencia son incorrectos. ¿Puede verificarlos todos con el multímetro? (agregue los valores al esquema si puede)
Revisé los valores de la resistencia con el multímetro y son los mismos que en el esquema. Para R3 estoy usando una serie de 4 resistencias de 10k.
Hmmm, estoy un poco desconcertado porque, a menos que su transistor tenga muy poca ganancia, debería funcionar. Quizás podrías probar a cambiarlo por otro del mismo tipo (NPN) y ver si es mejor. Desea un voltaje de colector de alrededor de 2.5V (está usando 5V; si no, debería ser para estos valores) Una cosa que puede probar es en lugar de R3, use un potenciómetro de 50k o 100k y varíelo mientras observa el voltaje del colector - si puede configurarlo para 2.5V, mida la resistencia a través de él. Si solo tiene un potenciómetro de 10k, utilícelo en lugar de una de las 4 resistencias de 10k.
R3 ahora es un potenciómetro de 50 kΩ. Cuando se establece en 4200 Ω, el voltaje del colector es de 2,5 V (512 en el pin A0). Todavía no reacciono a la música. ¿Cómo puedo comprobar si el micrófono funciona?
Parece que tienes una resistencia de 1k para R4 entonces. Esto probablemente seguirá funcionando hasta cierto punto, pero presentará una impedancia demasiado baja para la señal electret. Es mejor usar un 10k (o superior) para R4. Asegúrese de tener todavía la resistencia de 2k en el lado del electreto (no se muestra en mi esquema) PARA verificar si el micrófono está funcionando lo más rápido posible (por ejemplo, muestree al menos cada 1 ms, preferiblemente más rápido) y hable en voz alta en el electreto. Deberías ver alguna variación. También puede monitorear la señal del colector con su multímetro en la sonda de CA (rango bajo) del colector a tierra.
R4 es en realidad una resistencia de 10k. ¿Dónde va la resistencia de 2k? ¿Asumí que el otro pin del micrófono simplemente se conecta a tierra?
Algo es muy extraño entonces, ¿estás seguro de que tienes el transistor al revés? Lo siento, me refería a la resistencia de 10k (R1 en tu esquema) para el electret. El otro pin electret va a tierra; tiene que estar en el sentido correcto para que funcione correctamente, así que asegúrese de que así sea. Puede ser útil que actualice su pregunta y publique otra imagen de su configuración actual.
@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 eliminar los EDITbloques de alguna manera y editarlo para que pueda entenderse 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 como está.

Suponiendo que su circuito funcione, la señal de audio está en el rango de kHz, mientras que Arduino tiene un ADC adecuado para niveles de CC. El componente de CC en su señal es cero, lo que quiere decir que flota sobre un voltaje fijo. Es ese voltaje fijo lo 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.

El límite se cargará al valor máximo que se recibe, mientras que la resistencia descargará el límite cuando la señal se apague.

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

Editar: la entrada ADC en realidad está flotando ya que no tiene ningún sesgo debido al capacitor en serie. Si va a probar mi solución, elimine C2.

Bien, agregué esto al circuito y la señal en el monitor serial ahora es 458 (pero aún no cambia cuando hay ruido).
Cambié el transistor de "S9012 H 331" a "S9014 C 331" y el valor es 56.
El Arduino ADC es capaz de muestrear lo suficientemente rápido para audio. No los uso, pero creo que 10 ksps (hasta 5 kHz de ancho de banda) son posibles con las funciones de la biblioteca, lo cual está bien para cosas de baja fidelidad (estoy bastante seguro de que el ATMega real puede muestrear más rápido si se usa normalmente)
@Toast: ¿qué tan rápido estás muestreando? Si es muy lento, el detector de picos es una buena idea. Sin embargo, puedes hacer esto en el software.
Hice un retraso de 300 ms. Pero lo probé sin demora o con una breve demora, pero la señal no cambia significativamente.
@OliGlaser claramente nunca intentó hacer eso en ese momento o sabría que esas especificaciones no son realistas porque, si bien puede obtener 10 ksps, obtendrá lecturas basura y si quiere ese adc barato, lo meten en el microcontrolador para darle más más de 4 bits de datos, nunca hará más de 1 ksps.
@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.
Además, si revisa la hoja de datos de ATmega328 , puede ver las mismas especificaciones enumeradas en la sección ADC (página 323). Menciona una precisión absoluta de 2LSB a 200kHz (frecuencia de muestreo de ~15kHz)

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

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

Intente hacer un divisor de voltaje muy "ligero" con algunas resistencias de alto valor (entre 10K y 100K) y utilícelo 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 debería estar en la vecindad de 512.

Una vez que tenga la entrada 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 has pensado en conectar un pequeño parlante para depurar esa línea analógica de tu lectura. Cuando hice un medidor vu, tomé las líneas de un conector para auriculares, básicamente directamente en el AnalogRead y mapeé el resultado.