База знаний · Датчики и модули

DFPlayer Mini: MP3-плеер для Arduino — подключение, карта памяти, пульт

Крошечный плеер с картой microSD и выходом прямо на динамик: как подключить через SoftwareSerial, как назвать файлы на карте и как управлять им с пульта.

Зуммер умеет пищать, а DFPlayer Mini — говорить, петь и играть музыку: это крошечный MP3-плеер с картой памяти и выходом прямо на динамик. Arduino отдаёт ему команды по последовательному порту — «играй третий файл», «громче», «следующий» — а всю работу со звуком он делает сам. После урока про зуммер это естественный следующий шаг.

Что купить

Сам модуль — Mini MP3-плеер за 186 ₽, это и есть DFPlayer Mini. К нему нужны карта microSD (до 32 ГБ, формат FAT32) и динамик до 3 Вт на 4 или 8 Ом — такой подключается напрямую, без усилителя. Есть и Trema-модуль MP3-плеера за 460 ₽: та же библиотека и команды, но вместо выводов под динамик — гнездо 3,5 мм под наушники или колонки и готовый шлейф.

Подключение

У DFPlayer шестнадцать выводов, нужны пять: VCC, GND, RX, TX и пара SPK_1 и SPK_2 для динамика. Порт у Uno один, и он занят монитором, поэтому плеер вешают на программный порт SoftwareSerial — выводы 4 и 5 в скетчах ниже. Резистор 1 кОм в линии RX обязателен: без него плеер и работает хуже, и шипит в динамик.

UNO / NANOлюбая классика 5 ВDFPlayer Miniкарта памяти снизуSPK_1 · SPK_2 — динамикDAC_L · DAC_R — наушники5VVCCпитание 3,2–5 В5RXкоманды плееру4TXответы плеераGNDGNDобщий провод1 кОм
Провода крест-накрест: TX платы (вывод 5) — в RX плеера через резистор 1 кОм, TX плеера — в RX платы (вывод 4). Плеер внутри работает от 3,3 В, а плата шлёт 5 В: резистор ограничивает ток в этой линии, и заодно пропадает шипение из динамика. Динамик — прямо на SPK_1 и SPK_2, без усилителя; слот карты на модуле смотрит в сторону от платы.

Питание 3,2–5 В, с Uno берите 5V. Если плеер перезапускается на громких местах, виновато питание: динамику на 3 Вт нужен ток, которого у USB-порта компьютера может не хватить, — подключите внешний блок питания на 5 В.

Карта памяти: как назвать файлы

Плеер не читает названия, он считает файлы. Самый предсказуемый порядок — папки 01, 02 … 99, в каждой файлы 001.mp3, 002.mp3 … до 255; тогда player.playFolder(1, 3) всегда играет третий файл первой папки. Команда player.play(n) без папок берёт n-й файл с карты, но «n-й» считается не по имени, а по порядку записи на карту: скопировали файлы не в том порядке — и «третий» оказался первым. Поэтому копируйте по одному и по порядку, а лучше используйте папки. Есть и третий способ, самый простой для начала: папка mp3 с файлами 0001.mp3…9999.mp3 и команда player.playMp3Folder(7). Плеер смотрит только на первые цифры имени, так что 0007-pesnya.mp3 — тоже седьмой. Карта — FAT16 или FAT32 (не exFAT: карты на 64 ГБ и больше придётся переформатировать), до 32 ГБ; форматы MP3, WAV и WMA. Вставлять карту на ходу нельзя, только при выключенном питании.

Скетч: все файлы по кругу

Библиотека — «DFRobotDFPlayerMini» из каталога, версия 1.0.6. На Uno скетч занимает около 4,6 КБ.

#include <SoftwareSerial.h>
#include <DFRobotDFPlayerMini.h>

// 4 — к TX плеера, 5 — к RX плеера через резистор 1 кОм
SoftwareSerial mp3Serial(4, 5);
DFRobotDFPlayerMini player;

