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):

  1. Arduino IDE -> Araçlar -> Kütüphaneleri Yönet bölümünü açın.
  2. Arama çubuğuna ESP8266Audio yazı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 AudioFileSourceBuffer boyutunu 2048'den 4096 veya 8192 byte'a çıkarın.
Tebrikler: Bu altyapıyı bir önceki yazımızdaki OLED Ekran projesiyle birleştirerek ekranda çalan şarkının adını ve istasyon bilgisini gösteren harika bir masaüstü retro radyo tasarlayabilirsiniz!