DFPlayer и Arduino Nano не хотят дружить

Dmitriy_S.S.
Offline
Зарегистрирован: 31.05.2021

Всем привет! 

В работе с микроконтроллерами новичок.

Решил сделать небольшой проект. Предстоит управлять несколькими модулями через Arduino nano. Одним из модулей является мп3 проигрыватель.

Попробовал собрать простую схему (чтобы понять принцип работы модулей), которую нашел тут: https://portal-pk.ru/news/247-delaem-mp3-pleer-na-dfplayer-mini-i-arduino.html Собрал по образу и подобию, взял готовый скетч, загрузил... но ничего не работает. Сначала был треск в динамике. Устранил включением параллельно питанию 2 конденсаторов. Но все равно мп3 модуль не включается.

Питание пробовал как от USB, так и как планировал питать готовый проект - аккумулятор 18650.

Подскажите в чем может быть проблема и как ее можно устранить? времени на реализацию проектика почти нет((

Код скетча:

#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);
  }
}

вот фото сборки на макетке 

 

 

Dmitriy_S.S.
Offline
Зарегистрирован: 31.05.2021

в дополнение к описанию проблемы, стоит сказать, что при подключении модуля DFPlayer без ардуино, он работает. Делал к нему кнопки с подключением через ADKEY1. Все четко, никаких проблем не было.

Плата нано тоже рабочая. Тестировал простым кодом управления светодиодом.

Dmitriy_S.S.
Offline
Зарегистрирован: 31.05.2021

А вот что выдает монитор порта:

DFPlayer Mini Demo
Initializing DFPlayer...
Unable to begin:
1.Please recheck the connection!
2.Please insert the SD card!
 
DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Хто ж тебя по времени-то ограничивает, сделаешь потихоньку.  Ну, если догадаешься, канеш, что SD карта не читается. 

Dmitriy_S.S.
Offline
Зарегистрирован: 31.05.2021

на сколько я понимаю данный код, то сообщение, что я наблюдаю в мониторе порта, выводится в том случае если модуль не возвращает в ардуинку статус ОК. что может быть как из-за проблем с модулем, его питанием, флэшкой и каналом передачи данных от модуля к плате ардуино...

нечитаемая флэшка исключается, так как отдельно модуль воспроизводит все без проблем

sadman41
Offline
Зарегистрирован: 19.10.2016

RX/TX местами меняли?
От USB наврядли он будет работать, покуда запитан через VIN.

Нуидела
Offline
Зарегистрирован: 31.01.2017

на макетке не видно подключения питания
и второй момент шина питания на макетке сквозная  (или как обычно посередине разорвана) ?.

Dmitriy_S.S.
Offline
Зарегистрирован: 31.05.2021

RX и  TX до этого вопроса не пробовал менять. Сейчас поменял - результат все тот же - не работает.

С питанием все норм, там где в питании на макетке разрывы я ставлю перемычки. Прозванивал по разным группам контактов - везде есть. 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Светлодиод на DF-Player горит?

Dmitriy_S.S.
Offline
Зарегистрирован: 31.05.2021

Нет, на DFPlayer светодиод не горит. 

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Светодиод там горит, когда воспроизводится что-то. Но до этого, похоже, не доходит.

Хотя вот я почему-то давненько уж отказался от библиотеки и мечу прямо в сериал команды. Наверное какая-то хрень была с инитом. 

Нуидела
Offline
Зарегистрирован: 31.01.2017

то, что я вижу
у Вас модуль запитывается + слева от разрыва, а - справа от разрыва

Dmitriy_S.S.
Offline
Зарегистрирован: 31.05.2021

Нуидела пишет:

то, что я вижу
у Вас модуль запитывается + слева от разрыва, а - справа от разрыва

там нет разрыва по середине.к тому же как писал выше, я прозванивал по пинам на мп3 и нано - на них питание есть

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

sadman41 пишет:

Светодиод там горит, когда воспроизводится что-то. 

Да, точно. 

