Рейтинг статьи: 3.892/5 (65 голосов).
Схема подключения модулей MP3 DFPlayer Mini на базе yx5300 к arduino, система команд UARTСпонсор этой страницы:
Предисловие
В связи с удешевление TF карт, стало интересно использовать MP3 модули в своих проектах. Возможно это говорящие часы, или термометр, а возможно звуки в игрушечной машинке. на Ali я встредил 2 варианта модулей. Они на одной микросхеме и управляются одинаковыми командами.
Размеры и распиновка
MP3 DFPlayer Mini
MP3 YX5300/YX6300
Подключение к arduino
RX и TX обоих MP3 плейеров работают от 3.3V до 5V. Возможно 2 варианта подключения.
Вариант 1: Через TX, RX arduino.
Плюс в простоте подключения.
Минус в занятости порта, когда arduino подключена к компьютеру.
TX arduino к RX DFPlayer
RX arduino к TX DFPlayer
void setup()
{
Serial.begin(9600);
delay(500);
...
Вариант 2: Через виртуальны TX, RX arduino (например 7,8);
Плюс в возможности работы устройства, когда arduino подключена к компьютеру.
Минус - занятие двух контактов, которые могут понадобиться в больших проектах.
#include <SoftwareSerial.h>
#define pin_TX 7 // artuinio TX mp3 player RX
#define pin_RX 8 // artuinio RX mp3 player TX
SoftwareSerial mp3(pin_RX, pin_TX);
void setup()
{
mp3.begin(9600);
delay(500);
...
Задержка необходима для инициализации mp3 плеера
Структура папок и файлов
На носителе можно создать 99 нумерных папок, от "01" до "99"
именные папки "MP3" и "ADVERT"
в номерные папки можно поместить обычные и нумерные файлы (нумерация от "001_имя.mp3" до "255_имя.mp3")
в именные папки можно поместить обычные и нумерные файлы (нумерация от "0001_имя.mp3" до "9999_имя.mp3")
Производитель предупреждает, что если файлов будет больше 3000, то будет замедление в работе.
Управление DFPlayer mini
Структура команды
Через порт подключения посылаются команды.
Длинна команды с контрольной суммой - 10 байт.
Возможна отсылка команды без контрольной суммы - 8 байт.
Структура команды
$S | 0x7E | начало |
---|---|---|
VER | 0xFF | Версия |
Len | 0xNN | количество байт в команде без начального и конечного байта, 0x06 - без конр. суммы, 0x08 - c конр. суммы |
CMD | 0xNN | команда/запрос |
FeedBack | 0xNN | 1-потребовать подтверждение успешности, 0-не требовать |
Para_MSB | 0xNN | наиболее значимый байт параметра |
Para_LSB | 0xNN | наименее значимый байт параметра |
конр.сумма | Check_MSB Check_LSB | Checksum (2 bytes) = 0xFFFF–(Ver.+Length+CMD+Feedback+Para_MSB+Para_LSB)+1 (можно опустить.) |
$O | 0xEF | Конец команды |
В примерах я буду использовать второй вариант подключения через виртуальный Serial mp3
static uint8_t cmdbuf[8] = {0};
void command(int8_t cmd, int8_t Para_MSB, int8_t Para_LSB)
{
cmdbuf[0] = 0x7e;
cmdbuf[1] = 0xFF;
cmdbuf[2] = 0x06;
cmdbuf[3] = cmd;
cmdbuf[4] = 0x00;
cmdbuf[5] = Para_MSB;
cmdbuf[6] = Para_LSB;
cmdbuf[7] = 0xef;
for (uint8_t i = 0; i < 8; i++)
{
mp3.write(cmdbuf[i]);
}
}
Список команд
CMD | Para_MSB | Para_LSB | |
---|---|---|---|
0x01 | 00 | 00 | Следующая песня |
0x02 | 00 | 00 | Предыдущая песня |
0x03 | NN | MM | Песня по индексу 0xNNMM "7E FF 06 03 00 00 02 EF" Проиграть второй файл "7E FF 06 03 00 02 FF EF" Проиграть 767 файл |
0x04 | 00 | 00 | Громче |
0x05 | 00 | 00 | Тише |
0x06 | 00 | NN | Громкость (0..30) "7E FF 06 06 00 00 1E EF" Максимальная 30 (1E) |
0x07 | 00 | NN | Эквалайзер 0:Normal/1:Pop/2:Rock/3:Jazz/4:Classic/5: Bass |
0x08 | NN | MM | Циклическое воспроизведение песни "MM" из папки "NN" "7E FF 06 08 00 01 02 EF" - Проиграть в цикле файл "01\002Имя.mp3" |
0x09 | 00 | NN | Устройство 1 - USB 2 - TF, 4 - Flash |
0x0A | 00 | 00 | Переход в спящий режим |
0x0B | 00 | 00 | Пробуждение |
0x0C | 00 | 00 | Reset |
0x0D | 00 | 00 | Play |
0x0E | 00 | 00 | Pause |
0x0F | NN | MM | Проиграть файл "MM" из папки "NN" "7E FF 06 0F 00 01 03 EF" - Проиграть файл "01\003....mp3" |
0x10 | NN | MM | Настройка усиления звука MSB=1: усиление включено, LSB: установить усиление 0-31 |
0x11 | 00 | 00 | Включить циклическое воспроизведение всех файлов из всех папок |
0x12 | NN | MM | Воспроизвести файл 0xNNMM из папки "MP3" "7E FF 06 12 00 01 02 EF" - Проиграть файл "mp3\0193....mp3" |
0x13 | NN | MM | Вставить объявление 0xNNMM из папки "ADVERT" во время воспроизведения "7E FF 06 13 00 00 02 EF" - Вставить объявление "ADVERT\0002....mp3". После объявление воспроизведение продолжится с прерванного места |
0x14 | NM | MM | Поддержка больше 1000. Имя папки - первые 4 байта из MSB ("01" - "15", остальное имя файла) "7E FF 06 14 00 C7 Cf EF" - Проиграть файл "12\1999....mp3" "7E FF 06 14 00 10 09 EF" - Проиграть файл "01\0009....mp3" |
0x15 | 00 | 00 | Прекратить объявление и вернитесь назад и продолжайте играть прерванную музыку |
0x16 | 00 | 00 | Stop |
0x17 | 00 | NN | Циклическое воспроизведение указанной папки "NN". В папке могут присутствовать не нумерованные файлы |
0x18 | 00 | 00 | Воспроизведение в случайном порядке все файлы |
0x19 | 00 | 00 | Отключить циклическое воспроизведение. |
0x1A | 00 | NN | 00 Start up DAC output 01 DAC no output |
0x21 | В одной китайской документации сказано как проиграть набор файлов. Возможно изменение размера пакета. У меня не заработало "7E FF 07 21 00 01 03 04 EF" - Проиграть первую, третью и четвертую песню | ||
0x22 | NN | MM | Проиграть песню с определенной громкостью "7E FF 06 22 00 09 01 EF" Проиграть первую песню с громкостью 9 |
Список запросов
CMD | Para_MSB | Para_LSB | |
---|---|---|---|
0x3F | 00 | 00 | Список доступных устройств (побитно) USB 1, TF 2, Flash 4 |
0x42 | 00 | 00 | Статус плеера |
0x43 | 00 | 00 | Текущая громкость |
0x44 | 00 | 00 | Текущий эквалайзер |
0x47 | 00 | 00 | Общее количество файлов USB |
0x48 | 00 | 00 | Общее количество файлов TF |
0x49 | 00 | 00 | Общее количество файлов Flash |
0x4B | 00 | 00 | Текущий файл USB |
0x4C | 00 | 00 | Текущий файл TF |
0x4D | 00 | 00 | Текущий файл Flash |
0x4E | 00 | NN | Общее количество файлов в папке "NN" |
0x4F | 00 | 00 | Общее количество папок |
0x61 | 00 | 00 | Текущий указатель папки Flash |
Список Ответов
Ответы, связанные с количеством файлов приходят с задержкой
CMD | Para_MSB | Para_LSB | |
---|---|---|---|
CMD | Para_MSB | Para_LSB | |
0x3A | 00 | 00 | Вставлена карта TF (Приходит без запроса) |
0x3B | 00 | 00 | Вынута карта TF (Приходит без запроса) |
0x3C | NN | MM | Закончил играть файл 0xNNMM на USB (Приходит без запроса) |
0x3D | NN | MM | Закончил играть файл 0xNNMM на TF (Приходит без запроса) |
0x3F | 00 | 00 | Список доступных устройств (побитно) USB 1, TF 2, Flash 4 |
0x42 | NN | MM | Статус плеера NN - 1 USB/2 TF, MM - 0 Stop/1 Play/2 Pause |
0x43 | 00 | NN | Текущая громкость |
0x44 | 00 | NN | Текущий эквалайзер |
0x47 | NN | MM | Общее количество файлов USB 0xNNMM |
0x48 | NN | MM | Общее количество файлов TF 0xNNMM |
0x49 | NN | MM | Общее количество файлов Flash 0xNNMM |
0x4B | NN | MM | Текущий файл USB |
0x4C | NN | MM | Текущий файл TF |
0x4D | NN | MM | Текущий файл Flash |
0x4E | NN | MM | Общее количество файлов 0xNNMM |
0x4F | NN | MM | Общее количество папок 0xNNMM |
0x61 | 00 | 00 | Текущий указатель папки Flash |
Функция получения ответа.
В связи с тем, что при получении ответа возможно получения мусора, я ищу начало пакета, и далее считываю весь пакет.
static uint8_t ansbuf[10] = {0};
boolean answer(void)
{
uint8_t i;
uint8_t b = 0;
while(mp3.available() && (b!=0x7E))
{
b = mp3.read();
delay(1);
}
ansbuf[0] = b;
i = 1;
while(mp3.available() && (i < 10))
{
b = mp3.read();
ansbuf[i] = b;
i++;
delay(1);
}
if ((ansbuf[0] == 0x7E) && (ansbuf[9] == 0xEF))
{
return true;
}
return false;
}
Пример
В примере можно посмотреть команды и результаты.
#include <SoftwareSerial.h>
#define pin_TX 7 // artuinio TX mp3 player RX
#define pin_RX 8 // artuinio RX mp3 player TX
SoftwareSerial mp3(pin_RX, pin_TX);
static uint8_t cmdbuf[8] = {0};
static uint8_t ansbuf[10] = {0};
#define _DEBUG
void byte2hex(uint8_t b)
{
#ifdef _DEBUG
Serial.print("0x");
if (b < 16) Serial.print("0");
Serial.print(b, HEX);
Serial.print(" ");
#endif
delay(1);
}
void command(int8_t cmd, int8_t Para_MSB, int8_t Para_LSB)
{
#ifdef _DEBUG
Serial.print("cmd:");
#endif
cmdbuf[0] = 0x7e;
cmdbuf[1] = 0xFF;
cmdbuf[2] = 0x06;
cmdbuf[3] = cmd;
cmdbuf[4] = 0x00;
cmdbuf[5] = Para_MSB;
cmdbuf[6] = Para_LSB;
cmdbuf[7] = 0xef;
for (uint8_t i = 0; i < 8; i++)
{
mp3.write(cmdbuf[i]);
byte2hex(cmdbuf[i]);
}
#ifdef _DEBUG
Serial.println();
#endif
}
boolean answer(void)
{
#ifdef _DEBUG
Serial.print("ans:");
#endif
uint8_t i;
uint8_t b = 0;
while(mp3.available() && (b!=0x7E))
{
b = mp3.read();
delay(1);
}
ansbuf[0] = b;
i = 1;
while(mp3.available() && (i < 10))
{
b = mp3.read();
ansbuf[i] = b;
i++;
byte2hex(cmdbuf[i]);
delay(1);
}
#ifdef _DEBUG
Serial.println();
#endif
if ((ansbuf[0] == 0x7E) && (ansbuf[9] == 0xEF))
{
return true;
}
return false;
}
void setup()
{
Serial.begin(115200);
mp3.begin(9600);
delay(500);
command(0x09, 00, 02); //Выбрать TF карту
delay(200);
//Далее можно давать команды и смотреть ответы
//Например установить громкость 30
command(0x06, 0, 30);
//Или спросить количество файлов
command(0x48, 0, 0);
while (not mp3.available()){ delay(5);} //Подождать, пока посчитается
answer();
}
void loop() {
}
Документация
FN-M16P+Embedded+MP3+Audio+Module+Datasheet.pdfSerial MP3 Player v1.0 Manual.pdf
YX5300-24SS Datasheet V1.0.pdf
YX5300-24SS DEBUG manual V1.0.pdf
Модули на Ali
Модуль MP3 DFPlayer Mini yx5300 к arduino в WAVGATМодуль MP3 DFPlayer Mini yx5300 к arduino в All Electronics Trading Company
Модуль MP3 DFPlayer Mini yx5300 к arduino в Win win
Комментарии к статье:
-
2021-04-26 02:21:33, Борисыч69 :
Спасибо , отличный материал!
-
2021-09-18 16:44:20, Влад :
А как сделать с контрольной суммой? Нужно какуюто формуд=лу добавлять в код?
-
2023-07-14 07:54:40, Гость :
ffff-ver-len-cmd-fb-par1-par2
например:
7e ff 06 03 00 00 01 (ff e6) ef
ffff-ff-06-03-00-00-01=fef6
fef6 это ffe6 если переставить
-
-
2022-03-21 11:16:33, Гость :
если использовать мп3 YX5300 то надо добавлять библиотеку для него конкретно например MD YX5300
-
2024-10-07 09:52:59, Гость :
Можно ли на SD карте, вставленной в этот модуль, хранить, например, текстовые файлы, и считывать эти текстовые файлы самой Ардуино?
-
2024-10-14 20:40:20, 123 :
Хранить можно, но считать в ардуино не получится.
-
-
2024-11-06 03:05:47, Tavenger :
Можно ли сие девайс использовать просто как проигрыватель звука ? То есть подал питания он запускает мп3 файл загруженный на SD карте??? И второй вопрос, при подключении питания он издает какие-либо звуки приветсвия или нет ? Как на различных блютуз колонках ?
-
2024-11-06 03:16:11, Tavenger :
Можно ли сие девайс использовать просто как проигрыватель звука ? То есть подал питания он запускает мп3 файл загруженный на SD карте??? И второй вопрос, при подключении питания он издает какие-либо звуки приветсвия или нет ? Как на различных блютуз колонках ?
-
2024-11-08 02:38:02, Tavenger :
Можно ли сие девайс использовать просто как проигрыватель звука ? То есть подал питания он запускает мп3 файл загруженный на SD карте??? И второй вопрос, при подключении питания он издает какие-либо звуки приветсвия или нет ? Как на различных блютуз колонках ?