nettips.ru

Подключение модуля DFPlayer Mini к arduino

На главную Cisco Systems VoIP Arduino маршрутизатор Беларусь Android Asterisk Умный сетевой хаос дом коммутатор Nateks Alcatel MTS Velcom Python Gigaset ZTE Grandstream Huawei админы шутят о сайте Zelax Allied Telesis D-Link Штрихкоды HP
Телефонные номера доступа sip операторов VitebskPets - инфопомощь животным в Витебске Телефонные коды городов и стран мира.

Рейтинг статьи: 3.839/5 Рейтинг 3.84 из 5Рейтинг 3.84 из 5Рейтинг 3.84 из 5Рейтинг 3.84 из 5Рейтинг 3.84 из 5 (62 голосов).

Схема подключения модулей MP3 DFPlayer Mini на базе yx5300 к arduino, система команд UART

Спонсор этой страницы:

Предисловие

В связи с удешевление TF карт, стало интересно использовать MP3 модули в своих проектах. Возможно это говорящие часы, или термометр, а возможно звуки в игрушечной машинке. на Ali я встредил 2 варианта модулей. Они на одной микросхеме и управляются одинаковыми командами.

Размеры и распиновка

MP3 DFPlayer Mini

mp3 dfplayer mini

MP3 YX5300/YX6300

mp3 yx5300

Подключение к 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 байт.

Структура команды

$S0x7E начало
VER0xFFВерсия
Len0xNNколичество байт в команде без начального и конечного байта, 0x06 - без конр. суммы, 0x08 - c конр. суммы
CMD0xNNкоманда/запрос
FeedBack0xNN1-потребовать подтверждение успешности, 0-не требовать
Para_MSB0xNNнаиболее значимый байт параметра
Para_LSB0xNNнаименее значимый байт параметра
конр.суммаCheck_MSB Check_LSB Checksum (2 bytes) = 0xFFFF–(Ver.+Length+CMD+Feedback+Para_MSB+Para_LSB)+1 (можно опустить.)
$O0xEFКонец команды

В примерах я буду использовать второй вариант подключения через виртуальный 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]);
   }
}

Список команд

CMDPara_MSBPara_LSB
0x010000Следующая песня
0x020000Предыдущая песня
0x03NNMMПесня по индексу 0xNNMM
"7E FF 06 03 00 00 02 EF" Проиграть второй файл
"7E FF 06 03 00 02 FF EF" Проиграть 767 файл
0x040000Громче
0x050000Тише
0x0600NNГромкость (0..30)
"7E FF 06 06 00 00 1E EF" Максимальная 30 (1E)
0x0700NNЭквалайзер 0:Normal/1:Pop/2:Rock/3:Jazz/4:Classic/5: Bass
0x08NNMMЦиклическое воспроизведение песни "MM" из папки "NN"
"7E FF 06 08 00 01 02 EF" - Проиграть в цикле файл "01\002Имя.mp3"
0x0900NNУстройство 1 - USB 2 - TF, 4 - Flash
0x0A0000Переход в спящий режим
0x0B0000Пробуждение
0x0C0000Reset
0x0D0000Play
0x0E0000Pause
0x0FNNMMПроиграть файл "MM" из папки "NN"
"7E FF 06 0F 00 01 03 EF" - Проиграть файл "01\003....mp3"
0x10NNMMНастройка усиления звука MSB=1: усиление включено, LSB: установить усиление 0-31
0x110000Включить циклическое воспроизведение всех файлов из всех папок
0x12NNMMВоспроизвести файл 0xNNMM из папки "MP3"
"7E FF 06 12 00 01 02 EF" - Проиграть файл "mp3\0193....mp3"
0x13NNMMВставить объявление 0xNNMM из папки "ADVERT" во время воспроизведения
"7E FF 06 13 00 00 02 EF" - Вставить объявление "ADVERT\0002....mp3". После объявление воспроизведение продолжится с прерванного места
0x14NMMMПоддержка больше 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"
0x150000Прекратить объявление и вернитесь назад и продолжайте играть прерванную музыку
0x160000Stop
0x1700NNЦиклическое воспроизведение указанной папки "NN". В папке могут присутствовать не нумерованные файлы
0x180000Воспроизведение в случайном порядке все файлы
0x190000Отключить циклическое воспроизведение.
0x1A00NN00 Start up DAC output
01 DAC no output
0x21В одной китайской документации сказано как проиграть набор файлов. Возможно изменение размера пакета. У меня не заработало
"7E FF 07 21 00 01 03 04 EF" - Проиграть первую, третью и четвертую песню
0x22NNMMПроиграть песню с определенной громкостью
"7E FF 06 22 00 09 01 EF" Проиграть первую песню с громкостью 9

Список запросов

CMDPara_MSBPara_LSB
0x3F0000Список доступных устройств (побитно) USB 1, TF 2, Flash 4
0x420000Статус плеера
0x430000Текущая громкость
0x440000Текущий эквалайзер
0x470000Общее количество файлов USB
0x480000Общее количество файлов TF
0x490000Общее количество файлов Flash
0x4B0000Текущий файл USB
0x4C0000Текущий файл TF
0x4D0000Текущий файл Flash
0x4E00NNОбщее количество файлов в папке "NN"
0x4F0000Общее количество папок
0x610000Текущий указатель папки Flash

Список Ответов

Ответы, связанные с количеством файлов приходят с задержкой

CMDPara_MSBPara_LSB
CMDPara_MSBPara_LSB
0x3A0000Вставлена карта TF (Приходит без запроса)
0x3B0000Вынута карта TF (Приходит без запроса)
0x3CNNMMЗакончил играть файл 0xNNMM на USB (Приходит без запроса)
0x3DNNMMЗакончил играть файл 0xNNMM на TF (Приходит без запроса)
0x3F0000Список доступных устройств (побитно) USB 1, TF 2, Flash 4
0x42NNMMСтатус плеера NN - 1 USB/2 TF, MM - 0 Stop/1 Play/2 Pause
0x4300NNТекущая громкость
0x4400NNТекущий эквалайзер
0x47NNMMОбщее количество файлов USB 0xNNMM
0x48NNMMОбщее количество файлов TF 0xNNMM
0x49NNMMОбщее количество файлов Flash 0xNNMM
0x4BNNMMТекущий файл USB
0x4CNNMMТекущий файл TF
0x4DNNMMТекущий файл Flash
0x4ENNMMОбщее количество файлов 0xNNMM
0x4FNNMMОбщее количество папок 0xNNMM
0x610000Текущий указатель папки 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.pdf
Serial 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

Arduino Программирование

Пожалуйста, оцените и ВЫ эту статью:

Комментарии к статье:

  • 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


Ваши отзывы и предложения по работе сайта направляйте на форму обратной связи.

Яндекс.Метрика