401 lines
19 KiB
Markdown
401 lines
19 KiB
Markdown
|
---
|
|||
|
title: "▶️ DFPlayer Mini миниатюрный MP3 проигрыватель для Arduino"
|
|||
|
date: 2023-05-31T22:05:00+03:00
|
|||
|
draft: false
|
|||
|
tags: [hardware, smd, arduino]
|
|||
|
---
|
|||
|
|
|||
|
## Примечание
|
|||
|
|
|||
|
Статья скопирована с сайта https://focma.com/dfplayer-mini/.
|
|||
|
|
|||
|
## DFPlayer Mini
|
|||
|
|
|||
|
![DFPlayer Mini](/content/images/smd/dfplayer-mini-mp3-module.jpg)
|
|||
|
|
|||
|
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 спереди.
|
|||
|
|
|||
|
![](/content/images/smd/dfplayer_mini_pinout_front-scaled.jpg)
|
|||
|
|
|||
|
Распиновка DFPlayer Mini сзади.
|
|||
|
|
|||
|
![](/content/images/smd/dfplayer_mini_pinout_back-scaled.jpg)
|
|||
|
|
|||
|
| Пин | Описание | Примечание |
|
|||
|
|--------|--------------------|---------------------------------------------------------------------------------------|
|
|||
|
| VCC | Входное напряжение | DC3.2~5.0В; DC4.2В |
|
|||
|
| RX | UART вход | RX вход |
|
|||
|
| TX | UART выход | 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 — выключено |
|
|||
|
|
|||
|
## Рабочие режимы
|
|||
|
|
|||
|
### 1. Serial Mode (Управление с контроллера)
|
|||
|
|
|||
|
Режим работы заключается в управлении модулем DFPlayer Mini при помощи плат Arduino.
|
|||
|
Существует специальная библиотека для Arduino IDE.
|
|||
|
|
|||
|
### 2. AD Key Mode (Управление кнопками)
|
|||
|
|
|||
|
Используя всего два входа `ADKEY1` и `ADKEY2` мы можем подключить 20 кнопок,
|
|||
|
которые позволят воспроизводить произвольно 14 файлов и управлять громкостью.
|
|||
|
|
|||
|
![](/content/images/smd/df-player-mini-adkey-control-800x338.png)
|
|||
|
|
|||
|
## 3. I/O Mode (Упрощенный режим)
|
|||
|
|
|||
|
Это самый простой способ управления модулем.
|
|||
|
Он, как и AD Key Mode, не требует контроллера.
|
|||
|
Нужно подключить только динамик, 4 кнопки и подать питание от 3.3 до 5 Вольт.
|
|||
|
|
|||
|
**Примечание:** Обычное нажатие на **Pre/Vol+** (**Next/Vol-**) означает предыдущий
|
|||
|
или следующий трек, длинное нажатие и удержание — громкость больше или меньше.
|
|||
|
|
|||
|
![](/content/images/smd/df-player-mini-io-mode-800x440.png)
|
|||
|
|
|||
|
## Подключения DFPlayer Mini к Arduino
|
|||
|
|
|||
|
![](/content/images/smd/dfplayer-mini-to-arduino.png)
|
|||
|
|
|||
|
## Подготовка MP3 файлов для SD карты
|
|||
|
|
|||
|
**ПРИМЕЧАНИЕ:** Порядок, в котором вы копируете MP3 на карту MicroSD,
|
|||
|
влияет на порядок воспроизведения MP3 файлов, а это означает,
|
|||
|
что функция `Play(1)` будет воспроизводить первый MP3 файл скопированный на карту MicroSD.
|
|||
|
|
|||
|
### Для пользователей Mac
|
|||
|
|
|||
|
**ПРИМЕЧАНИЕ:** Если вы используете MacOS для копирования MP3 файлов,
|
|||
|
то файловая система автоматически добавит скрытые файлы `._0001.mp3`.
|
|||
|
Эти файлы модуль будет обрабатывать, как обычные MP3.
|
|||
|
Чтобы удалить эти файлы выполните команду в терминале:
|
|||
|
|
|||
|
```sh
|
|||
|
dot_clean /Volumes/<SDVolumeName>
|
|||
|
```
|
|||
|
|
|||
|
`<SDVolumeName>` — замените на имя тома вашей SD-карты.
|
|||
|
|
|||
|
## Библиотека DFPlayer Mini для Arduino
|
|||
|
|
|||
|
Пример кода для Arduino
|
|||
|
|
|||
|
`GetStarted` — в этом примере модуль каждые 3 секунды включает следующий трек.
|
|||
|
|
|||
|
```cpp
|
|||
|
/***************************************************
|
|||
|
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` — показывает работу всех функций модуля.
|
|||
|
|
|||
|
```cpp
|
|||
|
/***************************************************
|
|||
|
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`.
|