¿Cómo conectar Raspberry Pi con micrófono Electret para detectar niveles de sonido en dB?

Tengo que detectar niveles de sonido en un área cerrada, así que pensé que esta podría ser la elección correcta.

/*EDIT
Deseo recopilar niveles de sonido de aproximadamente 30-60dB, normalmente conversaciones humanas o solo ruido ambiental. Lo que realmente quiero lograr con esto es recopilar sonidos que puedan ser perceptibles para los humanos.
*/

Compré un micrófono Electret con ganancia automática de Adafruit https://www.adafruit.com/product/1713

Estoy tratando de conectarlo con una raspberry pi 3 para detectar niveles de sonido, sin embargo, no he podido encontrar una solución ya que la mayoría de los tutoriales son para Arduino u otras placas de conexión, ¿alguien tiene una solución para esto?

Entendí que la salida del micrófono es de tipo analógico y tengo un convertidor adc ADS1115 y MCP3008 que serían útiles, pero no he podido buscar la solución que me guíe en el uso del micrófono y el convertidor.

//EDITAR He podido conectar el sensor al ADC y MCP, sin embargo, los valores se mantienen constantes y no parecen cambiar en absoluto, incluso reproducir canciones en el micrófono no cambia los valores. Obtengo un valor constante que va de 200 a 300 en MCP y alrededor de 1056 en ADC.

Seguí tutoriales en https://learn.adafruit.com/adafruit-microphone-amplifier-breakout/measuring-sound-levels pero necesito generarlos en decibeles en RPI, necesito enviar los datos a un servidor.

He estado usando las bibliotecas de Adafruit en MCP3008 y ADC1115, ¿estoy haciendo esto mal?

Necesito recopilar los niveles de sonido en decibeles y ponerlos en un servidor.

Salud

¿Ha seguido de cerca y por completo todas las instrucciones que se encuentran en su página vinculada: learn.adafruit.com/adafruit-microphone-amplifier-breakout/…
@jonk He seguido ese tutorial por completo, lo que pido aquí es una solución que me permita usar RPI para leer los valores, y los valores que estoy leyendo de RPI no responden a los "sonidos que hice". En ese tutorial, adafruit solo usa arduino, y pude obtener valores de voltaje, sin embargo, necesito niveles de sonido, ¿tal vez podría proponer cómo podría convertir estos valores en niveles de sonido, etc. en decibelios?
Los valores de voltaje es lo que obtendrá. Para convertirlos en otra cosa, como niveles de sonido, deberá leer detenidamente la hoja de datos del micrófono que usan Y el IC con AGC que usan y tendrá que desarrollar las matemáticas usted mismo. El micrófono tendrá especificaciones en cuanto a su comportamiento como transductor de presión sonora. El IC tendrá más especificaciones. De todos modos, es lo que haría si este fuera mi proyecto. Siéntate con el papeleo, saca un poco de papel, lee hasta que entienda completamente, luego desarrolla las matemáticas y luego el código. Te propondría que hicieras eso también.
¿Ha considerado hacer la conversión de nivel de sonido a dB en el dominio analógico?
@jonk suena bastante bien, probaría esta solución primero.
@ThreePhaseEel Ciertamente no lo he hecho, ¿podría dar más detalles sobre esta solución propuesta?
En primer lugar, me gustaría preguntar si lo que propongo, usar el micrófono para medir los niveles de sonido, ¿es realmente factible?
no sabría No tengo idea de qué rango de SPL quieres. No he leído los detalles de AGC del IC. No he considerado el micrófono. Y si está buscando seriamente un rango de registro significativo, entonces creo que ThreePhaseEel lo está moviendo en la dirección correcta (dominio analógico primero). Si escribió más, ... Pero no lo ha hecho. Así que en su mayoría siento que compraste algo que no te llevará a donde quieres ir. Pero podría estar bien, si su rango es pequeño y está posicionado justo para lo que compró.
Tenga en cuenta que la salida de electret generalmente escala linealmente con Pascales. Entonces no lo hace, con decibelios, donde 6 dB significa un factor de 2 en Pascales. Se supone que debe considerar y especificar cuidadosamente su propio rango deseado y luego seleccionar con el mismo cuidado un transductor apropiado que admita ese rango. Luego, debe averiguar qué tipo de soporte y acondicionamiento electrónico (preamplificador, etc.) se necesitarán para hacer coincidir las cosas con su capacidad de ADC y su rango de rendimiento deseado. Dada su falta de información en su Q, supongo que no ha hecho nada de eso.
¿Ha considerado que el AGC podría estropear sus resultados?
@ThreePhaseEel Eso también se me pasó por la cabeza. (Leí que hay algunos controles de ganancia manuales en esa placa). No voy a leer las hojas de datos ahora. El OP ni siquiera ha pensado en qué tipo de SPL procesar (se hace referencia a 0 dB 20 m Pensilvania .) 50 veces eso, 1 mPa , se trata de un susurro. Un despertador es unas 100 veces más. 100 veces más y se vuelve doloroso escuchar. Todo eso puede ser de interés para el OP. Pero, ¿qué electreto sirve para 5 o 6 órdenes de magnitud? Creo que se necesita una divulgación completa. (Debería ser el párrafo n.º 1 de cada Q aquí). E incluso entonces...
@jonk Deseo recopilar niveles de sonido de aproximadamente 30-60dB, normalmente conversaciones humanas o solo ruido ambiental. Lo que realmente quiero lograr con esto es recopilar sonidos que puedan ser perceptibles para los humanos. Es cierto que realmente no entiendo estas terminologías sobre los datos que deseo recopilar y quiero agradecerle por ofrecerme su consejo.
Entonces, un rango dinámico de alrededor de 30-40... ¿Qué lecturas de voltaje obtienes en los niveles más bajos? ¿Qué lecturas de voltaje obtienes en el nivel más alto? ¿Tiene un dispositivo calibrado separado contra el cual puede medir SPL para comparar? ¿El AGC en el chip le brinda información adicional para que sepa cómo interpretar los voltajes?
Asegúrese de tener una buena conexión con el micrófono. Utilicé esa placa de conexión de micrófono electret de adafruit en un proyecto simple y estaba obteniendo datos incorrectos hasta que soldé el encabezado en la placa de conexión.

