Tempo di lettura/visione: 4 min
Introduzione
In questo tutorial vedremo come costruire uno "strumento musicale" tecnologico programmabile! Questa attività è sicuramente molto divertente, e permetterà agli studenti appassionati di musica (e non solo) di dare sfogo a tutta la loro fantasia e creatività.
Utilizzeremo la scheda Arduino UNO e un buzzer passivo. Non resta che iniziare!
Funzione tone()
Uno dei metodi più funzionali per controllare un buzzer è l’utilizzo della funzione nativa di arduino
tone(). Questa funzione utilizza 2 o 3 parametri con la seguente sintassi:
tone(pin, frequency, duration);
- Il primo parametro, pin, è il pin digitale a cui è collegato il buzzer.
- Il secondo parametro, frequency, è la frequenza, in Hz, del tono che si vuole riprodurre.
- Il terzo parametro, duration, è la durata in millisecondi del tono, può essere omesso.
N.B. La funzione una volta richiamata inizia la riproduzione del suono e
passa subito alla parte successiva del codice senza attendere che la riproduzione sia completata, è quindi necessario, in caso si voglia riprodurre una serie di note,
inserire un opportuno delay uguale o maggiore alla durata del tono, affinché le note non si sovrappongano.
Funzionamento del programma
La
frequenza è inseribile manualmente in Hz, ma è anche possibile utilizzare una serie di costanti pubbliche contenenti tutte le note e le relative frequenze, in modo da poterle richiamare più comodamente. Queste variabili saranno disponibili una volta inserita l’opportuna libreria "
pitches.h" (che trovi a questo
link) all’interno della cartella dello sketch (raggiungibile tramite il menu nell’IDE Arduino Sketch > Apri cartella dello sketch, o più comodamente con la combinazione di tasti Ctrl + K).
Un altro accorgimento utile per l’utilizzo di tone(), può essere l’implementazione di una funzione intermedia, che chiameremo
suona(). Utilizzeremo questa funzione con due principali scopi, il primo, poter inserire automaticamente il ritardo necessario prima dell’esecuzione della successiva nota. Il secondo invece, sarà avere la possibilità di controllare la velocità di esecuzione dei suoni, senza andare a modificare i tempi delle singole note.
Variante
Nel caso si volesse riprodurre una lunga serie di note, può essere utile implementare nel codice una sorta di spartito, con relativa funzione per andarlo poi a riprodurre. Uno dei modi più intuitivi è quello creare due liste, contenenti relativamente le note, e i tempi di queste.
Per far ciò basterà dichiarare due liste (o array) nel seguente modo:
int note[] = {NOTE_C4, NOTE_D4, NOTE_E4, NOTE_F4, NOTE_G4, NOTE_A4, NOTE_B4, NOTE_C5};
int tempi[] = { 4, 4, 4, 4, 4, 4, 4, 2 };
Una volta scritto il nostro “spartito” tramite un ciclo for andremo a scorrerlo interamente, richiamando ogni volta la nostra funzione suona() con i parametri necessari.
for ( int notaAttuale = 0; notaAttuale < sizeof(note); notaAttuale ++ ) {
suona( note[ notaAttuale ], tempi[ notaAttuale ] );
}
Con questo semplice ciclo andremo a prendere dalle due liste i due valori necessari volta per volta per suonare ogni nota. Grazie al sizeof, questo andrà automaticamente a determinare la lunghezza dello spartito, è quindi possibile andarlo a modificare senza problemi, curandosi solo della corrispondenza delle note nelle due liste.