Приєднуйся до нашої Telegram-групи — там я особисто відповідаю на запитання, ділюсь порадами, схемами, кодом і лайфхаками зі збирання та налаштування.
Перейти в Telegram

NEWS

Підключаємо PCM5102 до ESP32 у PlatformIO

 У цій інструкції розглянемо, як підключити DAC-модуль PCM5102 до плат ESP32 (на прикладі ESP32 WROOM 32D) через PlatformIO та вирішити поширені проблеми: відсутність звуку (тиша) або поява тріску. Як бонус — важливий лайфхак із перемичками на платі.

 Проблема: PCM5102 не працює з ESP32

 При спробі використати зв’язку ESP32 WROOM 32D (30 pin) і PCM5102 у середовищі PlatformIO часто замість звуку можна почути або повну тишу, або постійний тріск. Стандартні скетчі можуть не працювати, і в інтернеті не завжди є пряме рішення цієї конкретної проблеми.

 Характеристики PCM5102:

  • 32-бітний ЦАП може розрізняти понад 4 мільярди рівнів сигналу (2³²). (Приклади: 16-біт — як якість CD. 24-біт — студійна якість.)
  • Інтерфейс I2S (вимовляється як «ай-ту-ес») — це спосіб, за допомогою якого мікросхеми передають цифровий звук одна одній.
  • Динамічний діапазон: 112 дБ — це дуже хороший показник, адже чим більше число, тим краща якість звуку. (Якість CD — приблизно 96 дБ. Студійні пристрої — від 100 дБ і вище.)

 Комплектуючі та підключення

  • Плата: ESP32 WROOM 32D (30 pin)
  • ЦАП-модуль: PCM5102

Схема підключення PCM5102 до ESP32:

  • SCK -> GND
  • BCK (BCLK) -> GPIO 26
  • DIN (DATA) -> GPIO 22
  • LCK (LRCK) -> GPIO 25
  • GND -> GND
  • VIN -> 3.3V (можна живити від зовнішнього джерела, але спочатку перевірити від ESP32)


 І родзинка на торті — щоб цей код запрацював і PCM5102 нарешті почав видавати звук, потрібно на зворотному боці PCM5102 запаяти перемички, як на зображенні нижче.


 Код файлу platformio.ini


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

lib_deps = 
    esphome/ESP32-audioI2S@^2.0.7

 Код у main.cpp (зверніть увагу, що main.c перейменовано на main.cpp). У головному файлі програми (main.cpp) необхідно правильно ініціалізувати виводи I2S. Вкажіть піни у такому порядку: 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("Ініціалізація радіо...");

  // Підключення до WiFi
  Serial.print("Підключаємося до WiFi: ");
  Serial.println(ssid);
  
  WiFi.begin(ssid, password);
  
  int wifiTimeout = 20; // таймаут 10 секунд
  while (WiFi.status() != WL_CONNECTED && wifiTimeout > 0) {
    delay(500);
    Serial.print(".");
    wifiTimeout--;
  }
  
  if (WiFi.status() != WL_CONNECTED) {
    Serial.println("\n Помилка підключення до WiFi!");
    return;
  }
  
  Serial.println("\n WiFi підключено!");
  Serial.print(" IP-адреса: ");
  Serial.println(WiFi.localIP());
  Serial.print(" RSSI: ");
  Serial.print(WiFi.RSSI());
  Serial.println(" dBm");

  // Налаштування аудіо
  Serial.println(" Налаштовуємо аудіо...");
  audio.setPinout(26, 25, 22);
  audio.setVolume(15);
  Serial.println(" Гучність: 15/21");

  // Запуск потоку
  Serial.print(" Запускаємо потік: ");
  Serial.println(streamURL);
  audio.connecttohost(streamURL);
  
  Serial.println(" Радіо запущено!");
}

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

// ==================== ОБРОБНИКИ ПОДІЙ ====================

// Викликається при зміні статусу аудіо
void audio_info(const char *info) {
  Serial.print(" audio_info: ");
  Serial.println(info);
}

// Викликається при зміні ID3 тегів
void audio_id3data(const char *info) {
  Serial.print(" ID3: ");
  Serial.println(info);
}

// Викликається при отриманні назви станції
void audio_showstation(const char *info) {
  Serial.print(" Станція: ");
  Serial.println(info);
}

// Викликається при отриманні інформації про потік
void audio_showstreamtitle(const char *info) {
  Serial.print(" Трек: ");
  Serial.println(info);
}

// Викликається при зміні гучності
void audio_volume(int volume) {
  Serial.print(" Гучність: ");
  Serial.println(volume);
}

// Викликається при початку відтворення
void audio_eof_mp3(const char *info) {
  Serial.print(" Кінець треку: ");
  Serial.println(info);
}

// Викликається при помилках
void audio_commercial(const char *info) {
  Serial.print(" Помилка: ");
  Serial.println(info);
}

Підсумок:

 Дотримуючись цих кроків — правильне підключення пінів, налаштування перемичок на платі PCM5102 та використання коректного коду — ви вирішите проблему з відсутністю звуку. Якщо у вас є запитання або доповнення — залишайте їх у коментарях!