RPi come fonometro?


10

Per il progetto della fiera scientifica di mia figlia (categoria Informatica e matematica), vorrebbe usare l'RPi per andare in giro e misurare se diversi suoni forti sono al di sopra della soglia del dolore e ci stanno danneggiando. È una seconda media, ma ha esperienza con RPi e programmazione in Python. Phillip Heels Nichols ha risposto ad alcune domande sulla pagina RPi di FB, ma ha suggerito di venire qui per ulteriore aiuto. Vuole calibrare il Pi con un misuratore di pressione sonora (ne ho uno di questi) per capire quanti millivolt vengono prodotti

Ecco cosa stiamo pensando finora. Abbiamo acquistato un adc (mcp3008) da adafruit e stiamo aspettando il suo arrivo. Se colleghiamo l'uscita digitale dall'adc al pin 11 GPIO e al pin 12 GPIO a un LED rosso, questo semplice programma funzionerà?

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 ??

Se questo funzionasse, quale codice potrebbe essere inserito alla fine per ripristinare il programma con la pressione di un pulsante collegato ai pin GPIO? Vuole che sia portatile, quindi non sarà in grado di digitare comandi per eseguire nuovamente il programma.


Per qualche motivo, il codice è stato tagliato. Fammi riprovare: importare RPi.GPIO come GPIO GPIO.setmode (GPIO.BOARD) GPIO.setup (11, GPIO.IN) GPIO.setup (12, GPIO.OUT) GPIO.output (12, GPIO.LOW) # assicurati che il LED sia spento SPL = 0 # zero la variabile While SPL <??: #Where ?? è il valore in millivolt prodotto da un suono a 130 db SPL = GPIO.input (11) #get valore da adc collegato al microfono GPIO.output (12, GPIO.HIGH) #accendi il LED se il livello del suono è superiore a? ?
user5769

1
Puoi modificare il tuo post, se metti 4 spazi davanti al codice, lo inserisce in una speciale casella di "codice" e continua la formattazione. Rende molto più facile da leggere. Non proprio in relazione alla domanda, ma è impressionante per un sesto anno !!!! Vorrei aver iniziato così giovane.
Impulss,

1
Per interesse, quale marca / modello è il misuratore di pressione sonora?
recantha,

L'uscita dal misuratore è preamplificata? Altrimenti, l'uscita del microfono sarà troppo piccola per essere letta da un MCP3008.
scruss

Nota che non puoi semplicemente usare un ADC per misurare significativamente la pressione del suono. È necessario misurare la forma d'onda oscillante e quindi misurare la sua ampiezza nel software (eventualmente applicando la ponderazione dipendente dalla frequenza come tendono i misuratori reali) oppure rettificare il segnale prima che raggiunga l'ADC. Potresti voler eseguire alcuni esperimenti utilizzando prima un PC con una scheda audio per avere un'idea dell'algoritmo.
Chris Stratton,

Risposte:


3

L'uso del bus SPI semplicemente collegando il pin di uscita digitale dell'ADC al pin 11 di RPi GPIO non funzionerà. Questo bus ha bisogno di un paio di fili in più, 4 per essere precisi.

L'ADC avrà anche bisogno di un ingresso SPI, pin Clock e Chip Select collegati per funzionare correttamente. Fortunatamente ci sono buone informazioni su questo disponibili da più fonti.

Per prima cosa, se desideri saperne di più sul funzionamento di SPI, ti suggerisco di leggere questa pagina su Wikipedia per conoscere un po 'meglio SPI.

In secondo luogo c'è un tutorial molto carino di Adafruits che discute esattamente questo argomento, include il codice Python e ti guida attraverso i processi di connessione dell'ADC stesso e comunicazione con esso. Uno svantaggio (minore) è che il codice utilizzato in questa esercitazione non utilizza la porta SPI stessa, il software emula il bus SPI (chiamato bit-banging), questo significa che sei più libero di usare i pin sulla porta GPIO che tu vuoi.

Suppongo che per il tuo progetto relativamente semplice (anche se sono felicemente sorpreso al giorno d'oggi, i selezionatori di 6 ° grado svolgono questo tipo di compiti! Per loro vengono lanciate molte nuove informazioni realizzando questi tipi di progetti), la soluzione di bit-bang funzionerà proprio bene. Un vantaggio dell'uso del bit banging è che ai fini dell'apprendimento si adatta meglio perché crei tu stesso tutti i segnali SPI, il processore non fa nulla automaticamente, quindi finirai con una conoscenza molto migliore di SPI e delle comunicazioni seriali in generale!

Forse è una buona idea iniziare con gli esempi di Adafruit e passare successivamente all'uso dell'implementazione hardware su RPi per SPI, in tal caso è necessario il foglio dati (utile anche durante l'utilizzo dell'implementazione del software Adafruit) , I capitoli 5 e 6 descrivono la comunicazione e ciò che deve essere configurato per utilizzare l'ADC.


Eviterei del tutto le implementazioni di bit-bang e andrei direttamente alla versione hardware. Un buon esempio qui: Blog di Jeremy: Ingressi analogici SPI hardware Raspberry Pi che utilizzano l'MCP3008 .
scruss

Grazie. Abbiamo esaminato il tutorial di adafruit e abbiamo in programma di usarlo per connettere l'ADC al RPi. Abbiamo appena lasciato quel passo fuori dalla nostra descrizione. Tuttavia, il codice adafruit e l'idea del bit banging sono fin troppo complicati per lei (e per me) a questo punto. Non sarebbe mai stata in grado di spiegarlo ai giudici. Verificheremo la versione dell'hardware e vedremo come appare. Ma . . . il fatto che l'uscita del microfono sia troppo piccola (@scruss) sarà sicuramente un problema. Grazie per tutte le tue risposte, ti aiuteranno moltissimo!
user5769

C'è l' amplificatore per microfono a elettrete di Adafruit che aumenta l'uscita dell'elettrete a qualcosa che l'ADC può leggere. Include una capsula microfonica.
scruss

0

Per le librerie hardware SPI con MCP3008 e Adafruit_MCP3008 e Adafruit.SPI Python:

Ho provato a modificare la funzione set_clock_frequency ('valore in Hz') dell'oggetto SpiDev della libreria Adafruit.SPI. Quindi qualcosa come

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

Volevo una frequenza di campionamento di 5 KHz (5 V era stata data a MCP3008) ma il Raspberry Pi modello 2 B stava dando un OROLOGIO seriale di 25 KHz quando osservato su DSO. Per una frequenza di campionamento del segnale di ingresso analogico di 5 KHz, il CLK seriale da Pi dovrebbe essere 90 KHz (18 volte la frequenza di campionamento, come indicato nella scheda tecnica MCP 3008). Tuttavia, anche questo non può essere d'aiuto e le cose rimangono invariate durante l'esecuzione dello script Python.

Inoltre, lo stesso codice, quando eseguito su SPYDER IDE su RPi, stampava 1006 valori in 1 secondo indicando una frequenza di campionamento migliorata con le impostazioni mantenute uguali a quelle sopra a 1 KHz a differenza della shell Python-2 integrata.


Potresti provare a riformattare questo? La tua risposta nel suo formato attuale è difficile da leggere. Se hai bisogno di suggerimenti, dai un'occhiata al Centro assistenza.
Darth Vader
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.