RPi como medidor de nivel de sonido?

10

Para el proyecto de la feria de ciencias de mi hija (categoría de Ciencias de la Computación y Matemáticas), a ella le gustaría usar el RPi para medir si los diferentes sonidos fuertes están por encima del umbral del dolor y están dañando nuestros oídos. Ella es una estudiante de sexto grado, pero tiene experiencia con RPi y programación en Python. Phillip Heels Nichols ha respondido algunas preguntas en la página de FB RPi, pero sugirió que viniéramos aquí para obtener más ayuda. Ella quiere calibrar el Pi con un medidor de presión de sonido (tengo uno de estos) para calcular cuántos milivoltios se producen.

Esto es lo que estamos pensando hasta ahora. Compramos un adc (mcp3008) de adafruit y estamos esperando su llegada. Si conectamos la salida digital del adc al pin GPIO 11 y al pin GPIO 12 a un LED rojo, ¿funcionará este sencillo programa?

import RPi.GPIO as GPIO

GPIO.setmode(GPIO.BOARD)
GPIO.setup(11,GPIO.IN)
GPIO.setup(12,GPIO.OUT)
GPIO.output(12,GPIO.LOW)    #make sure LED is off
SPL=0 #zero the variable

While SPL<??:            #Where ?? is the value in millivolts produced by a sound at 130 db
    SPL=GPIO.input(11)   #get value from adc connected to microphone
GPIO.output(12,GPIO.HIGH)   #turn LED on if the sound level is higher than ??

Si esto funcionara, ¿qué código se podría poner al final para restablecer el programa con solo presionar un botón conectado a los pines GPIO? Ella quiere que esto sea portátil, por lo que no podrá escribir comandos para ejecutar el programa nuevamente.

user5769
fuente
Por alguna razón, el código se cortó. Permítame intentarlo nuevamente: importe RPi.GPIO como GPIO GPIO.setmode (GPIO.BOARD) GPIO.setup (11, GPIO.IN) GPIO.setup (12, GPIO.OUT) GPIO.output (12, GPIO.LOW) # asegúrese de que el LED esté apagado SPL = 0 # cero la variable Mientras SPL <??: #Where ?? ¿es el valor en milivoltios producido por un sonido a 130 db SPL = GPIO.input (11) #get value from adc conectado al micrófono GPIO.output (12, GPIO.HIGH) # enciende el LED si el nivel de sonido es superior a? ?
user5769
1
Puede editar su publicación, si coloca 4 espacios delante del código, lo coloca en un cuadro especial de "código" y mantiene el formato. Hace que sea mucho más fácil de leer. Realmente no se relaciona con la pregunta, ¡pero eso es impresionante para un estudiante de 6to grado! Desearía haber empezado tan joven.
Impulso
1
Por interés, ¿qué marca / modelo es el medidor de presión acústica?
retrantha 01 de
¿La salida del medidor está preamplificada? De lo contrario, la salida del micrófono será demasiado pequeña para que la lea un MCP3008.
scruss
Tenga en cuenta que no puede simplemente usar un ADC para medir significativamente la presión del sonido. Debe medir la forma de onda oscilante y luego medir su amplitud en el software (posiblemente aplicando una ponderación dependiente de la frecuencia como lo hacen los medidores reales) o rectificar la señal antes de que llegue al ADC. Es posible que desee ejecutar algunos experimentos usando una PC con una tarjeta de sonido primero para tener una idea del algoritmo.
Chris Stratton

Respuestas:

3

Usar el bus SPI simplemente conectando el pin de salida digital del ADC al pin 11 del RPi GPIO no funcionará. Este bus necesita un par de cables más, 4 para ser precisos.

El ADC también necesitará una entrada SPI, pines Clock y Chip Select conectados para funcionar correctamente. Afortunadamente hay buena información sobre esto disponible de múltiples fuentes.

Primero, si desea conocer un poco más sobre el funcionamiento de SPI, le sugiero que lea esta página en Wikipedia para conocer un poco mejor SPI.