Respuestas (3)

Ha seleccionado una placa de micrófono con ganancia automática. Esto es exactamente lo contrario de lo que necesita. No puede medir los niveles de audio reales cuando hay algo aguas arriba que NO realiza todos los cambios de nivel de audio ("auto-ganancia"). Entonces, primero, debe usar el módulo de micrófono adecuado que le brinde los niveles de audio reales, honestos y sin modificar.

En segundo lugar, está intentando medir los NIVELES de audio, no la FORMA DE ONDA del audio en sí. Eso significa que necesita promediar o integrar la señal de audio para producir la "envolvente" de los niveles de audio. Puede hacer esto en el software muestreando el audio a una velocidad alta y haciendo cálculos matemáticos furiosamente, o puede hacerlo de manera mucho más simple en el hardware rectificando e integrando la señal de audio en una señal de CC en movimiento que representa el NIVEL de audio en cualquier punto en particular. momento. Luego puede muestrear y escalar esta CC variable en deciBels o lo que sea.

Recomiendo encarecidamente obtener una placa de micrófono diseñada esencialmente para hacer exactamente lo que está proponiendo. A saber, la placa del detector de sonido Sparkfun. Esta placa tiene la cápsula de micrófono electret, y también el preamplificador de micrófono, y un detector de picos y un amplificador de búfer de salida. Todo lo que necesita hacer es conectar la salida del detector de picos de esta placa a un pin de entrada analógica en su Arduino y recibirá la envolvente de audio en bandeja de plata. Pan comido.

Ejemplo: https://www.sparkfun.com/products/12642

En realidad, necesito poder usar esto con rpi, considerando que tengo un ADC/MCP, ¿podría conectarle el sensor?
No hace ninguna diferencia. La placa SparkFun ofrece una buena señal envolvente de CC apropiada para CUALQUIER microcontrolador o ADC.
Extrañamente, tengo dificultades para encontrar este producto localmente, ¿puedo preguntar si esta alternativa es adecuada? sgbotic.com/index.php?dispatch=products.view&product_id=752 Placa de conexión para micrófono MEMS INMP401 (ADMP401)
o este sgbotic.com/ ... Placa de conexión para micrófono Electret
El tablero sgbotic es solo una cápsula de micrófono "en bruto". Necesitaría conectar eso a la entrada del micrófono de RasPi e idear algún software para tomar la señal del micrófono e integrarla en la envolvente del nivel de sonido. $ 10 parece bastante caro como una placa de conexión para una cápsula de micrófono de $ 1.
¿Qué pasa con esto? INMP401 (ADMP401) ¿Micrófono MEMS?
Puede usar un micrófono en la entrada de micrófono de RasPi y hacer todo en el software, o necesita un micrófono, un preamplificador de micrófono, un detector de picos y un integrador. Hace poca diferencia exactamente qué micrófono usas. De hecho, cualquier "micrófono de computadora" se conectaría al RasPi.

Tienes la cosa equivocada, en primer lugar

El control automático de ganancia (AGC) en su placa de micrófono existente no es lo que quiere aquí: un detector de nivel de sonido será expulsado por la acción del bucle AGC cambiando la ganancia por todas partes mientras intenta mantener un nivel de salida constante (¿qué más esperaría de un bucle AGC?). También podría obtener un micrófono electret barato, como el de Sparkfun , y usarlo directamente en cualquier circuito que armó.

