
07 - TASTIERA MUSICALE
CON ALCUNE RESISTENZE E PULSANTI COSTRUISCI UNA PICCOLA TASTIERA MUSICALE
Scopri: la rete di resistenze a scala, gli array
Tempo: 45 MINUTI Livello: ■ ■ ■ ■ □ Basato sui progetti: 1, 2, 3, 4, 6
Anche se è possibile semplicemente collegare un numero di pulsanti a ingressi digitali per avere toni diversi, in questo progetto useremo una rete di resistenze a scala.

INGREDIENTI
Pulsanti (4)
Piezo
Resistenza da 220 Ohm
Resistenza da 10 Kilo Ohm
Resistenza da 1 Mega Ohm
Questa permette di leggere più pulsanti usando un solo input analogico: è una tecnica utile se ti trovi a corto di ingressi digitali. Collega i pulsanti che sono connessi in parallelo al piedino analogico 0. La maggior parte di questi pulsanti è collegata all’alimentazione attraverso una resistenza. Quando premi ogni pulsante, un livello diverso di tensione viene applicato al piedino di ingresso. Se premi due bottoni insieme, hai un unico input basato sulla relazione tra due resistenze in parallelo.

Fig. 1: Una rete di resistenze a scala e cinque pulsanti come ingresso analogico
COSTRUISCI IL CIRCUITO

Fig. 2: Questa disposizione di resistenze e pulsanti che alimenta un ingresso analogico è chiamata rete di resistenze a scala
Collega la breadboard all’alimentazione e a massa come nei progetti precedenti. Collega un’estremità del piezo a massa. Collega l’altra estremità al piedino 8 di Arduino.
Posiziona i pulsanti sulla breadboard come mostrato nel circuito. Questa disposizione di resistenze e pulsanti che alimenta un ingresso analogico è chiamata rete di resistenze a scala. Collega la prima resistenza direttamente all’alimentazione. Collega il secondo, il terzo e il quarto pulsante all’alimentazione attraverso, rispettivamente, resistenze da 220 ohm, 10 kilo ohm e 1 mega ohm. Collega tutte le uscite dei pulsanti insieme in un unico punto. Collegalo a massa con una resistenza da 10 kilo ohm e collegalo anche al piedino analogico 0. Ognuna di queste resistenze si comporta da partitore di tensione.

Fig. 3: Schema elettrico

Pensa a un contenitore per la tastiera. Mentre i vecchi sintetizzatori analogici avevano fili elettrici che spuntavano da tutte le parti, la tua tastiera è raffinata e digitale. Prepara un piccolo cartoncino per posizionare i pulsanti. Etichetta i tasti, così sai quale nota suona ogni tasto.

