@wtFAQ
◀ Osnove programiranja u C++ za Arduino

Metronom

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

Takt i doba
Takt je metrična jedinica u glazbi. Služi kao osnovni okvir za stvarnu glazbu. Ukazuje na ritam pjesme, promjene u ritmu i naglascima, itd. Takt se sastoji od jedne ili više doba.
Svaki takt počinje sa naglašenom dobom, a ostale su nenaglašene.
Mehanički metronom
Klasični mehanički metronom je kućište u obliku piramide s klatnom na prednjoj strani i utegom koji se pomiče gore–dolje po letvici. Kad se klatno zanjihalo, opružni mehanizam i escapement osiguravaju da ono titra pravilnom brzinom; položaj utega određuje tempo (skalirana ljestvica s BPM vrijednostima otisnuta je uz letvicu).

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.

metronom 1
// 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.

metronom 2
// 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.

metronom 3
// 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.

ligtbulb Š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.
◀ Osnove programiranja u C++ za Arduino