ESP32-S3 ile Analog Görünümlü Stereo VU Metre Projesi

TA3UIS

Doğan
Katılım
15 Kasım 2023
Mesajlar
3,149
Merhaba arkadaşlar,

Bir süredir üzerinde çalıştığım bir projeyi paylaşmak istedim: ESP32-S3 tabanlı, gerçek analog VU metrelere benzeyen, dokunmatik LCD ekranlı, gerçek dB ölçen bir stereo ses seviye göstergesi.

İlham Kaynağı

Bu fikri şu projeden görüp beğendim: [ESP32 Analog VU Meter — Hackaday.io](mircemk). Orijinal proje, üzerinde kendi ESP32'si gömülü olan hazır CrowPanel 3.5" HMI ESP32 modüllerini kullanıyor, yani ekran ve mikrodenetleyici tek bir kart üzerinde geliyor. Bende böyle bir modül yoktu, elimdeki donanıma (ayrı bir ESP32-S3 + standart SPI TFT ekranlar) göre sıfırdan uyarladım. Ekran sürücüsünden dB kalibrasyonuna kadar çoğu şeyi kendi donanımıma göre baştan kurmam gerekti. Konsept ve LVGL/SquareLine yaklaşımı oradan esinlenme, ama uygulamanın kendisi farklı bir donanım için baştan yazıldı.

Kullanılan Malzemeler

- ESP32-S3-N16R8 geliştirme kartı (16MB Flash, 8MB PSRAM)
- 2x 3.5" TFT LCD ekran (480x320, ST7796 sürücü, XPT2046 dokunmatik), Raspberry Pi uyumlu 40-pin header'lı modeller
- Ses girişi için kanal başına 2x 10kΩ direnç (gerilim bölücü)
- Jumper kablolar, breadboard

Yazılım

Arayüz (ibre grafiği, dB skalası, üç renkli seviye LED'i) ilham aldığım projeden geliyor, LVGL ve SquareLine Studio ile hazırlanmış hazır bir tasarım. Ben bunu kendi donanımıma entegre ettim, firmware'i Arduino/PlatformIO ile ESP32-S3 üzerinde baştan yazıldı.

Süreçte Karşılaştıklarım

Ekranı ayakta tutmak bile ilk başta sorun oldu. Ekranın gerçek sürücü çipini yanlış belişrtilmiş, ILI9486 yazıyordu ama meğerse ST7796 imiş. Doğru sürücüyü bulunca ekran düzgün çalışmaya başladı.

İbre hiç dönmüyordu, saatlerce debug ettim. Sebep çok saçmaydı: LVGL'e zamanın geçtiğini bildiren lv_tick_inc() fonksiyonunu hiç çağırmıyordum. Bu çağrı olmadan LVGL'in dahili yenileme zamanlayıcısı sadece açılışta bir kere çalışıyor, sonra hiç tetiklenmiyor. Tek satırlık bir düzeltmeydi ama bulması gerçekten zaman aldı.

"dB" yazan bir ekran koymak yetmiyor, gerçekten dB ölçmek gerekiyor. İlk versiyon ADC'den okunan ham sinyali doğrudan açıya çeviriyordu, bu gerçek dB değil, sadece yüksek/alçak gösteriyordu. Gerçek dB için sinyalin RMS gerilimini hesapladım, dB = 20 × log10(Vrms / Vref) formülüyle gerçek dB'ye çevirdim, multimetre ile ölçüp kalibre ettim (referans gerilim olarak profesyonel ses standardı +4dBu, yani 1.228V kullandım). Analog VU metrelerin skalası doğrusal değil, uçlara doğru sıkışık, bu yüzden ibrenin açısını sabit noktalarda ölçüp bir arama tablosuyla eşleştirdim.

Yüksek seviyeleri (+3dB) test ederken ESP32'nin ADC pinini yakma riskiyle karşılaştım. Sinyal jeneratörünün çıkışı ESP32'nin 3.3V sınırını rahatlıkla aşabiliyordu. Çözüm olarak AWG çıkışı ile ADC pini arasına basit bir 2:1 gerilim bölücü (iki adet 10kΩ direnç) koydum, hem pini korudu hem de gerçek ses ekipmanlarındaki sinyal koşullandırma mantığına benzer bir yaklaşım oldu.

Stereo yapmak için ikinci ekranı eklerken SquareLine'ın ürettiği arayüz kodunu hiç değiştirmeden, lv_disp_set_default() ile hangi ekranın aktif olduğunu belirleyip aynı arayüz oluşturma fonksiyonunu iki farklı ekranda ayrı ayrı çalıştırdım. Kod tekrarına gerek kalmadı.

İkinci ekranın arkaışığı çalışmadı. Görüntü ve dokunmatik tarafı tamamen sağlamdı ama arkaışık neredeyse hiç akım çekmiyordu, yaklaşık 4mA, olması gereken 200mA civarının çok altında. Uzun bir donanım debug sürecinden sonra bunun muhtemelen fabrika kusurlu bir komponent ya da lehim olduğu sonucuna vardım, yazılımla çözülecek bir şey değildi.

-3, 0 ve +3 LED'lerini de çalışır hale getirdim. Bunlar aslında SquareLine tasarımındaki arka plan resminin içine gömülü, sabit çizilmiş kutucuklardı, LVGL nesnesi değillerdi. Yani koddan yakıp söndüremezdim. Çözüm olarak bu kutucukların tam üzerine, aynı boyutta, başlangıçta görünmez üç ayrı LVGL dikdörtgeni bindirdim. Sinyal -3dB, 0dB ve +3dB eşiklerini geçtikçe bu dikdörtgenleri görünür yapıp arkadaki statik kutuyu üstüne basarak aydınlatmış gibi gösteriyorum. Gerçek ses ekipmanlarındaki gibi kümülatif çalışıyor, üst seviyeye ulaşınca alttakiler de yanık kalıyor, ve +3 (peak/clip) LED'i kısa bir tepe yapsa bile 800ms boyunca yanık kalıyor, gerçek peak-hold devrelerine benzer şekilde.

Sırada Ne Var

Şimdi de kutusunu 3D baskıyla yapmayı planlıyorum, ekranların tam oturacağı bir kasa.

Son Durum

Sol kanal tam çalışır durumda: gerçek zamanlı, kalibre edilmiş dB ölçümü yapan, analog ibre ve renkli seviye LED'leri olan bir VU metre. Sağ kanal da yazılım olarak birebir aynı şekilde çalışıyor, sadece ekranın arkaışığı donanımsal bir arıza yüzünden soluk. O da değişince proje tamamen bitmiş olacak.

Bu tarz analog gösterge projeleriyle ilgilenenlere, ekranda güzel görünmesiyle gerçekten doğru ölçmesi arasındaki farkın ne kadar büyük olabileceğini gösteren güzel bir örnek oldu diye düşünüyorum.


WhatsApp Image 2026-08-29 at 14.18.39.jpeg
WhatsApp Image 2026-08-29 at 14.18.03.jpeg
WhatsApp Image 2026-08-29 at 14.18.20.jpeg




3D Kutuyu da yapınca Dac ve Amfimi yan yana koyup kutuyu da üste ya da altı koyacağım.

WhatsApp Image 2026-08-29 at 14.24.34.jpeg
 
Son düzenleme:

Çevrimiçi personel

Forum istatistikleri

Konular
9,360
Mesajlar
149,498
Üyeler
3,875
Son üye
amandA

Son kaynaklar

Back
Top