Nell’articolo precedente è stato illustrato in modo teorico l’utilizzo di un array. Da tal proposito in questo articolo vi sarà illustrato un tutorial su come realizzare e comporre tramite l’ausilio di un cicalino passivo la famigerata colonna sonora dei pirati dei Caraibi.
Come si è potuto ben evincere, per approcciare nel mondo di Arduino vi è data la necessità di conoscere determinati argomenti di programmazione.
I componenti richiesti per realizzare tale progetto sono:
Ora il prossimo passo consiste nel collegare il cicalino alla scheda UNO, il cavo rosso (positivo) al pin 8 e il cavo nero (negativo) alla messa a terra GND.
Nella seguente immagine è riportato il diagramma elettrico:
Prima di giungere al codice riguardante il componimento della famigerata colonna sonora è buona norma illustrare due sketch tramite i quali sarà possibile ben intravedere la differenza tra l’utilizzo di varie variabili semplici e l’utilizzo di un array.
Nei seguenti sketch sono stati utilizzati 6 LED collegati ai pin 2-7 medianti resistori da 220 Ohm. Il primo sketch utilizza 6 variabili semplici e fa lampeggiare in modo sequenziale i led, uno per uno. Per raggiungere tale scopo è stata utilizzata la seguente funzione: digitalWrite (pinNum, HIGH/LOW).
Il secondo sketch mostra l’uso di un array e di un ciclo for per eseguire lo stesso scopo. Ma in questo sono state utilizzate molte meno righe.
Ecco il primo sketch:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
//dichiarazioni variabili int pin2 = 2; int pin3 = 3; int pin4 = 4; int pin5 = 5; int pin6 = 6; int pin7 = 7; int timer = 100; void setup(){ //dichiaro le seguenti variabili come variabili di OUTPUT pinMode(pin2, OUTPUT); pinMode(pin3, OUTPUT); pinMode(pin4, OUTPUT); pinMode(pin5, OUTPUT); pinMode(pin6, OUTPUT); pinMode(pin7, OUTPUT); } void loop() { //con la funzione digitalWrite nel momento in cui il parametro è HIGH il led corrispondente si accenderà //con la funzione digitalWrite nel momento in cui il parametro è LOW il led corrispondente si spegnerà digitalWrite(pin2, HIGH); delay(timer); digitalWrite(pin2, LOW); delay(timer); digitalWrite(pin3, HIGH); delay(timer); digitalWrite(pin3, LOW); delay(timer); digitalWrite(pin4, HIGH); delay(timer); digitalWrite(pin4, LOW); delay(timer); digitalWrite(pin5, HIGH); delay(timer); digitalWrite(pin5, LOW); delay(timer); digitalWrite(pin6, HIGH); delay(timer); digitalWrite(pin6, LOW); delay(timer); digitalWrite(pin7, HIGH); delay(timer); digitalWrite(pin7, LOW); delay(timer); digitalWrite(pin6, HIGH); delay(timer); digitalWrite(pin6, LOW); delay(timer); digitalWrite(pin5, HIGH); delay(timer); digitalWrite(pin5, LOW); delay(timer); digitalWrite(pin4, HIGH); delay(timer); digitalWrite(pin4, LOW); delay(timer); digitalWrite(pin3, HIGH); delay(timer); digitalWrite(pin3, LOW); delay(timer); } |
Ecco il secondo sketch:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
int pinArray[] = {2, 3, 4, 5, 6, 7}; //la dichiarazione del vettore, la dimensione è stata omessa in quanto sono presenti i valori all'interno delle parentesi graffe //la dimensione è calcolata automaticamente dal compilatore. int count = 0; //la variabile contatore utilizzata all'interno dei cicli for. int timer = 100; void setup(){ //tramite questo ciclo for sarà possibile impostare le variabili come variabili di output for (count=0;count<6;count++) { pinMode(pinArray[count], OUTPUT); } } void loop() { for (count=0;count<6;count++) { digitalWrite(pinArray[count], HIGH); delay(timer); digitalWrite(pinArray[count], LOW); delay(timer); } for (count=5;count>=0;count--) { digitalWrite(pinArray[count], HIGH); delay(timer); digitalWrite(pinArray[count], LOW); delay(timer); } } |
Da come ben si può evincere, nel momento in cui si fa utilizzo di tipologie di dati dello stesso tipo. l’uso di un vettore permette di impiegare molte meno variabili e oltre ad ottimizzare e snellire il codice.
Nelle seguenti righe è disponibile il codice tramite il quale è possibile realizzare il componimento dei Pirati dei Caraibi.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 |
const int buzzer = 8; //in tale stringa vi è selozionato il pin // per cui il cicalino è collegato dal filo rosso const int velocitasuono = 1.5; #define NOTE_DO4 262 #define NOTE_RE4 294 #define NOTE_MI4 330 #define NOTE_FA4 349 #define NOTE_SOL4 392 #define NOTE_LA4 440 #define NOTE_SI4 494 #define NOTE_DO5 523 #define NOTE_RE5 587 #define NOTE_MI5 659 #define NOTE_FA5 698 #define NOTE_SOL5 784 #define NOTE_LA5 880 #define NOTE_SI5 988 //nel vettore note è presente lo spartito int note[] = { NOTE_MI4, NOTE_SOL4, NOTE_LA4, NOTE_LA4, 0, NOTE_LA4, NOTE_SI4, NOTE_DO5, NOTE_DO5, 0, NOTE_DO5, NOTE_RE5, NOTE_SI4, NOTE_SI4, 0, NOTE_LA4, NOTE_SOL4, NOTE_LA4, 0, NOTE_MI4, NOTE_SOL4, NOTE_LA4, NOTE_LA4, 0, NOTE_LA4, NOTE_SI4, NOTE_DO5, NOTE_DO5, 0, NOTE_DO5, NOTE_RE5, NOTE_SI4, NOTE_SI4, 0, NOTE_LA4, NOTE_SOL4, NOTE_LA4, 0, NOTE_MI4, NOTE_SOL4, NOTE_LA4, NOTE_LA4, 0, NOTE_LA4, NOTE_DO5, NOTE_RE5, NOTE_RE5, 0, NOTE_RE5, NOTE_MI5, NOTE_FA5, NOTE_FA5, 0, NOTE_MI5, NOTE_RE5, NOTE_MI5, NOTE_LA4, 0, NOTE_LA4, NOTE_SI4, NOTE_DO5, NOTE_DO5, 0, NOTE_RE5, NOTE_MI5, NOTE_LA4, 0, NOTE_LA4, NOTE_DO5, NOTE_SI4, NOTE_SI4, 0, NOTE_DO5, NOTE_LA4, NOTE_SI4, 0, NOTE_LA4, NOTE_LA4, NOTE_LA4, NOTE_SI4, NOTE_DO5, NOTE_DO5, 0, NOTE_DO5, NOTE_RE5, NOTE_SI4, NOTE_SI4, 0, NOTE_LA4, NOTE_SOL4, NOTE_LA4, 0, NOTE_MI4, NOTE_SOL4, NOTE_LA4, NOTE_LA4, 0, NOTE_LA4, NOTE_SI4, NOTE_DO5, NOTE_DO5, 0, NOTE_DO5, NOTE_RE5, NOTE_SI4, NOTE_SI4, 0, NOTE_LA4, NOTE_SOL4, NOTE_LA4, 0, NOTE_MI4, NOTE_SOL4, NOTE_LA4, NOTE_LA4, 0, NOTE_LA4, NOTE_DO5, NOTE_RE5, NOTE_RE5, 0, NOTE_RE5, NOTE_MI5, NOTE_FA5, NOTE_FA5, 0, NOTE_MI5, NOTE_RE5, NOTE_MI5, NOTE_LA4, 0, NOTE_LA4, NOTE_SI4, NOTE_DO5, NOTE_DO5, 0, NOTE_RE5, NOTE_MI5, NOTE_LA4, 0, NOTE_LA4, NOTE_DO5, NOTE_SI4, NOTE_SI4, 0, NOTE_DO5, NOTE_LA4, NOTE_SI4, 0, NOTE_MI5, 0, 0, NOTE_FA5, 0, 0, NOTE_MI5, NOTE_MI5, 0, NOTE_SOL5, 0, NOTE_MI5, NOTE_RE5, 0, 0, NOTE_RE5, 0, 0, NOTE_DO5, 0, 0, NOTE_SI4, NOTE_DO5, 0, NOTE_SI4, 0, NOTE_LA4, NOTE_MI5, 0, 0, NOTE_FA5, 0, 0, NOTE_MI5, NOTE_MI5, 0, NOTE_SOL5, 0, NOTE_MI5, NOTE_RE5, 0, 0, NOTE_RE5, 0, 0, NOTE_DO5, 0, 0, NOTE_SI4, NOTE_DO5, 0, NOTE_SI4, 0, NOTE_LA4 }; //lo spartito della colonna sonora dei pirati dei caraibi, //lo 0 (0 Hz) raprresenta che in quel preciso momento non deve essere prodotto nessun suono. int durata[] = { 125, 125, 250, 125, 125, 125, 125, 250, 125, 125, 125, 125, 250, 125, 125, 125, 125, 375, 125, 125, 125, 250, 125, 125, 125, 125, 250, 125, 125, 125, 125, 250, 125, 125, 125, 125, 375, 125, 125, 125, 250, 125, 125, 125, 125, 250, 125, 125, 125, 125, 250, 125, 125, 125, 125, 125, 250, 125, 125, 125, 250, 125, 125, 250, 125, 250, 125, 125, 125, 250, 125, 125, 125, 125, 375, 375, 250, 125, 125, 125, 250, 125, 125, 125, 125, 250, 125, 125, 125, 125, 375, 125, 125, 125, 250, 125, 125, 125, 125, 250, 125, 125, 125, 125, 250, 125, 125, 125, 125, 375, 125, 125, 125, 250, 125, 125, 125, 125, 250, 125, 125, 125, 125, 250, 125, 125, 125, 125, 125, 250, 125, 125, 125, 250, 125, 125, 250, 125, 250, 125, 125, 125, 250, 125, 125, 125, 125, 375, 375, 250, 125, 375, 250, 125, 375, 125, 125, 125, 125, 125, 125, 125, 125, 375, 250, 125, 375, 250, 125, 375, 125, 125, 125, 125, 125, 500, 250, 125, 375, 250, 125, 375, 125, 125, 125, 125, 125, 125, 125, 125, 375, 250, 125, 375, 250, 125, 375, 125, 125, 125, 125, 125, 500 }; //in tale vettore vi è l'intervallo di tempo per //cui ciascuna nota del vettore note[i] sarà prodotta. void setup() { } //tone è la funzione che permette di generare il suono //tramite il cicalino, vi sono tre parametri formali, //il primo parametro costituisce il pin in cui è collegato il cicalino, //il secondo parametro è costituito dal vettore note (lo spartito) //e dalle relative frequenze //il terzo parametro è costituito dal periodo durante //il quale verrà prodotto ciascun suono. void loop() { for (int i=0;i<203;i++){ int attesa = durata[i] * velocitasuono; tone(buzzer,note[i],attesa); delay(attesa);} delay (2000); // delay(2000) costituisce l'intervallo di tempo per cui //una volta terminato il brano lo ricomincerà da capo } |
Link guida:
- Arduino IDE: che cos’è un array o vettore #8
- Arduino IDE: led RGB e cicli for, while e do while #7
- Arduino IDE: ciclo for e differenze con while e do while #6
- Arduino IDE: ciclo while e do while #5
- Arduino IDE: accendere led con un bottone (if) #4.1
- Arduino IDE: la struttura condizionale IF #4
- Arduino IDE: operatori aritmetici, relazione e logici #3
- Arduino IDE: variabili, costanti e macro #2
- Arduino IDE: in che maniera si crea un programma? #1
- Arduino IDE: che cos’è e come funziona #0
Link utili
- Arduino UNO R3
- Elegoo UNO R3
- Arduino Starter Kit per principianti
- Elegoo Advanced Starter Kit
- Arduino Nano
- Arduino e buzzer: componiamo i Pirati dei Caraibi
Seguici per non perdere le prossime novità!