Долго думает arduino UNO

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

  1. mantiss

    mantiss Нуб

    Написал тут код для подсветки дисков в машине. Лента светодиодная, RGB. В зависимости от ситуации она светит разными цветами. 6 выходов для управления лентой, 3 входа для считывания стоп-сигнала и 2х поворотников(буду брать 5 в с реле или как-то там..).

    Подключил пока РГБ светодиоды, для проверки. В начале, где тест, цвета переключаются нормально и быстро, а в самом теле цикла вообще беда. Как тест проходит, один диод почему-то горит красным, а другой зеленым(желтым, у меня вместо желтого зеленый пока задан), потом через какие-то переходы цвета устанавливается штатный режим(синий). Как только подаю 5в на какой-нибудь вход цвет меняется быстро, но вот как 5в пропадает - возвращается в штатный режим не сразу, секунд через 5. Как сделать чтоб этой задержки не было?


    там где видно пульсацию, я так понимаю, да и видно, цвет не чистый. ШИМ работает получается, а не должен же?

    Код (Text):
    // соответствие цветов выходам
    // left side
    #define rl 3
    #define gl 5
    #define bl 6
    // right side
    #define rr 9
    #define gr 10
    #define br 11
    // задаем входы
    #define L 7    // левый поворотник
    #define R 8    // правый поворотник
    #define S 12  // стоп

    void setup()
    {
      pinMode(L, INPUT);
      pinMode(R, INPUT);
      pinMode(S, INPUT);
      pinMode(rl, OUTPUT);
      pinMode(gl, OUTPUT);
      pinMode(bl, OUTPUT);
      pinMode(rr, OUTPUT);
      pinMode(gr, OUTPUT);
      pinMode(br, OUTPUT);
      //типа тест
      redLeft();
      redRight();
      delay(500);
      digitalWrite(rl, 0);
      digitalWrite(rr, 0);
      yellowLeft();
      yellowRight();
      delay(500);
      digitalWrite(gl, 0);
      digitalWrite(gr, 0);
      blueLeft();
      blueRight();
      delay(500);
      digitalWrite(bl, 0);
      digitalWrite(br, 0);
      delay(500);

    }
    void loop()
    {
      digitalWrite(L, LOW); // подтягивающие резисторы
      digitalWrite(R, LOW);
      digitalWrite(S, LOW);
      bool LS=digitalRead(L);
      bool RS=digitalRead(R);
      bool SS=digitalRead(S);

    // blueRight(); // штатный режим
    //  blueLeft();
      if (LS==HIGH&&RS==LOW&&SS==LOW) {// режим 1
      purge();
        yellowLeft();
        blueRight();
      }
    else if (LS==LOW&&RS==HIGH&&SS==LOW) {// режим 2
    purge();
        yellowRight();
        blueLeft();
      }
    else if ((LS==HIGH&&RS==HIGH&&SS==LOW)||(LS==HIGH&&RS==HIGH&&SS==HIGH)) {
      purge();
        yellowRight();  //режим 3
        yellowLeft();
      }
    else if (LS==LOW&&RS==LOW&&SS==HIGH) { //режим 4
    purge();
      redRight();
      redLeft();
      }
    else if (LS==LOW&&RS==HIGH&&SS==HIGH) { // режим 5
    purge();
      yellowRight();
      redLeft();
      }
    else if(LS==HIGH&&RS==LOW&&SS==HIGH) { //режим 6
    purge();
      redRight();
      yellowLeft();
      }
      else {
        purge();
        blueRight();
        blueLeft();
      }

    }

    // синий правый включить
    void blueRight()
    {
        digitalWrite(rr, 0);
        digitalWrite(gr, 0);
        digitalWrite(br, 1);
    }
    // синий левый включить
    void blueLeft()
    {
        digitalWrite(rl, 0);
        digitalWrite(gl, 0);
        digitalWrite(bl, 1);
    }
    // желтый правый включить
    void yellowRight()
    {
        digitalWrite(rr, 0);
        digitalWrite(gr, 1);
        digitalWrite(br, 0);
    }
    // желтый левый включить
    void yellowLeft()
    {
        digitalWrite(rl, 0);
        digitalWrite(gl, 1);
        digitalWrite(bl, 0);
    }
    // красный правый включить
    void redRight()
    {
        digitalWrite(rr, 1);
        digitalWrite(gr, 0);
        digitalWrite(br, 0);
    }
    // красный левый включить
    void redLeft()
    {
        digitalWrite(rl, 1);
        digitalWrite(gl, 0);
        digitalWrite(bl, 0);
    }
    void purge()
    {
        digitalWrite(rl, 0);
        digitalWrite(gl, 0);
        digitalWrite(bl, 0);
        digitalWrite(rl, 0);
        digitalWrite(gl, 0);
        digitalWrite(bl, 0);
    }
     
    Последнее редактирование: 6 ноя 2014
  2. lerik2703

    lerik2703 Гик

    Код (Text):
      digitalWrite(L, LOW); // подтягивающие резисторы
      digitalWrite(R, LOW);
      digitalWrite(S, LOW);
    это как?
    и зачем каждый раз подключать их?а лучше вообще от них отказаться и использовать внешнее резисторы.
     
  3. mantiss

    mantiss Нуб

    [​IMG]
    вот такая схема, пусть я уберу внутренние подтягивающие резисторы. Входы у меня 7,8,12. куда мне подключить внешние резисторы и какого номинала?
     
  4. mantiss

    mantiss Нуб

    1pinMode(L, INPUT_PULLUP);
    2pinMode(R, INPUT_PULLUP);
    3pinMode(S, INPUT_PULLUP);

    плюс всю логику наоборот.
    [​IMG]
    как-то так.. вроде нормально работает
     
  5. Unixon

    Unixon Оракул Модератор

    Вот как на картинке у mantiss работать как раз не будет. Излучатель оптопары работает в ИК с малым Vf, меньше, чем у светодиодов видимого диапазона. Напряжение на светодиоде/лампе перед оптопарой не будет больше Vf оптопары. Это грабли, не наступайте на них.
     
    Последнее редактирование: 8 ноя 2014
  6. Виталий

    Виталий Нерд

    А если попробовать вот так:

    Код (Text):

    // соответствие цветов выходам
    // left side
    #define rl 3
    #define yl 5
    #define bl 6
    // right side
    #define rr 9
    #define yr 10
    #define br 11

    // задаем входы
    #define L 7    // левый поворотник
    #define R 8    // правый поворотник
    #define S 12    // стоп

    int RGBb[2];
    int RGBr[2];
    int RGBy[2];


    void setup()
    {
      pinMode(L, INPUT);
      pinMode(R, INPUT);
      pinMode(S, INPUT);

      pinMode(rl, OUTPUT);
      pinMode(yl, OUTPUT);
      pinMode(bl, OUTPUT);
      pinMode(rr, OUTPUT);
      pinMode(yl, OUTPUT);
      pinMode(br, OUTPUT);

      digitalWrite(bl, 0);
      digitalWrite(br, 0);
      digitalWrite(rl, 0);
      digitalWrite(rr, 0);
      digitalWrite(yl, 0);
      digitalWrite(yr, 0);

      //типа тест
      digitalWrite(bl, 1);
      digitalWrite(br, 1);
      delay(500);
      digitalWrite(bl, 0);
      digitalWrite(br, 0);
      digitalWrite(rl, 1);
      digitalWrite(rr, 1);
      delay(500);
      digitalWrite(rl, 0);
      digitalWrite(rr, 0);
      digitalWrite(yl, 1);
      digitalWrite(yr, 1);
      delay(500);
      digitalWrite(yl, 0);
      digitalWrite(yr, 0);
    }

    void loop()
    {

      bool LS = digitalRead(L);
      bool RS = digitalRead(R);
      bool SS = digitalRead(S);

      // По умолчанию "Штатный" режим
      RGBb[1] = 1;
      RGBb[2] = 1;
      RGBr[1] = 0;
      RGBr[2] = 0;
      RGBy[1] = 0;
      RGBy[2] = 0;

      if (SS==HIGH) {// "Стоп"
        RGBb[1] = 0;
        RGBb[2] = 0;
        RGBr[1] = 1;
        RGBr[2] = 1;
      };

      if (LS==HIGH) {// "Левый поворот"
        RGBb[1] = 0;
        RGBr[1] = 0;
        RGBy[1] = 1;
      };

      if (RS==HIGH) {// "Правый поворот"
        RGBb[2] = 0;
        RGBr[2] = 0;
        RGBy[2] = 1;
      };

      digitalWrite(bl, RGBb[1]);
      digitalWrite(br, RGBb[2]);
      digitalWrite(rl, RGBr[1]);
      digitalWrite(rr, RGBr[2]);
      digitalWrite(yl, RGBy[1]);
      digitalWrite(yr, RGBy[2]);
    }