BP–04 · Başlangıç projesi

Buzzer ile Melodi Çalma

Ses, saniyede belirli sayıda titreşen havadır. Bu projede Arduino'ya notaların frekanslarını öğretip pasif buzzer ile "Daha Dün Annemizin" ezgisini çaldıracağız.

SeviyeBaşlangıç
Süre30 dk
Malzeme7 çeşit
tone()noTone()FrekansDizi (array)sizeof()#define

Proje hakkında

Buzzer'lar ikiye ayrılır: aktif buzzer içinde kendi osilatörü olduğu için 5V verildiğinde tek bir tonda öter. Pasif buzzer ise bir hoparlör gibidir; hangi frekansta sinyal gönderirseniz o notayı çalar. Melodi çalmak için pasif buzzer gerekir.

Bu projede notaları frekans değerlerine dönüştürecek, melodiyi ve nota sürelerini iki ayrı dizide saklayacak ve bir for döngüsüyle sırayla çalacağız. Diziler, programlamada birbirine benzeyen çok sayıda veriyi düzenli tutmanın temel yoludur.

  • Aktif ve pasif buzzer arasındaki farkı
  • tone() ve noTone() fonksiyonlarını
  • Notaların frekans karşılıklarını
  • Diziler ve sizeof() ile eleman sayısını bulmayı

Malzeme listesi

Projeyi tamamlamak için aşağıdaki 7 çeşit malzemeye ihtiyacınız var. Parçaların çoğu Arduino başlangıç setlerinde hazır olarak bulunur.

Arduino Uno R3 1 adet

Projenin beyni. Nano veya Mega ile de aynı kod çalışır.

Breadboard 1 adet

Lehimsiz devre kurmak için yarım boy (400 delik) yeterlidir.

Pasif buzzer 1 adet

Altı açık, yeşil devre kartı görünen model genellikle pasiftir.

100 Ω direnç (isteğe bağlı) 1 adet

Ses seviyesini biraz azaltır ve pini korur.

Push buton (isteğe bağlı) 1 adet

Geliştirme kodunda melodiyi başlatmak için.

Jumper kablo (erkek-erkek) 4 adet

USB A-B kablosu 1 adet

Kodu yüklemek ve kartı bilgisayardan beslemek için.

Devre bağlantıları

Bağlantıları USB kablosu takılı değilken yapın. Her satır, bileşenin hangi bacağının Arduino'nun hangi pinine gideceğini gösterir; çizgi rengi önerilen kablo rengidir.

Buzzer + bacağıD8İsteğe bağlı 100 Ω direnç üzerinden
Buzzer − bacağıGNDDoğrudan GND
Aktif ve pasif buzzer'ı ayırt etmek için buzzer'ı kısa bir an doğrudan 5V ve GND'ye bağlayın. Sürekli bir "biiip" duyuyorsanız aktiftir; sadece "tık" sesi geliyorsa pasiftir ve bu proje için doğru buzzer'dır.

Adım adım kurulum

  1. Buzzer'ın kutbunu bulun

    Buzzer'ın üzerinde genellikle + işareti vardır ve + bacak biraz daha uzundur.

  2. Breadboard'a yerleştirin

    Buzzer'ı iki bacağı ayrı sütunlara gelecek şekilde takın.

  3. Bağlantıları yapın

    + bacağı (isteğe bağlı 100 Ω direnç üzerinden) D8'e, − bacağı GND'ye bağlayın.

  4. Kodu yükleyin

    Aşağıdaki kodu yükleyin. Melodi setup() içinde olduğu için kart her açıldığında bir kez çalar.

  5. Tekrar dinleyin

    Melodiyi yeniden duymak için Arduino üzerindeki RESET düğmesine basın.

  6. Kendi melodinizi yazın

    melodi[] ve sureler[] dizilerini değiştirerek başka bir ezgi deneyin. İki dizinin eleman sayısının aynı kalmasına dikkat edin.

