Ардуино

DFPlayer Mini – Обзор и описание MP3 модуля для Arduino

Введение

DFPlayer Mini – это миниатюрный MP3 проигрыватель для плат Arduino. Недорогой MP3 модуль может работать без контроллера автономно с аккумулятором или в сочетании с Arduino UNO и другими платами Arduino.

Спецификация модуля

  • Поддерживаемые частоты дискретизации (кГц): 8/11.025/12/16/22.05/24/32/44.1/48
  • 24-битный выход ЦАП
  • Поддержка динамического диапазона 90дБ, поддержка SNR 85дБ
  • Полностью поддерживает файловую систему FAT16 и FAT32
  • Максимальный объем памяти SD карт 32ГБ, 64MБ NORFLASH
  • Различные режимы управления:
    • режим управления вводом / выводом
    • последовательный режим
    • режим управления кнопкой
  • Интеграция рекламных вставок при проигрывании музыки
  • Поддерживает до 100 папок (каждая папка может содержать до 255 песен)
  • 30 уровней регулировки громкости
  • 6-уровневый эквалайзер

Применение DFPlayer Mini

  • Озвучивание событий и действий контроллеров Arduino;
  • Голосовые подсказки сигнализаций и при тревоге;
  • Голосовые функции игрушек;
  • Проигрывание музыки со вставками рекламы;
  • Автоматическое циклическое оповещение.

Распиновка

Распиновка DFPlayer Mini спереди \ Распиновка DFPlayer Mini сзади

ПинОписаниеПримечание
VCCВходное напряжениеDC3.2~5.0В; DC4.2В
RXUART входRX вход
TXUART выходTX выход
DAC_RАудио выход правыйВыход правый на динамики или наушники
DAC_LАудио выход левыйВыход левый на динамики или наушники
SPK2Динамик –Выход с усилителем 3Вт
GNDЗемляЗемля
SPK1Динамик +Выход с усилителем 3Вт
IO1Триггер 1Короткое нажатие – проиграть предыдущий трек (длинное нажатие – уменьшение громкости)
GNDЗемляЗемля
IO2Триггер 2Короткое нажатие – проиграть следующий трек (длинное нажатие – увеличение громкости)
ADKEY1Текст ячейкиТекст ячейки
ADKEY2Текст ячейкиТекст ячейки
USB+USB+ DPПорт USB
USB-USB- DMПорт USB
BUSYСтатусLow – включено, High – выключено

Как правильно вставить MicroSD карту в DFPlayer Mini

Рабочие режимы

1. Serial Mode (Управление с контроллера)

Режим работы заключается в управлении модулем DFPlayer Mini при помощи плат Arduino. Существует специальная библиотека для Arduino IDE.

2. AD Key Mode (Управление кнопками)

Используя всего два входа ADKEY1 и ADKEY2 мы можем подключить 20 кнопок, которые позволят воспроизводить произвольно 14 файлов и управлять громкостью.

Схема подключения кнопок к DFPlayer Mini

3. I/O Mode (Упрощенный режим)

Это самый простой способ управления модулем. Он, как и AD Key Mode, не требует контроллера. Нужно подключить только динамик, 4 кнопки и подать питание от 3.3 до 5 Вольт.

Примечание: Обычное нажатие на Pre/Vol+ (Next/Vol-) означает предыдущий или следующий трек, длинное нажатие и удержание – громкость больше или меньше.

Упрощенная схема DFPlayer Mini

Подключения DFPlayer Mini к Arduino

Схема подключения DFPlayer Mini к Arduino UNO

Подготовка MP3 файлов для SD карты

ПРИМЕЧАНИЕ: Порядок, в котором вы копируете MP3 на карту MicroSD, влияет на порядок воспроизведения MP3 файлов, а это означает, что функция Play(1) будет воспроизводить первый MP3 файл скопированный на карту MicroSD.

Для пользователей Mac
ПРИМЕЧАНИЕ: Если вы используете MacOS для копирования MP3 файлов, то файловая система автоматически добавит скрытые файлы: “._0001.mp3”. Эти файлы модуль будет обрабатывать, как обычные MP3. Чтобы удалить эти файлы выполните команду в терминале:

dot_clean /Volumes/<SDVolumeName>

<SDVolumeName> – замените на имя тома вашей SD-карты.

Библиотека DFPlayer Mini для Arduino

Пример кода для Arduino

GetStarted – в этом примере модуль каждые 3 секунды включает следующий трек.

