
Utilizzo del microfono analogico
In questa lezione vedremo come utilizzare il sensore di suono integrato nell’Arduino Sensor Kit, leggeremo il segnale analogico prodotto con l’istruzione analogRead() e ne interpreteremo i valori.
Verrà introdotto, in modo estremamente semplice il concetto di decibel e vedremo come procedere alla calibrazione del microfono in funzione delle attività di sperimentazione che verranno proposte.
Il microfono del Sensor Kit è pre‑cablato sulla linea analogica A0 tramite il connettore Grove, quindi non sono necessari ulteriori collegamenti.
Principio di funzionamento
Il modulo Grove Sound Sensor è un ottimo strumento per misurare i rumori intorno a voi. Quando l’aria vibra a causa di un suono, una sottile membrana nel microfono si piega avanti e indietro. Questi movimenti generano una variazione di tensione: più forte è il suono, più grande è la variazione e quindi più alto sarà il numero che andremo a leggere con Arduino mediante l’istruzione analogRead().
Approfondimento tecnico
Per chi ha qualche competenza in più in elettronica aggiungo che all’interno del modulo è presente un microfono a elettrete o microfono electret collegato a un piccolo amplificatore (LM358). L’amplificatore rende il segnale abbastanza grande da poter essere rilevabile da Arduino. Un circuito chiamato rivelatore di inviluppo converte le onde sonore in un valore di tensione continua che rappresenta l’intensità del suono istantaneo.
- Il segnale in uscita varia da 0 V (silenzio) a 5 V (suono molto forte).
- Arduino lo misura con il convertitore A/D a 10 bit, producendo numeri da 0 a 1023.
- Il modulo è sensibile a frequenze fino a ~20 kHz (oltre il limite dell’udito umano).
- L’amplificatore amplifica il segnale di circa 26 dB, così anche suoni deboli diventano misurabili.
- Il consumo di corrente è basso, circa 4‑5 mA.
Nelle specifiche del dispositivo parlo di convertitore A/D a 10 bit e decibel (dB) e indico che l’amplificatore amplifica, in modo più semplice, ingrandisce di 26 dB, vediamo cosa vuol dire.
Qualche concetto tecnico spiegato in modo semplice
Cos’è un convertitore A/D a 10 bit
Un convertitore A/D (Analogico → Digitale) è come un traduttore: trasforma la tensione continua che esce dal sensore in numeri che il microcontrollore può elaborare.
10 bit significa che abbiamo 2¹⁰ = 1024 possibili valori, da 0 (0 V) a 1023 (5 V circa). Ogni “scalino” vale quindi circa 5 V / 1023 ≈ 0,005 V (5 millivolt). Più bit, più la scala è fine e la misura precisa.
Che cosa sono i decibel (dB) e perché l’amplificatore “ingrandisce” di 26 dB?
Il decibel (dB) è una grandezza adimensionale ed è un modo logaritmico di confrontare due grandezze: dice “quante volte più grande” è un segnale rispetto a un altro, ma usa il logaritmo per compattare numeri dimensionalmente diversi in una scala più gestibile. Inoltre il nostro orecchio non percepisce l’intensità del suono in modo lineare: se la potenza acustica raddoppia non ci sembra “due volte più forte”, ma solo un po’ più intensa. Questa risposta psicoacustica si descrive bene con una scala logaritmica, perciò usiamo i decibel.
Per le tensioni si usa la formula:
dB = 20 × log10(V2 / V1)
- 0 dB ⇒ stessa tensione
- +6 dB ⇒ tensione circa doppia
- −6 dB ⇒ tensione circa metà
Dire che l’amplificatore aumenta il segnale di 26 dB significa che la tensione in uscita è circa 20× (volte) più grande di quella che entra (perché 20× ≈ 26 dB). Così anche un suono debole crea un segnale abbastanza grande da essere misurato da Arduino.
ATTENZIONE
Questo sensore è pensato per percepire la presenza di suoni e valutarne l’intensità, non per registrare l’audio né per misurazioni professionali in decibel. Per avere dati certificati servono microfoni calibrati e convertitori più veloci.
Esempio di base
8 | const int pinSuono = A2; |
10 | const int sogliaRumore = 200; |
13 | pinMode(pinLED, OUTPUT); |
18 | int livello = analogRead(pinSuono); |
23 | if (livello > sogliaRumore) { |
30 | digitalWrite(pinLED, HIGH); |
32 | digitalWrite(pinLED, LOW); |
35 | Serial.print( "Livello: " ); |
36 | Serial.print(livello); |
37 | Serial.print( " Rumore forte? " ); |
38 | Serial.println(rumoreForte ? "SI" : "NO" ); |
Continua a leggere→