Blog/content/posts/smd/dfplayer-mini.md

403 lines
19 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
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)
{{< table "table table-sm table-striped table-hover" >}}
| Пин | Описание | Примечание |
|--------|--------------------|---------------------------------------------------------------------------------------|
| 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 — выключено |
{{</ table >}}
## Рабочие режимы
### 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`.