Bu projede mesafe sensörü kullanarak müzik yapmayı öğreneceksin. Elektronik bir "teremin" yapacağız - bu, elini alçına yaklaştırıp uzaklaştırarak farklı notalar çıkarabileceğin özel bir müzik aleti!
Teremin, 1920'lerde Rus mucit Lev Sergeyeviç Termen tarafından icat edilmiş, dokunmadan çalınan ilk elektronik müzik aleti. Bizim versiyonumuz ultrasonic (sesötesi) mesafe sensörü kullanarak elinin sensöre olan uzaklığını ölçüyor ve bu mesafeyi müzik notalarına dönüştürüyor. Elin sensöre ne kadar yakınsa ses o kadar tiz, uzaksa o kadar pes oluyor.
Bu projede HC-SR04 ultrasonic sensörünü ve önceki projelerden tanıdığın buzzer'ı kullanacağız. Ayrıca Arduino'nun map() fonksiyonunu ve mesafe ölçümünün nasıl çalıştığını öğreneceksin.
HC-SR04 ultrasonic sensörü mesafe ölçmek için sesötesi (ultrasonic) dalgalar kullanır - tıpkı yarasaların karanlıkta yön bulmak için kullandığı sistem gibi!
Sensör şu şekilde çalışır:
Trigger (Tetik) pini - Arduino'nun 6 numaralı pininden gelen sinyal ile sensöre "mesafe ölç" komutu verilir.
Echo (Yankı) pini - Arduino'nun 5 numaralı pininden sensörün ölçüm sonucunu okur.
Sensör, trigger sinyali aldığında 40kHz frekansta 8 adet ses dalgası gönderir.
Bu dalgalar önündeki nesneden yansıyıp geri döner.
Echo pini, dalganın gidip gelme süresini Arduino'ya bildirir.
Arduino bu süreyi mesafeye çevirir. (ses hızı: yaklaşık 343 m/s)
Devre üzerinde buzzer'ın 3 numaralı pine bağlı olduğunu görüyorsun. Bu pin, tone() fonksiyonu ile farklı frekanslarda sinyal üretebildiğin pinlerden biri. (Diğeri de pin 11)
Bu projede ilk defa bir "kütüphane" kullanacağız.
Kütüphaneler, belirli bir iş için yazılmış, kendi projelerinizde kullanabileceğin hazır kodlardır.
Kütüphaneler, belirli bir iş için yazılmış, kendi projelerinizde kullanabileceğin hazır kodlardır.
O kod için gereken bir kütüphane kurulu değilse, şöyle bir hata mesajı alırsın:
Compilation error: HCSR04.h: No such file or directory
Kod çalıştığında elini mesafe sensörünün önüne yaklaştırıp uzaklaştırdığında farklı notalar duyacaksın. Elin sensöre ne kadar yakınsa ses o kadar tiz, uzaklaştırdıkça daha pes sesler çıkacak.
Bu proje için gerekli kütüphane: HCSR04 Martin Sosic
Kod çalıştığında elini mesafe sensörünün önüne yaklaştırıp uzaklaştırdığında farklı notalar duyacaksın. Elin sensöre ne kadar yakınsa ses o kadar tiz, uzaklaştırdıkça daha pes sesler çıkacak.
Kodlar:
// Arduino IDE'de menüden Araçlar → Kütüphaneleri Yönet... seçeneğini tıkla.
// Kütüphane adını yaz ve listeden doğru kütüphaneyi bul, KUR butonuna tıkla
#include <HCSR04.h> // Mesafe sensörünü yöneten kütüphaneyi dahil ediyoruz.
// --- Donanım Pin Tanımlamaları ---
const byte triggerPin = 6; // Sensöre ses dalgası yayması için sinyal gönderen pin.
const byte echoPin = 5; // Geri dönen ses dalgasını algılayan pin.
const int buzzerPin = 3; // Sesin çıkacağı hoparlör/buzzer pini.
const int ledPin = 10; // Parlaklığı değişecek LED pini (PWM destekli olmalı).
// --- Ayarlar ve Sınırlar ---
const int min_mesafe = 2; // Sensörün algılayacağı en yakın mesafe (cm).
const int max_mesafe = 50; // İstediğin gibi 50cm'ye çıkardık, daha geniş kontrol alanı sağlar.
/* Pentatonik Dizi: Bu dizi DO-RE-MI-SOL-LA notalarından oluşur.
"Penta" kelimesi Yunancada "beş" demektir.
Yani Pentatonik Dizi, içinde sadece 5 farklı nota bulunan bir müzik dizisidir.
Normalde bildiğimiz 7 tane nota varken, pentatonik dizide iki tanesini eleriz.
FA ve SI notaları yoktur. Çin veya Japon filmlerinde duyduğun
o huzurlu, egzotik müziklerin neredeyse tamamı pentatonik dizidir.
Gitaristlerin attığı soloların %90'ı bu 5 notanın etrafında döner.*/
int pentatonik[] = {
262, 294, 330, 392, 440, // 3. Oktav: DO, RE, MI, SOL, LA
523, 587, 659, 784, 880 // 4. Oktav: DO, RE, MI, SOL, LA
};
/* Müzikte de bir notadan başlayıp aynı notanın bir sonraki
teline/sesine ulaşana kadar toplam 8 nota sayarız.
Oktav, aynı notanın (örneğin Do) bir merdiven yukarıdaki
veya bir merdiven aşağıdaki "ikizi" gibidir.
Örneğin: Kalın bir LA notası saniyede 220 kez titreşiyorsa ($220$ Hz),
onun bir oktav üstündeki ince LA notası saniyede tam 440 kez ($440$ Hz) titreşir.*/
int nota_adedi = 10; // Dizide toplam 10 adet notamız var.
// Sensör nesnemizi tanımlıyoruz.
UltraSonicDistanceSensor mesafeOlcer(triggerPin, echoPin);
void setup() {
// LED pini üzerinden akım çıkışı alacağımız için OUTPUT olarak ayarlıyoruz.
pinMode(ledPin, OUTPUT);
/* Buzzer ve Sensör pinleri ilgili kütüphaneler/fonksiyonlar (tone ve HCSR04)
tarafından otomatik yönetildiği için burada ekstra tanımlamaya gerek yoktur. */
}
void loop() {
// 1. ADIM: Mesafeyi ölç.
// measureDistanceCm() bize ondalıklı (float) bir değer döner.
float mesafe = mesafeOlcer.measureDistanceCm();
// 2. ADIM: Sayıyı yuvarla.
// Hassas titremeleri engellemek için en yakın tam sayıya (integer) çeviriyoruz.
int mesafeMm = round(mesafe);
// 3. ADIM: Güvenlik ve Kontrol.
// Eğer elin sensörün menzilinden (50cm) uzaksa veya çok yakınsa sesi ve ışığı kes.
if (mesafeMm > max_mesafe || mesafeMm < min_mesafe) {
noTone(buzzerPin); // Sesi sustur.
analogWrite(ledPin, 0); // LED'i söndür.
return; // Döngünün başına dön, aşağıdaki kodları çalıştırma.
}
// 4. ADIM: LED Parlaklığını Hesapla.
/* map() fonksiyonu mesafe arttıkça parlaklığı da artırır.
Mesafe 2cm -> Parlaklık 0 (Sönük)
Mesafe 50cm -> Parlaklık 255 (En parlak)
*/
int parlaklik = map(mesafeMm, min_mesafe, max_mesafe, 0, 255);
analogWrite(ledPin, parlaklik); // PWM sinyali ile LED'i yak.
// 5. ADIM: Notayı Belirle.
/* Ölçülen 2-50 arası mesafeyi, dizimizin 0-9 arası indeksine oranlıyoruz.
Elin yakındaysa pes (kalın), uzaklaştıkça tiz (ince) notalar çalar. */
int indeks = map(mesafeMm, min_mesafe, max_mesafe, 0, nota_adedi - 1);
// 6. ADIM: Sesi Çıkar. Seçilen indeksteki frekansı buzzer pinine gönderiyoruz.
tone(buzzerPin, pentatonik[indeks]);
// 7. ADIM: Kararlılık Beklemesi.
// Sensörün kendi yankısından etkilenmemesi için çok kısa bir bekleme ekliyoruz.
delay(15);
}











