26 Mart 2024 Salı

Buzzer ile bir melodi çalmak

 Buzzer ses çıkaran bir çeşit elektronik bileşendir. Bu örnekte buzzer çıkardığı sesleri notasal bir düzene dizip tanıdık bir melodi nasıl çalınırı işleyeceğiz.



Piezo buzzer olarak da bilinen bu ses çıkaran bileşen üzerinde + ve - olmak üzere 2 uç bulunmaktadır. Arduino ile kuracağımız sistemde - uç düşük değerli bir direnç ile GND'ye, + uç ise dijital pinlerden birine bağlanır. 

Buzzerdan ses çıkarmak için Arduino'da tone ve ses çıkarmamak için de noTone komutlarını kullanacağız. 

tone(2,250); kodu 2 numaralı pine bağlanan buzzer'a 250 değerini gönderdik. Gönderdiğimiz 250 değeri bir frekans değeridir. Bu frekansa göre notasal bir ses çıkarır. yani her notanın bir frekans değeri vardır. Örneğin do notası 261 hertz değerindedir.

noTone(2); kodu ise 2 numaralı pine bağlanan buzzer'a ses göndermez susturur.

Bir melodi birden fazla sayıda notaların belirli aralıklarla peş peşe çalınmasıyla oluşmaktadır. tone komutu ile Arduino'dan buzzer'a notaları gönderirsek ve aralarında bir miktar gecikme yaparsak bir melodi elde edebiliriz. Bunun için notaların değerlerini bilmemiz gerekmektedir. 

Bir tam sayıyı tanıtmak için int sayı = 261; kodunu kullanıyorduk. Aynı şekilde notaları da bu şekilde tanıtabiliriz fakat bu sefer farklı bir değişken tanıtma komutundan bahsedelim. #define do_ 261 komutu ile do_ adında bir değişkene 261 değerini eşitlemiş olduk. define kelime anlamı olarak tanımlamadır. do_ yapmamızın nedeni ise değişken kurallarına göre bazı isimlerin komut olmasından yani do adında bir komut olmasından dolayı do notasına do_ adını vermiş olduk.

Bu tanımlamadan sonra tone(2,do_) komutu kullanırsam do_ yerine 261 geleceği için 2 numaralı pindeki buzzer'a 261 değeri gönderir ve buzzer do notası sesi çıkarır. Notaların değerleri ve tanımlamaları aşağıdaki gibidir.

#define do_ 261
#define re 294
#define mi 329
#define fa 349
#define sol 392
#define la 440
#define si 493

Bu değerler Arduino formlarında verilmiş değerlerdir. Şimdi gelelim bu notalardan bir melodi oluşturmaya. Melodi oluşması için bu notaların art arda olması gerekir. Mesela do_, re, re, fa, sol, mi gibi 6 notayı art arda ve aralarında kısa bekletmeler ile çalıştırırsak bir melodi ortaya çıkar. 


Beethoven'un 9 numaralı senfonisinden meşhur olan hemen hemen herkesin kulağının aşina olduğu bir melodinin nota sıralaması aşağıdaki gibidir. 

mi,mi,fa,sol,sol,fa,mi,re,do_,do_,re,mi,mi,re,re,mi,mi,fa,sol,sol,fa, mi, re, do_, do_, re, mi, re, do_, do_, re, re, mi, do_, re, mi, fa, mi, do_, re, mi, fa, mi, re, do_ , re, sol, mi, mi, mi, fa, sol, sol, fa, mi, re, do_, do_, re, mi, re, do_, do_

Şimdi bu notaları bir küme mantığında Arduino'ya kaydetmemiz gerekir. Önceki derslerde bir değişken içine bir içerik girebiliyorduk. Mesela sayı=45 dersek sayı değişkeni 45 değeri almaktadır. Ama çiftsayılar diye bir küme yapmak istersem o zaman ciftsayilar[]={2,4,6,8}; komutunu kullanmam gerekir. Bu sayede ciftsayilar adında bir değişken oluşturmuş oldum ve türü de küme yani yazılım dilinde dizi değişkeni oluşturmuş oldum. Bu dizinin içinde 4 tane eleman yani sayı vardır. Örneğin ciftsayılar[2] kodunun içeriği 6'dır. Eleman sayıları 0'dan başlar. 0. eleman 2, 1. eleman 4 diye ilerler. Şimdi bunu öğrendikten sonra yukarıdaki notaları melodi adında bir diziye eklersek melodiler tek bir değişken içinde bulunur. Bunları da melodi[0], melodi[1].... gibi sırasıyla tone komutuna eklersek istediğimiz melodiyi buzzer ile çıkarmış oluruz. Aşağıdaki kodlar ile bu melodiyi Arduino ile çalmak mümkün oluyor.

#define do_ 261
#define re 294
#define mi 329
#define fa 349
#define sol 392
#define la 440
#define si 493

int melodi[]={mi,mi,fa,sol,sol,fa,mi,re,do_,do_,re,mi,mi,re,re,mi,mi,fa,sol,sol,fa, mi, re, do_, do_, re, mi, re, do_, do_, re, re, mi, do_, re, mi, fa, mi, do_, re, mi, fa, mi, re, do_ , re, sol, mi, mi, mi, fa, sol, sol, fa, mi, re, do_, do_, re, mi, re, do_, do_};
int notasayisi=sizeof(melodi)/sizeof(int);//melodi içinde kaç tane eleman yani nota var tam sayı şeklinde verir

void setup()
{
pinMode(2,OUTPUT);
}

void loop() {
 
 for(int a=0;a<notasayisi;a++)
 {
   tone(2,melodi[a]);
   delay(250);  
  }
 noTone(2);
 delay(1000); // melodide tüm notalar çaldıktan sonra herhangi bir ses çıkarmadan 1 saniye beklemesi için
}

Notalar ilk bölümde #define ile tanıtılıyor. Ardından melodi[] adındaki dizi oluşturuluyor ve içine notalar ekleniyor. nota sayısı çok olduğu için saymakla uğraşmıyoruz ve sizeof komutu ile bu melodi içindeki notaların sayısını buluyoruz ki bu bize notaları çağırırken kullanacağımız for döngüsünde lazım olacak.

Gelelim for döngüsüne, bu döngü melodi içindeki notaların peş peşe çalınması için bize gereklidir. For döngüsüne verilen a değişken değerinin 0 dan başlaması ile melodi[a] ile melodinin ilk elemanı yani 0. elemanından başlayıp nota sayısına kadar olan elemanına kadar 250 milisaniye bekleyerek notaları buzzer üzerinde ses haline dönüştürür.

Bu çalışmayı Tinkercad sitesinde incelemek için aşağıdaki adrese tıklayın. Ücretsiz üyelik seçenekleri ile giriş yapabilirsiniz.

Hiç yorum yok:

Yorum Gönder