void setup() {
  Serial.begin(9600);
  mp3Serial.begin(9600);  // плеер понимает только 9600
  Serial.println("Ждём плеер, это занимает 2-3 секунды...");
  if (!player.begin(mp3Serial)) {
    Serial.println("Плеер не отвечает: проверьте RX/TX, питание и карту памяти");
    while (true) {
    }
  }
  player.volume(20);       // громкость 0-30
  player.enableLoopAll();  // все файлы по кругу: плеер сам переключает треки
  Serial.println("Играет всё подряд");
}

void loop() {
  if (player.available()) {  // плеер прислал сообщение
    if (player.readType() == DFPlayerPlayFinished) {
      Serial.print("Закончился трек номер ");
      Serial.println(player.read());
    }
  }
}

begin() ждёт ответа плеера до двух секунд и возвращает false, если его нет: тогда проверьте, не перепутаны ли RX и TX (это самая частая причина), вставлена ли карта и есть ли на ней хоть один файл. Громкость — от 0 до 30, в комнате хватает 15–20. Переключать треки сами мы не стали нарочно: по окончании файла плеер шлёт сообщение «закончил» дважды, и скетч с next() в ответ на него перескакивает через трек. Команда enableLoopAll() крутит всю карту по кругу без нашего участия, loopFolder(1) — одну папку.

Полезные команды той же библиотеки: pause() и start(), next() и previous(), volumeUp() и volumeDown(), loop(n) — крутить один файл по кругу, EQ(DFPLAYER_EQ_BASS) — один из шести эквалайзеров.

Плеер с пультом

Добавьте ИК-приёмник из статьи про пульт — и у вас плеер с дистанционным управлением: пауза, следующий, предыдущий, громкость. Коды кнопок здесь от чёрного пульта «Car MP3» из наборов; свои узнайте первым скетчем той статьи. На Uno — около 11 КБ.

#include <SoftwareSerial.h>
#include <DFRobotDFPlayerMini.h>
#include <IRremote.hpp>

SoftwareSerial mp3Serial(4, 5);  // 4 — к TX плеера, 5 — к RX плеера через 1 кОм
DFRobotDFPlayerMini player;
const byte IR_PIN = 2;           // выход ИК-приёмника

// Коды кнопок чёрного пульта «Car MP3»; свои узнайте скетчем из статьи про пульт.
const uint16_t CMD_PLAY = 0x43;  // «воспроизведение/пауза»
const uint16_t CMD_NEXT = 0x40;  // «вперёд»
const uint16_t CMD_PREV = 0x44;  // «назад»
const uint16_t CMD_VOL_UP = 0x15;    // «+»
const uint16_t CMD_VOL_DOWN = 0x07;  // «-»

bool paused = false;

void setup() {
  Serial.begin(9600);
  mp3Serial.begin(9600);
  // Без подтверждений (false): иначе каждая команда ждёт ответ плеера
  // до полусекунды, и за это время сигналы пульта теряются.
  if (!player.begin(mp3Serial, false)) {
    Serial.println("Плеер не отвечает: проверьте RX/TX, питание и карту памяти");
    while (true) {
    }
  }
  player.volume(15);
  player.play(1);
  IrReceiver.begin(IR_PIN);
  Serial.println("Готово: управляйте с пульта");
}

void loop() {
  if (IrReceiver.decode()) {
    if (!(IrReceiver.decodedIRData.flags & IRDATA_FLAGS_IS_REPEAT)) {
      uint16_t cmd = IrReceiver.decodedIRData.command;
      if (cmd == CMD_PLAY) {
        if (paused) {
          player.start();
        } else {
          player.pause();
        }
        paused = !paused;
      } else if (cmd == CMD_NEXT) {
        player.next();
      } else if (cmd == CMD_PREV) {
        player.previous();
      } else if (cmd == CMD_VOL_UP) {
        player.volumeUp();
      } else if (cmd == CMD_VOL_DOWN) {
        player.volumeDown();
      }
    }
    IrReceiver.resume();
  }
}