Los logaritmos analógicos son el camino a seguir aquí

Una de las verdades básicas de los ADC modernos y económicos, especialmente los proporcionados en sistemas altamente integrados, es que su rango dinámico está limitado por el ruido en el extremo inferior y el bajo voltaje de suministro disponible en el extremo superior. Además, tomar sus logaritmos digitalmente hace un mal uso de los bits ADC que tiene disponibles: pequeños cambios en la señal en el extremo inferior provocan un cambio relativamente grande en el registro, pero son difíciles de distinguir para el ADC debido a su resolución limitada. .

Como resultado de todo esto, usaría un chip convertidor lineal en dB RMS-DC para convertir su entrada de sonido a dB, luego alimentaría ese "voltaje de control" detectado a su ADC para fines de medición. Afortunadamente, esto no es difícil: el convertidor RMS-CC de un ESO4316 funciona felizmente con 3,3 o 5 VCC, y es fácil de aplicar: un circuito de ejemplo que lo usa, el micrófono electret Sparkfun vinculado anteriormente y el LT1678 dual de bajo ruido. El amplificador operacional se muestra a continuación.

esquemático

simular este circuito : esquema creado con CircuitLab

OA1A, R5 y R6 son un amplificador no inversor de fuente única, ganancia = 100 que sirve como un preamplificador de micrófono con su entrada polarizada al punto medio del rango de suministro por R2, que también polariza el micrófono. Se eligió la ganancia porque el ESO4316 tiene un nivel de entrada mínimo de 100 nA, o 100 uV con la resistencia elegida, y con la sensibilidad de 5 mV/Pa del micrófono elegido, solo obtenemos 1 uV del micrófono para una entrada de 30 dB. C5 y R1 AC acoplan la señal de audio a U1 y la convierten en corriente, respectivamente, mientras que C2 es el condensador de temporización RMS-DC. R3, R4 y OA1B aumentan la oscilación de salida de +/-300 mV de U1 para adaptarse mejor al rango de entrada del ADC. C1, C3, C4 y C6 proporcionan varios tipos de desacoplamiento de suministro.

Tenga en cuenta que C2 y C5 deben ser capacitores de película (no cerámicos, electrolíticos o de tantalio), y R1, R3, R4, R5 y R6 deben ser resistencias del 1 % o mejores, preferiblemente de película delgada o de metal, ya que carecen de exceso de ruido. Además, C3 debe conectarse directamente entre el pin 8 de U1 y el extremo conectado a tierra de C2; ​​esto evita que los picos de corriente del convertidor RMS-DC de U1 arruinen el resto del funcionamiento del circuito. Finalmente, si no puede obtener un LT1678, querrá prestar atención a la oscilación de salida: necesita una parte que pueda tirar dentro de un par de cientos de mV más o menos del riel negativo, además de salir de un suministro único de 3,3 V con un rango de modo común decente y silencioso: el LT1678 puede generar un ruido de voltaje de 4,4 nV/hercios raíz a 10 Hz, y con el Zin bajo (dominado por R2) y los valores de resistencia elegidos (consejo:

La señal resultante es un voltaje que oscila entre casi 0 V y casi 3,3 V, con una función de transferencia lineal en dB: el convertidor RMS-CC del That4316 tiene la agradable propiedad de que la salida es de 6 mV por dB de nivel de entrada.

El fabricante del micrófono dice que su salida de amplificador "se puede usar fácilmente con cualquier convertidor analógico/digital que tenga una entrada de hasta 3,3 V. Si desea conectarlo a una entrada de línea, simplemente use un capacitor de bloqueo de 1-100 uF en serie". (100uF suena mejor)".

Tienes dos opciones aquí:

  • La opción más simple: conecte la tarjeta de sonido USB al Pi y alimente la salida del amplificador a través de una capacidad de bloqueo de 100uF en la entrada de la tarjeta de sonido. A continuación, puede utilizar el programa de su elección para procesar el sonido. Enlace a la tarjeta de sonido compatible con Pi: https://www.adafruit.com/product/1475
  • Si por alguna razón, la opción anterior no satisface sus necesidades, puede usar un convertidor analógico a digital (como el MCP3008 o el ADS1x15 (ADS1015 / ADS1115)) y programar el código Python necesario para interpretar la salida de los convertidores. Hay una guía completa sobre cómo hacerlo aquí: https://learn.adafruit.com/raspberry-pi-analog-to-digital-converters/overview (detalla el cableado y las bibliotecas de Python que necesita usar). ¡Espero que esto ayude!
No creo que esto sea lo que necesito, ya lo probé y el resultado no es lo que necesitaba
De acuerdo. No hay problema.
esta respuesta es correcta, no obstante.