Tastiera musicale con Arduino
Questa risorsa è stata scritta dagli studenti dell'Istituto ITIS "Enrico Mattei" di Urbino, della classe 3A/EN (Andrea Piergiovanni, Matteo Coccia, Sasha Fasolo Massoli e Daniel Gostoli) nell'a.s. 2020/2021, all'interno del corso di Sistemi automatici per le superiori 1.
Per favore, prima di apportare modifiche, attendi sino alla fine dell'anno scolastico (termina il 30 giugno 2021) oppure contatta il docente di riferimento Giacomo Alessandroni nel caso venissero rilevati contenuti non in linea con le linee guida della comunità. Se leggi questo avviso ad anno scolastico concluso puoi rimuoverlo. |
Pianola
modificaUtilizzando il microcontrollore Arduino combinato con dei tasti e un cicalino andremo a replicare il principio di una normalissima pianola; con una sola tonalità che va dal Do basso al Do alto senza semitoni.
Descrizione del progetto
modificaLa piano ha un funzionamento molto semplice:
- Viene premuto il tasto;
- Arduino associa il tasto premuto alla tonalità prescelta;
- Poi invia un segnale al cicalino con la frequenza adeguata;
- Il cicalino emette il suono.
Schema di montaggio
modifica
I pulsanti sono collegati a un lato alla tensione di e all'altro con una resistenza di pull-up, che servono per evitare corto-circuiti, e il cicalino è collegato.
Il cicalino è stato collegato al pin 10 di Arduino e a massa, con una resistenza da , per limitare il flusso di corrente.
Componente | q.tà |
---|---|
Arduino | 1 |
Buzzer | 1 |
Resistenze | 8 |
Resistenza | 1 |
Codice
modificaCome prima cosa nel codice andiamo a definire delle costanti globali che sono le frequenze delle note scelte:
#define NOTE_C4 262 // DO
#define NOTE_D4 294 // RE
#define NOTE_E4 330 // MI
#define NOTE_F4 349 // FA
#define NOTE_G4 392 // SOL
#define NOTE_A4 440 // LA
#define NOTE_B4 494 // SI
#define NOTE_C5 523 // DO ALTO
Sempre a livello globale andiamo a impostare il pin alla quale è collegato il cicalino, poi andiamo a definire 3 array:
- il primo con le note e lo chiamiamo
Melodia
- il secondo con i pin dei pulsanti
- il terzo lo useremo per memorizzare i valori dei pulsanti
const int Speaker = 10; // Il pin dove andrà il buzzer o lo speaker
int Melodia[] = {NOTE_C4, NOTE_D4, NOTE_E4, NOTE_F4, NOTE_G4, NOTE_A4, NOTE_B4, NOTE_C5};
int Tasto[] = {9, 8, 7, 6, 5, 4, 3, 2}; // I pin dove andranno collegati gli 8 pulsanti
int val_Tasto[8]; // Array per la memorizzazione dei valori dei pulsanti
Nel setup
andiamo a impostare i pin collegati ai pulsanti come pin di ingresso e il pin collegato al cicalino come pin di uscita:
void setup(){
// Setta i pulsanti come input
for(int i=0; i<8; i++)
pinMode(Tasto[i], INPUT);
// Setta lo speaker come output
pinMode(Speaker, OUTPUT);
}
Nel loop
andiamo a verificare quale tasto è premuto e in base ad esso andiamo a riprodurre la nota prescelta:
void loop(){
// Legge lo stato dei pulsanti, li memorizza nell'array val_Tasto[]
// Se un pulsante è alto, lo speaker, riprodurrà la corrispondente nota musicale
for(int pin = 0; pin < 8; pin++)
if(digitalRead(Tasto[pin] == HIGH) tone(Speaker, Melodia[pin], 100);
}
Il comando tone
genera una nota musicale in uscita, e ha la seguente sintassi:
tone(pin, frequenza, durata)
dove i parametri corrispondono a:
pin
: il pin di Arduino sul quale si genera la nota musicale.
frequenza
: la frequenza della nota espressa in hertz. I tipi consentiti sono:unsigned int
.
durata
: la durata della nota espressa in millisecondi (opzionale, diversamente la nota termina col comandonoTone()
). I tipi consentiti sono:unsigned int
.