/***************************************************
  DFPlayer Mini - Компактный мини MP3 проигрыватель для Arduino
  В этом примере показаны основные функции библиотеки для модуля DFPlayer Mini
  Автор библиотеки: Angelo Qiao
 ****************************************************/
/*******Инструкция и совместимость***********
  1. Инструкцию по подключению: https://focma.com/wiki/DFPlayer_Mini
  2. Этот код протестирован на платах Arduino UNO, Arduino Leonardo, Arduino Mega.
 ****************************************************/
#include "Arduino.h"
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"

SoftwareSerial mySoftwareSerial(10, 11); // RX, TX
DFRobotDFPlayerMini myDFPlayer;
void printDetail(uint8_t type, int value);

void setup()
{
  mySoftwareSerial.begin(9600);
  Serial.begin(115200);
  Serial.println();
  Serial.println(F("DFRobot DFPlayer Mini Demo"));
  Serial.println(F("Initializing DFPlayer ... (May take 3~5 seconds)")); // Инициализация модуля

  if (!myDFPlayer.begin(mySoftwareSerial)) {  //Use softwareSerial to communicate with mp3.
    Serial.println(F("Unable to begin:"));
    Serial.println(F("1.Please recheck the connection!")); // Проверьте соединение
    Serial.println(F("2.Please insert the SD card!")); // Вставьте SD карту
    while(true);
  }
  Serial.println(F("DFPlayer Mini online.")); // Готов к работе

  myDFPlayer.volume(10);  // Установка громкости от 0 до 30
  myDFPlayer.play(1);  // Проигрывать с первого MP3 файла
}

void loop()
{
  static unsigned long timer = millis();

  if (millis() - timer > 3000) {
    timer = millis();
    myDFPlayer.next();  // Переходить на следующий трек каждые 3 секунды
  }

  if (myDFPlayer.available()) {
    printDetail(myDFPlayer.readType(), myDFPlayer.read()); // Выводить сообщения о статусе и ошибках модуля
  }
}

void printDetail(uint8_t type, int value){
  switch (type) {
    case TimeOut:
      Serial.println(F("Time Out!")); // Время вышло
      break;
    case WrongStack:
      Serial.println(F("Stack Wrong!"));
      break;
    case DFPlayerCardInserted:
      Serial.println(F("Card Inserted!")); // Карта вставлена
      break;
    case DFPlayerCardRemoved:
      Serial.println(F("Card Removed!")); // Карта удалена
      break;
    case DFPlayerCardOnline:
      Serial.println(F("Card Online!")); // Карта готова
      break;
    case DFPlayerPlayFinished:
      Serial.print(F("Number:")); // Номер
      Serial.print(value);
      Serial.println(F(" Play Finished!")); // Воспроизведение окончено
      break;
    case DFPlayerError:
      Serial.print(F("DFPlayerError:")); // Ошибка
      switch (value) {
        case Busy:
          Serial.println(F("Card not found")); // Карта не найдена
          break;
        case Sleeping:
          Serial.println(F("Sleeping")); // Сон
          break;
        case SerialWrongStack:
          Serial.println(F("Get Wrong Stack"));
          break;
        case CheckSumNotMatch:
          Serial.println(F("Check Sum Not Match"));
          break;
        case FileIndexOut:
          Serial.println(F("File Index Out of Bound"));
          break;
        case FileMismatch:
          Serial.println(F("Cannot Find File")); // Не могу найти файл
          break;
        case Advertise:
          Serial.println(F("In Advertise")); // Реклама
          break;
        default:
          break;
      }
      break;
    default:
      break;
  }
}

FullFunction – показывает работу всех функций модуля.

/***************************************************
  DFPlayer Mini - Компактный мини MP3 проигрыватель для Arduino
  В этом примере показаны основные функции библиотеки для модуля DFPlayer Mini
  Автор библиотеки: Angelo Qiao
 ****************************************************/
/***********Инструкция и совместимость***************
  1. Инструкцию по подключению: https://focma.com/wiki/DFPlayer_Mini
  2. Этот код протестирован на платах Arduino UNO, Arduino Leonardo, Arduino Mega.
 ****************************************************/
#include "Arduino.h"
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"

SoftwareSerial mySoftwareSerial(10, 11); // RX, TX
DFRobotDFPlayerMini myDFPlayer;
void printDetail(uint8_t type, int value);

void setup()
{
  mySoftwareSerial.begin(9600);
  Serial.begin(115200);
  Serial.println();
  Serial.println(F("DFRobot DFPlayer Mini Demo"));
  Serial.println(F("Initializing DFPlayer ... (May take 3~5 seconds)"));

  if (!myDFPlayer.begin(mySoftwareSerial)) {  //Use softwareSerial to communicate with mp3.
    Serial.println(F("Unable to begin:"));
    Serial.println(F("1.Please recheck the connection!"));
    Serial.println(F("2.Please insert the SD card!"));
    while (true);
  }
  Serial.println(F("DFPlayer Mini online."));

  myDFPlayer.setTimeOut(500); //Set serial communictaion time out 500ms

  //----Set volume / Установка громкости----
  myDFPlayer.volume(10);  // Установка громкости от 0 до 30
  myDFPlayer.volumeUp(); // Громкость больше
  myDFPlayer.volumeDown(); // Громкость меньше

  //----Set different EQ / Эквалайзер----
  // Раскомментируйте желаемый
  myDFPlayer.EQ(DFPLAYER_EQ_NORMAL);
  //  myDFPlayer.EQ(DFPLAYER_EQ_POP);
  //  myDFPlayer.EQ(DFPLAYER_EQ_ROCK);
  //  myDFPlayer.EQ(DFPLAYER_EQ_JAZZ);
  //  myDFPlayer.EQ(DFPLAYER_EQ_CLASSIC);
  //  myDFPlayer.EQ(DFPLAYER_EQ_BASS);

  //----Set device we use SD as default----
  //  myDFPlayer.outputDevice(DFPLAYER_DEVICE_U_DISK);
  myDFPlayer.outputDevice(DFPLAYER_DEVICE_SD);
  //  myDFPlayer.outputDevice(DFPLAYER_DEVICE_AUX);
  //  myDFPlayer.outputDevice(DFPLAYER_DEVICE_SLEEP);
  //  myDFPlayer.outputDevice(DFPLAYER_DEVICE_FLASH);

  //----Mp3 control / Управление----
  //  myDFPlayer.sleep();     // Сон
  //  myDFPlayer.reset();     // Перезагрузка
  //  myDFPlayer.enableDAC();  // Включить DAC
  //  myDFPlayer.disableDAC();  // Выключить DAC
  //  myDFPlayer.outputSetting(true, 15); // Настройка выхода

  //----Mp3 play / Воспроизведение----
  myDFPlayer.next();  // Воспроизвести следующий MP3
  delay(1000);
  myDFPlayer.previous();  // Воспроизвести предыдущий MP3
  delay(1000);
  myDFPlayer.play(1);  // Воспроизвести первый MP3
  delay(1000);
  myDFPlayer.loop(1);  // Зациклить первый MP3
  delay(1000);
  myDFPlayer.pause();  // Пауза
  delay(1000);
  myDFPlayer.start();  // Продолжить воспроизведение после паузы
  delay(1000);
  myDFPlayer.playFolder(15, 4);  // Воспроизвести файл 004.mp3 из директории 15 - SD:/15/004.mp3
  delay(1000);
  myDFPlayer.enableLoopAll(); // Зациклить все MP3 файлы
  delay(1000);
  myDFPlayer.disableLoopAll(); //Выключить зацикливание всех MP3 файлы
  delay(1000);
  myDFPlayer.playMp3Folder(4); // play specific mp3 in SD:/MP3/0004.mp3; File Name(0~65535)
  delay(1000);
  myDFPlayer.advertise(3); // advertise specific mp3 in SD:/ADVERT/0003.mp3; File Name(0~65535)
  delay(1000);
  myDFPlayer.stopAdvertise(); // Остановить рекламу
  delay(1000);
  myDFPlayer.playLargeFolder(2, 999); // play specific mp3 in SD:/02/004.mp3;
  delay(1000);
  myDFPlayer.loopFolder(5); // Зациклить все MP3 файлы в директории 05 - SD:/05
  delay(1000);
  myDFPlayer.randomAll(); // Случайно, рандомно воспроизвести файлы MP3
  delay(1000);
  myDFPlayer.enableLoop(); // enable loop
  delay(1000);
  myDFPlayer.disableLoop(); // disable loop
  delay(1000);

  //----Read imformation----
  Serial.println(myDFPlayer.readState()); // Вывести статус модуля
  Serial.println(myDFPlayer.readVolume()); // Вывести текущую громкость
  Serial.println(myDFPlayer.readEQ()); // Вывести данные эквалайзера
  Serial.println(myDFPlayer.readFileCounts()); // Вывести количество файлов
  Serial.println(myDFPlayer.readCurrentFileNumber()); // Вывести текущий файл
  Serial.println(myDFPlayer.readFileCountsInFolder(3)); // Вывести количество в директории 3 - SD:/03
}

void loop()
{
  static unsigned long timer = millis();

  if (millis() - timer > 3000) {
    timer = millis();
    myDFPlayer.next();  //Play next mp3 every 3 second.
  }

  if (myDFPlayer.available()) {
    printDetail(myDFPlayer.readType(), myDFPlayer.read()); //Print the detail message from DFPlayer to handle different errors and states.
  }
}

void printDetail(uint8_t type, int value) {
  switch (type) {
    case TimeOut:
      Serial.println(F("Time Out!"));
      break;
    case WrongStack:
      Serial.println(F("Stack Wrong!"));
      break;
    case DFPlayerCardInserted:
      Serial.println(F("Card Inserted!"));
      break;
    case DFPlayerCardRemoved:
      Serial.println(F("Card Removed!"));
      break;
    case DFPlayerCardOnline:
      Serial.println(F("Card Online!"));
      break;
    case DFPlayerPlayFinished:
      Serial.print(F("Number:"));
      Serial.print(value);
      Serial.println(F(" Play Finished!"));
      break;
    case DFPlayerError:
      Serial.print(F("DFPlayerError:"));
      switch (value) {
        case Busy:
          Serial.println(F("Card not found"));
          break;
        case Sleeping:
          Serial.println(F("Sleeping"));
          break;
        case SerialWrongStack:
          Serial.println(F("Get Wrong Stack"));
          break;
        case CheckSumNotMatch:
          Serial.println(F("Check Sum Not Match"));
          break;
        case FileIndexOut:
          Serial.println(F("File Index Out of Bound"));
          break;
        case FileMismatch:
          Serial.println(F("Cannot Find File"));
          break;
        case Advertise:
          Serial.println(F("In Advertise"));
          break;
        default:
          break;
      }
      break;
    default:
      break;
  }
}

Файлы и директории

ПРИМЕЧАНИЕ: Имя папки должно быть “mp3”. Она должна быть помещена в корневой каталог SD-карты, а имя mp3 файла должно состоять из 4-х цифр. Например: “0001.mp3”, помещенное в папку “mp3”. Если вам требуется обозначить файл, вы можете добавить текст после цифр – “0001hello.mp3”.

Вячеслав Ким

Привет, меня зовут Вячеслав. Я создаю электронные устройства, иногда печатаю на 3D принтере, режу  лазером и веду канал на YouTube. А в этом блоге, я пишу про микроэлектронику, Arduino и робототехнику.

View Comments

  • Один клиентский проект был основан на модуле DFPlayer Mini. Суть заключалась в оповещении пассажиров маршрутного такси о приближающейся остановки.

    Система состояла из модуля и кнопок. Были дополнительные кнопки:

    "Просим оплатить за проезд"

    "Просьба пройти назад"

    и т.п.

    Интересный бюджетный проект для развивающихся не очень богатых стран.

Share
Published by
Вячеслав Ким

Recent Posts

Контроллер автоматической подсветки лестницы «Laika Pro»

Промо страница контроллера "Laika" Обновленный контроллер "Laika Pro" на 28 каналов Датчики движения (обнаружения) Миниатюрный…

4 years ago

Arduino RS-485: Подключение, описание и примеры с кодами

Интерфейс RS-485 RS-485 является одним из наиболее распространенных интерфейсов передачи данных. Для передачи сигнала используется…

4 years ago

Создаем аппарат ИВЛ в Кыргызстане

Меня зовут Вячеслав Ким. Я являюсь выпускником Alumni программы IVLP США. Входя в группу по…

4 years ago

We are making an ALV unit in Kyrgyzstan

My name is Vyacheslav Kim, a US IVLPA program alumni. Being a part of working…

4 years ago

Счетчик YouTube подписчиков на ESP8266 и OLED дисплее

Что это за устройство? Если у вас есть канал на Youtube и вы почти популярны,…

4 years ago

Копилка со счетчиком монет на Arduino с OLED дисплеем

https://www.youtube.com/watch?v=lyBiI67T2Zw <pre class="lang:arduino decode:true " > /* Created 2017 Remixed from AlexGyver */ //-------НАСТРОЙКИ--------- #define…

4 years ago