diff --git a/content/posts/smd/dfplayer-mini.md b/content/posts/smd/dfplayer-mini.md new file mode 100644 index 0000000..3f2343b --- /dev/null +++ b/content/posts/smd/dfplayer-mini.md @@ -0,0 +1,400 @@ +--- +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/ +``` + +`` — замените на имя тома вашей 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`.