Простая гирлянда - проблема с ШИМ-выходом

Тема в разделе "Arduino & Shields", создана пользователем cooler.od, 13 май 2018.

  1. cooler.od

    cooler.od Нуб

    Всем привет!
    В качестве освоения ардуины тренируюсь на кошках на светодиодах.
    Задача проста: к пяти ШИМ-выходам Arduino UNO подсоединены светодиоды, в массив единичек и ноликов забита последовательность их зажигания. Программа поочередно перебирает строки массива. Попутно опрашиваем ИК-порт, при подаче команды с пульта очередность и скорость мигания могут меняться.
    Вот скетч. Все прекрасно работает, хотя подозреваю, что можно было бы изящнее. Критика приветствуется.

    Код (C++):

    #include <IRremote.h>
    int reciverPin = 11; // пин, к котрому подключен ИК-приемник
    IRrecv irrecv(reciverPin);
    decode_results results;

    int prg_now = 0; // номер выполняемой программы
    //int prg [5][5];  // текущая программа
    float koeff = 1.3;
    //int koeff = 10;
    int speed2 = 200;

    int led [5] = {5,6,3,10,9};  // выводы на светодиоды
    int prg [6][15][5] = {{
                        {5,0,0,0,0},
                        {1,0,0,0,0},
                        {0,1,0,0,0},
                        {0,0,1,0,0},
                        {0,0,0,1,0},
                        {0,0,0,0,1},
                      },
                      {
                        {2,0,0,0,0},
                        {0,1,0,1,0},
                        {1,0,1,0,1},
                      },
                      {
                        {4,0,0,0,0},
                        {0,1,0,1,0},
                        {0,0,1,0,0},
                        {0,1,0,1,0},
                        {1,0,0,0,1},
                      },
                      {
                        {2,0,0,0,0},
                        {1,1,1,1,1},
                        {0,0,0,0,0},
                      },
                      {
                        {14,0,0,0,0},
                        {1,0,0,0,0},
                        {0,1,0,0,0},
                        {1,0,0,0,0},
                        {0,0,1,0,0},
                        {1,0,0,0,0},
                        {0,0,0,1,0},
                        {1,0,0,0,0},
                        {0,0,0,0,1},
                        {1,0,0,0,0},
                        {0,0,0,1,0},
                        {1,0,0,0,0},
                        {0,0,1,0,0},
                        {1,0,0,0,0},
                        {0,1,0,0,0},
                      },
                      {
                        {10,0,0,0,0},
                        {0,0,0,0,0},
                        {1,0,0,0,0},
                        {1,1,0,0,0},
                        {1,1,1,0,0},
                        {1,1,1,1,0},
                        {1,1,1,1,1},
                        {1,1,1,1,0},
                        {1,1,1,0,0},
                        {1,1,0,0,0},
                        {1,0,0,0,0},
                      }};                                

    void setup()
    {
      Serial.begin(9600);
      irrecv.enableIRIn(); // запуск приемника
      pinMode(5, OUTPUT);
      pinMode(6, OUTPUT);
      pinMode(3, OUTPUT);
      pinMode(10, OUTPUT);
      pinMode(9, OUTPUT);
    }

    void loop()
    {

      for (int x = 1; x < (prg [prg_now][0][0] +1); x++)
      {
        for (int y = 0; y < 5; y++)
        {
          digitalWrite(led [y], prg [prg_now][x][y]);
            if (irrecv.decode(&results))
            {
              Serial.println(results.value, HEX);
              if(results.value == 0xFD00FF) prg_now = 0;
              if(results.value == 0xFD807F) prg_now = 1;
              if(results.value == 0xFD40BF) prg_now = 2;
              if(results.value == 0xFD20DF) prg_now = 3;
              if(results.value == 0xFDA05F) prg_now = 4;
              if(results.value == 0xFD609F) prg_now = 5;
              if(results.value == 0xFD8877) speed2 = speed2 / koeff;
              if(results.value == 0xFD9867) speed2 = speed2 * koeff;
              if(results.value == 0xFDA857) speed2 = 200;
              irrecv.resume(); // готовы принимать следующий сигнал
              break;
            }
        }
        delay (speed2);
      }
    }
     
    Следующим шагом в развитии хочу менять яркость светодиодов. Поменял digitalWrite на analogWrite, попытался на все выходы поочередно подать значение 200.
    И вот проблема: светодиод, подключенный к 3-му выходу, не мигает!
    Менял ардуину, менял в программе последовательность мигания - ничего не помогает. Но если я подаю значение 255, то выход работает! А при любом значении в analogWright менее 255 - мигают все светодиоды, кроме 3-го выхода.

    Скетч с analogWhright:
    Код (C++):
    #include <IRremote.h>
    int reciverPin = 11; // пин, к котрому подключен ИК-приемник
    IRrecv irrecv(reciverPin);
    decode_results results;
    int ggg;
    int x;
    int y;
    int prg_now = 0; // номер выполняемой программы
    //int prg [5][5];  // текущая программа
    float koeff = 1.3;
    //int koeff = 10;
    int speed2 = 200;

    int brightness = 255;    // уставливаем начально значение яркости
    int fadeAmount = 10;    // шаг приращения/убывания яркости

    int led [5] = {3,6,9,10,5};  // выводы на светодиоды
    int prg [6][15][5] = {{
                        {5,0,0,0,0},
                        {1,0,0,0,0},
                        {0,1,0,0,0},
                        {0,0,1,0,0},
                        {0,0,0,1,0},
                        {0,0,0,0,1},
                      },
                      {
                        {2,0,0,0,0},
                        {0,1,0,1,0},
                        {1,0,1,0,1},
                      },
                      {
                        {4,0,0,0,0},
                        {0,1,0,1,0},
                        {0,0,1,0,0},
                        {0,1,0,1,0},
                        {1,0,0,0,1},
                      },
                      {
                        {2,0,0,0,0},
                        {1,1,1,1,1},
                        {0,0,0,0,0},
                      },
                      {
                        {14,0,0,0,0},
                        {1,0,0,0,0},
                        {0,1,0,0,0},
                        {1,0,0,0,0},
                        {0,0,1,0,0},
                        {1,0,0,0,0},
                        {0,0,0,1,0},
                        {1,0,0,0,0},
                        {0,0,0,0,1},
                        {1,0,0,0,0},
                        {0,0,0,1,0},
                        {1,0,0,0,0},
                        {0,0,1,0,0},
                        {1,0,0,0,0},
                        {0,1,0,0,0},
                      },
                      {
                        {10,0,0,0,0},
                        {0,0,0,0,0},
                        {1,0,0,0,0},
                        {1,1,0,0,0},
                        {1,1,1,0,0},
                        {1,1,1,1,0},
                        {1,1,1,1,1},
                        {1,1,1,1,0},
                        {1,1,1,0,0},
                        {1,1,0,0,0},
                        {1,0,0,0,0},
                      }};                              

    void setup()
    {
      Serial.begin(9600);
      irrecv.enableIRIn(); // запуск приемника
      pinMode(5, OUTPUT);
      pinMode(6, OUTPUT);
      pinMode(9, OUTPUT);
      pinMode(10, OUTPUT);
      pinMode(3, OUTPUT);
    }

    void loop()
    {

      for (x = 1; x < (prg [prg_now][0][0] +1); x++)
      {
        for (y = 0; y < 5; y++)
        {
          ggg = (prg [prg_now][x][y]) * brightness;
          analogWrite(led [y], ggg);
          if (y == 0) Serial.println(ggg);
            if (irrecv.decode(&results))
            {
              Serial.println(results.value, HEX);
              if(results.value == 0xFD00FF) prg_now = 0;
              if(results.value == 0xFD807F) prg_now = 1;
              if(results.value == 0xFD40BF) prg_now = 2;
              if(results.value == 0xFD20DF) prg_now = 3;
              if(results.value == 0xFDA05F) prg_now = 4;
              if(results.value == 0xFD609F) prg_now = 5;
              if(results.value == 0xFD8877) speed2 = speed2 / koeff;
              if(results.value == 0xFD9867) speed2 = speed2 * koeff;
              if(results.value == 0xFDA857) speed2 = 200;

         
              irrecv.resume(); // готовы принимать следующий сигнал
              break;
            }
        }
        delay (speed2);
      }
    }
    Пытался запустить банальную программу из учебника - выход работает на любом значении, и светодиод меняет яркость. Но в моей программе не хочет.
    В чем может быть секрет?
     
    Последнее редактирование: 13 май 2018
  2. cooler.od

    cooler.od Нуб

  3. ostrov

    ostrov Гуру

    Гирлянда на ШИМ теперь интересна разве что мазохистам.:D
     
  4. cooler.od

    cooler.od Нуб

    Не сомневался, что какой-то мудак-бездельник зайдёт и отпишет что-нибудь остроумное...
    Для тех, у кого плохо со зрением, повторюсь: "В качестве освоения ардуины..."
     
    Последнее редактирование: 13 май 2018
  5. ostrov

    ostrov Гуру

    Вы бы за базаром следили, любезный.
     
  6. cooler.od

    cooler.od Нуб

    А вы когда эту дурость написали, что ожидали в ответ, кроме грубости?
    Программа моего сына, он делает лишь первые шаги в электронике... при чем здесь мазохизм?
     
  7. ostrov

    ostrov Гуру

    Ты нормальный нет? Никто не обязан читать твои дисклеймеры про учебный процесс и прочее. Раздавать собственные титулы тем кто опытней и, наверняка, старше тебя это и есть мудизм. Я тебе слово грубое до этого сказал? Если тебя воспитывали в лесу, то не выходи от туда пока не научишься вести себя в обществе.
     
  8. cooler.od

    cooler.od Нуб

    Во-первых, я старше тебя.
    Во-вторых, твой опыт никого не интересует, если он выражается лишь в умении насрать в комментах.
    Ты повел себя по-хамски, в ответ получил то же самое, чему ты удивляешься?

    П.С. Прошу админов закрыть или прибить тему по вполне понятным причинам.
     
  9. ostrov

    ostrov Гуру

    Темы здесь удаляют крайне редко. Будет висеть в качестве иллюстрации.
     
  10. Сначала великую русскую языку повтори:rolleyes: