Oggi proporremo un progetto che consentirà di realizzare un fonometro con Seeeduino Wio Terminal.
Un fonometro (sound meter in Inglese) è un apparecchio in grado di rappresentare il “livello di rumore” presente in un luogo in un dato momento. Si compone di un microfono e di un trasduttore elettronico in grado di tradurre la pressione delle onde sonore in un segnale elettrico. Il livello del segnale elettrico verrà quindi trasformato in un valore specifico standard, il decibel. Nello standard attuale, 20 dB corrispondono ad un sussurro, 30 dB al rurnore di sottofondo in campagna, 45 dB ad una conversazione, 60 dB al rumore presente in un luogo pubblico frequentato e così via (vedere tabella).
Ora, il nostro Seeeduino Wio Terminal dispone di serie di un microfono integrato, di un ingresso analogico, di un convertitore ADC, di un display e di un compilatore: perché dunque non provare a costruire il nostro fonometro personale?
Il progetto
Componenti:
Il fonometro con Seeeduino Wio funziona perfettamente collegando il Wio ad una sorgente elettrica con il relativo cavo USB-C, ma per il funzionamento sul campo occorre ovviamente un sistema di alimentazione portatile.
Il Wio Terminal prodotto da SeeedStudio dispone di un microfono integrato collegato ad un pin analogico della scheda, definito come WIO_MIC. Il valore presente su tale pin è accessibile tramite il comando
1 |
valore = analogRead(WIO_MIC); |
e fornisce una risposta intera compresa tra 0 e 1023.
Tale risposta potrà essere successivamente convertita in decibel (dB) attraverso il classico comando
1 2 3 |
// Mapping iniziale della tensione in decibel // prima della taratura dello strumento dB = map(valore, 0, 1023, 0, 100); |
Ovviamente, il microfono fornito con il WIO non ha una sensibilità ad alta fedeltà, e prima di ottenere letture valide dovremo operare una opportuna taratura, descritta più avanti nell’articolo.
Le letture vengono acquisite attraverso il sistema della media mobile, che consente di scartare i valori di picco e di rendere più omogeneo il valore restituito.
A questo punto sarà sufficiente passare il valore calcolato e tradotto in decibel alla routine di rappresentazione grafica descritta nel prossimo paragrafo.
Il software
Il software è liberamente scaricabile attraverso GitHub, e richiede la libreria di colloquio via SPI con il display integrato e la libreria SPI stessa.
Vengono definite le costanti relative alla finestra per il calcolo della la media mobile, ed alcune variabili necessarie per la routine grafica.
Il programma fa largo uso del codice di esempio TFT_Meters fornito con il Wio Terminal. Abbiamo ruotato l’immagine dello strumento di 90 gradi e modificato le sue misure, quindi abbiamo eliminato gli strumenti lineari e aggiunto la stampa in basso di uno sprite rappresentante il valore float dei dB calcolati.
La sezione di setup() inizializza il display, definisce la rappresentazione landscape, inizializza lo sprite relativo al valore calcolato della pressione sonora, disegna la prima volta lo strumento ed aggiorna il timer.
La sezione di loop() si limita a chiamare la funzione delegata ad aggiornare il display.
La taratura dello strumento
Come si è accennato più sopra, il microfono integrato nel Wio Terminal non ha una sensibilità eccelsa. Si è pertanto reso necessario ideare e applicare una serie di test correttivi del programma di base per ottenere risultati più vicini alla realtà, La sensibilità è stata accresciuta diminuendo il range di valori presenti nell funzione map() dal range 0..1023 ad un range più ristretto. Da misurazioni successive abbiamo riscontrato che il valore letto dall’ADC era costantemente superiore a 150, ed inferiore a 850. Abbiamo quindi utilizzato un fonometro professionale, e misurato sia il rumore in dB presente in diverse situazioni che il livello riportato dal convertitore del nostro Wio. Infine abbiamo creato una retta di regressione lineare tra i dati e applicato i coefficienti a valle della nostra formula di mapping.
Il risultato è stato esaltante: l’ago dello strumento riproduceva abbastanza federmente i valori di picco riscontrati dallo strumento professionale, mentre la lettura numerica esprimeva la media mobile. A causa dell’interpolazione rimane una precisione minore al di sotto dei 30 dB e al di sopra dei 70. C’è da aggiungere che lo strumento risente molto anche di problemi di deriva termica: il valore letto dalla porta WIO_MIC tende a decrescere con il tempo.
Ulteriori estensioni.
Seeeduino Wio Terminal dispone di 3 pulsanti programmabili via software. Volendo quindi aggiungere diversi sistemi di raccolta dati (ad esempio allargando la finestra di calcolo della media mobile, o agendo sui timer che regolano l’intervallo tra due letture successive), sarà sufficiente definire nel programma le seguenti variabili:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
#include "TFT_eSPI.h" TFT_eSPI tft; void setup() { // Codice già presente // tft.begin(); // tft.setRotation(3); /// spr.createSprite(TFT_HEIGHT, TFT_WIDTH); pinMode(WIO_KEY_A, INPUT); pinMode(WIO_KEY_B, INPUT); pinMode(WIO_KEY_C, INPUT); } void loop() { if (digitalRead(WIO_KEY_A) == LOW) { // modifica il valore della WINDOW_SIZE delay(100); } else if (digitalRead(WIO_KEY_B) == LOW) { // modifica il delay() tra le letture delay(100); } else if (digitalRead(WIO_KEY_C) == LOW) { // modifica il LOOP_PERIOD delay(1000); } } |
Considerazioni finali
Una volta assimilate le funzioni per la creazione dell’interfaccia grafica, il progetto appare abbastanza semplice:
- acquisizione di un valore analogico,
- trasformazione del valore in formato opportuno
- passaggio del valore alla routine grafica.
Prossimamente pubblicheremo un nuovo articolo che utilizza il medesimo sistema di programmazione applicativa (API) per monitorare una variabile del tutto differente.
Se nel frattempo avete domande, curiosità o richieste, non esitate a scriverci!
Link utili: