Geleneksel mikrodenetleyicilerde (örneğin klasik Arduino Uno'da) ses üretmek istendiğinde genellikle PWM (Darbe Genişlik Modülasyonu) sinyalleri veya piezo buzzer'lar kullanılır. Ancak PWM ile üretilen sesler boğuk, dip gürültülü ve aşırı kalitesizdir. ESP32 ise bünyesinde barındırdığı donanımsal I2S (Inter-IC Sound) çevre birimleri sayesinde, profesyonel ses cihazları standartlarında 16-bit ve 24-bit dijital ses akışlarını doğrudan işleme kapasitesine sahiptir.
Bu rehberde, popüler ve yüksek verimli MAX98357A Class-D I2S DAC amplifikatör modülünü ESP32'ye bağlayarak, WiFi üzerinden canlı MP3 web radyolarını çalan kesintisiz bir internet radyosu inşa edeceğiz.
I2S Protokolü Nedir ve Neden DAC Gereklidir?
I2S (Inter-IC Sound), dijital ses verilerini iki entegre devre arasında yüksek hızda ve sıfır kayıpla aktarmak için geliştirilmiş seri bir veri yoludur. Standart bir I2S haberleşmesi 3 temel sinyal hattı üzerinden yürütülür:
- BCLK (Bit Clock): Her bir ses bitinin zamanlamasını sağlayan seri saat hattı.
- LRC / WSEL (Left/Right Clock): Verinin sağ (R) mı yoksa sol (L) ses kanalına mı ait olduğunu belirten kanal seçim hattı.
- DIN (Data In / Serial Data): Sayısal olarak kodlanmış gerçek PCM ses örneklerinin aktarıldığı veri hattı.
MAX98357A modülü hem bir DAC (Dijitalden Analoga Dönüştürücü) hem de 3.2 Watt güç üretebilen bir Class-D amplifikatördür. Bu sayede harici bir analog amfi devresine ihtiyaç duymadan doğrudan 4Ω veya 8Ω küçük bir hoparlörü sürebilir.
ESP32 - MAX98357A Bağlantı Şeması
| MAX98357A Pini | ESP32 Pin | Görev & Not |
|---|---|---|
| VIN | 5V (VIN) | 3.2W tam güç için 5V önerilir (3.3V ile de çalışır) |
| GND | GND | Ortak toprak hattı |
| LRC | GPIO 25 | I2S Word Select (Kanal seçimi) |
| BCLK | GPIO 26 | I2S Bit Clock (Saat) |
| DIN | GPIO 22 | I2S Veri girişi |
| GAIN | Boşta veya 100kΩ GND | Boşta: 9dB gain (Standart ses seviyesi) |
Arduino IDE Kütüphane Kurulumu
Web üzerinden canlı MP3 akışını parçalara ayırmak ve I2S donanımına DMA tamponlarıyla aktarmak için ESP8266Audio kütüphanesini kullanacağız (İsminde 8266 geçse de ESP32'yi tam donanımsal DMA desteğiyle destekler):
- Arduino IDE -> Araçlar -> Kütüphaneleri Yönet bölümünü açın.
- Arama çubuğuna
ESP8266Audioyazıp Earle F. Philhower tarafından geliştirilen kütüphaneyi kurun.
Çalışan Arduino C++ İnternet Radyosu Kodu
#include <WiFi.h>
#include "AudioFileSourceHTTPStream.h"
#include "AudioFileSourceBuffer.h"
#include "AudioGeneratorMP3.h"
#include "AudioOutputI2S.h"
// WiFi Bilgileri
const char *SSID = "KODKATMAN_WIFI";
const char *PASSWORD = "guclu_sifre_123";
// Canlı MP3 Akışı URL'i
const char *RADIO_URL = "http://stream.radioparadise.com/mp3-128";
AudioGeneratorMP3 *mp3;
AudioFileSourceHTTPStream *file;
AudioFileSourceBuffer *buff;
AudioOutputI2S *out;
void setup() {
Serial.begin(115200);
delay(1000);
Serial.print("WiFi'a Baglaniyor: ");
Serial.println(SSID);
WiFi.begin(SSID, PASSWORD);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi Baglantisi Basarili! IP: " + WiFi.localIP().toString());
// I2S Donanım Konfigürasyonu
out = new AudioOutputI2S();
// BCLK: GPIO 26, LRC: GPIO 25, DIN: GPIO 22
out->SetPinout(26, 25, 22);
out->SetGain(0.4); // Ses seviyesi (0.0 ile 4.0 arasi, 0.4 ideal)
// Ağ Akışı ve Tampon (Buffer) Ayarı
file = new AudioFileSourceHTTPStream(RADIO_URL);
buff = new AudioFileSourceBuffer(file, 2048); // 2 KB buffer takılmaları engeller
mp3 = new AudioGeneratorMP3();
Serial.println("Yayin Baslatiliyor...");
mp3->begin(buff, out);
}
void loop() {
if (mp3->isRunning()) {
if (!mp3->loop()) {
mp3->stop();
Serial.println("Yayin Sonlandi!");
}
} else {
Serial.println("Yayin kesildi, 2 sn sonra tekrar baglaniliyor...");
delay(2000);
mp3->begin(buff, out);
}
}
Dip Gürültüsü ve Ses Kalitesini Artırma İpuçları
- Güç Kaynağı Paraziti: ESP32 WiFi çipi anlık 300-400 mA akım dalgalanmaları yapar. Hoparlörden "pıt pıt" veya cızırtı geliyorsa, MAX98357A'nın VIN ve GND bacakları arasına 100µF ile 470µF arası bir elektrolitik kondansatör paralel bağlayın.
- Buffer Boyutu: İnternet bağlantınız zayıfsa ve seste milisaniyelik kesilmeler oluyorsa
AudioFileSourceBufferboyutunu 2048'den 4096 veya 8192 byte'a çıkarın.