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.

laboratorio
laboratorio
Tastiera musicale con Arduino
Tipo di risorsa Tipo: laboratorio
Materia di appartenenza Materia: Sistemi automatici per le superiori 1
Avanzamento Avanzamento: laboratorio completa al 100%

Pianola

modifica

Utilizzando 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

modifica

La 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.

Componenti utilizzati
Componente q.tà
Arduino 1
Buzzer 1
Resistenze   8
Resistenza   1

Come 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:

  1. il primo con le note e lo chiamiamo Melodia
  2. il secondo con i pin dei pulsanti
  3. 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 comando noTone()). I tipi consentiti sono: unsigned int.