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

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

Метки:
  1. Andrey.D

    Andrey.D Нерд

    Что то не укладывается как... я пытался но он все равно ругается.
     
  2. Tomasina

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

    у тебя в loop() 5 открывающих скобок и 6 закрывающих.
     
  3. Andrey.D

    Andrey.D Нерд

    Спасибо Tomasina! скечь залил но эфэкт не тот, точнее вообше нет эфекта - просто горит и все.
    Походу millis() и Switch функции не дружат. Я пытаюсь добится того что при case 'M' мигалки начнут мигать сами по себе, но походу луп пропускает отсчет так как не поступает сигнал case 'M'. есть может быть вариант полегче реализовать мигание светодиодом при подаче одного сигнала case 'M'?
    вот код:
    Код (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() {
    unsigned long currentMillis = millis();
     
      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':
         
            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;
    }
     
  4. Tomasina

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

    так и должно быть, ведь M появляется в буфере однократно.
    Просто обработку millis() надо вынести за пределы обработчика Serial:
    Код (C++):

    void loop() {
      static boolean flashEnable = false;

      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':
            flashEnable = !flashEnable; // разрешаем или запрещаем мигалки
            break;
          case 'N':
            digitalWrite(ledPin, LOW);
            break;
          case '1':
            mp3_cmd(NEXT, 0);
            break;
          case '2':
            mp3_cmd(STOP, 0);
            break;
        } // switch
      } // if Serial

      if (flashEnable == true && millis() - previousMillis >= interval) {
        ledState = !ledState;
        digitalWrite(ledPin, ledState);
        previousMillis = millis();
      } // if flashEnable

    } // loop
     
    Последнее редактирование: 15 ноя 2016
  5. Andrey.D

    Andrey.D Нерд

    Спасибо Большое за помощь! Теперь все мигает как надо но я не могу выключить пин А4 так как он привязон к циклу if(flashEnable)... и даже когда я подаю сигнал case'N' то через одну секунду светодиод включается вновь (цикл millis()). Как это можно поправить?
     
  6. Tomasina

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

    Код (C++):
          case 'M':
            flashEnable = true;
            break;
          case 'N':
            flashEnable = false;
            digitalWrite(ledPin, LOW);
            break;
     
    Andrey.D нравится это.
  7. Andrey.D

    Andrey.D Нерд

    Tomasina Огромное спасибо! все работает!:)
     
  8. Basilio83

    Basilio83 Нерд

    помогите, что не так с скетчем при подключении датчика тока не хочет работать
    Код (C++):
    #include <SoftwareSerial.h>
    #include <DFPlayer_Mini_Mp3.h>
    int flag=0;// переменная равна 0
    #define BUSY_MP3  11 // ножка BUSY занятость мп3 (0-играет, 1-молчит)
    #define SENSOR_PIN A0 // ножка датчика тока
    SoftwareSerial mySerial(9, 10); // RX, TX
    void setup () {
        Serial.begin (9600);
      mySerial.begin (9600);
      mp3_set_serial (mySerial);    //set Serial for DFPlayer-mini mp3 module
        mp3_set_volume (25);
      pinMode(BUSY_MP3, INPUT);// установил вход на 11 пин BUSY_MP3
      pinMode(12, OUTPUT);// установил выход на 12 пин
    }


    //
    void loop ()  {
      long val = 0;
      if(digitalRead(8)==HIGH&&flag==0)
      // если на 8 входе есть сигнал и переменная равна 0 то...
      {
      digitalWrite(12,!digitalRead(12));//меняем значение выхода на противоположное
      flag=1;//меняем значение ФЛАГА
      //это нужно для того что бы с каждым нажатием кнопки
      //происходило только одно действие
      // плюс защита от "дребезга"  100%
      delay (1000);
      }
       if(digitalRead(8)==LOW&&flag==1)
      //если на 8 входе нет сигнал и переменная равна 1 то...
    {
      flag=0;//обнуляем переменную
      delay (1000);
      }
        for (int i=0; i<100; ++i) {
            val = val + analogRead(SENSOR_PIN);
        }
        val = val/100;
    if(digitalRead(12)==HIGH&&digitalRead(BUSY_MP3)==HIGH&&val>530)
    // если есть сигнал на на 12 выходе и BUSY_MP3 и оба генератора работают то ...
    {
      mp3_play (3);//проигрываем 3 трек
      delay (100);
    }
        if(val<520&&digitalRead(BUSY_MP3)==HIGH&&digitalRead(12)==HIGH)
        {
      mp3_play (1);//проигрываем 1 трек
      delay (100);
    }
    if(val>520&&val<530&&digitalRead(BUSY_MP3)==HIGH&&digitalRead(12)==HIGH)
        {
      mp3_play (2);//проигрываем 2 трек
      delay (100);
    }
    if(digitalRead(12)==LOW)
    // если на 12 выходе нет сигнала то...
    {
      mp3_stop ();
    }
    Serial.println(val);
    }
     
  9. Tomasina

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

    Нафига так наверчено?
    Код (C++):
    #include <SoftwareSerial.h>
    #include <DFPlayer_Mini_Mp3.h>
    int flag = 0; // переменная равна 0
    #define BUSY_MP3  11 // ножка BUSY занятость мп3 (0-играет, 1-молчит)
    #define SENSOR_PIN A0 // ножка датчика тока
    SoftwareSerial mySerial(9, 10); // RX, TX
    void setup () {
      Serial.begin (9600);
      mySerial.begin (9600);
      mp3_set_serial (mySerial);    //set Serial for DFPlayer-mini mp3 module
      mp3_set_volume (25);
      pinMode(BUSY_MP3, INPUT);// установил вход на 11 пин BUSY_MP3
      pinMode(12, OUTPUT);// установил выход на 12 пин
    }


    //
    void loop ()
    {
      long val = 0;
      if (digitalRead(8) == HIGH && flag == 0)
        // если на 8 входе есть сигнал и переменная равна 0 то...
      {
        Serial.println("@1");
        digitalWrite(12, !digitalRead(12)); //меняем значение выхода на противоположное
        flag = 1; //меняем значение ФЛАГА
        //это нужно для того что бы с каждым нажатием кнопки
        //происходило только одно действие
        // плюс защита от "дребезга"  100%
        delay (1000);
      }

      if (digitalRead(8) == LOW && flag == 1)
        //если на 8 входе нет сигнал и переменная равна 1 то...
      {
        Serial.println("@2");
        flag = 0; //обнуляем переменную
        delay (1000);
      }

      for (int i = 0; i < 100; ++i) val = val + analogRead(SENSOR_PIN);
      val = val / 100;
      Serial.println(val);

      if (digitalRead(BUSY_MP3) == HIGH && digitalRead(12) == HIGH)    // если есть сигнал на на 12 выходе и BUSY_MP3 и оба генератора работают то ...
      {
        if (val < 520)
        {
          Serial.println("@3");
          mp3_play (1);//проигрываем 1 трек
          delay (100);
        }

        if (val > 520 && val < 530)
        {
          Serial.println("@4");
          mp3_play (2);//проигрываем 2 трек
          delay (100);
        }

        if (val > 530)
        {
          Serial.println("@5");
          mp3_play (3);//проигрываем 3 трек
          delay (100);
        }
      } //

      if (digitalRead(12) == LOW) // если на 12 выходе нет сигнала то...
      {
        Serial.println("@6");
        mp3_stop ();
      }
    }
    Так же ведь проще читать.
     
  10. Basilio83

    Basilio83 Нерд

    извините нуба, что означает @1,2,3 и т.д.
     
  11. Tomasina

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

    просто метки, чтобы в консоли можно было проконтролировать в каком месте программа сейчас выполняется.
     
  12. Basilio83

    Basilio83 Нерд

    Мне в принципе и не нужна консоль, это остаток от другого скетча. Попробую на работоспособность Вами исправленный и отпишусь
     
  13. Basilio83

    Basilio83 Нерд

    Можете подсказать, измерял значения на аналоговом входе с датчика тока питание с ардуины, могут ли поменяться показание если питание от внешнего источника.
     
  14. Tomasina

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

    да, они немного будут отличаться.
     
  15. Basilio83

    Basilio83 Нерд

    Подключал внешнее питание и usb к компу так значения с датчика прыгают по мере воспроизведения трека. Не пойму как тогда настроить скетч.
     
  16. Tomasina

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

    похоже что источник питания слабоват - просадка напряжения идет при громких звуках.
    Или увеличить мощность ИП, или на питание поставить электролитический конденсатор на 2000-4700 мкФ, 16-25 В.
     
  17. Basilio83

    Basilio83 Нерд

    питание у меня идет через китайский конвертер на L7805 выход 5 В 1А думаю этого достаточно. К тому же показания при воспроизведении трека увеличиваются.