ARDUINO Куб 4х4х4 на RGB светодиодах

02.11.2018
21
8
3
#1
Всем привет.
Надоел мне одноцветный куб. Его сборка была увлекательным процессом, но один цвет быстро наскучил. Захотелось разнообразия.
Сказано - сделано. Быстренько набросал схемку в EasyEDA для куба на RGB светодиодах и сдвиговых регистрах. Схемка просто три раза копирует схему одноцветного куба.
Схема.png
В отличии от схемы Алекса у меня транзисторы полевые, т. к. их у меня много, а биполярных не было. Ну и подтяжка кнопок внешняя к минусу, а не внутренняя к плюсу. Ради четырёх слоёв решил не ставить отдельный сдвиговый регистр, и вывел затворы транзисторов напрямую к ардуине к ногам D4-D7. Первоначально выводил к ногам D6-D9, но потом увидел, что это разные порты - D6 и D7 это порт D, а D8 и D9 это порт B - и перенёс все на порт D. Так удобнее переключать слои. Надписи на схеме Red, Green и Blue получились условные, потом будет ясно, почему.
В той же EasyEDA развёл печатную плату:
Плата.png
И вот она у меня на столе (верх и низ соответственно):
IMG_20181116_180938.jpg IMG_20181116_180928.jpg
И уже с запаяными компонентами (список компонентов ниже):
IMG_20181116_152055.jpg
Как всегда, чего-то не хватило - два сдвиговых регистра запаяны, а не вставлены в панельку. Ардуина так же вставлена в панельку (правда она на 40 ног, а не 30), а не припаяна. Конденсатор взят от старой материнской платы.
Теперь очередь светодиодов. Как видно на плате, места для пайки я сделал уголком. Так и будем сгибать ноги.
1. Сгибаем ногу, дальнюю от минусовой вбок.
2. Сгибаем остальные три ноги перпендикулярно первой. Минусовая нога в центре.
3. Теперь плоскогубцами загибаем плюсовые ноги вниз ступенькой.
IMG_20181116_161028.jpg IMG_20181116_161053.jpg IMG_20181116_161145.jpg IMG_20181116_152426.jpg

Теперь паяем светодиоды. Для начала спаиваем по четыре штуки минусовыми ногами. Следим, чтобы не припаять минусовую ногу к сигнальной.
IMG_20181116_164753.jpg
А тут я немного накосячил и припаял к сигнальной ноге:
IMG_20181116_171704.jpg

Ну и теперь можно спаять полученные четвёрки друг с другом. Принцип спайки сигнальных ног показан на примере двух светодиодов.
IMG_20181116_154236.jpg

Ну и вот готовая сетка, припаянная к плате:
IMG_20181116_180145.jpg

Повторяем так четыре раза и получаем почти готовый куб. Остаётся спаять минусовые ноги каждого слоя и спустить их на плату. Для этого я взял моток медной проволоки, откусил 5 кусков в два раза длиннее, чем расстояние между крайними светодиодами в слое, сложил пополам и на шуруповёрте закрутил в спираль. Это сделало проволоку более жёсткой. Почему пять, а не четыре? Пятую я припаял к верхнему слою с обратной стороны, чтобы конструкция была более жёсткой. Ну и так же сделал проволоку для спуска слоёв на плату. Длина такой проволоки равна 10 расстояниям межу светодиодами по высоте. Ну и вот, что получилось:
IMG_20181121_214536.jpg

На плате есть большое отверстие для провода возле места для клеммника. Я его сделал после того, как понял, что припаяные провода от зарядки для телефона просто обламываются через некоторое время. Теперь, если пропустить провод в отверстие и только потом припаять, то он не обламывается.

Ну и как обещал, список компонентов:
1. Печатная плата - 1 шт.
2. Arduino nano - 1 шт.
3. Панелька DIP30 для arduio - 1 шт. по желанию
4. Резисторы 220 Ом - 48 шт. по 16 на каждый цвет
5. Резисторы 10 кОм - 6 шт.: 4 на подтяжку затвора транзистора к земле и два для подтяжки кнопок так же к земле
6. Резисторы 1 кОм - 4 шт. для защиты ног МК от тока заряда транзисторов
7. Сдвиговые регистры 74HC595N - 6 шт.
8. Панельки DIP16 для сдвиговых регистров - 6 шт. по желанию
9. Кнопки - 2 шт.
10. Транзисторы полевые IRFZ24N или аналогичные. - 4 шт.
11. Светодиоды RGB с общим катодом - 64 шт.
12. Зарядка для телефона 5В 0,5А - 1 шт.

Как примерно работает данный куб, можно посмотреть на видео по ссылке. Прошивка пока ещё в стадии правки напильником, но 4 анимации уже есть: слои, случайное заполнение, дождь и ночник.

Ещё в планах сделать для куба корпус на 3Д принтере, когда он приедет. Модель так же почти готова.

Добавлено 21.12.2018:
Скачать прошивку

Добавлено 24.12.2018:
Проект в easyeda

Добавлено 18.01.2018:
Нарисовал в OpenSCAD нижнюю часть корпуса.
box.png
Исходный код
 
Последнее редактирование:
19.11.2018
42
36
18
Лен.обл
#2
Да-а-а-а-а.... Вот так сразу на печать...
Всё же отладочный образец лучше на слепыше спаять.
Вы ведь не остановитесь на 4³ ?
Надеюсь 16³ в полноцвете дело времени :)
 
15.12.2018
9
0
1
#4
>Решил собрать собственную светодиодную матрицу на RGB светодиодах, ибо куб тяжко скорее всего
>Увидел пост
>Послал в пешее эротическое матрицу, лучше её на адресной ленте делать без колхоза

Спасибочки за пост. Теперь буду делать куб. Как раз есть 200 RGB светодиодов и 30 STP16C596XTTR. Буду тоже рубить)
 
#6
Доброго дня,
А можно взглянуть на Вашу версию в прошивке функции renderCube(). Или аналога. В монохроме все просто, яркость управляется таймингами. в RGB смешивать цвета сложнее. Для полноценного цвета на мой взгляд нужно выделять количество тактов когда горит тот или иной цвет.
Т.е. в монохроме мы определяем какие светодиоды зажигать и они горят 50 мс... а тут придется на 1 такт слоя разложить на 16 тактов для яркости каждого цвета...
Или может Вы нашли другое решение?
 
02.11.2018
21
8
3
#7
А твем кубе присутствует смешивание цветов
Само собой. Иначе зачем всё это делать?
Сдвиговый регистр позволяет реализовать 8 цветов:
- красный, синий, зелёный - основные;
- жёлтый = красный+зелёный, розовый (пурпурный) = красный+синий, голубой (похож на белый) = синий+зелёный - дополнительные
- белый
- чёрный (т. е. выключено).

А можно взглянуть на Вашу версию в прошивке функции renderCube()
Конечно можно. Она пока не эффективна и её можно запросто ускорить, но учитывая, что количество информации невелико, то отрисовка успевает за один цикл таймера (1 мс). На само деле, ничего сложного в смешении цветов нет. Нужно просто зажигать одновременно нужные компоненты цвета в одном светодиоде.
C++:
void drawCube(byte layer)
{
  //Собирание массива в числа, посылаемые на
  //сдвиговые регистры
  byte fRed, sRed, fGreen, sGreen, fBlue, sBlue;

  fRed = (cubeDataR[layer][1][3] << 7) +
         (cubeDataR[layer][1][2] << 6) +
         (cubeDataR[layer][1][1] << 5) +
         (cubeDataR[layer][1][0] << 4) +
         (cubeDataR[layer][0][3] << 3) +
         (cubeDataR[layer][0][2] << 2) +
         (cubeDataR[layer][0][1] << 1) +
         cubeDataR[layer][0][0];

  sRed = (cubeDataR[layer][3][3] << 7) +
         (cubeDataR[layer][3][2] << 6) +
         (cubeDataR[layer][3][1] << 5) +
         (cubeDataR[layer][3][0] << 4) +
         (cubeDataR[layer][2][3] << 3) +
         (cubeDataR[layer][2][2] << 2) +
         (cubeDataR[layer][2][1] << 1) +
         cubeDataR[layer][2][0];

  fGreen = (cubeDataG[layer][1][3] << 7) +
           (cubeDataG[layer][1][2] << 6) +
           (cubeDataG[layer][1][1] << 5) +
           (cubeDataG[layer][1][0] << 4) +
           (cubeDataG[layer][0][3] << 3) +
           (cubeDataG[layer][0][2] << 2) +
           (cubeDataG[layer][0][1] << 1) +
           cubeDataG[layer][0][0];

  sGreen = (cubeDataG[layer][3][3] << 7) +
           (cubeDataG[layer][3][2] << 6) +
           (cubeDataG[layer][3][1] << 5) +
           (cubeDataG[layer][3][0] << 4) +
           (cubeDataG[layer][2][3] << 3) +
           (cubeDataG[layer][2][2] << 2) +
           (cubeDataG[layer][2][1] << 1) +
           cubeDataG[layer][2][0];

  fBlue = (cubeDataB[layer][1][3] << 7) +
          (cubeDataB[layer][1][2] << 6) +
          (cubeDataB[layer][1][1] << 5) +
          (cubeDataB[layer][1][0] << 4) +
          (cubeDataB[layer][0][3] << 3) +
          (cubeDataB[layer][0][2] << 2) +
          (cubeDataB[layer][0][1] << 1) +
          cubeDataB[layer][0][0];

  sBlue = (cubeDataB[layer][3][3] << 7) +
          (cubeDataB[layer][3][2] << 6) +
          (cubeDataB[layer][3][1] << 5) +
          (cubeDataB[layer][3][0] << 4) +
          (cubeDataB[layer][2][3] << 3) +
          (cubeDataB[layer][2][2] << 2) +
          (cubeDataB[layer][2][1] << 1) +
          cubeDataB[layer][2][0];

  //Передаём данные на сдвиговые регистры
  digitalWrite(SS, LOW);
  SPI.transfer(sGreen);
  SPI.transfer(fGreen);
  SPI.transfer(sRed);
  SPI.transfer(fRed);
  SPI.transfer(sBlue);
  SPI.transfer(fBlue);
  digitalWrite(SS, HIGH);

  //Выключение всех слоёв
  PORTD = PORTD & 0b00001111;

  //включаем нужный слой
  switch (layer) {
    case 0:
      PORTD = PORTD | 0b00010000;
      break;
    case 1:
      PORTD = PORTD | 0b00100000;
      break;
    case 2:
      PORTD = PORTD | 0b01000000;
      break;
    case 3:
      PORTD = PORTD | 0b10000000;
      break;
    default:
      break;
  }
}

