DFPlayer mp3 Mini нужна помощь

Тема в разделе "Схемотехника, компоненты, модули", создана пользователем Andrey.D, 11 ноя 2016.

Метки:
  1. ostrov

    ostrov Гуру

    Вот относительно простой способ. Обратите внимание. что используется Serial3, для другого порта нужно подправить.
    Код (C++):
    #define PLAY  0x03          // команда play
    #define VOL   0x06          // команда громкость, аргумент: 0 - 30
    #define BUSY_MP3  9         // занятость мп3 (0-играет, 1-молчит)
    byte buff[10] = {0x7E, 0xFF, 0x06, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEF};

    void setup() {
      pinMode(BUSY_MP3, INPUT);  
      Serial3.begin(9600);      // плеер
      mp3_cmd(VOL, 22);         // громкость
      delay(100);
      play (1);                 // проигрываем первый файл (отсчет ведется по порядку записи файлов на SD)
    }

    void loop() {
    }


    // служебные ПП

    void play (byte np) {                 // проигрываем запись номер nm
      mp3_cmd(PLAY, np);
      delay(100);
      //  while (!digitalRead(BUSY_MP3)); // если нужно дождаться окончания проигрывания
    }

    void mp3_cmd (byte com, byte atr) {  // команда на плеер
      buff[3] = com;
      buff[6] = atr;
      mp3_check(buff);
      for (byte i = 0; i < 10; i++) {
        Serial3.write(buff[i]);
      }
    }

    void mp3_check (uint8_t *buf) {      // КС для плеера
      uint16_t sum = 0;
      for (byte i = 1; i < 7; i++) {
        sum += buf[i];
      }
      sum = -sum;
      *(buf + 7) = (uint8_t)(sum >> 8);
      *(buf + 8) = (uint8_t)sum;
     
    Andrey.D и Tomasina нравится это.
  2. Andrey.D

    Andrey.D Нерд

    Большое спасибо ostrov.
    У меня происходит какаето не описуймая ситуация.
    Я пытаюсь управлять плеером по Bluetooth через андроид, в функции switch под case '1' у меня проигрывается первый аудио файл при case '2' отключается воспроизведение, все это корректно работает. Теперь самое не объяснимое, когда я хочу настроит case '3' на воспроизведение второго трека, ардуино как будто игнорирует запрос и не чего не происходит. Такое впечатление что есть какаето конфронтация serial портов или еше чего. Мп3 плеер подключён к 0,1 пинам а Bluetooth module к 2 и 13 через softwareserial. помогите пожалуйста разобраться.
     
  3. ostrov

    ostrov Гуру

    Скетч опубликуйте уже. Только в тэг не забудьте засунуть.
     
  4. Andrey.D

    Andrey.D Нерд

    Код (C++):
    #include <SoftwareSerial.h>
    /*#include <DFPlayer_Mini_Mp3.h>*/
    #define PLAY  0x03          // команда play
    #define VOL   0x06          // команда громкость, аргумент: 0 - 30
    #define BUSY_MP3  9         // занятость мп3 (0-играет, 1-молчит)
    byte buff[10] = {0x7E, 0xFF, 0x06, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEF};
    #include <AFMotor.h>
    #include <Servo.h>
    AF_DCMotor motor2(2, MOTOR12_64KHZ);
    AF_DCMotor motor1(1, MOTOR12_64KHZ);
    AF_DCMotor motor3(3, MOTOR12_64KHZ);
    AF_DCMotor motor4(4, MOTOR12_64KHZ);
    Servo servo1;
    SoftwareSerial mySerial(2,13); // RX, TX


    void setup() {
      servo1.write(90);
      delay(15);
      mySerial.begin(9600);
      pinMode(BUSY_MP3, INPUT);
      Serial.begin(9600);      // плеер
      mp3_cmd(VOL, 29);         // громкость
      delay(100);
      play (1);                 // проигрываем первый файл (отсчет ведется по порядку записи файлов на SD)
      /*mp3_set_serial (Serial);//set Serial for DFPlayer-mini mp3 module
      delay(100);
      mp3_set_volume (30);
      delay(100);
      mp3_play (1); */

      motor1.setSpeed(100);
      motor2.setSpeed(100);
      motor3.setSpeed(100);
      motor4.setSpeed(100);
      motor1.run(RELEASE) ;
      motor2.run(RELEASE) ;
      motor3.run(RELEASE) ;
      motor4.run(RELEASE) ;
      servo1.attach(9);
      pinMode(A0, OUTPUT);
      pinMode(A1, OUTPUT);
     
    }

    void loop() {
     
       
         if (mySerial.available() > 0) {
         char control = mySerial.read();
         switch(control)
         {
         
           case 'S':
            digitalWrite(A1,LOW);
            motor1.run(RELEASE) ;
            motor2.run(RELEASE) ;
            motor3.run(RELEASE) ;
            motor4.run(RELEASE) ;
            break;
           case 'F':
          /* mp3_play (1);*/
            digitalWrite(A1,LOW);
            motor1.run(FORWARD) ;
            motor2.run(FORWARD) ;
            motor3.run(FORWARD) ;
            motor4.run(FORWARD) ;
            break;
           case 'B':
            motor1.run(BACKWARD) ;
            motor2.run(BACKWARD) ;
            motor3.run(BACKWARD) ;
            motor4.run(BACKWARD) ;
            digitalWrite(A1, HIGH);
            break;
           case 'L':
            servo1.write(50);                                                      
            delay(15);
            break;
           case 'R':
            servo1.write(130);                          
            delay(15);
            break;
           case 'C':
            servo1.write(90);                          
            delay(15);
            break;
           case 'P':
            digitalWrite(A0, HIGH);
            break;
           case 'O':
            digitalWrite(A0, LOW);
            break;
           case '1':
           /* mp3_play (1);*/
           play (2);
            break;
           case '2':
           /* mp3_stop ();*/
            break;
           case '3':
            /*mp3_next ();*/
            break;
         }
    }
    }
    void play (byte np) {                 // проигрываем запись номер nm
      mp3_cmd(PLAY, np);
      delay(100);
      //  while (!digitalRead(BUSY_MP3)); // если нужно дождаться окончания проигрывания
    }

    void mp3_cmd (byte com, byte atr) {  // команда на плеер
      buff[3] = com;
      buff[6] = atr;
      mp3_check(buff);
      for (byte i = 0; i < 10; i++) {
        Serial.write(buff[i]);
      }
    }

    void mp3_check (uint8_t *buf) {      // КС для плеера
      uint16_t sum = 0;
      for (byte i = 1; i < 7; i++) {
        sum += buf[i];
      }
      sum = -sum;
      *(buf + 7) = (uint8_t)(sum >> 8);
      *(buf + 8) = (uint8_t)sum;
    }
     
  5. ostrov

    ostrov Гуру

    Если верить вашей проге, то ,по команде '3' ничего происходить и не должно. По '2', кстати тоже. По '1' играет второй файл. А вот первый играет сразу после запуска программы.
     
  6. Andrey.D

    Andrey.D Нерд

    Да, сейчас не чего, так как я все закоментирывал чтоб проверить ваш код. Но все так же не чего не работает.
    Отдельно ваш опубликованный ранее код работает, но не в месте с моим скечем.
     
  7. Andrey.D

    Andrey.D Нерд

    Может стоит поменять местами Bleutooth и Мп3 модуль? Как вообще правильней зделать?
    Возможно ли зделать SoftwareSerial на аналоговые пины А2,А3 на про мини?
     
  8. ostrov

    ostrov Гуру

    В итоге я не понял что работает а что нет. Вы там половину закаментили и удивляетесь что что то не работает. Сделайте сначала свой скетч полностью рабочим и проверьте его, если не будет работать то выложите сюда.
     
    Andrey.D нравится это.
  9. Andrey.D

    Andrey.D Нерд

    ostrov Вы Гений! Большое спасибо!!! я и не знал что если есть много всего закоментирываного то это может привести к ошибкам! стер все лишнее теперь вроде все за играло как надо!
    Еше один вопрос: как дописать функцию STOP Playing тоесть останавить проигрывание?
     
  10. ostrov

    ostrov Гуру

    Попробуйте в шапке добавить
    #define STOP 0x0E
    а команду давать так:
    mp3_cmd(STOP, 0);

    Если не получится, то:
    #define STOP 0x3С
     
  11. Andrey.D

    Andrey.D Нерд

    Огромное Спасибо, проверю и отпишусь.
     
  12. Andrey.D

    Andrey.D Нерд

    Вот так все получилось! Огромное Спасибо!
     
  13. Andrey.D

    Andrey.D Нерд

    ostrov у меня есть один вопрос не по теме решил задать его тут чтоб не открывать еше одну тему. Подскажите пожалуйста почему не как не получается настроить аналоговые пины Arduino pro mini 5v с А2-А7 на дигитальный выход?
    А2 и А3 вообще не как не реагируют с моим скечем только А4 когда подаю HIGH загорается как и должно быть а вот LOW подаю и не как не выключается. Переставляю на А5\А6\А7 не чего не происходит но если коснутся А4 то он горит... все пины проверял отдельно все ок.
     
  14. ostrov

    ostrov Гуру

    Поставь сдвиговый регистр и не мучайся уже. )
     
  15. Andrey.D

    Andrey.D Нерд

    strov, post: 93103, member: 7724"]Поставь сдвиговый регистр и не мучайся уже. )[/QUOTE]
    В плане свободных пинов есть только аналоговые. есть у меня такой SN74HC595, нужно включать по отдельности 3 цепочки светодиодов. Можно ли в моей ситуации это реализовать? если да то как? первый раз сталкиваюсь с этим.
     
  16. ostrov

    ostrov Гуру

    Из 3х цифровых пинов делается хренова гора цифровых пинов на выход и столько же не вход из других трех цифровых пинов. Итого 6 пинов хватит на все случаи жизни, остальные пригодятся для коммуникации, всяких там UASRT, SPI и прочего.
     
  17. Andrey.D

    Andrey.D Нерд

    Вы имеете ввиду подключения не только светодиодов но и остальные компоненты как 'синий зуб' и Мп3 модуль?
     
  18. Tomasina

    Tomasina Сушитель лампочек Модератор

    A6 и A7 не могут работать на выход (digitalWrite или analogWrite), а только как аналоговый вход (analogRead).
    Аппаратное ограничение чипа.
     
  19. Andrey.D

    Andrey.D Нерд

    С пинами я разобрался. Теперь вот не могу понять почему кампилятор ругается?!
    Пытаюсь зделать мигание светодиодом без delay() на А4 пине вот код :
    Код (C++):
    #include <SoftwareSerial.h>
    #define PLAY  0x03          // команда play
    #define VOL   0x06          // команда громкость, аргумент: 0 - 30
    #define BUSY_MP3  9         // занятость мп3 (0-играет, 1-молчит)
    #define STOP 0x0E
    #define NEXT 0x01
    byte buff[10] = {0x7E, 0xFF, 0x06, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEF};
    #include <AFMotor.h>
    #include <Servo.h>
    AF_DCMotor motor2(2, MOTOR12_64KHZ);
    AF_DCMotor motor1(1, MOTOR12_64KHZ);
    AF_DCMotor motor3(3, MOTOR12_64KHZ);
    AF_DCMotor motor4(4, MOTOR12_64KHZ);
    Servo servo1;
    SoftwareSerial mySerial(2,13); // RX, TX
    const int ledPin =  A4;
    int ledState = LOW;
    unsigned long previousMillis = 0;
    const long interval = 1000;

    void setup() {
      servo1.write(90);
      delay(15);
      mySerial.begin(9600);
      pinMode(BUSY_MP3, INPUT);
      Serial.begin(9600);      // плеер
      mp3_cmd(VOL, 30);         // громкость
      delay(100);
      play (1);                 // проигрываем первый файл (отсчет ведется по порядку записи файлов на SD)
      motor1.setSpeed(100);
      motor2.setSpeed(100);
      motor3.setSpeed(100);
      motor4.setSpeed(100);
      motor1.run(RELEASE) ;
      motor2.run(RELEASE) ;
      motor3.run(RELEASE) ;
      motor4.run(RELEASE) ;
      servo1.attach(9);
      pinMode(A0, OUTPUT);
      pinMode(A1, OUTPUT);
      pinMode(ledPin, OUTPUT);

    }

    void loop() {

     
         if (mySerial.available() > 0) {
         char control = mySerial.read();
         switch(control)
         {
       
           case 'S':
            mp3_cmd(STOP, 0);
            digitalWrite(A1,LOW);
            motor1.run(RELEASE) ;
            motor2.run(RELEASE) ;
            motor3.run(RELEASE) ;
            motor4.run(RELEASE) ;
            break;
           case 'F':
            play (2);
            digitalWrite(A1,LOW);
            motor1.run(FORWARD) ;
            motor2.run(FORWARD) ;
            motor3.run(FORWARD) ;
            motor4.run(FORWARD) ;
            break;
           case 'B':
            play (3);
            motor1.run(BACKWARD) ;
            motor2.run(BACKWARD) ;
            motor3.run(BACKWARD) ;
            motor4.run(BACKWARD) ;
            digitalWrite(A1, HIGH);
            break;
           case 'L':
            servo1.write(50);                                                    
            delay(15);
            break;
           case 'R':
            servo1.write(130);                          
            delay(15);
            break;
           case 'C':
            servo1.write(90);                          
            delay(15);
            break;
           case 'P':
            digitalWrite(A0, HIGH);
            break;
           case 'O':
            digitalWrite(A0, LOW);
            break;
           case 'M':
            unsigned long currentMillis = millis();
            if (currentMillis - previousMillis >= interval) {
                previousMillis = currentMillis;
            if (ledState == LOW) {
                ledState = HIGH;
         } else {
                 ledState = LOW;
                 }
            digitalWrite(ledPin, ledState);
      }
    }
         
            break;
           case 'N':
            digitalWrite(ledPin, LOW);
            break;
           case '1':
           mp3_cmd(NEXT, 0);
            break;
           case '2':
           mp3_cmd(STOP, 0);
            break;
         }
    }
    }
    void play (byte np) {                 // проигрываем запись номер nm
      mp3_cmd(PLAY, np);
      delay(100);
      //  while (!digitalRead(BUSY_MP3)); // если нужно дождаться окончания проигрывания
    }

    void mp3_cmd (byte com, byte atr) {  // команда на плеер
      buff[3] = com;
      buff[6] = atr;
      mp3_check(buff);
      for (byte i = 0; i < 10; i++) {
        Serial.write(buff[i]);
      }
    }

    void mp3_check (uint8_t *buf) {      // КС для плеера
      uint16_t sum = 0;
      for (byte i = 1; i < 7; i++) {
        sum += buf[i];
      }
      sum = -sum;
      *(buf + 7) = (uint8_t)(sum >> 8);
      *(buf + 8) = (uint8_t)sum;
    }
    Кампилятор ругается пишет:
     
  20. ostrov

    ostrov Гуру

    Рассьавбте правильно фигурнве скобки. Автоформат даже немного подсказывает.