Управление RGB Led Матрицей 8х8

Тема в разделе "Arduino & Shields", создана пользователем Lag, 3 сен 2015.

  1. Lag

    Lag Нуб

    Добрый день. Подключил такую матрицу согласно схеме:[​IMG]

    Написал под неё несколько строчек кода и возникло несколько вопросов:
    1) Можно ли сделать ШИМ управление яркостью конкретного светодиода?
    2) Что лучше использовать сдвиговые регистры 74HC595 или драйвер MAX7219?
    3) Как написать код, так чтобы крайние светодиоды одного цвета были постоянно включены (рамка), а те что внутри - меняли свой цвет и положение? Функция millis() для этого подойдет?

    П.С. Пример моего очень плохого кода. Его буду переписывать с циклами. битовыми операциями и т.д.
    Код (Text):
    #include <SPI.h>

    enum { REG = 8 };

    void setup()
    {
      pinMode(REG, OUTPUT);
      SPI.begin();
    }

    void loop()
    {
      //field
      digitalWrite(8,LOW);
      SPI.transfer(B01111110);  // Red
      SPI.transfer(B01111110);  // Blue
      SPI.transfer(B10000001);  // Column
      SPI.transfer(B01111110);  // Green
      digitalWrite(8, HIGH);
      delay(200);
     
      digitalWrite(8,LOW);
      SPI.transfer(B11111111);  // Red
      SPI.transfer(B10111101);  // Blue
      SPI.transfer(B01000010);  // Column
      SPI.transfer(B10111101);  // Green
      digitalWrite(8, HIGH);
      delay(200);
     
      digitalWrite(8,LOW);
      SPI.transfer(B11011011);  // Red
      SPI.transfer(B11011011);  // Blue
      SPI.transfer(B00100100);  // Column
      SPI.transfer(B11111111);  // Green
      digitalWrite(8, HIGH);
      delay(200);
     
      digitalWrite(8,LOW);
      SPI.transfer(B11111111);  // Red
      SPI.transfer(B11100111);  // Blue
      SPI.transfer(B00011000);  // Column
      SPI.transfer(B11111111);  // Green
      digitalWrite(8, HIGH);
      delay(200);
    }
     
  2. DrProg

    DrProg Вечный нерд

    ШИМ через сдвиговые регистры нельзя.

    Могу подкинуть свой код, правда не знаю тот же алгоритм у вас или нет, я схему сам придумывал. У меня есть массив 8х8 который некая процедура выводит на матрицу. 0 - выкл, 1 - зеленый, 2 - красный, 3 - оранжевый. Менять можно что угодно где угодно, у меня например три разноцветных шарика бегает по матрице с разной скоростью отскакивая от стенок и друг от друга.
     
    ИгорьК нравится это.
  3. Lag

    Lag Нуб

    Да, я бы посмотрел. Скиньте пожалуйста
     
  4. DrProg

    DrProg Вечный нерд

    Частично вот, чтобы не мешало. Поле вот такое:
    Код (Text):
    #define DATA_PIN  13
    #define LATCH_PIN  12
    #define CLOCK_PIN  11

    #define DDD        // отладка и печать в ком порт

    byte masRG [8][8] = {    // поле
      0, 0, 0, 0, 0, 0, 0, 0,
      0, 0, 0, 0, 0, 0, 0, 0,
      0, 0, 0, 0, 0, 0, 0, 0,
      0, 0, 0, 0, 0, 0, 0, 0,
      0, 0, 0, 0, 0, 0, 0, 0,
      0, 0, 0, 0, 0, 0, 0, 0,
      0, 0, 0, 0, 0, 0, 0, 0,
      0, 0, 0, 0, 0, 0, 0, 0,
    };
    Сами кадры вот так выводятся:

    Код (Text):
    void setKadr_RG () {                                  // отрисовка кадра
      byte bytSTR;
      byte mR;
      byte mG;
      for (byte s = 0; s <= 7; s++) {
        bytSTR = 0;
        bitSet(bytSTR, s);
        for (byte i = 0; i <= 7; i++) {
          bitWrite(mR, i, !(bitRead(masRG[s][i], 0)));
          bitWrite(mG, i, !(bitRead(masRG[s][i], 1)));
        }
        MC_WRITE_PIN(LATCH_PIN, LOW);
        writeByte(bytSTR);
        writeByte(mR);
        writeByte(mG);
        MC_WRITE_PIN(LATCH_PIN, HIGH);
      }
    }

    void writeByte(byte byteW) {                          // аналог shiftOut, работает чуть быстрее
      for (int i = 7; i >= 0; i--)
      {
        MC_WRITE_PIN(DATA_PIN, (bitRead(byteW, i)));
        MC_WRITE_PIN(CLOCK_PIN, HIGH);
        MC_WRITE_PIN(CLOCK_PIN, LOW);
      }
    }
    MC_WRITE_PIN(LATCH_PIN, HIGH); это тоже самое что digitalWrite(LATCH_PIN, HIGH);
     
    ИгорьК нравится это.
  5. Lag

    Lag Нуб

    Спасибо!
     
  6. ANV

    ANV Гуру

    ШИМ можно, но это будет "ручной" ШИМ.