Arduino Projects: divertiamoci con le note musicali

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.

Figura 1: Schema elettrico della tastiera musicale

 

Figura 2: Schema di montaggio della tastiera musicale

Figura 2: Schema di montaggio della tastiera musicale

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);
}
}
Figura 3: Schema di montaggio con 1 led RGB

Figura 3: Schema di montaggio con un led RGB

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!

 

 

 

 

STAMPA     Tags:,

5 Commenti

  1. Maurizio Di Paolo Emilio Maurizio Di Paolo Emilio 23 dicembre 2016
  2. Andre-EMC 25 dicembre 2016
  3. Doc77 Doc77 8 febbraio 2017
    • Maurizio Di Paolo Emilio Maurizio Di Paolo Emilio 8 febbraio 2017

Scrivi un commento