Присоединяйся к нашей 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 и использование верного кода — вы решите проблему с отсутствием звука. Если у вас есть вопросы или дополнения — оставляйте их в комментариях!