Помогите разобраться с UART DFPlayer Mini 2.0

Тема в разделе "Arduino & Shields", создана пользователем Unruly, 27 ноя 2014.

  1. ostrov

    ostrov Гуру

    Команда уходит на скорости 9600, пакет не помню байт 10 что ли, даже на передачу какое то время уйдет. То есть мгновенно не получится никак.
     
  2. Caver

    Caver Нуб

    Ну мгновенно вообще ничего в этом мире не происходит) А плеер только со скоростью 9600 работает?
     
  3. Hmuriy

    Hmuriy Нуб

    Сильно не пинайте, нужна помощь. Хочу сделать ребенку плеер, где при нажатии кнопки включается случайный трек и потом останавливается.
    Брал скетч от NikNow из 63 поста

    Код (C++):
    #include <SoftwareSerial.h>
    #include <DFPlayer_Mini_Mp3.h>


    int playStatePin = 3;       //digital pin3: read the module play state
    SoftwareSerial mySerial(8, 9); // RX, TX (Serial wiring; RX-TX, TX-RX)
    int flag=0;
    int n=0;

    void setup () {
      pinMode(mySerial, OUTPUT);
      Serial.begin (9600);
      mySerial.begin (9600);
      mp3_set_serial (mySerial);  //set softwareSerial for DFPlayer-mini mp3 module
      mp3_set_volume (30);        //value 0~30
      delay(1000);   //wait for the module setting finished
           mp3_stop ();
    }

    void loop()
    {    
         if(digitalRead(14)==HIGH&&flag==0)
         {
          flag = 1;
         }
     
         if (digitalRead(14)==LOW&&flag==1)
         {
          delay(300);
          mp3_play (n++);
          delay(3000);
          mp3_stop ();
          delay(300);
          digitalWrite(mySerial,!digitalRead(mySerial));
          flag = 0;//обнуляем переменную flag
         }
    }
    Если честно мне даже до нуба еще далеко, пытаюсь вникнуть из-за стремления порадовать ребенка.
    Как я понял в скетче переназначены пины Rx Tx на 8 и 9, кнопка на 3 пин.
    При включении ничего не происходит (горит только светодиод PWR, Rx и Tx не мигают), на кнопку не реагирует (подключал через 10к). Пробовал делать с Нано и Уно итог один. Но пробные скетчи работаю исправно.
    То ли скетч не работает то ли мне это понять не дано :confused:
     
  4. ostrov

    ostrov Гуру

    Сделайте n=1 вначале.
    Это уберите: pinMode(mySerial, OUTPUT);
    Как кнопка подключена? Судя по программе она не на 3, а на 14. Притяжка внешняя?
    Этим чего хотели добиться? digitalWrite(mySerial,!digitalRead(mySerial));
     
    Последнее редактирование: 12 май 2018
  5. Hmuriy

    Hmuriy Нуб

    Честно не знаю, скетч не мой.
    Немножко поправил по вашим рекомендациям и обратно переназначил Rx Tx

    Код (C++):
    #include <SoftwareSerial.h>
    #include <DFPlayer_Mini_Mp3.h>


    int playStatePin = 3;       //digital pin3: read the module play state
    int flag=0;
    int n=1;

    void setup () {
      Serial.begin (9600);
      mp3_set_serial (Serial);  //set softwareSerial for DFPlayer-mini mp3 module
      mp3_set_volume (15);        //value 0~30
      delay(1000);   //wait for the module setting finished
      mp3_stop ();
    }

    void loop()
    {  
         if(digitalRead(14)==HIGH&&flag==0)
         {
          flag = 1;
         }
     
         if (digitalRead(14)==LOW&&flag==1)
         {
          delay(300);
          mp3_play (n++);
          delay(3000);
          mp3_stop ();
          delay(300);
          flag = 0;//обнуляем переменную flag
         }
    }
    Самый сюрприз обнаружился в том, что на модуле перепутаны Rx и Tx. Теперь все работает но трек воспроизводится 3 сек. Как понимаю это обосновано условием delay. А как сделать чтобы трек любой продолжительности воспроизводился целиком?
     
  6. Airbus

    Airbus Оракул

    Зачем Software serial?Когда есть аппаратный?
     
  7. ostrov

    ostrov Гуру

    Уберите mp3.stop(). И tx на этом модуле не нужен, с плеера ничего не идет, достаточно одного провода. И треки идут подряд, не случайно. Используйте random() если надо.
     
  8. Hmuriy

    Hmuriy Нуб

    Просто не все удалил )

    Я уже поигрался и тоже это обнаружил. Только при удалении mp3.stop() треки играют друг за другом не останавливаясь.
     
  9. ostrov

    ostrov Гуру

    Тут надо или дать команду плееру вначале играть треки по одному, или отслеживать ножку BUSY и тормозить их программно.
     
  10. ostrov

    ostrov Гуру

    Как в библиотеке делать не знаю, я ей не пользуюсь, а команда вот в нижней строке:
    [​IMG]
     
  11. atompost

    atompost Гик

    Вот, может кому пригодиться.
    DFPlayer подключен к ардуиньке (UNO) по этой схеме:
    [​IMG]

    Busy зацеплен на 12 пин дуньки, все управляется ИК пультом

    вот таким
    [​IMG]

    Библиотеку брал от сюда: клац

    Код (C++):

    #include <DFPlayer_Mini_Mp3.h>
    #include <IRremote.h>
    int irPin   = 11;
    int busy    = 12;
    int volume  = 5;
    int trigger = 1;
    int trig    = 0;
    int EQvol   = 0;
    const unsigned long volUP      = 16754775;
    const unsigned long volDN      = 16769055;
    const unsigned long play_pause = 16761405;
    const unsigned long next       = 16712445;
    const unsigned long prev       = 16720605;
    const unsigned long EQ         = 16748655;
    IRrecv irrecv(irPin);
    decode_results results;

    void setup() {
      pinMode(busy, INPUT);
      Serial.begin(9600);
      mp3_set_serial(Serial);
      delay(100);
      mp3_set_volume(5);
      irrecv.enableIRIn();
    }
    void loop() {
      if (irrecv.decode(&results)) {
        Serial.println(results.value, DEC);
        if (results.value == play_pause) {
          trigger ? mp3_play() : mp3_pause ();
          trigger = !trigger;
          if (trigger == 0) {
            trig = 1;
          } else {
            trig = 0;
          }
          delay(100);
        }
        if (results.value == next) {
          mp3_next ();
          delay(100);
        }
        if (results.value == prev) {
          mp3_prev ();
          delay(100);
        }
        if (results.value == EQ) {
          mp3_set_EQ (EQvol);
          EQvol += 1;
          if (EQvol > 5) {
            EQvol = 0;
          }
          delay(100);
        }
        if (results.value == volUP) {
          mp3_set_volume(volume++);
          if (volume >= 29) {
            volume = 29;
          }
          delay(100);
        }
        if (results.value == volDN) {
          mp3_set_volume(volume--);
          if (volume <= 1) {
            volume = 1;
          }
          delay(100);
        }
        irrecv.resume();
      }

      int count = digitalRead(busy);
      if (count == 1 && trig == 1) {
        mp3_next ();
        delay (100);
      }
    }

     
     
    Последнее редактирование: 22 май 2018
  12. DIYMan

    DIYMan Гуру

    Хочешь, плохой вещь скажу? Вопрос - накохер там double, сиречь - операции с плавающей точкой, если все чиста прекрасно вмещаются в unsigned long? Это я про твои константы, если что ;) Да и некорректно это, строго говоря: если убрать неявные преобразования, которые за тебя делает компилятор, приводя твои double к целочисленному типу левого операнда, то НИКОГДА результат сравнения целого числа с double не будет равен true - это я про "results.value== volDN": даже если слева - значение 1, и в volDN лежит 1.0, то на самом деле - в volDN лежит не 1.0, а число, очень близкое к 1.0, но - не 1.0.

    Короче, такой код - источник потенциальных скрытых ошибок, и следует это понимать. Пока за тебя решает компилятор и его настройки по умолчанию - ты с этим не сталкиваешься. Но это не значит, что суслика нет ;)
     
    parovoZZ нравится это.
  13. atompost

    atompost Гик


    Благодарю за замечания, глаз даже не зацепился за типы, код писался давно ...
     
  14. VadimG

    VadimG Нуб

    Ребят, подскажите, может кто видел или знает как сделать из DFPlayer такую вещь:
    на разные пины ардуино подавать "ноль", и в зависимости от этого, на какой пин подан ноль, играет той или иной назначенный трек с DFPlayer?
     
  15. DIYMan

    DIYMan Гуру

    И в чём у тебя сложности? Как прочитать состояние пина - знаешь? Как проиграть трек на DFPlayer - знаешь? В чём проблема-то? Опять кусок готового кода нужно?
     
  16. parovoZZ

    parovoZZ Гуру

    Ну естественно =)
     
    DetSimen нравится это.
  17. VadimG

    VadimG Нуб

    Как проиграть трек на DFPlayer ещё смогу разобраться, а как прочитать пины и дать команду - нет )
     
  18. DIYMan

    DIYMan Гуру

    Так что мешает разобраться-то? Лень-матушка? Прочитать про digitalRead - так сложно? Примеры из поставки Arduino IDE посмотреть - запрещает сосед? Посмотреть в этой самой теме, как работать с DFPlayer - можно только в високосный год 29-го февраля, не чаще?
     
    parovoZZ нравится это.
  19. a1000

    a1000 Гик

    Как читать состояние пина
    https://doc.arduino.ua/ru/prog/DigitalRead
    Ну а потом сравниваешь полученное значение с нулём - совпало, включаешь трек.
     
    VadimG нравится это.
  20. parovoZZ

    parovoZZ Гуру

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