In questo articolo vogliamo utilizzare alcuni componenti presenti nel kit di Elettronica Open Source per realizzare una semplice tastiera musicale. Attraverso una serie di pulsanti e un buzzer, programmeremo la scheda Arduino per riprodurre le classiche note musicali, offrendo quindi la possibilità di suonare delle semplici canzoni. Il progetto si basa essenzialmente sulla funzione tone() che genera un segnale digitale ad una particolare frequenza. Scegliere la nota musicale significa scegliere la frequenza giusta da riprodurre. Clicca qui per scoprire come ricevere in omaggio il nostro Kit Arduino!
Introduzione
Il nostro sistema uditivo riesce a percepire sensazioni sonore in un determinato intervallo di frequenze che appartiene al range di 20 Hz - 20 kHz. L'infrasuono appartiene ad un range di frequenze inferiore alla soglia di 20 Hz come limite inferiore per l'orecchio umano. Lo studio della loro gamma è la stessa utilizzata dai sismografi per il monitoraggio degli eventi sismici. Questi segnali possono propagarsi per lunghe distanze e aggirare ostacoli con molta semplicità. Al di sopra dei 20 kHz ci sono gli ultrasuoni, ovvero tutto quello che è al di là del suono fisico udibile. Come per altri tipi di segnali, anche in questo caso, ogni suono può essere caratterizzato da parametri quali l'intensità e la frequenza, oltre ad essere soggetto a fenomeni di riflessione e rifrazione. I musicisti individuano per ogni nota musicale una frequenza particolare, quest'ultima usata come standard internazionale. Per calcolare la frequenza delle note si utilizza la seguente formula:
f = 2N/12 * frif
dove N è il numero di semitoni ed frif è la frequenza di riferimento pari a 440 Hz.
Il progetto
L'insieme di interruttori sono collegati attraverso delle resistenze, in modo che un solo input analogico possa essere usato per la riproduzione della corrispondente frequenza. Ogni volta che si preme un pulsante viene generata una tensione analogica data dal corrispondente partitore resistivo. In figura 1 riportiamo lo schema elettrico e in figura 2 quello di montaggio. L'elenco dei componenti è riportato di seguito:
- Buzzer;
- 4 Pulsanti;
- R1 = 1 kohm;
- R2 = 10 kohm;
- R3 = 1 Mohm;
- R4 = 4.7 kohm.
Nel progetto abbiamo implementato 4 pulsanti, quindi dovremmo prendere in considerazione 4 note musicali. Lasciamo al lettore la possibilità di implementare altri pulsanti per rendere completa la tastiera musicale. In particolare consideriamo le prime 4 note: DO, RE, MI e FA; e quindi le corrispondenti frequenze di 262 Hz, 294 Hz, 330 Hz e 349 Hz. Nel codice di programmazione Arduino IDE utilizziamo una semplice variabile di tipo array per inglobare queste informazioni. Riportiamo, di seguito, il codice completo opportunamente commentato:
int musica[] = {262, 294, 330, 349}; //memorizzare in un array le note musicali void setup() { //avviamo la comunicazione seriale con il computer a 9600 baud Serial.begin(9600); } void loop() { // variabile per memorizzare il valore analogico della tensione int Val = analogRead(A0); // Inviamo i valori al PC per tenere sotto controllo i valori analogici corrispondenti Serial.println(keyVal); //adesso inseriamo delle funzioni if else per scegliere il suono in funzione del tasto premuto, ovvero del valore analogico della tensione //INT1 è premuto if(Val == 1023){ tone(8, musica[0]); } //INT2 è premuto else if(Val >= 990 && Val <= 1010){ tone(8, musica[1]); } //INT3 è premuto else if(Val >= 505 && Val <= 515){ tone(8, musica[2]); } //INT4 è premuto else if(Val >= 960 && Val <= 990){ tone(8, musica[3]); } else{ // se nessun pulsante è premuto il buzzer non emetterà nessun suono noTone(8); } }
Utilizzando il terminale di Arduino, possiamo misurare i valori analogici inviati sul pin AN0 della scheda quando vengono premuti i tasti dei pulsanti INT: osserviamo valori di 1023 per INT1, valori di circa 850 quando si preme INT2, e di circa 320 quando si preme INT3. Valori di circa 3, invece, quando è premuto l'interruttore INT4. Tutti questi valori dipendono dalle resistenze disposte vicino gli interruttori. Aggiungendo altri interruttori bisognerà scegliere un intervallo di resistenze in modo da avere valori analogici opportuni per ogni nota musicale.
Conclusioni e considerazioni
Il lettore può divertirsi nel ricreare effetti luminosi come abbiamo visto in questo articolo. Per esempio, possiamo collegare il LED RGB ai pin 3, 5 e 6 e stabilire delle condizioni di accensione in accordo alle note musicali (Figura 3). Di seguito riportiamo un esempio di codice commentato. Il lettore può provare a cambiare le colorazioni e le varie combinazioni.
int musica[] = {262, 294, 330, 349}; //memorizzare in un array le note musicali void setup() { //avviamo la comunicazione seriale con il computer a 9600 baud Serial.begin(9600); pinMode(3, OUTPUT); pinMode(5, OUTPUT); pinMode(6, OUTPUT); } void loop() { // variabile per memorizzare il valore analogico della tensione int Val = analogRead(A0); // LED RGB spento digitalWrite(3,LOW); digitalWrite(5,LOW); digitalWrite(6,LOW); //adesso inseriamo delle funzioni if else per scegliere il suono in funzione del tasto premuto, ovvero del valore analogico della tensione //INT1 è premuto if(Val == 1023){ tone(8, musica[0]); //accendi il verde digitalWrite(3, HIGH); } //INT2 è premuto else if(Val >= 800 && Val <= 900){ tone(8, musica[1]); //accendo il blu digitalWrite(5, HIGH); } //INT3 è premuto else if(Val >= 300 && Val <= 355){ tone(8, musica[2]); delay(1); //accendi il rosso digitalWrite(6, HIGH); } //INT4 è premuto else if(Val >= 1 && Val <= 5){ tone(8, musica[3]); } else { // se nessun pulsante è premuto il buzzer non emetterà nessun suono noTone(8); } }
Come fareste ad implementare gli altri pulsanti per completare le restanti note musicali ? Di seguito riportiamo una possibile lista di #define da utilizzare per completare il progetto.
#define NOTE_1 262 // DO #define NOTE_2 294 // RE #define NOTE_3 330 // MI #define NOTE_4 349 // FA #define NOTE_5 392 // SOL #define NOTE_6 440 // LA #define NOTE_7 494 // SI
E quindi il nostro array "musica" potrebbe essere scritto nel seguente modo:
int musica[] = {NOTE_1, NOTE_2, NOTE_3, NOTE_4, NOTE_5, NOTE_6, NOTE_7};
Non resta che scegliere le resistenze giuste, e quindi individuare i valori analogici inviati sul pin AN0, che permettono al buzzer di emettere il corrispondente suono attraverso l'istruzione IF. Con tanti articoli presenti nel blog possiamo divertirci per modificare a piacimento la nostra tastiera. Vi consiglio di dare un'occhiata anche a questo link con tanti articoli Arduino. Buon divertimento e buona progettazione!
Consiglio di fare questo progettino con i ragazzi per imparare la programmazione/progettazione giocando con la musica. Per poi pensare ad altre implementazioni, come incrementare il numero dei pulsanti per esempio o divertirsi con i suoni.
Ma il progetto è già completo così o necessita di qualche ritocchino ?
E’ gia’ completo cosi’…per variazioni/approfondimenti segui le conclusioni e i link all’interno.
segnalo un piccolo errore nel codice 1 per la “prova note” del buzzer con i 4 pulsanti:
si devono cambiare i valori entro cui è compresa “Val” per i tasti 2,3,4 altrimenti il buzzer emetterà il suono solo col tasto 1, restando muto premendo gli altri.
siccome al momento non avevo a disposizione tutte le stesse resistenze del progettino, ho prima controllato i valori dati da ciascun tasto nel monitor seriale, poi ho corretto il codice con questi valori:
//INT2 è premuto
(Val >= 800 && Val = 320 && Val = 3 && Val <= 100){
Quindi, per tutti quanti voglio correggere il codice, consiglio prima di verificare i valori dal monitor seriale alla pressione di ciascun tasto.
ciao buoni esperimenti.
I valori “Val” dipendono dalle resistenze che ha scelto, per quelle indicate nell’articolo i valori sono indicati nel codice. Cambiando le resistenze è giusto verificare prima con il monitor seriale e poi stabilire nuovi valori del parametro. Praticamente la configurazione è un tipico partitore di tensione.
Buondì
anch’io non capisco bene una cosa (scusate la mia ignoranza)
ma se sviluppiamo lo schema eletrico si nota che premendo 1
non si inserisce nessuna resistenza, ancorchè R4 è inserita tra
il positivo e il negativo( vedi ponticello marrone ) enon capisco il senso.
Devo procurami anch’io alcuni valori di resistenza poi proverò
Saluti
PS: cos’è il monitor seriale?
Inoltre i pulsanti 2-3-4-vengono inseriti solo se viene premuto 1
( sempre cavallotto marrone di FIG 2)
Il positivo secondo me va portato sul pin 15 della bredboard, e nel pin 13 inserita la R1
e così di seguito
Correggetemi se sbaglio
Saluti
posso riprodurre una nota collegando il tutto a un sensore di pressione piezoresistivo e far uscire il tutto da una cassa?