Arduino kodu

Kodları Arduino IDE'ye yapıştırıp yükleyebilirsiniz. Türkçe karakterler yalnızca yorum satırlarında kullanıldı; Seri Port Ekranına yazdırılan metinlerde bilerek kullanılmadı.

Daha Dün Annemizin ezgisi (halk ezgisi, telifsiz).

melodi.ino
// Buzzer ile Melodi Çalma
// RobotikHocasi.com

// Nota frekansları (Hz)
#define NOTA_C4 262   // Do
#define NOTA_D4 294   // Re
#define NOTA_E4 330   // Mi
#define NOTA_F4 349   // Fa
#define NOTA_G4 392   // Sol
#define NOTA_A4 440   // La
#define NOTA_B4 494   // Si
#define NOTA_C5 523   // İnce Do

const int buzzerPin = 8;

int melodi[] = {
  NOTA_C4, NOTA_C4, NOTA_G4, NOTA_G4, NOTA_A4, NOTA_A4, NOTA_G4,
  NOTA_F4, NOTA_F4, NOTA_E4, NOTA_E4, NOTA_D4, NOTA_D4, NOTA_C4,
  NOTA_G4, NOTA_G4, NOTA_F4, NOTA_F4, NOTA_E4, NOTA_E4, NOTA_D4,
  NOTA_G4, NOTA_G4, NOTA_F4, NOTA_F4, NOTA_E4, NOTA_E4, NOTA_D4,
  NOTA_C4, NOTA_C4, NOTA_G4, NOTA_G4, NOTA_A4, NOTA_A4, NOTA_G4,
  NOTA_F4, NOTA_F4, NOTA_E4, NOTA_E4, NOTA_D4, NOTA_D4, NOTA_C4
};

// 4 = dörtlük nota, 2 = ikilik nota
int sureler[] = {
  4, 4, 4, 4, 4, 4, 2,
  4, 4, 4, 4, 4, 4, 2,
  4, 4, 4, 4, 4, 4, 2,
  4, 4, 4, 4, 4, 4, 2,
  4, 4, 4, 4, 4, 4, 2,
  4, 4, 4, 4, 4, 4, 2
};

const int notaSayisi = sizeof(melodi) / sizeof(melodi[0]);

void setup() {
  for (int i = 0; i < notaSayisi; i++) {
    int notaSuresi = 1000 / sureler[i];        // ms cinsinden süre
    tone(buzzerPin, melodi[i], notaSuresi);    // Notayı çal
    delay(notaSuresi * 1.30);                  // Notalar arasında küçük boşluk
    noTone(buzzerPin);                         // Sesi durdur
  }
}

void loop() {
  // Melodi bir kez çalındı. Tekrar için RESET'e basın.
}

Bonus: D2'ye bağlı butona (INPUT_PULLUP, diğer bacağı GND) her basışta melodiyi çalar.

melodi_buton.ino
// Butona basınca melodi çalan kapı zili
#define NOTA_C5 523
#define NOTA_E5 659
#define NOTA_G5 784

const int buzzerPin = 8;
const int butonPin = 2;

int zil[]   = { NOTA_G5, NOTA_E5, NOTA_C5 };
int sure[]  = { 250, 250, 500 };

void setup() {
  pinMode(butonPin, INPUT_PULLUP);   // Dahili direnç: basılınca LOW
}

void loop() {
  if (digitalRead(butonPin) == LOW) {
    for (int i = 0; i < 3; i++) {
      tone(buzzerPin, zil[i], sure[i]);
      delay(sure[i] + 50);
    }
    noTone(buzzerPin);
    delay(300);   // Tekrarlı tetiklemeyi önle
  }
}

Kod açıklaması

#define NOTA_A4 440

Derleyiciye NOTA_A4 gördüğü her yere 440 yazmasını söyler. Bellek harcamaz ve kodu okunaklı yapar. 440 Hz, müzisyenlerin akort için kullandığı La notasıdır.

