Ultrasonik theremin, HC-SR04 sensörüyle elinizin uzaklığını ölçüp bu mesafeyi ses frekansına çeviren bir Arduino projesidir. El sensöre yaklaştıkça ses incelir, uzaklaştıkça kalınlaşır; örnek kodda 5-50 cm arası 1.000-200 Hz'e karşılık gelir. Ses pasif buzzerdan ya da PAM8403 amfi ve küçük bir hoparlörden çıkar.
Dokunmadan çalınan bir müzik aleti düşünün: elinizi havada yaklaştırıp uzaklaştırdıkça ses değişiyor. Bu alete theremin denir. Bu projede ultrasonik mesafe sensörü HC-SR04 ve Arduino Uno ile basit bir theremin yapıyoruz. Proje ses dalgası, frekans ve mesafe ölçümünü birlikte öğretir; ortaokul, lise ve TÜBİTAK 4006 projeleri için uygundur.
Theremin nedir?
Theremin, çalan kişinin aletin antenlerine dokunmadan, yalnızca elinin konumuyla ses yüksekliğini ve perdesini değiştirdiği elektronik bir müzik aletidir. Rus mucit Lev Termen (Léon Theremin) tarafından 1920'de geliştirilmiştir.
Gerçek theremin, elin anten çevresinde oluşturduğu sığa (kapasite) değişimini algılar. Bizim sürümümüzde bu işi ultrasonik sensör yapar: HC-SR04 elin uzaklığını ölçer, Arduino da bu mesafeyi bir frekansa çevirip hoparlöre gönderir. Sonuç gerçek theremine benzer, ama ölçüm yöntemi farklıdır.
Hangi malzemeler gerekir?
Temel sürüm için Arduino Uno, HC-SR04 sensör, pasif buzzer ve bir buton yeterlidir. Daha yüksek ses isteyenler PAM8403 amfi ve 4 Ω hoparlör ekler.
Malzeme listesi
| Malzeme | Adet | Ne işe yarar? |
|---|---|---|
| Arduino Uno R3 (CH340, USB kablolu) | 1 | Mesafeyi ölçer, sesi üretir |
| HC-SR04 ultrasonik mesafe sensörü | 1 | Elin uzaklığını ölçer (2-400 cm) |
| Pasif buzzer 17 mm | 1 | Temel sürümde ses çıkışı |
| 6x6 mm tact buton | 1 | Kaygan ses ve nota modu arasında geçiş |
| PAM8403 ses kontrollü amfi | 1 | İsteğe bağlı; sesi yükseltir |
| 4 Ω 2 W hoparlör (44x44 mm) | 1 | İsteğe bağlı; amfiye bağlanır |
| 10 kΩ direnç, breadboard, jumper kablolar | 1 | Amfi girişi ve bağlantılar |
Pasif buzzer kullanıyoruz, çünkü aktif buzzer tek bir tonda öter ve frekansı değiştirilemez. Farkı aktif ve pasif buzzer farkı yazısında anlattık.
HC-SR04 mesafeyi nasıl ölçer?
HC-SR04, 40 kHz'lik ultrasonik bir ses darbesi gönderir ve yankının dönüş süresini Echo pininde darbe genişliği olarak verir; Arduino bu süreyi 58'e bölerek mesafeyi santimetre olarak bulur.
Ses havada 20 °C'de yaklaşık 343 m/s hızla gider, yani 1 cm'yi yaklaşık 29 µs'de alır. Darbe gidip geri geldiği için 1 cm mesafe yaklaşık 58 µs yankı süresine karşılık gelir. Sensörün çalışma ayrıntıları HC-SR04 ultrasonik sensör yazısında.
Devre nasıl bağlanır?
HC-SR04'ün Trig ucu D9'a, Echo ucu D10'a; pasif buzzer D8'e, buton D2'ye bağlanır. Sensör ve Arduino USB'den 5V ile beslenir.
- HC-SR04: VCC → 5V, Trig → D9, Echo → D10, GND → GND. Sensörü yukarı bakacak şekilde, bir sensör tutucuyla sabitleyin.
- Pasif buzzer: artı (+) ucu D8'e, diğer ucu GND'ye.
- Buton: bir ucu D2'ye, çaprazındaki ucu GND'ye. Kod iç pull-up direncini kullanır.
- Yüksek ses için (isteğe bağlı): buzzer yerine D8'i 10 kΩ direnç üzerinden PAM8403'ün sol (L) ses girişine, amfinin ses girişi GND'sini Arduino GND'sine bağlayın. Amfiyi 5V ve GND'den besleyin; hoparlörü L+ ve L− çıkışlarına takın.
- USB kablosunu takıp kodu yükleyin ve elinizi sensörün 5-50 cm üstünde gezdirin.
PAM8403 köprü (BTL) çıkışlıdır: hoparlörün eksi ucu GND'ye bağlanmaz, yalnızca L− çıkışına gider. Amfinin ayrıntıları PAM8403 mini amfi yazısında.
Theremin kodu nasıl çalışır?
Kod her 30 ms'de mesafeyi ölçer; el 5-50 cm arasındaysa mesafeyi frekansa çevirip tone() ile çalar, bu aralığın dışındaysa sesi keser. Buton kaygan ses ile nota modu arasında geçiş yapar.
const byte TRIG = 9, ECHO = 10, SES = 8, BUTON = 2;
const int NOTA[] = {262, 294, 330, 349, 392, 440, 494, 523}; // Do4..Do5
bool notaModu = false;
long mesafeOlc() {
digitalWrite(TRIG, LOW);
delayMicroseconds(2);
digitalWrite(TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG, LOW);
long sure = pulseIn(ECHO, HIGH, 30000); // en cok 30 ms bekle
if (sure == 0) return -1; // yanki yok
return sure / 58; // cm
}
void setup() {
pinMode(TRIG, OUTPUT);
pinMode(ECHO, INPUT);
pinMode(BUTON, INPUT_PULLUP);
}
void loop() {
if (digitalRead(BUTON) == LOW) { // mod degistir
notaModu = !notaModu;
delay(300);
while (digitalRead(BUTON) == LOW);
}
long cm = mesafeOlc();
if (cm < 5 || cm > 50) {
noTone(SES); // el yok: sessiz
} else if (notaModu) {
int i = 7 - (cm - 5) * 8 / 46; // yakin = tiz nota
tone(SES, NOTA[i]);
} else {
tone(SES, map(cm, 5, 50, 1000, 200)); // kaygan ses
}
delay(30);
}
Mesafe hangi sese karşılık gelir?
Kaygan modda el yaklaştıkça frekans doğrusal olarak artar; nota modunda 5-50 cm aralığı, her biri yaklaşık 6 cm genişliğinde sekiz bölgeye ayrılır ve her bölge bir Do majör notası çalar.
| Mesafe | Kaygan mod | Nota modu |
|---|---|---|
| 5-10 cm | 1.000-912 Hz | Do5 (523 Hz) |
| 11-16 cm | 894-805 Hz | Si4 (494 Hz) |
| 17-22 cm | 787-698 Hz | La4 (440 Hz) |
| 23-27 cm | 680-609 Hz | Sol4 (392 Hz) |
| 28-33 cm | 592-503 Hz | Fa4 (349 Hz) |
| 34-39 cm | 485-396 Hz | Mi4 (330 Hz) |
| 40-45 cm | 378-289 Hz | Re4 (294 Hz) |
| 46-50 cm | 272-200 Hz | Do4 (262 Hz) |
Do5'in frekansı Do4'ün yaklaşık iki katıdır; bu aralığa oktav denir. La4 notası 440 Hz'dir ve çalgıların akordunda başvuru sesi olarak kullanılır.
Hangi güvenlik kurallarına dikkat edilmeli?
- Devreyi bilgisayarın USB çıkışından ya da 5V USB adaptörden besleyin; 220V'a hiçbir şey bağlamayın.
- Hoparlörü doğrudan Arduino pinine bağlamayın; pinin akım sınırı aşılır. Hoparlör yalnızca amfiye bağlanır.
- Amfinin ses düğmesini kısık başlatın; yüksek frekanslı ses yakından kulağı rahatsız eder.
- Projeyi öğretmen ya da yetişkin gözetiminde kurun.
Ödevinizi nasıl sunarsınız?
Nota modunda basit bir çocuk şarkısının ilk ölçülerini çalmak sunumu akılda kalıcı yapar.
- Problem: "Bir cisme dokunmadan uzaklığı nasıl ölçeriz ve bunu sese nasıl çeviririz?"
- Deney: Elinizi cetvelle 10, 20, 30 ve 40 cm'ye koyup sesi telefondaki bir frekans ölçer uygulamasıyla ölçün; tabloyla karşılaştırın.
- Hesap: 58 µs/cm değerinin ses hızından nasıl çıktığını gösterin.
- Rapor: Bağlantı şemasını, mesafe-frekans tablosunu ve kodun açıklamasını ekleyin.
- Geliştirme: İkinci bir HC-SR04 ile ses şiddetini de elle kontrol edin.
Sık sorulan sorular
Ses neden kesik kesik ya da titrek çıkıyor?
Ultrasonik ölçüm her seferinde birkaç milimetre farklı sonuç verebilir; bu da frekansın sürekli biraz değişmesine yol açar. Son üç ölçümün ortalamasını almak sesi yumuşatır. Sensörün önünde yansıma yapan başka cisimler olmamalı; elinizi düz ve sensöre dik tutun.
Aktif buzzer ile theremin yapılabilir mi?
Yapılamaz. Aktif buzzerin içinde sabit frekanslı bir osilatör vardır ve Arduino onu yalnızca açıp kapatabilir. Theremin için frekansın değişmesi gerektiği için pasif buzzer ya da amfi ve hoparlör kullanılmalıdır.
Ses aralığını nasıl değiştirebilirim?
Kaygan modda map(cm, 5, 50, 1000, 200) satırındaki 1000 ve 200 değerlerini değiştirin. Örneğin 2000 ve 100 yazarsanız ses aralığı genişler. Mesafe aralığını büyütmek için 5 ve 50 değerlerini değiştirebilirsiniz; ancak 80 cm'nin üstünde el algılaması zorlaşır.
Hoparlörü doğrudan Arduino'ya bağlayabilir miyim?
Bağlamayın. Küçük bir hoparlörün direnci 4-8 Ω'dur ve doğrudan bağlandığında pinden izin verilen akımdan çok daha fazlası çekilir. Ses yükseltmek için PAM8403 gibi bir amfi ya da bir transistörlü sürücü devresi kullanın.
Özet
- Ultrasonik theremin, HC-SR04 ile ölçülen el mesafesini ses frekansına çevirir.
- Bağlantı: Trig D9, Echo D10, pasif buzzer D8, mod butonu D2.
- Mesafe = yankı süresi / 58; ses 5-50 cm aralığında çalar, dışında susar.
- Kaygan modda 1.000-200 Hz, nota modunda Do4-Do5 arası sekiz nota çalar.
- Yüksek ses için PAM8403 amfi ve 4 Ω hoparlör kullanılır; hoparlör pine doğrudan bağlanmaz.
