Dołącz do naszej grupy Telegram — tam osobiście odpowiadam na pytania, dzielę się poradami, schematami, kodem i trikami dotyczącymi montażu i konfiguracji.
Перейти в Telegram

NEWS

Podłączamy PCM5102 do ESP32 w PlatformIO

 W tej instrukcji omówimy, jak podłączyć moduł DAC PCM5102 do płytek ESP32 (na przykładzie ESP32 WROOM 32D) za pomocą PlatformIO i rozwiązać typowe problemy: brak dźwięku (cisza) lub pojawiające się trzaski. Jako bonus — ważny trik z zworkami na płytce.

 Problem: PCM5102 nie działa z ESP32

 Podczas próby użycia zestawu ESP32 WROOM 32D (30 pinów) i PCM5102 w środowisku PlatformIO często zamiast dźwięku słychać całkowitą ciszę lub nieustanne trzaski. Standardowe szkice mogą nie działać, a w internecie nie zawsze znajdziemy bezpośrednie rozwiązanie tego konkretnego problemu.

Specyfikacja PCM5102:

  • 32-bitowy DAC może rozróżniać ponad 4 miliardy poziomów sygnału (2³²). (Przykłady: 16-bit — jakość CD. 24-bit — jakość studyjna.)
  • Interfejs I2S (czytane jako „aj-tu-es”) to sposób, w jaki układy scalone przesyłają między sobą cyfrowy dźwięk.
  • Zakres dynamiczny: 112 dB — to bardzo dobry wynik, ponieważ im wyższa wartość, tym lepsza jakość dźwięku. (Jakość CD — około 96 dB. Urządzenia studyjne — od 100 dB wzwyż.)

 Komponenty i podłączenie

  • Płytka: ESP32 WROOM 32D (30 pinów)
  • Moduł DAC: PCM5102

Schemat podłączenia PCM5102 do ESP32:

  • SCK -> GND
  • BCK (BCLK) -> GPIO 26
  • DIN (DATA) -> GPIO 22
  • LCK (LRCK) -> GPIO 25
  • GND -> GND
  • VIN -> 3.3V (można zasilić z zewnętrznego źródła, ale najpierw sprawdzić z ESP32)


 I wisienka na torcie — aby ten kod zadziałał i PCM5102 w końcu zaczął wydawać dźwięki, trzeba na odwrocie PCM5102 przylutować zworki zgodnie z obrazkiem poniżej.


 Kod pliku platformio.ini


[env:esp32dev]
platform = espressif32
board = esp32dev
framework = arduino
monitor_speed = 115200

lib_deps = 
    esphome/ESP32-audioI2S@^2.0.7

 Kod w main.cpp (zwróć uwagę, że main.c został przemianowany na main.cpp). W głównym pliku programu (main.cpp) należy prawidłowo zainicjować wyjścia I2S. Podaj piny w następującej kolejności: BCK, LCK, DIN.

#include <wifi.h>
#include "Audio.h"

const char* ssid = "FIFI NAME";
const char* password = "WIFI PASS";
const char* streamURL = "http://zt01.cdn.eurozet.pl/zet-net.mp3";

Audio audio;

void setup() {
  Serial.begin(115200);
  Serial.println("Inicjalizacja radia...");

  // Połączenie z WiFi
  Serial.print("Łączenie z WiFi: ");
  Serial.println(ssid);
  
  WiFi.begin(ssid, password);
  
  int wifiTimeout = 20; // timeout 10 sekund
  while (WiFi.status() != WL_CONNECTED && wifiTimeout > 0) {
    delay(500);
    Serial.print(".");
    wifiTimeout--;
  }
  
  if (WiFi.status() != WL_CONNECTED) {
    Serial.println("\n Błąd połączenia z WiFi!");
    return;
  }
  
  Serial.println("\n WiFi połączone!");
  Serial.print(" Adres IP: ");
  Serial.println(WiFi.localIP());
  Serial.print(" RSSI: ");
  Serial.print(WiFi.RSSI());
  Serial.println(" dBm");

  // Konfiguracja audio
  Serial.println(" Konfiguracja audio...");
  audio.setPinout(26, 25, 22);
  audio.setVolume(15);
  Serial.println(" Głośność: 15/21");

  // Uruchomienie strumienia
  Serial.print(" Uruchamianie strumienia: ");
  Serial.println(streamURL);
  audio.connecttohost(streamURL);
  
  Serial.println(" Radio uruchomione!");
}

void loop() {
  audio.loop();
}

// ==================== OBSŁUGA ZDARZEŃ ====================

// Wywoływane przy zmianie statusu audio
void audio_info(const char *info) {
  Serial.print(" audio_info: ");
  Serial.println(info);
}

// Wywoływane przy zmianie tagów ID3
void audio_id3data(const char *info) {
  Serial.print(" ID3: ");
  Serial.println(info);
}

// Wywoływane przy otrzymaniu nazwy stacji
void audio_showstation(const char *info) {
  Serial.print(" Stacja: ");
  Serial.println(info);
}

// Wywoływane przy otrzymaniu informacji o strumieniu
void audio_showstreamtitle(const char *info) {
  Serial.print(" Utwór: ");
  Serial.println(info);
}

// Wywoływane przy zmianie głośności
void audio_volume(int volume) {
  Serial.print(" Głośność: ");
  Serial.println(volume);
}

// Wywoływane przy rozpoczęciu odtwarzania
void audio_eof_mp3(const char *info) {
  Serial.print(" Koniec utworu: ");
  Serial.println(info);
}

// Wywoływane przy błędach
void audio_commercial(const char *info) {
  Serial.print(" Błąd: ");
  Serial.println(info);
}

Podsumowanie:

 Stosując się do tych kroków — prawidłowe podłączenie pinów, konfiguracja zworek na płytce PCM5102 i użycie właściwego kodu — rozwiążesz problem braku dźwięku. Jeśli masz pytania lub uwagi — zostaw je w komentarzach!