Ссылку на прошивку добавил в первый пост. Прошивка будет обновляться по мере наличия у меня свободного времени.
 
Последнее редактирование:
#8
А если этот Ваш drawCube обернуть сверху в 16 мс - т.е. отрисовку делать не 1 цикл а 16 циклов, то каждого цвета будет по 16 градаций... конечно это не 8 бит на канал.
 
02.11.2018
21
8
3
#9
Ну я где-то читал, что можно на сдвиговом регистре сделать ШИМ, но такого рода эксперименты не проводил.
 
#10
Как я понимаю это и получается программный ШИМ. Пойду возьму у ребенка UNO и пару RGB светодиодов. И на 2 регистрах погоняю глубину цвета. Лучше взять 4 штуки чтобы имитировать слои.
 
15.12.2018
9
0
1
#15
Ну я где-то читал, что можно на сдвиговом регистре сделать ШИМ, но такого рода эксперименты не проводил.
Я читал здесь о нем: http://codius.ru/articles/Arduino_Сдвиговый_регистр_74НС595_или_размножаем_экономим_выходы_платы

По-моему RGB куб не имеет право зваться RGB, пока в нем такое ограниченное количество, как вы указали. Используя ШИМ становится намного больший цветовой диапазон. Будете делать?
 
02.11.2018
21
8
3
#16
Светодиоды RGB, смешение цветов есть. Ну и что, что ШИМ нет, так сдвиговый регистр и не поддерживает его. Если нужен, то смотрите сторону tlc5940 и им подобных.

По-моему RGB куб не имеет право зваться RGB, пока в нем такое ограниченное количество, как вы указали.
Вы вольны его называть как угодно, от этого он RGB быть не перестанет.
 
#17
Коллеги, Я тут обнаружил на Али аналог WS2812b, но в круглом исполнении. называется APA106. Цена пока кусается 500шт - 6 тыс.
И вопросов много. Но тогда вопрос RGB уже не будет стоять. Пока мысль сделать вертикальные слои. По пропайке самого куба тоже нужно придумывать. Зато для матриц куча эффектов написана ))
 
02.11.2018
21
8
3
#19
@ProShow, это магия. А если по существу, то куб никакого смешения не делает. Он просто включает или выключает три цвета: красный, синий или зелёный - так как таких цветов светодиоды. Всё остальное делает мозг человека. Так же, как несколько разных картинок при быстрой смене объединяются в одну плавную, так же и несколько рядом расположенных цветных точек объединяются в одну с новым цветом. Если посмотреть на RGB-светодиод сбоку, то будут видны отдельные компоненты цвета. А ШИМ только регулирует яркость, не более того.
 
15.12.2018
9
0
1
#20
@pi1985, ну так ШИМ используется для регулировки яркости, благодаря чему и оттенки меняются. Работает как изменение уровня цвета в RGB (Например, 255, 168, 0 или 0, 180, 60 и т.д.). Вы хотите сказать, что куб производит быстрое включение/выключение кристалла определенного цвета?