Урок 19. Делаем MP3-плеер на DFPlayer Mini и Arduino.
Как воспроизвести аудиофайлы в формате wav я уже рассказывал в уроке: Arduino SD карта. Воспроизводим звуки и музыку в wav формате. Данный способ подходит, когда нужно воспроизвести файлы не очень высокого качества, например, уведомления, оповещение и пр. Если же надо воспроизводить файлы в формате mp3, нам поможет модуль DFPlayer Mini.
MP3-плеер DFPlayer Mini позволяет воспроизводить аудиофайлы, записанные на карту памяти формата microSD. С помощью этого плеера можно управлять музыкой: приостановка и возобновление воспроизведения аудиофайла. А также можно установить громкость из 30-ти уровней громкости и одни из 6-ти режимов эквалайзера.
DFPlayer отлично подходит дляArduino проектов, в которых нужно воспроизводить уведомления или оповещения, а также для музыкального сопровождения с автоповтором выбранного трека, воспроизведением всех треков, или случайное воспроизведение треков.
Характеристики DFPlayer MP3 mini:
Напряжение питания: 3,3–5 В
Количество каналов: 1 моно, 3 Вт + 2 стерео, без усилителя
Для реализации самого простого плеера не нужно подключатьDFPlayer кArduino. Достаточно подключить несколько кнопок вот по такой схеме.
Но у нас уроки про Arduino, поэтому рассмотрим простой пример подключения MP3-плеер к Arduino, который подключается по аппаратному или программному UART порту (пины RX и TX) Ардуино.
Код с выводом отладочной информацией будет вот таким. Данный код взят с сайта библиотеки DFRobotDFPlayerMini. Также нам понадобится библиотека для работы спрограммным UART портом SoftwareSerial.Скачать библиотеки можно внизу статьи, в разделе материалы для скачивания.
Для воспроизведения аудиофайла необходимо поместить на карту памяти microSD один трек. Файлы рекомендуется помещать в папку mp3 и называть порядковыми номерами вот в таком формате 0001.mp3. Мой опыт показывает, что можно скидывать файлы с любым названием и помещать в корень флешки, но воспроизводиться файлы будут в том порядке, в каком их загрузилина карту памяти. При пакетной загрузке одни файлы загружаются быстрее, а другие медленнее, из-за чего воспроизведение треков идет в хаотичном порядке.
Пример MP3-плеера на DFPlayer Mini и Arduino с возможностью выбора трека и изменением громкости.
Давайте сделаем полноценный MP3-плеера на Arduino. Для этого нам понадобится:
2 резистора на 10 кОм.. Купить можно на AliExpress или в России.
Динамик. Я использую от ноутбука.
Все компоненты нашего будущего MP3-плеера на DFPlayer соединяем по схеме.
Загрузим файлы с треками на карту памяти microSD, я использую 3 трека с YouTube, чтобы можно было воспроизводить музыку в видеоролике и не получить бан. Архив с треками можно скачать внизу статьи, в разделе материалы для скачивания.
Код для MP3-плеера на DFPlayer Mini и Arduino с возможностью выбора трека и изменением громкости будет вот такой.
#include "DFRobotDFPlayerMini.h"
// библиотека для эмуляции Serial порта
#include <SoftwareSerial.h>
// создаём объект mySoftwareSerial и передаём номера управляющих пинов RX и TX
// RX - цифровой вывод 10, необходимо соединить с выводом TX дисплея
// TX - цифровой вывод 11, необходимо соединить с выводом RX дисплея
SoftwareSerial mySoftwareSerial(10, 11); // RX, TX для плеера DFPlayer Mini
DFRobotDFPlayerMini myDFPlayer;
int buttonNext = 2; // кнопка следующий трек
int buttonPause = 3; // кнопка пауза/ пуск
int buttonPrevious = 4; // кнопка предыдущий трек
int buttonVolumeUp = 5; // кнопка увеличение громкости
int buttonVolumeDown = 6; // кнопка уменьшение громкости
boolean isPlaying = false; // статус воспроизведения/пауза
void setup() {
pinMode(buttonPause, INPUT_PULLUP);
pinMode(buttonNext, INPUT_PULLUP);
pinMode(buttonPrevious, INPUT_PULLUP);
pinMode(buttonVolumeUp, INPUT_PULLUP);
pinMode(buttonVolumeDown, INPUT_PULLUP);
mySoftwareSerial.begin(9600);
Serial.begin(9600);
delay(1000);
Serial.println();
Serial.println("DFPlayer Mini Demo");
Serial.println("Initializing DFPlayer...");
if (!myDFPlayer.begin(mySoftwareSerial)) {
Serial.println("Unable to begin:");
Serial.println("1.Please recheck the connection!");
Serial.println("2.Please insert the SD card!");
while (true);
}
Serial.println(F("DFPlayer Mini online."));
myDFPlayer.setTimeOut(300);
//----Set volume----
myDFPlayer.volume(15); //Set volume value (0~30).
//----Set different EQ----
myDFPlayer.EQ(DFPLAYER_EQ_NORMAL);
myDFPlayer.outputDevice(DFPLAYER_DEVICE_SD);
myDFPlayer.play(1); //Воспроизведение первого mp3
isPlaying = true; // воспроизводим
Serial.println("Playing..");
//----Читать информацию----
Serial.println(myDFPlayer.readState()); //читать состояние mp3
Serial.println(myDFPlayer.readVolume()); //Текущая громкость
Serial.println(myDFPlayer.readEQ()); // читаем настройку эквалайзера
Serial.println(myDFPlayer.readFileCounts()); // читать все файлы на SD-карте
Serial.println(myDFPlayer.readCurrentFileNumber()); // текущий номер файла воспроизведения
}
void loop() {
if (digitalRead(buttonPause) == LOW) {
if (isPlaying) { // если было воспроизведение трека
myDFPlayer.pause(); // пауза
isPlaying = false; // пауза
Serial.println("Paused..");
} else { // иначе
isPlaying = true; // воспроизводим
myDFPlayer.start(); //запускаем mp3 с паузы
}
delay(500);
}
if (digitalRead(buttonNext) == LOW) {
if (isPlaying) {
myDFPlayer.next(); //Next Song
Serial.println("Next Song..");
}
delay(500);
}
if (digitalRead(buttonPrevious) == LOW) {
if (isPlaying) {
myDFPlayer.previous(); //Previous Song
Serial.println("Previous Song..");
}
delay(500);
}
if (digitalRead(buttonVolumeUp) == LOW) {
if (isPlaying) {
myDFPlayer.volumeUp(); //Volume Up
Serial.println("Volume Up..");
}
delay(500);
}
if (digitalRead(buttonVolumeDown) == LOW) {
if (isPlaying) {
myDFPlayer.volumeDown(); //Volume Down
Serial.println("Volume Down..");
}
delay(500);
}
}
У платы Arduino NANO всего один аппаратный Serial Port, поэтому будем использовать программный порт. Для этого нужно установить и подключить библиотеку SoftwareSerial.h.
Чтоб проверить, подключен или нет DFPlayer используется условие:
Если в мониторе порта мы видим надпись «DFPlayer Mini online.» все подключено правильно и работает.
Данные строки кода
Включают первый трек.
И выводят в монитор порта информацию об этом.
Строки ниже
выводят в монитор порта полезную информацию о статусе работы.
Первая строчка выводит статус: цифра с кодом.
Вторая строчка выводить уровень текущей громкости от 0 до 30
Третья выводит настройки эквалайзера, также в цифровом значении.
Четвертая выводит, сколько треков найдено на карте памяти.
Последняя стока выводит, какой трек воспроизводится сейчас.
В мониторе порта это будет выглядеть вот так:
В основном цикле loop выводим условия проверки нажатия той или иной кнопки. И выполняем нужную команду.
if (digitalRead(buttonNext) == LOW) {
if (isPlaying) {
myDFPlayer.next(); //Next Song
Serial.println("Next Song..");
}
delay(500);
}
Это одно условие для примера, остальные устроены аналогично, их рассматривать не будем. Список команд для работы с DFPlayer Mini myDFPlayer.next(); // Воспроизвести следующий mp3
myDFPlayer.previous(); // Воспроизвести предыдущий mp3
myDFPlayer.play(1); //Воспроизведение первого mp3
myDFPlayer.loop(1); //зациклить первый mp3
myDFPlayer.pause(); //приостановить mp3
myDFPlayer.start(); //запускаем mp3 с паузы
myDFPlayer.playFolder(15, 4); //воспроизводить определенный mp3 в SD: /15/004.mp3; Имя папки (1 ~ 99);
myDFPlayer.enableLoopAll(); //зациклить все mp3 файлы.
myDFPlayer.disableLoopAll(); //остановить цикл всех mp3 файлов.
myDFPlayer.playMp3Folder(4); //воспроизводить конкретный mp3 в SD: /MP3/0004.mp3; Имя файла (0 ~ 65535)
myDFPlayer.advertise(3); //рекламируем конкретный mp3 в SD: /ADVERT/0003.mp3; Имя файла (0 ~ 65535
myDFPlayer.playLargeFolder(2, 999); //воспроизводить конкретный mp3 в SD: /02/004.mp3; Имя папки (1 ~ 10); Имя файла (1 ~ 1000)
myDFPlayer.loopFolder(5); //зациклить все mp3 файлы в папке SD: / 05.
myDFPlayer.randomAll(); //Произвольное воспроизведение всех mp3.
myDFPlayer.enableLoop(); //включить цикл.
myDFPlayer.disableLoop(); //отключить цикл
Как видите, не так много кода и алгоритм работы достаточно несложный. Планирую реализовать пару проектов с использованием модуля DFPlayerMini и Arduino, ESP8266, ESP32 для публикации на сайте. Благо, опыт работы с этим модулем и данными платформами есть.
Пишите ваши предложения и пожелания в комментариях. Чем больше будет откликов, тем чаше будут выходить проекты и уроки на сайте.
Здравствуйте. Может кто подсказать как сделать несколько функций на 1 кнопку в данном проекте? Например я хочу на 1 кнопку при обычном клике играть следующую мелодию, а при зажатии кнопки повышать громкость
Здравствуйте!
Собираю игрушку, но при реализации возникает ошибка.
Скетч (копипаст скетча проекта) проверен – компиляция завершена. Успешно загружается на Arduino Uno. Но после загрузки в мониторе порта отображается ошибка: 1.Please recheck the
connection! 2.Please insert the SD card! На нажатие кнопок плеер не реагирует.
При подключении пинов № 10 и 11 к плееру напрямую (к TX и RX), минуя резисторы, и перезагрузке платы, плеер инициализируется в мониторе порта и начинает вести себя согласно
скетчу. Но при этом звук воспроизводится с громким дребезгом (независимо от
уровня установленной в скетче громкости).
Однако если в момент воспроизведения извлечь провод RX, то шум исчезает. Но плеер естественно перестает отвечать на команды, пока RX не будет обратно на месте.
Плеер отвечает на команды и хорошо воспроизводит звук в томслучае, если в момент, когда он работает и определен в мониторе порта, провода
от пинов 10 и 11 Arduino подключить к TX и RX через резисторы 220 Ом.
Однако если повторно открыть монитор порта или перезапустить плеер, то появляется ошибка: 1.Please recheck the connection! 2.Please insert
the SD card! На нажатие кнопок плеер не реагирует. После перезапуска платы в
динамике слышен однократный щелчок и дважды моргает диод RX на плате.
Ситуация исправляется только повторным подключением пинов №10 и 11 к TX и RX с кратковременным извлечением кабеля USB.
Почему может возникать такая нестабильность в работе? 2 вечера поисков не дали ответа.
Заранее благодарю за помощь.
Комментарии
Войдите или Зарегистрируйтесь И Вы сможете общаться на форуме и оставлять комментарии без капчи.