Arduino зависает при подключении dfplayer mini

Тема в разделе "Схемотехника, компоненты, модули", создана пользователем jonihh, 13 авг 2018.

  1. jonihh

    jonihh Нуб

    Имею ардуино нано, ресивер spektrum (ШИМ сигнал с 2 каналов), плеер, усилок к нему, динамик на 0.5 Вт 8 Ом, микросд на 2 гб, 2 драйвера l293d параллельно соединенных (ардуино думает, что он один), 3 двигателя n20 300 об/мин 12В (если надо).

    Вот код (вставляю впервые, вроде бы правильно вставляю):

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

    #include <SoftwareSerial.h>



    int channel;
    int channel2;
    byte Speedmotor;
    int diapazonSpeed;
    byte iz;

    int max1, max2, min1, min2, maxa1, maxa2, mina1, mina2;
    //SoftwareSerial mp3(9, 10);

    //const int ledPin =  ;      // номер выхода, подключенного к светодиоду
    //int ledState = LOW;             // этой переменной устанавливаем состояние светодиода
    //long previousMillis = 0;        // храним время последнего переключения светодиода
    //long interval = 400;

    void setup() {
      pinMode(3, INPUT);
      pinMode(5, INPUT);
      pinMode(8, OUTPUT);
      pinMode(7, OUTPUT);
      pinMode(6, OUTPUT);
    //  pinMode(ledPin, OUTPUT);
      Serial.begin(9600);
      max1=1890  ; //вверх верхний предел
      min1=1510  ; //вверх нижний предел
      max2=1490  ; //вниз верхний предел
      min2=1215  ; //вниз нижний предел
      maxa1=1820  ; //правый стик (лево-право) правый предел
      mina1=1520  ; //правый минимум
      maxa2=1500  ; //левый минимум
      mina2=1245  ; //левый предел
    //  mp3.begin(9600);
      mp3_set_serial(Serial); // включаем передачу данных с DFPlayer mini mp3
      delay(1);               // задержка в 1ms для установки громкости
      mp3_set_volume(25);     // устанавливаем громкость от 0 до 30
      mp3_set_EQ(0);          // устанавливаем эквалайзер от 0 до 5
    }

    void loop() {
    //получаем данные с приемника
    channel=pulseIn(3,HIGH);
    channel2=pulseIn(5,HIGH);

    //мониторим данные

    //  Serial.print(channel);
    //  Serial.print(" - ");
    //  Serial.print(channel2);
    //  Serial.print(" - ");
    //  Serial.print(Speedmotor);
    //  Serial.print(" - ");
    //  Serial.print(diapazonSpeed);
    //  Serial.print(" - ");
    //  Serial.println(iz);


    //управление мотором


    if (channel>min1) {  //ход вперед
      digitalWrite(7, LOW);          //7 HIGH назад
      digitalWrite(8, HIGH);         //8 HIGH вперед
      Speedmotor=(channel-min1)/1.5;
      analogWrite(6, Speedmotor);
      diapazonSpeed=2;
    }

    if (channel>(max1-10)) {  //ход вперед max
      digitalWrite(7, LOW);      
      digitalWrite(8, HIGH);
      Speedmotor=254;
      analogWrite(6, Speedmotor);
      diapazonSpeed=2;
    }
    if (channel<max2) { //ход назад
      digitalWrite(8,LOW);
      digitalWrite(7,HIGH);
      Speedmotor=((max2-channel)/1.083);
      analogWrite(6, Speedmotor);
      diapazonSpeed=3;
    }
    if (channel<(min2+10)) { //ход назад max
      digitalWrite(8,LOW);
      digitalWrite(7,HIGH);
      Speedmotor=254;
      analogWrite(6, Speedmotor);
      diapazonSpeed=3;
    }

    if (min1>channel && channel>max2 || channel<1100) { //на месте
      Speedmotor=0;
      digitalWrite(7,LOW);
      digitalWrite(8,LOW);
      analogWrite(6, Speedmotor);
      diapazonSpeed=1;
    }

    //поворотники

    //unsigned long currentMillis = millis();
    //if (min1<channel2 || max2>channel2) {
    //  if(currentMillis - previousMillis > interval) {
    //    // сохраняем время последнего переключения
    //    previousMillis = currentMillis;
    //
    //    // если светодиод не горит, то зажигаем, и наоборот
    //    if (ledState == LOW)
    //      ledState = HIGH;
    //    else
    //      ledState = LOW;
    //  
    //    digitalWrite(ledPin, ledState);
    //  }
    //  if (mina1>channel2>maxa2){
    //    digitalWrite(ledPin, LOW);
    //  }
    //}

      //звук

       if (diapazonSpeed != iz){
       mp3_play(diapazonSpeed);
       iz=diapazonSpeed;
       }

    }
    Кратко, что хочу сделать:
    Принимаем сигнал, переводим значения, определяем какой трек играть (1, 2 или 3) и распределяем на пины 6 (скорость), 7 и 8 (крутить вперед или назад). Команды на плеер отправляю через rx-1кОм-tx и tx-1кОм-rx.


    Проблема, без строчки №29 "Serial.begin(9600);" звук не работает (что логично), но ардуино не зависает вообще (что тоже логично), но включаем строчку в код звук работает, но ардуино зависает на секунду-две. То есть двигаю стик пульта, машина стоит, звука нет, прошла секунда машина выполняет команду отправленную секунду назад и звук полностью соответствует движению. Если стик отпустить машина еще выполняет данные ей команды, то есть едет дальше еще секунду со звуком.

    Почему зависает и как можно решить? Код вроде бы не тяжелый, 12% памяти и 11% динамической

    ------------------------

    Есть идея использовать Adkey_1 и Adkey_2
    Кратковременно открывать транзистор напряжением с необходимых ног ардуино, тем самым замыкая gnd и adkey_1, в зависимости от скорости будут открываться различные транзисторы замыкающие цепи с различными резисторами по схеме:
    [​IMG]
    Тут столкнулся с проблемой, что при замыкание adkey_2 запускается не пятый трек, а второй и только при наличии пятого. Конфуз. Помогите пожалуйста, уже полгода постепенно колдую над машиной.

    UPD
    А если передавать команды через другие пины а не через RX TX?
     
  2. Daniil

    Daniil Гуру

    А что за звуки воспроизводятся? Мне кажется, что вы хотите чтобы операции выполнялись параллельно, но ардуина занята воспроизведением (могу ошибаться).
    Резисторы на Rx и Тх не нужны, но проблема не в них.
    "другие пины rx/tx" не вижу смысла использовать.
     
  3. DIYMan

    DIYMan Guest

    Вы не правы, читайте даташит на DFPlayer. Резистор на Rx плеера на 1К - нужен, иначе - будет шипение в динамике.
     
    Daniil нравится это.
  4. ostrov

    ostrov Гуру

    Библиотеки под этот плеер все кривые, надо давать команду без них.

    Номера треков не зависят от их названий, а зависят от физической очередности записи на флешку. Первым считается записанный первым и так далее.

    TX ардуины соединять с RX плеера через резистор.

    ТХ плеера соединять с RX ардуины не нужно вообще, там ничего нет.
     
  5. jonihh

    jonihh Нуб

    Я сегодня утром это заметил. Когда записал звук с названием не имеющим цифр.


    Что я хочу сделать:

    Когда нужно играть трек №1 (холостой ход, ход на месте) на пин d2 подаем HIGH. Этот пин подключен к Базе транзистора. Коллектор подключен к Adkey_1, Эмиттер к GND.
    Когда нужно играть трек №2 (малый ход вперед или назад не имеет значения) мы подаем HIGH на d4 который подключен к другому транзистору аналогично предыдущему, но к IO_1 (следующий трек)
    Когда нужно играть трек №3 (быстрый ход) мы подаем HIGH с d12 на транзистор к IO_2.
    Скорость сбавляется играет №2, скорость 0 играет №1, скорость повышается назад №2, скорость еще повышается №3 и т.д.

    Получится или не будет работать?

    Транзистор 2N2222A NPN

    Upd

    Или же управлять через аналоговые функцией digitalWrite значением, которое соответствует 0,6-1,2 вольт
     
    Последнее редактирование: 14 авг 2018
  6. jonihh

    jonihh Нуб

    Схема работает, но появляется паразитная переменная ломающая весь код...
     
  7. jonihh

    jonihh Нуб

    Значительно упростил код и использовал библиотеку, вместо транзисторов. Основные компоненты работают, но окончательно всё проверится в сборке.
     
  8. b707

    b707 Гуру

    "библиотеку вместо транзисторов" - это сильно.
    теперь ждем использование скетча вместо ардуины...
     
  9. jonihh

    jonihh Нуб

    Всё пашет отлично, но сам плеер переключает не моментально, а с тишиной в десятые секунды. Но это меня устраивает. На WTV020SD вообще задержка в секунду.
    Качество звука в сравнении с компом хуже, но похоже, что здесь динамик виноват.

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

    #include <SoftwareSerial.h>


    int channel;
    int channel2;
    int Speedmotor;
    int diapazonSpeed;
    int iz;
    int a;
    int b;

    int max1, max2, min1, min2, maxa1, maxa2, mina1, mina2;

    void setup() {
      Serial.begin(9600);
      pinMode(3, INPUT);
      pinMode(5, INPUT);
      pinMode(8, OUTPUT);
      pinMode(7, OUTPUT);
      pinMode(6, OUTPUT);
      a=2;
      b=60;
      max1=1890  ; //вверх верхний предел
      min1=1510  ; //вверх нижний предел
      max2=1477  ; //вниз верхний предел
      min2=1215  ; //вниз нижний предел
      maxa1=1820  ; //правый стик (лево-право) правый предел
      mina1=1520  ; //правый минимум
      maxa2=1500  ; //левый минимум
      mina2=1245  ; //левый предел


      mp3_set_serial(Serial);
      mp3_set_volume(20);
      mp3_play(4);
    }
    void loop (){
    channel=pulseIn(3,HIGH);
    channel2=pulseIn(5,HIGH);

    if (a!=b) {
      a=b;
      delay(5000);
    }


    if (channel>min1) {  //ход вперед
      digitalWrite(7, LOW);          //7 HIGH назад
      digitalWrite(8, HIGH);         //8 HIGH вперед
      Speedmotor=map(channel, min1, max1, 0, 253);
      analogWrite(6, Speedmotor);
    }

    if (channel<max2) { //ход назад
      digitalWrite(8,LOW);
      digitalWrite(7,HIGH);
      Speedmotor=map(channel, min2, max2, 253, 0);
      analogWrite(6, Speedmotor);
    }


    if (min1>channel && channel>max2 || channel<1100) { //на месте
      Speedmotor=0;
      digitalWrite(7,LOW);
      digitalWrite(8,LOW);
      analogWrite(6, Speedmotor);
    }

    if (Speedmotor<10 && Speedmotor>=0){
      diapazonSpeed=1;
    }

    if (Speedmotor<160 && Speedmotor>0){
      diapazonSpeed=2;
    }

    if (Speedmotor<255 && Speedmotor>160){
      diapazonSpeed=3;
    }





         if (diapazonSpeed != iz){
         mp3_play (diapazonSpeed);
         iz = diapazonSpeed;
         }
     

    }
     
     
    Последнее редактирование: 18 авг 2018