Ses seviyesi ölçer (VU metre), bir mikrofon modülünün sinyalini Arduino ile okuyup ses yükseldikçe daha fazla LED yakan bir göstergedir. MAX9814 mikrofon modülü ve 10 LED'li WS2812 çubukla tek veri pini kullanılarak kolayca yapılır. Gösterge sesi karşılaştırır; kalibre edilmiş bir desibel ölçer değildir.
Müzik setlerindeki zıplayan ışık çubuklarını hepiniz görmüşsünüzdür. Bu yazıda aynı göstergeyi bir mikrofon modülü, Arduino ve renkli LED'lerle kuruyoruz. Proje, sesin bir dalga olduğunu ve şiddetinin ölçülebildiğini gösterdiği için fen derslerine ve sınıf gürültüsü gibi araştırma konularına çok uygundur. Malzeme listesi, bağlantı, kod ve sunum önerileri aşağıda.
Ses seviyesi ölçer (VU metre) nedir?
Ses seviyesi ölçer (VU metre), ortamdaki sesin şiddetini yanan LED sayısıyla gösteren bir göstergedir. VU, İngilizcede "volume unit" yani ses birimi anlamına gelir. Ses yükseldikçe çubuk uzar; sessizlikte LED'ler söner.
Mikrofon, ses dalgasının oluşturduğu basınç değişimini küçük bir elektrik sinyaline çevirir. Modüldeki yükselteç bu sinyali büyütür. Arduino sinyali kısa aralıklarla okuyup en büyük ve en küçük değer arasındaki farkı, yani tepeden tepeye genliği hesaplar. Genlik ne kadar büyükse ses o kadar şiddetlidir.
Hangi malzemeler gerekir?
VU metre için Arduino, bir mikrofon modülü, 10 LED'li WS2812 çubuk ve bir 330 Ω direnç yeterlidir.
Malzeme listesi
| Malzeme | Adet | Ne işe yarar? |
|---|---|---|
| Arduino Uno (USB kablolu) | 1 | Sesi okur, LED'leri yakar |
| MAX9814 mikrofon yükselteç modülü | 1 | Sesi güçlendirilmiş analog sinyale çevirir |
| WS2812 NeoPixel çubuk, 10 LED | 1 | Ses seviyesini renkli çubukla gösterir |
| Direnç seti (1/4 W) | 1 | 330 Ω (veri hattı) ve 220 Ω (LED'li sürüm) dirençleri |
| KY-038 ses sensör kartı | 1 (isteğe bağlı) | MAX9814 yerine daha basit, daha az hassas seçenek |
| 3 mm ve 5 mm LED seti | 1 (isteğe bağlı) | Tek tek LED'li sürüm için |
MAX9814, kazancı kendiliğinden ayarlayan (AGC) bir yükselteç içerir; bu sayede fısıltıyı da alkışı da gösterebilir. KY-038 kartının analog çıkışı daha zayıftır; konuşmaları göstermekte zorlanabilir, ama alkış ve yüksek müzikte çalışır.
WS2812 mi tek tek LED mi kullanılmalı?
Az kablo ve renk geçişi istiyorsanız WS2812 çubuk, devre elemanlarını tek tek tanımak istiyorsanız ayrı LED'ler seçilmelidir. İki sürüm de aynı mikrofon kodunu kullanır.
| Özellik | WS2812 çubuk (10 LED) | 10 adet ayrı LED |
|---|---|---|
| Arduino pini | 1 (D6) | 10 (D2-D11) |
| Direnç | Veri hattına 1 adet 330 Ω | Her LED'e 1 adet 220 Ω |
| Renk | Koddan seçilir (yeşil, sarı, kırmızı) | LED rengiyle sabit |
| Kablo sayısı | 3 kablo | 20'den fazla kablo |
| Akım | LED başına en çok yaklaşık 60 mA (beyaz, tam parlak) | LED başına yaklaşık 14 mA |
WS2812 LED'lerin bağlantısı ve kütüphanesi RGB LED ve WS2812B bağlantısı yazısında ayrıntılı anlatılıyor.
Devre nasıl bağlanır?
MAX9814'ün OUT ucu A0'a, WS2812 çubuğun DIN ucu 330 Ω direnç üzerinden D6'ya bağlanır; iki modül de Arduino'nun 5V ve GND pinlerinden beslenir. Bağlantıyı USB kablosu çıkarılmışken yapın.
- MAX9814 modülünü bağlayın: VDD → 5V, GND → GND, OUT → A0. Gain ve A/R uçlarını boş bırakın; Gain boşken kazanç en yüksek değerdedir (60 dB).
- WS2812 çubuğun 5V (ya da VCC) ucunu Arduino 5V'a, GND ucunu GND'ye bağlayın.
- Arduino D6 pininden çıkan kabloya 330 Ω direnç ekleyin ve direncin diğer ucunu çubuğun DIN (veri girişi) ucuna bağlayın. DOUT ucu boş kalır.
- Çubuğu dik ya da yatay olarak bir kartona sabitleyin; 1. LED (DIN tarafı) çubuğun alt ucu olsun.
- USB kablosunu takın ve kodu yükleyin.
Arduino IDE'de Kütüphane Yöneticisi'nden "Adafruit NeoPixel" kütüphanesini kurun.
#include <Adafruit_NeoPixel.h>
const byte MIK_PIN = A0, LED_PIN = 6, LED_SAYI = 10;
const int SESSIZ = 20; // sessiz odada okunan genlik
const int GURULTU = 400; // en yuksek beklenen genlik
Adafruit_NeoPixel serit(LED_SAYI, LED_PIN, NEO_GRB + NEO_KHZ800);
byte tepe = 0;
unsigned long tepeZaman = 0;
void setup() {
Serial.begin(9600);
serit.begin();
serit.setBrightness(40); // USB akimini dusuk tutar
serit.show();
}
void loop() {
unsigned long bas = millis();
int enAz = 1023, enCok = 0;
while (millis() - bas < 50) { // 50 ms boyunca ornek al
int v = analogRead(MIK_PIN);
if (v < enAz) enAz = v;
if (v > enCok) enCok = v;
}
int genlik = enCok - enAz; // tepeden tepeye genlik
Serial.println(genlik);
int seviye = map(constrain(genlik, SESSIZ, GURULTU), SESSIZ, GURULTU, 0, LED_SAYI);
if (seviye >= tepe) { tepe = seviye; tepeZaman = millis(); }
else if (millis() - tepeZaman > 600) { tepe--; tepeZaman = millis() - 500; }
for (byte i = 0; i < LED_SAYI; i++) {
uint32_t renk = 0; // sonuk
if (i < seviye) {
if (i < 6) renk = serit.Color(0, 150, 0); // yesil
else if (i < 8) renk = serit.Color(150, 110, 0); // sari
else renk = serit.Color(150, 0, 0); // kirmizi
}
serit.setPixelColor(i, renk);
}
if (tepe > seviye) serit.setPixelColor(tepe - 1, serit.Color(120, 120, 120));
serit.show();
}
Kod her 50 ms'de bir genliği ölçer ve 20-400 aralığını 0-10 LED'e çevirir. İlk 6 LED yeşil, sonraki 2 LED sarı, son 2 LED kırmızı yanar. Beyaz "tepe" noktası en yüksek seviyede 0,6 saniye kalır, sonra yavaşça düşer. MAX9814'ün çıkışı en çok yaklaşık 2 V tepeden tepeye olduğu için genlik 400 civarını pek geçmez.
Kalibrasyon nasıl yapılır?
- Seri Monitör'ü 9600 baud hızında açın ve odada sessizken birkaç saniye genlik değerlerini izleyin.
- Görülen en yüksek sessizlik değerinin biraz üstünü
SESSIZsabitine yazın. - Yüksek sesle alkışlayın ya da müzik çalın; görülen en büyük değeri
GURULTUsabitine yazın ve kodu yeniden yükleyin.
VU metre gerçek desibel ölçer mi?
Hayır, bu VU metre sesleri birbirleriyle karşılaştırır ama desibel (dB) cinsinden kesin ölçüm yapmaz. Desibel ölçerler bilinen bir ses kaynağıyla kalibre edilir; mikrofon modülleri ise kalibre edilmemiştir ve AGC kazancı sürekli değiştirir.
Yine de göstergeyi sunumda yaygın ses düzeyleriyle karşılaştırabilirsiniz. Desibel ölçeği logaritmiktir: 10 dB artış, ses şiddetinin 10 kat arttığı anlamına gelir.
| Ortam | Yaklaşık düzey | Göstergede beklenen |
|---|---|---|
| Fısıltı | ≈ 30 dB | 0-1 LED |
| Normal konuşma | ≈ 60 dB | Yeşil bölge |
| Kalabalık teneffüs | ≈ 70-80 dB | Sarı bölge |
| Uzun süre maruz kalınca işitmeye zararlı | 85 dB ve üstü | Kırmızı bölge |
Kesin değerleri, telefonunuza kuracağınız bir ses ölçer uygulamasıyla karşılaştırarak kendi tablonuzu oluşturabilirsiniz. Ses sensörlerinin dijital çıkışla kullanımı için alkışla yanan lamba yazısına bakabilirsiniz.
Hangi güvenlik kurallarına dikkat edilmeli?
Proje yalnızca USB'nin 5V gerilimiyle çalışır ve güvenlidir; yine de birkaç kurala uyun.
- WS2812 çubuğu tam beyaz ve tam parlaklıkta çalıştırmayın; 10 LED birlikte 0,6 A'e kadar çekebilir ve USB portunu zorlar. Kod parlaklığı 40/255'e sınırlar.
- LED'lere yakından bakmayın; parlak ışık gözü yorar.
- Sesi test etmek için kulağa zarar verecek kadar yüksek müzik çalmayın.
- Bağlantıyı değiştirmeden önce USB kablosunu çıkarın. 5V ile GND'yi birbirine değdirmeyin.
- Projede 220V hiçbir cihaz kullanılmaz; hoparlörü de ayrı, kendi fişiyle çalıştırın.
Projeyi nasıl sunarsınız?
Projeyi, okulunuzun farklı yerlerindeki ses düzeylerini karşılaştıran küçük bir araştırma olarak sunabilirsiniz.
- Soru: "Okulun en gürültülü yeri neresi, en gürültülü zaman hangisi?"
- Ölçüm: Sınıf, koridor, kantin ve kütüphanede bir dakika boyunca en çok yanan LED sayısını not edin.
- Veri: Seri Çizici (Serial Plotter) ile genlik grafiğinin ekran görüntüsünü alın.
- Sonuç: Ölçümleri sütun grafikte gösterin ve işitme sağlığı için önerilerinizi yazın.
- Rapor: Amaç, sesin fiziği, malzemeler, devre şeması, kod, ölçüm tablosu ve sonuç bölümlerini ekleyin.
Sergide çubuğu bir müzik kutusunun ön yüzüne yerleştirip ziyaretçilerden alkışlamalarını istemek dikkat çekici olur.
Sık sorulan sorular
LED'ler hiç yanmıyorsa ne yapmalıyım?
Önce Seri Monitör'de genlik değerlerinin sesle değişip değişmediğine bakın. Değerler değişiyorsa sorun LED tarafındadır: DIN ucunun D6'ya, okun gösterdiği giriş tarafına takıldığını kontrol edin. Değerler hep sabitse mikrofonun OUT ucunun A0'a ve VDD ucunun 5V'a bağlı olduğundan emin olun.
Sessizken de LED'ler yanıyorsa sebebi nedir?
Ortam gürültüsü ya da elektriksel parazit, SESSIZ eşiğinin üstünde kalıyordur. Seri Monitör'de sessizlikteki değerleri okuyup SESSIZ sabitini biraz yükseltin. MAX9814 çok hassastır; bilgisayar fanı ve klima sesini bile algılayabilir. Gerekirse Gain ucunu GND'ye bağlayarak kazancı 50 dB'e düşürün.
KY-038 ile de yapılabilir mi?
Evet, KY-038 kartının A0 çıkışı Arduino'nun A0 pinine bağlanarak aynı kod kullanılabilir. Ancak kartta güçlü bir yükselteç olmadığından genlik değerleri küçük kalır. GURULTU sabitini Seri Monitör'de gördüğünüz en büyük değere göre, örneğin 60-100 arasına düşürmeniz gerekir. Kartın dijital çıkışı ise yalnızca "ses var" ya da "yok" bilgisi verir.
Daha fazla LED eklenebilir mi?
Evet, WS2812 çubuklar zincirlenebilir. Birinci çubuğun DOUT ucunu ikinci çubuğun DIN ucuna bağlayıp koddaki LED_SAYI değerini artırmanız yeterlidir. 20 LED'i aşan düzenlerde akım arttığı için LED'leri harici bir 5V kaynakla besleyin ve kaynağın GND'sini Arduino GND'siyle birleştirin.
Müziğin ritmine göre renk değiştirmek mümkün mü?
Evet, basit bir yöntemle mümkündür. Genlik ani olarak yükseldiğinde, örneğin bir önceki ölçümün iki katını geçtiğinde, bir "vuruş" sayıp bütün çubuğun rengini değiştirebilirsiniz. Bas ve tiz sesleri ayırmak ise frekans analizi (FFT) gerektirir; bu, lise düzeyinde ileri bir proje konusudur.
Özet
- VU metre, mikrofon sinyalinin tepeden tepeye genliğini ölçüp yanan LED sayısına çevirir.
- MAX9814 OUT ucu A0'a, WS2812 çubuğun DIN ucu 330 Ω direnç üzerinden D6'ya bağlanır.
- Kod 50 ms'lik ölçümlerde 20-400 genlik aralığını 0-10 LED'e çevirir: 6 yeşil, 2 sarı, 2 kırmızı.
- Gösterge sesleri karşılaştırır; kalibre edilmiş bir desibel ölçer değildir.
- Parlaklığı sınırlayın, yüksek sesten kaçının ve yalnızca USB'nin 5V gerilimiyle çalışın.
