светодиодное пано\ светодиодная матрица

lifegame
Offline
Зарегистрирован: 12.12.2016

Приветствую уважаемые знатоки!  загнался идеей создать квадратную матрицу из RGB светодиодов, накрыть матовым стеклом её и повесить на стену, типа интерактивная картина своеобразная, погуглил реализацию но нашел только темы с отдельным управлением одним диодом. Итак вопрос! возможно ли реализовать на ардуинке управление матрицей из 100 светодиодов? и самое главное что бы каждый диод мог отдельно управляться и я мог создавать любые световые эффекты

lifegame
Offline
Зарегистрирован: 12.12.2016

если это возможно я был бы рад любым советам по реализации

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

lifegame пишет:

погуглил реализацию но нашел только темы с отдельным управлением одним диодом. 

Странно Вы как-то гуглили. Материалов про RGB матрицы завались. В том числе и на данном форуме. Например, и ещё с десяток если поискать..

lifegame пишет:

Итак вопрос! возможно ли реализовать на ардуинке управление матрицей из 100 светодиодов? и самое главное что бы каждый диод мог отдельно управляться и я мог создавать любые световые эффекты

Можно. В том примере, на который я дал ссылку - 64 светодиода. Точно также можно сделать и из ста.

 

lifegame
Offline
Зарегистрирован: 12.12.2016

большое спасибо за помощь, вероятно я криво искал и запросы "подключение rgb светодиодов к arduino" не совсем верны для моей идеи

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Да, не за что. Смотрите. 

Там я правда делал исключительно демонстрацию работы матрицы, поэтому код сделан в лоб без каких-либо оптимизиаций. Но каждый диодик управляется независимо, как Вы хотели, и есть функции сложения цветов (когда одна волна на другую набегает). Для старта Вам подойдёт, а там разберётесь и оптимизируете.

arduinec
Offline
Зарегистрирован: 01.09.2015

В данном форуме есть несколько тем про светодиоды WS2811 или WS2812 (или ленты с ними) - их можно до 500 спокойно подключить (и управлять ими по одному пину).

lifegame
Offline
Зарегистрирован: 12.12.2016

большое спасибо! Ваш комментарий идеально подходит для моей задумки, на мой взгляд лента гораздо проще матрицы, а главное, как мне кажется, дешевле

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

lifegame пишет:

лента гораздо проще матрицы

Если умеете её готовить, то да.

lifegame пишет:

как мне кажется, дешевле

А вот это ХЗ.

И ещё, если ленту паять самому, то конечно "паяем как хотим", а если покупать готовую, то обращайте внимание на количество светодиодов на метр, а то бывает, что они довольно редко стоят. Также обращайте внимание на отзывы и ищите хорошего поставщика, т.к. часто халтурщики плохо делают теплоотвод. И последнее, сам не нарывался, но тут на форуме много писали - чтобы она служила долго и безпроблемно, сразу делайте двойной запас по току, т.е. подавайте на неё ток вдвое меньше, чем заявлено, т.к. светодиоды они туда пихают нонэймовые и от положенного тока они часто выходят из строя (как в китайских светодиодных лампах - китайцы делают их на меньший ток и тогда служат нормально).

 

lifegame
Offline
Зарегистрирован: 12.12.2016

спасибо за совет)

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

Здравствуйте. Подскажите как оптимизировать код:

Мне не нравится идея выполнять условия каждые N циклов, но зато не использую delay

#include <SPI.h>
enum { reg = 8 };


int q=16;
int t=0;
int a=0;
void setup()
{
  SPI.begin(); 
  pinMode(reg, OUTPUT); 
  Serial.begin(9600);
}