1. Disegna e taglia un pezzo di carta con buchi per i 4 pulsanti e il piezo. Decoralo per farlo assomigliare a una tastiera.
2. Metti il cartoncino sopra i pulsanti e il piezo. Divertiti con la tua creazione!
IL CODICE
L’array
In questo programma, hai bisogno di tenere una lista di frequenze che vuoi suonare quando schiacci ogni pulsante. Puoi iniziare con le frequenze per le note do, re, mi, fa centrali (262Hz, 294Hz, 330Hz e 349Hz). Per farlo, hai bisogno di un nuovo tipo di variabile chiamata array.
Un array è un modo per immagazzinare differenti valori che sono in relazione l’uno con l’altro, come le frequenze in una scala musicale, usando un solo nome. Sono uno strumento utile per avere accesso alle informazioni in modo veloce ed efficiente. Per dichiarare un array, inizia come faresti con una variabile, ma fai seguire al nome un paio di parentesi quadre: []. Dopo il segno uguale, metti gli elementi tra parentesi graffe.
Per leggere o cambiare gli elementi dell’array, fai riferimento ai singoli elementi usando il nome dell’array e l’indice di ciò che vuoi indirizzare. L’indice fa riferimento all’ordine nel quale compaiono gli elementi quando è creato l’array. Il primo elemento nell’array è 0, il secondo è 1 e così via.
int buttons[6];
// crea un array di 6 numeri interi
int buttons[0] = 2;
// assegna il valore 2 al primo elemento
// dell'array
Crea un array di frequenze
Crea un array di quattro note usando le frequenze indicate sopra. Rendi questo array una variabile globale dichiarandolo prima del setup().
int notes[] = {262, 294, 330, 349};
Comunicazione seriale
Nel setup(), inizia una comunicazione seriale con il computer.
void setup() {
Serial.begin(9600);
}
Leggi il valore analogico e invialo al monitor seriale
Nel loop(), dichiara una variabile locale per memorizzare il valore del piedino A0. Dato che ogni pulsante è collegato all’alimentazione tramite una resistenza di valore diverso, ognuno produce un diverso valore. Per vedere i valori, inviali al computer aggiungendo la riga Serial.println(keyVal).
void loop() {
int keyVal = analogRead(A0);
Serial.println(keyVal);
Usa un’istruzione if()…else per determinare quale nota suonare
Usando un’istruzione if()...else, puoi assegnare ogni valore a un tono diverso. I numeri inclusi nel programma d’esempio sono valori approssimativi per queste resistenze. Siccome tutte le resistenze hanno una certa tolleranza, questi potrebbero non essere perfetti. Usa le informazioni dal monitor seriale per sistemarli se necessario.
if(keyVal == 1023){
tone(8, notes[0]);
}
Suona le note che corrispondono al valore analogico
Dopo ogni istruzione if(), chiama la funzione tone(). Il programma fa riferimento all’array per determinare quale frequenza suonare. Se il valore di A0 corrisponde a una delle tue istruzioni if(), puoi dire ad Arduino di riprodurre un tono. È possibile che il tuo circuito sia un po” «rumoroso» e i valori possono oscillare un po” mentre si preme un interruttore. Per adattarsi a queste variazioni, è buona norma verificare un breve intervallo di valori. Se si utilizza il confronto &&, è possibile controllare più condizioni per vedere se sono vere.
Se premi il primo pulsante, suona notes[0]. Se premi il secondo, suona notes[1] e se premi il terzo, suona notes[2]. Questo è uno dei momenti in cui gli array diventano veramente utili.
else if(keyVal >= 990 && keyVal <= 1010){
tone(8, notes[1]);
}
else if(keyVal >= 505 && keyVal <= 515){
tone(8, notes[2]);
}
else if(keyVal >= 5 && keyVal <= 10){
tone(8, notes[3]);
}
Smetti di suonare il tono quando non è premuto nulla
Solo una frequenza può suonare su un piedino in un dato momento, quindi se premi più tasti, senti solo un suono.
Per interrompere le note quando nessun pulsante viene premuto, chiama la funzione noTone(), specificando il numero del piedino sul quale interrompere la riproduzione audio.
else{
noTone(8);
}
}
USALO
Se le resistenze sono vicine ai valori nel programma di esempio, quando premi i tasti dovresti sentire alcuni suoni dal piezo. In caso contrario, controlla il monitor seriale per assicurarti che ciascuno dei pulsanti sia in un intervallo che corrisponde alle note nella istruzione if()...else. Se stai ascoltando un suono stentoreo, prova ad aumentare un po” l’intervallo.
Premi più pulsanti insieme e vedi che tipo di valori ottieni sul monitor seriale. Usa questi nuovi valori per attivare anche più suoni. Prova con diverse frequenze per ampliare la tua produzione musicale. Trovi le frequenze delle note musicali su questa pagina: arduino.cc/frequencies

Se sostituisci i pulsanti e le scale di resistenze con sensori analogici, puoi usare le informazioni in più che ti forniscono per creare uno strumento più dinamico? Potresti usare il valore per cambiare la durata di una nota o, come nel progetto con il theremin, creare una scala di suoni.

La funzione
tone()è divertente per generare suoni, ma ha alcune limitazioni. Può creare solo onde quadre, non sinusoidi o triangoli. Le onde quadre non sembrano davvero delle onde. Come hai visto nella Fig. 1 del Progetto 06, sono una serie di impulsi acceso/spento.Prima di creare il tuo gruppo musicale tieni presente alcune cose: si può suonare solo un tono alla volta e
tone()interferisce conanalogWrite()sui piedini 3 e 11.
Gli array sono utili per raggruppare tipi simili di informazioni; vi si accede da un numero di indice che si riferisce ai singoli elementi. Le scale di resistenze sono un modo semplice per aumentare gli ingressi digitali di un sistema collegandosi a un ingresso analogico.
CODICE COMPLETO
/*
Arduino Starter Kit example
Project 7 - Keyboard
This sketch is written to accompany Project 7 in the Arduino Starter Kit
Parts required:
- two 10 kilohm resistors
- 1 megohm resistor
- 220 ohm resistor
- four pushbuttons
- piezo
created 13 Sep 2012
by Scott Fitzgerald
https://store.arduino.cc/genuino-starter-kit
This example code is part of the public domain.
*/
// create an array of notes
// the numbers below correspond to the frequencies of middle C, D, E, and F
int notes[] = { 262, 294, 330, 349 };
void setup() {
//start serial communication
Serial.begin(9600);
}
void loop() {
// create a local variable to hold the input on pin A0
int keyVal = analogRead(A0);
// send the value from A0 to the Serial Monitor
Serial.println(keyVal);
// play the note corresponding to each value on A0
if (keyVal == 1023) {
// play the first frequency in the array on pin 8
tone(8, notes[0]);
} else if (keyVal >= 990 && keyVal <= 1010) {
// play the second frequency in the array on pin 8
tone(8, notes[1]);
} else if (keyVal >= 505 && keyVal <= 515) {
// play the third frequency in the array on pin 8
tone(8, notes[2]);
} else if (keyVal >= 5 && keyVal <= 10) {
// play the fourth frequency in the array on pin 8
tone(8, notes[3]);
} else {
// if the value is out of range, play no tone
noTone(8);
}
}