Две оговорки. На Uno программный порт и ИК-приёмник мешают друг другу: пока SoftwareSerial передаёт байт, он выключает прерывания, и библиотека пульта может пропустить сигнал. Поэтому плеер запущен без подтверждений — begin(mp3Serial, false): иначе каждая команда ждёт ответа до полусекунды, и нажатия в это время теряются. Если нажатие срабатывает не с первого раза — это оно. На Mega, Leonardo и ESP32 есть второй аппаратный порт Serial1, подключите плеер к нему, и проблема исчезнет.

Без Arduino тоже работает

У DFPlayer есть выводы IO_1 и IO_2: кнопка между выводом и землёй. Короткое нажатие IO_1 — предыдущий трек, IO_2 — следующий; длинное — тише и громче. На выводы ADKEY_1 и ADKEY_2 через резисторы вешают до двадцати кнопок, каждая запускает свой файл. Так собирают детскую музыкальную шкатулку без платы вовсе. Вывод BUSY опускается в ноль, пока играет звук, — по нему удобно мигать светодиодом или ждать конца фразы в скетче.

Что ломается

  • Молчит и begin() возвращает false. RX и TX перепутаны — поменяйте провода местами. Или на карте нет файлов, или она в NTFS: переформатируйте в FAT32.
  • Играет не тот файл. Порядок записи на карту — см. выше. Папки 01/001.mp3 решают это раз и навсегда.
  • Шипит и трещит. Нет резистора 1 кОм в RX, или питание слабое. Поставьте резистор, запитайте от внешних 5 В, добавьте конденсатор 100–470 мкФ между VCC и GND у плеера.
  • Клон ведёт себя иначе. Под именем DFPlayer Mini продают модули на разных чипах. Клоны на MH2024K и GD3200B обычно отдают моно вместо стерео и дольше думают после команды; некоторые путают номера папок. Если команды из статьи срабатывают через раз, увеличьте паузу после begin() и не шлите команды чаще раза в 100 мс.
  • Трек обрывается, плата перезагружается. Питание просело на громком месте. Внешний блок питания и конденсатор.

Частые вопросы

Как подключить DFPlayer Mini к Arduino Uno?

VCC — на 5V, GND — на землю, TX плеера — на вывод 4, RX плеера — на вывод 5 через резистор 1 кОм, динамик до 3 Вт — на SPK_1 и SPK_2. В скетче плеер работает через SoftwareSerial(4, 5) на 9600, аппаратный порт остаётся монитору.

Зачем резистор 1 кОм между Arduino и DFPlayer?

Плеер работает от 3,3 В внутри, а Uno шлёт 5-вольтовый сигнал. Резистор в линии RX ограничивает ток и, по опыту, убирает шипение из динамика. Без него плеер часто работает, но нестабильно.

Как назвать файлы на карте, чтобы играл нужный?

Папки 01…99, внутри файлы 001.mp3…255.mp3 — тогда playFolder(1, 3) всегда играет третий файл первой папки. Команда play(n) считает файлы по порядку записи на карту, а не по именам, поэтому без папок порядок легко сбить. Карта — FAT32 до 32 ГБ, вставлять только при выключенном питании.

DFPlayer молчит, begin() возвращает false — что проверить?

Чаще всего перепутаны RX и TX — поменяйте провода местами. Дальше: карта вставлена и отформатирована в FAT32, на ней есть файлы, скорость порта 9600, плеер получает 5 В. После включения ему нужно две-три секунды, begin() столько и ждёт.

Нужен ли усилитель для динамика?

Нет, если динамик до 3 Вт на 4 или 8 Ом: он подключается прямо к SPK_1 и SPK_2. Для колонок или наушников есть выходы DAC_L и DAC_R, а у Trema-модуля MP3-плеера — готовое гнездо 3,5 мм.

Может ли DFPlayer работать без Arduino?

Да. Кнопки между выводами IO_1, IO_2 и землёй переключают треки коротким нажатием и меняют громкость длинным, а на выводы ADKEY вешают ещё несколько кнопок через резисторы. Вывод BUSY опускается в ноль, пока играет звук.

Обновлено: 22 октября 2026