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.
Adım adım kurulum
Buzzer'ın kutbunu bulun
Buzzer'ın üzerinde genellikle + işareti vardır ve + bacak biraz daha uzundur.
Breadboard'a yerleştirin
Buzzer'ı iki bacağı ayrı sütunlara gelecek şekilde takın.
Bağlantıları yapın
+ bacağı (isteğe bağlı 100 Ω direnç üzerinden) D8'e, − bacağı GND'ye bağlayın.
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.
Tekrar dinleyin
Melodiyi yeniden duymak için Arduino üzerindeki RESET düğmesine basın.
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).
// 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.
// 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 440Derleyiciye 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
Melodi yerine tek tonda sürekli ötüyor
Ses çok cızırtılı veya kısık
tone() kullanınca D3 veya D11'deki PWM bozuluyor
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.