int melodi[] = { ... };

Notaları sırayla tutan bir dizi. Köşeli parantezin içi boş bırakıldığında derleyici eleman sayısını kendisi hesaplar.

sizeof(melodi) / sizeof(melodi[0])

Dizinin toplam bayt boyutunu tek elemanın boyutuna bölerek eleman sayısını bulur. Nota ekleyip çıkardığınızda bu satırı değiştirmeniz gerekmez.

tone(buzzerPin, melodi[i], notaSuresi)

Pinde belirtilen frekansta bir kare dalga üretir ve süre dolunca kendiliğinden durur.

delay(notaSuresi * 1.30)

Notayı çaldıktan sonra %30 fazla bekler. Bu küçük sessizlik notaların birbirine yapışmasını önler.

Nasıl çalışır?

tone() fonksiyonu, Arduino'nun içindeki bir zamanlayıcıyı (Timer2) kullanarak pini saniyede istenen sayıda açıp kapatır. 440 Hz için pin saniyede 440 kez HIGH ve 440 kez LOW olur. Pasif buzzer'ın içindeki piezo disk bu sinyalle aynı hızda titreşir ve havayı titreştirerek sesi oluşturur.

Her oktav yukarı çıktığında frekans iki katına çıkar: La4 440 Hz, La5 880 Hz'dir. Bu yüzden NOTA_C5 (523 Hz), NOTA_C4'ün (262 Hz) yaklaşık iki katıdır. Kendi melodinizi yazarken bu ilişkiyi kullanarak yeni notalar türetebilirsiniz.

Sorun giderme

Hiç ses yok
Buzzer'ın + ve − bacaklarını kontrol edin. Kodda buzzerPin değerinin kablonun takılı olduğu pinle aynı olduğundan emin olun.
Melodi yerine tek tonda sürekli ötüyor
Aktif buzzer kullanıyorsunuz. Pasif bir buzzer ile değiştirin.
Ses çok cızırtılı veya kısık
Buzzer'ı breadboard'dan çıkarıp masaya bastırmadan tutun; titreşimin sönümlenmesi sesi bozar. Direnç kullanıyorsanız değerini düşürün.
tone() kullanınca D3 veya D11'deki PWM bozuluyor
tone(), Timer2'yi kullandığı için bu pinlerdeki analogWrite ile çakışır. PWM gereken başka bir pin seçin.

Geliştirme fikirleri

Projeyi tamamladıysanız, aşağıdaki fikirlerle bir adım öteye taşıyabilirsiniz.

Mini piyano

8 buton ekleyip her birine bir nota atayarak bir oktavlık piyano yapın.

Alarm saati sesi

millis() ile belirli aralıklarla çalan bir alarm melodisi yazın.

Işığa duyarlı müzik

LDR ile ortam ışığına göre frekansı değiştiren bir "theremin" yapın.

Oyun sesleri

Kazanma ve kaybetme için kısa efekt sesleri tasarlayıp başka projelerinize ekleyin.

Sık sorulan sorular

Aynı anda iki nota çalabilir miyim?
tone() fonksiyonu aynı anda yalnızca bir pinde ses üretir. Çok sesli müzik için Tone kütüphanesi veya harici ses modülleri gerekir.
Hoparlör kullanabilir miyim?
Küçük bir 8 Ω hoparlörü 100 Ω direnç üzerinden bağlayabilirsiniz. Daha yüksek ses için bir transistör veya amplifikatör modülü kullanın.
Neden melodi loop() yerine setup() içinde?
loop() içine yazsaydık melodi sonsuza kadar tekrar ederdi. setup() bir kez çalışır; test için daha az yorucudur.

Bir sonraki projeye hazır mısınız?

Başlangıç serisindeki 10 projeyi sırayla tamamladığınızda sensör, motor ve ekran kullanımının temellerini öğrenmiş olursunuz.

Başlangıç projelerine dön