static uint8_t digit[96] = {
0x01,0xE0,
0x02,0xEE,
0x04,0xEE,
0x08,0xEE,
0x10,0xEE,
0x20,0xEE,
0x40,0xEE,
0x80,0xE0,
//Ноль
0x01,0xEF,
0x02,0xEF,
0x04,0xEF,
0x08,0xEF,
0x10,0xEF,
0x20,0xEF,
0x40,0xEF,
0x80,0xEF,
//Один
0x01,0xE0,
0x02,0xEF,
0x04,0xEF,
0x08,0xE0,
0x10,0xE0,
0x20,0xFE,
0x40,0xFE,
0x80,0xE0,
//Два
0x01,0xE0,
0x02,0xEF,
0x04,0xEF,
0x08,0xE0,
0x10,0xE0,
0x20,0xEF,
0x40,0xEF,
0x80,0xE0,
//Три
0x01,0xEE,
0x02,0xEE,
0x04,0xEE,
0x08,0xE0,
0x10,0xE0,
0x20,0xEF,
0x40,0xEF,
0x80,0xEF,
//Четыре
0x01,0xE0,
0x02,0xFE,
0x04,0xFE,
0x08,0xE0,
0x10,0xE0,
0x20,0xEF,
0x40,0xEF,
0x80,0xE0,
//Пять
};

void loop()
{
a=a+1;
switch (a) {
case 1:q=16; t=0; break;//1 кадр
case 10000:q=q+16; t=t+16; break;//2 кадр
case 20000:q=q+16; t=t+16; break;//3 кадр
case 30000:q=q+16; t=t+16; break;//4 кадр
case 40000:q=q+16; t=t+16; break;//5 кадр
case 50000:q=q+16; t=t+16; break;//6 кадр
case 60000:a=0;break;//В начало анимации
}


for (int i=t;i<q;i+=2){
    digitalWrite(reg, LOW);
    SPI.transfer(digit[i+1]);
    SPI.transfer(digit[i]);
    digitalWrite(reg, HIGH);

  }
 
}

 

Nosferatu
Offline
Зарегистрирован: 04.11.2012

Irinka пишет:

Здравствуйте. Подскажите как оптимизировать код:

Мне не нравится идея выполнять условия каждые N циклов, но зато не использую delay

Можно избавится от переменной q.

#include <SPI.h>
enum { reg = 8 };


int t = 0;
int a = 0;
void setup()
{
  SPI.begin();
  pinMode(reg, OUTPUT);
  Serial.begin(9600);
}

static uint8_t digit[96] = {
  0x01, 0xE0,
  0x02, 0xEE,
  0x04, 0xEE,
  0x08, 0xEE,
  0x10, 0xEE,
  0x20, 0xEE,
  0x40, 0xEE,
  0x80, 0xE0,
  //Ноль
  0x01, 0xEF,
  0x02, 0xEF,
  0x04, 0xEF,
  0x08, 0xEF,
  0x10, 0xEF,
  0x20, 0xEF,
  0x40, 0xEF,
  0x80, 0xEF,
  //Один
  0x01, 0xE0,
  0x02, 0xEF,
  0x04, 0xEF,
  0x08, 0xE0,
  0x10, 0xE0,
  0x20, 0xFE,
  0x40, 0xFE,
  0x80, 0xE0,
  //Два
  0x01, 0xE0,
  0x02, 0xEF,
  0x04, 0xEF,
  0x08, 0xE0,
  0x10, 0xE0,
  0x20, 0xEF,
  0x40, 0xEF,
  0x80, 0xE0,
  //Три
  0x01, 0xEE,
  0x02, 0xEE,
  0x04, 0xEE,
  0x08, 0xE0,
  0x10, 0xE0,
  0x20, 0xEF,
  0x40, 0xEF,
  0x80, 0xEF,
  //Четыре
  0x01, 0xE0,
  0x02, 0xFE,
  0x04, 0xFE,
  0x08, 0xE0,
  0x10, 0xE0,
  0x20, 0xEF,
  0x40, 0xEF,
  0x80, 0xE0,
  //Пять
};