Dmitriy_S.S.
Offline
Зарегистрирован: 31.05.2021

sadman41 пишет:

Хотя вот я почему-то давненько уж отказался от библиотеки и мечу прямо в сериал команды. Наверное какая-то хрень была с инитом. 

не расскажешь чуть подробнее, как это сделать на моем примере? )

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Вопрос : а почему ТС решил, что в макетке нет разрыва ?
Я без разрыва не видел пока ни одной такого формата.
Сколько не пытался найти перемычку, не выходит

Dmitriy_S.S.
Offline
Зарегистрирован: 31.05.2021

С 1 по 60 контакт макетки плюс и минус без разрыва. Но верхний и нижний ряды питания раздельные. при необходимости я перемычкой соединяю. 

Ребят, давайте по существу. вопрос с питанием исключается, так как повторюсь - проверяю на пинах плат питание - присутстввует.

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Фото разобранной макетки с обратной стороны можно ?

Rumata
Rumata аватар
Offline
Зарегистрирован: 29.03.2019

У меня тоже штук 5 таких макеток. Все без разрывов. Разбирать не стану, есичо))

Dmitriy_S.S.
Offline
Зарегистрирован: 31.05.2021

тоже не горю желанием разобрать, особенно осознавая, что делу это никак не поможет.

Сейчас пытаюсь найти инфу, как управлять этим мп3 модулем через пины RX/TX. Нашел несколько статей, где пишут, что есть 2 варианта подключения - аппаратный и программный, но все останавливаются на более подробном описании программного и нигде нет инфы об аппаратном...

Быть может кто-то может кинуть пример скетча?

b707
Offline
Зарегистрирован: 26.05.2017

ТС надо прямо на этом подключении залить в ардуину скетч, который будет читать вывод плеера из СофтСериала и все это редиректить в Монитор. И посмотреть, что там ДФПлеер сообщает при запуске

b707
Offline
Зарегистрирован: 26.05.2017

Dmitriy_S.S. пишет:

Быть может кто-то может кинуть пример скетча?

если речь об аппаратном - это вообще без скетча, кнопками

sadman41
Offline
Зарегистрирован: 19.10.2016

Dmitriy_S.S. пишет:

sadman41 пишет:

Хотя вот я почему-то давненько уж отказался от библиотеки и мечу прямо в сериал команды. Наверное какая-то хрень была с инитом. 

не расскажешь чуть подробнее, как это сделать на моем примере? )

Ну вот, нарубил из своего старинного:

#define DFPLAYER_UART_SPEED                   (9600)

#define DFPLAYER_RX_PIN                       (10)            
#define DFPLAYER_TX_PIN                       (11)            

#define DFPLAYER_VOLUME                       (25)            
#define DFPLAYER_TRACK_NO                     (9)            

#define DFPLAYER_CMD_PLAYBACK_TRACK           (0x03)
#define DFPLAYER_CMD_SET_VOLUME               (0x06)
#define DFPLAYER_CMD_STOP                     (0x16)

#define SYSTEM_INIT_TIME                      (3000UL)       // DFPlayer must be inited in a 3...5 sec

SoftwareSerial swSerial(DFPLAYER_RX_PIN, DFPLAYER_TX_PIN);

....

void sendToDFPlayer(Stream& _stream, uint8_t _command, uint16_t _option) {
  uint8_t buffer[10] = {0x7E, 0xFF, 0x06, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEF};
  uint16_t crc = 0x00;

  buffer[0x03]  = _command;
  buffer[0x05] = (uint8_t) (_option >> 0x08);
  buffer[0x06] = (uint8_t) _option;
  for (uint8_t i = 0x01; i < 0x07; i++) {
    crc += buffer[i];
  }
  crc = (0xFFFF - crc + 0x01);
  buffer[0x07]   = (uint8_t) (crc >> 0x08);
  buffer[0x08]   = (uint8_t) crc;
  _stream.write(buffer, sizeof(buffer));
}

....

swSerial.begin(DFPLAYER_UART_SPEED);