En segundo lugar, hay un tutorial muy bueno de Adafruits que trata exactamente este tema, incluye el código de Python y lo guía a través de los procesos de conexión del ADC y la comunicación con él. Una desventaja (menor) es que el código utilizado en este tutorial no usa el puerto SPI en sí mismo, sino que emula el bus SPI (llamado bit-banging), esto significa que tiene más libertad para usar los pines en el puerto GPIO que usted quiere.

Supongo que para su proyecto relativamente simple (¡aunque estoy felizmente sorprendido de que hoy en día los estudiantes de 6to grado hagan este tipo de tareas! Para ellos se les arroja mucha información nueva al hacer este tipo de proyectos), la solución de golpe de bits funcionará simplemente multa. Una ventaja de usar bit banging es que, para fines de aprendizaje, se adapta mejor porque crea todas las señales SPI usted mismo, el procesador no hace nada automáticamente, por lo que obtendrá un conocimiento mucho mejor de SPI y las comunicaciones en serie en general.

Tal vez sea una buena idea comenzar con los ejemplos de Adafruit y pasar a utilizar la implementación de hardware en el RPi para SPI, en ese caso necesitará la hoja de datos (también útil cuando se usa la implementación del software Adafruit) Los capítulos 5 y 6 describen la comunicación y lo que debe configurarse para usar el ADC.

ikku
fuente
Evitaría por completo las implementaciones de bit-banging, e iría directamente a la versión de hardware. Buen ejemplo simple aquí: Blog de Jeremy: Entradas analógicas SPI de hardware Raspberry Pi usando el MCP3008 .
scruss 01 de
Gracias. Hemos visto el tutorial de adafruit y planeamos usarlo para conectar el adc al RPi. Acabamos de dejar ese paso fuera de nuestra descripción. Sin embargo, el código adafruit y la idea de golpear son demasiado complicados para ella (y para mí) en este momento. Ella nunca podría explicar eso a los jueces. Revisaremos la versión de hardware y veremos cómo se ve. Pero . . . El hecho de que la salida del micrófono sea demasiado pequeña (@scruss) será un problema seguro. Gracias por todas sus respuestas, ¡ayudarán mucho!
user5769
Existe el amplificador de micrófono Electret de Adafruit que aumenta la salida del electret a algo que el ADC puede leer. Incluye una cápsula de micrófono.
scruss 01 de
0

Para SPI de hardware con MCP3008 y las bibliotecas Adafruit_MCP3008 y Adafruit.SPI Python:

He intentado modificar la función set_clock_frequency ('valor en Hz') del objeto SpiDev de la biblioteca Adafruit.SPI. Entonces algo como

import Adafruit_SPI as SPI  
ChangeClk=SPI.SpiDev(spi=0, port=0, max_speed = default)
ChangeClk.set_clock_frequency(90000)

Quería una frecuencia de muestreo de 5 KHz (se le dieron 5 V a MCP3008) pero el Raspberry Pi modelo 2 B estaba dando un RELOJ en serie de 25 KHz cuando se observó en DSO. Para una frecuencia de muestreo de señal de entrada analógica de 5 KHz, el CLK de serie de Pi debe ser de 90 KHz (frecuencia de muestreo de 18 veces, como se indica en la hoja de datos de MCP 3008). Sin embargo, incluso esto no podría ayudar y las cosas permanecen sin cambios mientras se ejecuta el script python.

También sorprendentemente, el mismo código cuando se ejecutó en SPYDER IDE en RPi imprimió un valor de 1006 en 1 segundo, lo que indica una tasa de muestreo mejorada con la configuración que se mantuvo igual a la anterior a 1 KHz a diferencia del shell incorporado Python-2.

S Vyas
fuente
¿Podría intentar reformatear esto? Su respuesta en su formato actual es difícil de leer. Si necesita sugerencias, eche un vistazo al Centro de ayuda.
Darth Vader