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.
Respuestas:
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.
fuente
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
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.
fuente