delay(SYSTEM_INIT_TIME);
sendToDFPlayer(swSerial, DFPLAYER_CMD_STOP, 0x00);
sendToDFPlayer(swSerial, DFPLAYER_CMD_SET_VOLUME, DFPLAYER_VOLUME);

sendToDFPlayer(swSerial, DFPLAYER_CMD_PLAYBACK_TRACK, DFPLAYER_TRACK_NO);
...

 

kalapanga
Offline
Зарегистрирован: 23.10.2016

И в конце концов окажется, что тупо какой-нибудь из проводков в макетке болтался...

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Kakmyc пишет:
Вопрос : а почему ТС решил, что в макетке нет разрыва ? Я без разрыва не видел пока ни одной такого формата.
Будете у нас заходите - покажу. Я вот с разрывами никогда не видел :-)

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

У меня пяток плат, полученных в разное время, на 830 точек, все с разрывами.  Причём, забавно было в первое время косяки в монтаже искать, ведь про разрывы то я ни сном ни духом тогда не знал. :) 

Kakmyc
Offline
Зарегистрирован: 15.01.2018

ЕвгенийП пишет:
Будете у нас заходите - покажу. Я вот с разрывами никогда не видел :-)

 

Да мне не жалко, вот так оно выглядит. На второй картинке вариант решения проблемы с разрывом

raven78
Offline
Зарегистрирован: 03.11.2019

Попробовать закомментить 31 строку. Проверить не замкнут ли tx вывод плеера на землю, там рядом железяка. 

Dmitriy_S.S.
Offline
Зарегистрирован: 31.05.2021

raven78 пишет:

Попробовать закомментить 31 строку. Проверить не замкнут ли tx вывод плеера на землю, там рядом железяка. 

TX не замкнут на землю (проверил).

закомментировал 31 строку. результат:

DFPlayer Mini Demo
Initializing DFPlayer...
Unable to begin:
1.Please recheck the connection!
2.Please insert the SD card!
DFPlayer Mini online.
Playing..
-1
0
-1
-1
-1
 
при нажатии на кнопки в статус заносится какую кнопку нажал, но модуль мп3 не реагирует
raven78
Offline
Зарегистрирован: 03.11.2019

Ну если Вы уверены, что всё правильно и на резисторах не оранжевая полоса, а красная( по фото точно не видно), то плеер в топку, китайцу привет)))

Дим-мычъ
Offline
Зарегистрирован: 20.03.2021

Я бы пробовал постепенно уменьшать сопротивление резисторов RX TX. ИМХО 10 кОм может быть многовато...

P.S. Вот ещё глянул

https://picaxe.com/docs/spe033.pdf

Dmitriy_S.S.
Offline
Зарегистрирован: 31.05.2021

Проблему решил. Всем огромное спасибо!

Автор статьи, откуда я брал схему, действительно перегнул с сопротивлениями. Заменил на 1 кОм. После чего пересобрал с более надежными контактами (закрались подозрения что реально где-то контакт пропадал) - и все заработало))))

Но теперь вопрос по командам DFPlayer. По отдельности воспроизводить удается, но как быть если мне нужно, чтобы после определенной мелодии следующий трек зацикливался до наступления какого-либо события?


  if (digitalRead(buttonPlay) == LOW) {
    if (flagOpen==false && digitalRead(buttonOnOff) == HIGH) {
      //isPlaying = true;
      flagOpen=true; 
      myDFPlayer.play(1); 
    } else if (flagOpen==false && digitalRead(buttonOnOff) == LOW){
      //isPlaying = true;
      flagOpen=true; 
      myDFPlayer.play(2);
      delay(4000);
      myDFPlayer.loop(4);
    } else if (flagOpen==true) {
      flagOpen=false; 
      myDFPlayer.play(3);
    }
    delay(500);
  }

через LOOP(номер трека) не получилось, модуль эту строку игнорирует.

Dmitriy_S.S.
Offline
Зарегистрирован: 31.05.2021

Dmitriy_S.S. пишет:

Проблему решил. Всем огромное спасибо!

Автор статьи, откуда я брал схему, действительно перегнул с сопротивлениями. Заменил на 1 кОм. После чего пересобрал с более надежными контактами (закрались подозрения что реально где-то контакт пропадал) - и все заработало))))

Но теперь вопрос по командам DFPlayer. По отдельности воспроизводить удается, но как быть если мне нужно, чтобы после определенной мелодии следующий трек зацикливался до наступления какого-либо события?


  if (digitalRead(buttonPlay) == LOW) {
    if (flagOpen==false && digitalRead(buttonOnOff) == HIGH) {
      //isPlaying = true;
      flagOpen=true; 
      myDFPlayer.play(1); 
    } else if (flagOpen==false && digitalRead(buttonOnOff) == LOW){
      //isPlaying = true;
      flagOpen=true; 
      myDFPlayer.play(2);
      delay(4000);
      myDFPlayer.loop(4);
    } else if (flagOpen==true) {
      flagOpen=false; 
      myDFPlayer.play(3);
    }
    delay(500);
  }

через LOOP(номер трека) не получилось, модуль эту строку игнорирует.

Методом проб и ошибок пришел к тому, что модулю чем-то просто не понравился тот трек, что я решил зациклить))) с другим все работает.

Думаю, тему можно закрывать)

Еще раз спасибо всем откликнувшимся. 

Vlad_58
Offline
Зарегистрирован: 14.03.2020

Всем огромный привет.Решил я тоже зимой от нечего делать собрать конструкцию на ардуино и купленным  DFPiaer mini MP3 .Как описывалось выше в постах я сразу впаял в цепь UART резисторы по 1 кОм,по ссылке:https://portal-pk.ru/news/247-delaem-mp3-pleer-na-dfplayer-mini-i-arduino.html,подключил библиотеку :"DFRobotDFPlayerMini.h".Вроде как бы меня устраивало всё до того момента,пока не столкнулся с проблемой-ничего то я прочитать не могу из плеера,а хотелось бы увидеть уровень громкости,состояние плеера,номер проигрываемого трека и многое другое.На экранчик ничего не выводится,т.е. выводится как на мониторе компа-

-1

0

-1
-1
-1
Вопрос:может ли кто чего подсказать по этому поводу,повторюсь,все мои комады плеер выполняет,но от туда ничего не выдаёт.
  Serial.println(myDFPlayer.readState()); //read mp3 state
  Serial.println(myDFPlayer.readVolume()); //read current volume
  Serial.println(myDFPlayer.readEQ()); //read EQ setting
  Serial.println(myDFPlayer.readFileCounts()); //read all file counts in SD card
  Serial.println(myDFPlayer.readCurrentFileNumber()); //read current play file number
  Serial.println(myDFPlayer.readFileCountsInFolder(3)); //read file counts in folder SD:/03
вот то что я запрашиваю у Плеера.Заранее прошу прощения за может быть не правильные термины.

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Контакта нет, поди.
Осциллографа нужна, однако.

raven78
Offline
Зарегистрирован: 03.11.2019

TX плеера прозвонить на предмет замыкания на корпус. Чип на плеере какой? Китайцы начали подделывать чипы и как результат ничерта не работает как надо

Vlad_58
Offline
Зарегистрирован: 14.03.2020

Спасибо за то что отозвались,начну с первого:

я думаю если бы не было контакта "однако",он у меня вообще не работал бы,а как я писал выше все команды посылаемые отрабатываются,и громкость и пауза и т.д.,нет обратной связи,т.е. я прочитать не могу состояние плеера.

По второму,тип чипа точно не могу прочитать,даже через лупу посмотрел,но могу ошибаться,показалось что :MH2024K-24SS

Замыканий никаких нет,мне же что то да приходит от туда,громкость приходит-0,№ трека--1,№эквалайзера--1 и т.д.

Жду новых идей.

raven78
Offline
Зарегистрирован: 03.11.2019

TX плеера отсоедините и посмотрите, что приходит

Vlad_58
Offline
Зарегистрирован: 14.03.2020

счас попробую и отпишусь

Vlad_58
Offline
Зарегистрирован: 14.03.2020

сделал то что просили,отсоединил ТХ плеера,громкость так и почему то приходит 0 ,а вот на остальные команды вообще не реагирует,я имею ввиду чтение,а то приходило от туда -1 

Vlad_58
Offline
Зарегистрирован: 14.03.2020

 у автора было  вот так :SoftwareSerial mySoftwareSerial(10, 11); ,а так как у меня эти порты заняты,я использовал 9 и 10,соответственно их прописав,может в библиотеке где то их нужно исправить?

raven78
Offline
Зарегистрирован: 03.11.2019

Ничего в библиотеке не нужно прописывать. Плеер может выполнять команды только по одному проводу RX, а вот если нужно прочитать что то из плеера то нужен уже TX. По какой то причине с TX ничего нет, это может быть кривизна чипа плеера или не верный монтаж. Вот https://github.com/ghmartin77/DFPlayerAnalyzer и посмотреть issues

 

Между командами плееру желательно сделать задержку 100 мс

Vlad_58
Offline
Зарегистрирован: 14.03.2020

Спасибо,завтра с утра подумаю как проверить,есть и осциллограф и много приборов всяких.Спасибо,найду причину,отпишусь,может кому и понадобится,

sadman41
Offline
Зарегистрирован: 19.10.2016

Подделывать чип дфплеера? Зачем?

raven78
Offline
Зарегистрирован: 03.11.2019

Вопрос к китайцам))) Затем, за чем же и  ds18b20, ft232 и далее и так далее

sadman41
Offline
Зарегистрирован: 19.10.2016

Ну, это-то брендовые чипы, не грех цап-царапнуть. Но дфплеер - чисто китайское детище, его-то зачем воровать..

SAB
Offline
Зарегистрирован: 27.12.2016

Их просто из брака тащат с завода, вот и попадаются глючные. Некоторые китайцы ещё те пройдохи.

Vlad_58
Offline
Зарегистрирован: 14.03.2020

Всем доброго утра.Проверил,перепроверил всё что можно было(в моём понимании),но результатов пока нет.На ножке ТХ плеера меняется конечно напряжение,но импульсы какие то слабые,но есть.Почему то есть напряжение постоянное в районе 3 вольт,я почему то думал,что там должно быть в районе уровня "0" TTL при отсутствии передачи от плеера.Жаль что выписал только 1 шт,можно было бы поменять и проверить другой плеер.Может это программный UART не очень корректен.А кто ещё подскажет,есть много схем подключения плеера к ардуино через штатные TX и RX (например http://arduinoprom.ru/shemotehnika/123-mp3-player-na-arduino.html).Можно ли так,а как тогда загрузить скетч? не опасно ли портам в паралель?Или я чего то не догоняю,поправьте меня кто может.

Vlad_58
Offline
Зарегистрирован: 14.03.2020

raven78 куда пропал?

 

raven78
Offline
Зарегистрирован: 03.11.2019

Через штатные rx и tx можно. Вот ещё https://github.com/enjoyneering/DFPlayer библиотека под  разные  варианты плеера, попробовать все. Я давал ссылку на DFplayerAnalizer, что выдаёт?

Vlad_58
Offline
Зарегистрирован: 14.03.2020

Привет.Выяснил что с библиотекой <DFRobotDFPlayerMini.h> плеер не проходит инициализацию, вначале есть такое условие,контроллер уходит в цикл.Что бы это мне не мешало я "ремировал" этот участок.Все команды принимает и работает,а обратно ничего не выдаёт,хотя я подключил паралельно TX RX платку-(не помню как называется ,выписывал у китайцев) и подключил к терминалу компа,стал смотреть что отправляю и что принимаю,вроде как приём есть но подозреваю что не выдаёт мне инфу из-за самой библиотеки.Нашёл другую простенькую библиотеку и сейчас изучаю.