Metronom
Što je metronom?
Metronom služi za mjerenje i označavanje brzine izvođenja glazbe. Ta se brzina obično izražava u BPM (beats per minute – udarci u minuti), npr. 60 BPM znači 60 otkucaja u jednoj minuti.
Čemu metronom služi?
Glazbenici koriste metronom da vježbaju držanje ritma, precizno izvođenje i zajedničko sviranje u istom tempu. Posebno pomaže početnicima da nauče osjećaj za dobe i takt, jer metronom “otkucava” svaku dobu u mjeri (npr. u 4/4 mjeri svaku od četiri dobe).
Svaki takt počinje sa naglašenom dobom, a ostale su nenaglašene.
Kako bi trebao raditi Arduino metronom?
Elektronički metronom (poput ovog projekta s Arduinom) u pravilnim razmacima pali LED-ice i daje zvučni “klik” na svaku dobu. Gumbom ili potenciometrom može se mijenjati tempo (broj otkucaja u minuti) ili ritamska podjela, npr. cijela doba, pola dobe, četvrtinke i sl.
Pretpostavimo da je brzina postavljena na 60 BPM (60 taktova u minuti), dakle svaki takt traje 1 sekundu.
Cilj zadatka:
- Dobiti funkcionalni metronom, gdje će se jedna LED dioda aktivirati na svaku naglašenu dobu, a druga na nenaglašene.
- Zvučnik bi trebao dati naglašeniji “klik” na naglašenoj dobi.
- Tipkom se mijenja takt između (1/1, 2/2, 4/4…)
Potrebne komponente:
- Arduino
- 2 × LED (dvije boje)
- 2 × otpornik 200 Ω (za LED)
- zvučnik (piezo)
- tipka
1. dio: LED-ice trepere u ritmu (2/2 takt)
Spoji LED-ice preko otpornika na pinove 8 i 9 Arduina.
// C++
int LED1 = 8;
int LED2 = 9;
int bpm = 60; // udaraca u minuti
unsigned long interval; // trajanje jedne dobe u ms
void setup() {
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
interval = 60000UL / bpm; // 60000 ms / BPM = trajanje jedne dobe
}
void loop() {
// upali LED1 (npr. naglašena doba)
digitalWrite(LED1, HIGH);
digitalWrite(LED2, LOW);
delay(interval / 2);
// upali LED2
digitalWrite(LED1, LOW);
digitalWrite(LED2, HIGH);
delay(interval / 2);
}
2. dio: Zvučnik
Spoji zvučnik na pin 3 Arduina.
// C++
int LED1 = 8;
int LED2 = 9;
int BUZZER = 3;
int bpm = 60; // udaraca u minuti
unsigned long interval; // trajanje jednog takta u ms
void setup() {
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(BUZZER, OUTPUT);
interval = 60000UL / bpm;
}
void loop() {
// prva doba – jači naglasak
digitalWrite(LED1, HIGH);
digitalWrite(LED2, LOW);
tone(BUZZER, 1200, 5); // 1000 Hz, 80 ms
delay(interval / 2);
// druga doba - slabiji naglasak
digitalWrite(LED1, LOW);
digitalWrite(LED2, HIGH);
tone(BUZZER, 800, 5); // malo niži ton
delay(interval / 2);
}
3. dio: Promjena tempa tipkom
Spoji tipku na pin 2 Arduina, tako da aktiviraš interni pull-up otpornik. Svaki pritisak na tipku će promijeniti broj doba u taktu, kako je navedeno u nizu.
// C++
int LED1 = 8;
int LED2 = 9;
int zvucnik = 3;
int dugme = 2;
int bpm = 120; // udaraca u minuti
unsigned long interval; // trajanje jednog takta u ms
int dobe = 1; // podjela takta na dobe
int dobaSad = 1;
void setup() {
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(zvucnik, OUTPUT);
pinMode(dugme, INPUT_PULLUP);
Serial.begin(9600);
interval = 60000UL / bpm;
Serial.println(interval);
}
void loop() {
CitajDugme();
bool prvaDoba = dobaSad == 1;
digitalWrite(LED1, prvaDoba);
digitalWrite(LED2, !prvaDoba);
tone(zvucnik, prvaDoba ? 1200 : 800, 5); // 1200/800 Hz, 5 ms
Serial.print(prvaDoba ? '*' : '-');
delay(50);
digitalWrite(LED1, LOW);
digitalWrite(LED2, LOW);
delay(interval - 50);
dobaSad++;
if (dobaSad > dobe) {
dobaSad = 1;
}
}
void CitajDugme() {
int dval = digitalRead(dugme);
if (dval == LOW) {
dobe++;
if (dobe > 8) { // najviše 8 doba po taktu
dobe = 1;
}
Serial.println();
Serial.print("dobe = ");
Serial.println(dobe);
tone(zvucnik, 2000, 20);
delay(100);
dobaSad = 1;
}
}
Dodatna pitanja i zadaci:
- Dodaj potenciometar za promjenu broja udaraca u minuti. Dodaj potreban kod da se bpm mijenja od 15 do 200.
Što smo naučili?
- Upoznali smo se s osnovama mjere (takta) i dobe u glazbi te vidjeli kako metronom pomaže da ritam ostane stalan. Naučili smo kako brojanjem doba (1, 2, 3…) i njihovom podjelom možemo opisati različite taktove i promijeniti osjećaj glazbe bez promjene brzine.
- S elektroničke strane naučili smo spojiti jednostavan sklop na breadboardu, koristiti Arduino za upravljanje dvjema LED-icama i zvučnikom te tipkom mijenjati broj doba unutar takta. Djeca su vidjela kako se promjenom tog broja mijenja način na koji metronom broji takt (npr. 2, 3, 4… do 8 doba).
- S programerske strane savladali smo:
- deklariranje varijabli i rad s različitim tipovima (int, bool, unsigned long) za rad s pinovima, vremenom i brojačima;
- korištenje funkcija setup() i loop(), te pisanje vlastite funkcije CitajDugme() za čitljiviji i organiziraniji kod;
- upotrebu digitalWrite(), digitalRead() i tone() za upravljanje LED-icama i zvučnikom, uključujući uvjetno biranje tona pomoću operatora ? :
- rad s ulazom tipke koristeći INPUT_PULLUP i jednostavnu logiku za prepoznavanje pritiska, resetiranje brojača doba i ciklično povećavanje broja doba (od 1 do 8);
- osnovno korištenje delay() i računa s vremenom (interval, bpm) te ispis dijagnostičkih poruka preko serijske veze pomoću Serial.begin(), Serial.print() i Serial.println().
- Na jednom jednostavnom primjeru metronoma povezali smo glazbenu teoriju, elektroniku i osnove programiranja u C++ za Arduino.