void loop()
{
  a = a + 1;
  switch (a) {
    case 1: t = 0; break; //1 кадр
    case 10000: t = t + 16; break; //2 кадр
    case 20000: t = t + 16; break; //3 кадр
    case 30000: t = t + 16; break; //4 кадр
    case 40000: t = t + 16; break; //5 кадр
    case 50000: t = t + 16; break; //6 кадр
    case 60000: a = 0; break; //В начало анимации
  }


  for (int i = 0; i < 16; i += 2) {
    digitalWrite(reg, LOW);
    SPI.transfer(digit[i + 1 + t]);
    SPI.transfer(digit[i + t]);
    digitalWrite(reg, HIGH);

  }

}

На работоспособность не проверялось.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Добрый день,

Irinka пишет:

Мне не нравится идея выполнять условия каждые N циклов,

Вот этого текста я не понял. Где у Вас там что делается каждые N циклов, Вы бы поподробнее рассказали.

Зато, глянул на код ... давайте вместе посмотрим ... Переменная a у Вас описана как int. Стало быть она не бывает больше, чем 32767, а Вы в строках 80-82 чего от неё ожидаете?

Irinka пишет:

но зато не использую delay

Само по себе это не говорит ни о чём. Использование или не использование того или иного инструмента обуславливается потребностями программы. Вот Вы не используете делэй, но при этом крутитесь в собственном цикле, т.е. процессорное время для других дел Вы всё равно не освободили. Так зачем было городить огород?

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

Добрый день

ЕвгенийП пишет:

Вот этого текста я не понял. Где у Вас там что делается каждые N циклов, Вы бы поподробнее рассказали.

Зато, глянул на код ... давайте вместе посмотрим ... Переменная a у Вас описана как int. Стало быть она не бывает больше, чем 32767, а Вы в строках 80-82 чего от неё ожидаете?

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

Цикл - это я имела ввиду a=a+1;....60000....

Ещё хотела спросить почему switch (в моем коде) после 40 000 притормаживает иногда. Про int не знала. Спасибо.

А я думала что таким образом освобождаю процессор.

Какое решение Вы посоветуете?

Этот код управляет светодиодной марицей 8*8 через два HC595

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Так потому и притормаживает. 32 тысячи он съел, а потом ему надо пройти отрицательные значения.

Решения советовать незваозможно, не зная задачи целиком. Если Вашей программе нечего делать между переключениями режимов (т.е. она не оправшивает никаких датчиков, кнопок и т.п.), то ставьте delay и не парьтесь.

Если же есть есть чем заняться, то делайте переключения через миллис или прерывания таймера, как Вам проще и легче.

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

Спасибо. Оставлю одну ардуинку чисто для рисования на матрице, а к ней организую доступ.

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017
Сделала вот так:

#include <SPI.h>
#define _STCPpin 8
int shift,str,kadr,timer,timerPrev=0;

static uint8_t smail[16] = {
0xC3,0xBD,0x5A,0x7E,0x5A,0x66,0xBD,0xC3,
0x7E,0x7E,0x7E,0x7E,0x7E,0x7E,0x7E,0x7E
};
static uint8_t stroka[8] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//строки

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


void loop(){
timer = millis(); 
if (timer-timerPrev>1000){
kadr=kadr+8;
if (kadr>sizeof(smail)-8){kadr=0;}
timerPrev=timer;
}
for (int i=kadr;i<kadr+8;i++){
digitalWrite(_STCPpin, LOW);
SPI.transfer(smail[i]);//столбец 
SPI.transfer(stroka[str]);//строка
digitalWrite(_STCPpin, HIGH);
str++;
if (str>7){str=0;}
}
 
}

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

вместо вот этого 

if (str>7){str=0;}

добрые луди пишуть 

str &= 0x7;

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

DetSimen пишет:

вместо вот этого 

if (str>7){str=0;}

добрые луди пишуть 

str &= 0x7;

Не разбирался в коде ТС, но эти два выражения в общем случае не одно и тоже

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

DetSimen пишет:

вместо вот этого 

if (str>7){str=0;}

добрые луди пишуть 

str &= 0x7;

Работает, спасибо.