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

Введение

DFPlayer Mini для Ардуино

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

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

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

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

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

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

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

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

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

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

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

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

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

Схема подключения DFPlayer Mini к Arduino UNO
Схема подключения 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”.