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.
Inizio questa lezione con un’informazione che va a correggere quanto scritto sul sito Arduino in riferimento al Grove Light Sensor in cui erroneamente viene indicato il dispositivo come fotoresistenza, in realtà si tratta di un fototransistor e ciò, soprattutto per i neofiti può creare qualche problema di comprensione, soprattutto perché lo sketch presentato non fornisce esattamente quanto indicato.
Fotoresistenza o fototransistor?
Versione 1.0 del Grove-Light Sensor – usava una classica CdS LDR GL5528, cioè una vera fotoresistenza.
Versione 1.1 / 1.2 (quella montata sullo Shield dell’Arduino Sensor Kit) – per ragioni RoHS (il cadmio delle CdS è vietato) Seeed ha sostituito l’LDR con un LS06-S: si tratta di un sensore a fototransistor lineare (tecnicamente una fotodiodo-transistor) che “mima” la vecchia fotoresistenza ma è più rapido e lineare.
Il sito di Arduino non ha aggiornato la terminologia e continua a chiamarlo “photo-resistor”.
Ora come possiamo fare per non creare problemi a chi inizia?
Innanzi tutto se volete utilizzare una fotoresistenza vi rimando alle mie slide: Alfabeto di Arduino – Lezione 3, ma attenzione in questo caso dovrete usare una breadboard e realizzare un circuito con un resistore da 10Kohm e una fotoresistenza, in questo modo usando lo sketch presente sul sito Arduino o quelli indicati nelle mie slide tutto funzionerà ed avrete valori che variano tra 0 e circa 900, coll’esempio sul sito Arduino avrete un valore massimo più basso.
Dal punto di vista teorico cosa succede (usando una fotoresistenza):
La fotoresistenza (o LDR, Light Dependent Resistor) per rilevare l’intensità della luce:
la resistenza della fotoresistenza diminuisce quando l’intensità luminosa aumenta;
la resistenza della fotoresistenza aumenta quando l’intensità luminosa diminuisce.
L’ADC dell’Arduino la converte in un numero intero da 0 (buio) a 1023 (molta luce) quindi la lettura avviene tramite l’istruzione analogRead() per questo kit collegheremo direttamente il modulo al pin A3 e quindi nel codice scriveremo: analogRead(A3).
Serial.println(luce); // stampa il valore di luce sul Monitor Seriale
19
20
delay(1000); // attende 1 secondo prima della prossima lettura
21
}
Le cose sono simili con il Grove-Light Sensor sull’Arduino Sensor Kit, ma avrete, come dicevo, valori massimi più bassi, che raggiungo circa i 750 con la torcia dello smartphone direttamente puntata sul fototransistor. Dal punto di vista funzionale nulla cambia ma è importante aver ben presente che siamo lavorando con componenti elettronici diversi che hanno comportamenti simili.
Con lo sketch precedente otterremo sulla serial monitor questi valori:
Il fatto che il valore massimo si fermi attorno a 750 è in realtà perfettamente coerente con l’elettronica del modulo.
Quindi per ora, per chi inizia potete far finta che il componente sull’Arduino Sensor Kit è una fotoresistenza e se desiderate potete fermarvi a questo punto.
I potenziometri sono tra i resistori variabili più diffusi la cui legge di variazione della resistenza dipende da una grandezza meccanica (generalmente la rotazione di un albero, in qualche caso lo spostamento rettilineo di un cursore).
I resistori variabili sono schematicamente indicati con uno dei due simboli riportati di seguito:
Un resistore variabile è caratterizzato dal suo valore ohmico esistente tra i due terminali fissi; esso può essere utilizzato all’interno di un circuito in due modi come reostato, utilizzato come regolatore di corrente o come potenziometro utilizzato come regolatore di tensione, in questa lezione ne vedremo l’utilizzo come potenziometro.
Non tutti i potenziometri sono uguali, nei potenziometri “logaritmici” (usati negli amplificatori audio) la variazione di resistenza segue una curva esponenziale per meglio adattarsi alla percezione umana del volume.
Obiettivi di questa lezione
Comprendere il funzionamento del potenziometro come partitore di tensione variabile.
Collegare correttamente il modulo Potentiometer Grove allo shield Arduino Sensor Kit.
Misurare la posizione del cursore con analogRead() e convertire in un valore all’interno di un range fissato.
Utilizzare l’istruzione di controllo di flusso IF-THEN-ELSE.
Teoria di base
Il microcontrollore ATmega328 è dotato si 6 ADC (Analog to Digital Converter – Convertitori Analogici Digitali)
Gli ingressi analogici leggono valori compresi tra 0 e 5 volt
La risoluzione dei valori convertiti in digitale è di 10 bit (1024 valori)
Ogni bit equivale a valori di tensione pari a 5/1024 = 4,8 mV che è la più piccola misura di tensione che si può rilevare
Le grandezze fisiche del mondo reale sono di tipo analogico ed Arduino dispone di una serie di ingressi adibiti alla lettura di grandezze di tipo analogico, che come dettagliato nella lezione 1, vengono poi convertire dal microcontrollore in grandezze di tipo digitale.
Le variazioni di grandezze di tipo analogico vengono lette da Arduino come variazioni di tensione sugli ingressi analogici.
Un sensore generico quindi, connesso sui pin analogici fornirà una tensione che sarà funzione della grandezza fisica misurata.
Per poter simulare la variazione di tensione e quindi studiare il comportamento di un generico sensore e capire come leggere valori analogici, utilizzeremo in questa fase un potenziometro o un trimmer, componente elettronico che consente di variare la tensione presente ai suoi capi.
A distanza di qualche mese riprendo le mie brevi lezioni sull’uso dell’Arduino Sensor Kit, mi dispiace non stato celere nel produrre altre lezioni, ma gli impegni lavorativi mi hanno parecchio coinvolto.
Come già avevo avuto modo di segnalare nelle precedenti lezioni, per la realizzazione di queste guide prendo come riferimento l’indice presente sul sito Arduino e su quella traccia realizzo lezioni un po’ più approfondite che mi permettono poi di strutturare una lezione di laboratorio di circa due ore di attività.
Giusto per non far “arrabbiare” nessuno — mi riferisco a chi potrebbe critica le modalità con cui vengono presentati alcuni argomenti di elettronica — ricordo che queste lezioni sono dedicate a chi non ha mai affrontato lo studio dell’elettronica (neofiti o studenti della secondaria di primo grado e studenti dei primi due anni della scuola superiore), pertanto alcuni concetti richiedono chiarimenti e inevitabili semplificazioni, che consentiranno di riprendere gli stessi argomenti con maggiore facilità quando le competenze teoriche saranno più solide.
Gli obiettivi di questa terza lezione sono:
comprendere come funziona un pulsante a livello elettrico e meccanico.
sviluppare sketch via via più complessi:
accensione di un LED alla pressione del pulsante;
Indicazione dello stato del LED sulla SerialMonitor;
cicli di blink avviati da pulsante;
cicli di blink avviati da pulsante e segnalazione del numero di cicli.
Per lo svolgimento di questa esercitazione abbiamo necessità solamente dell’Arduino Sensor Kit ed utilizzeremo:
Una delle nuove caratteristiche presenti in entrambe le schede Arduino Uno R4, Minima e WiFi, è l’inclusione di un singolo DAC a 12 bit. Questo può generare tensioni di uscita discrete da 0 a 5 volt. Poiché questa funzionalità può essere di estremo interesse nelle attività di laboratorio di Elettronica ne indico di seguito il principio di funzionamento per sviluppare future esercitazioni.
Principio di funzionamento
Un DAC, o Convertitore Digitale-Analogico (in inglese: Digital-to-Analog Converter), è un dispositivo che converte un valore digitale (in binario) in un valore analogico (segnali continui che possono assumere un’infinità di valori all’interno di un intervallo).
Si tratta dell’operazione inversa di quella eseguita da un ADC, o Convertitore Analogico-Digitale, che converte un segnale analogico in una rappresentazione digitale.
Il processo di conversione avviene in tre fasi:
lettura in input dei dati digitali,
conversione in analogico
output del segnale analogico
Il DAC riceve in input un segnale digitale, che è rappresentato da una serie di valori binari (0 e 1), l’elettronica del DAC consente successivamente di convertire i valori binari in un segnale di output analogico che può essere utilizzato per pilotare dispositivi analogici come altoparlanti, motori, o altre apparecchiature che necessitano di un ingresso analogico.
Dal punto di vista pratico un DAC può essere utilizzato per creare un’uscita analogica a partire da un valore digitale utile per molte applicazioni, ad esempio per generare forme d’onda audio, per pilotare dispositivi che richiedono un input analogico, o per creare segnali di tensione variabile. Ad esempio nei sistemi audio un DAC converte i segnali audio digitali (come quelli presenti nei file MP3 o nei CD) in segnali analogici che possono essere riprodotti attraverso altoparlanti o cuffie.
Per semplificare ulteriormente nell’utilizzo con Arduino UNO R4, immaginate di avere un valore digitale che varia da 0 a 4095 (rappresentando un range di 12 bit). Un DAC potrebbe convertire questo valore in una tensione che varia, ad esempio, da 0V a 5V. Quindi, se il valore digitale fosse 512 (circa metà del range), l’uscita del DAC potrebbe essere di circa 0,6V.
Vediamo un esempio pratico.
Lo sketch che segue genera una forma d’onda sinusoidale o, meglio, una forma d’onda sinusoidale “simulata”. La frequenza della forma d’onda sinusoidale viene controllata da potenziometro.
Utilizzeremo un oscilloscopio per visualizzare l’onda sinusoidale, il collegamento è piuttosto semplice, abbiamo bisogno di un potenziometro lineare con una resistenza di 5 KOhm o superiore, io ho utilizzato un potenziometro da 10 KOhm.
La sonda dell’oscilloscopio deve essere connessa al pin A0 che viene usata come uscita del DAC. Il potenziometro ha il pin centrale connesso ad A5 (ingresso del DAC), un pin laterale connesso a 5V sulla scheda e l’altro pin laterale connesso a GND sulla scheda.
Se non possedete un oscilloscopio potete inviare l’output ad un amplificatore audio in modo che possiate ascoltare la tonalità generata, ricordate però che se procedete in questo modo bisogna assicurarsi che il controllo del volume sull’amplificatore sia al minimo, dopo di che lentamente aumentate il volume.
Il codice indicato di seguito è tratto dall’esempio di riferimento sul sito Arduino e all’interno degli esempi dell’IDE su cui ho inserito i commenti tradotti in italiano e fatto una piccola correzione.
La spiegazione del funzionamento la trovate nei commenti.
// Stampa l'aggiornmento dell frequenza impostata sulla serial monitor
24
Serial.println("La frequenza e' "+ String(frequenza) + " hz");
25
26
// Imposta la frequenza del generatore di forma d'onda sul valore aggiornato
27
wave.freq(frequenza);
28
29
// aspetta un secondo prima di ripetere la successiv rilevazione
30
delay(1000);
31
}
Volutamente ho lasciato commentata nel setup() la riga di codice in cui viene impostato il pinMode del pin A5 perché non è necessario inizializzare un pin Analogico, nell’esempio originale invece viene inizializzata.
A tal proposito per chi inizia con Arduino consiglio la lettura della guida: “Errori comuni nell’uso di Arduino – confondere pin analogici con pin digitali“.
Il risultato sarà il seguente:
E’ possibile quindi generare forme d’onda non solo sinusoidali, la funzione wave permette di impostare:
sine – onda sinusoidale
square – onda quadra
saw – onda a dente di sega
sarà sufficiente sostituire wave.sine(frequenza) presente nella sezione setup() rispettivamente con: