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

pi1985

★✩✩✩✩✩✩
2 Ноя 2018
21
15
Всем привет.
Надоел мне одноцветный куб. Его сборка была увлекательным процессом, но один цвет быстро наскучил. Захотелось разнообразия.
Сказано - сделано. Быстренько набросал схемку в EasyEDA для куба на RGB светодиодах и сдвиговых регистрах. Схемка просто три раза копирует схему одноцветного куба.
Схема.png
В отличии от схемы Алекса у меня транзисторы полевые, т. к. их у меня много, а биполярных не было. Ну и подтяжка кнопок внешняя к минусу, а не внутренняя к плюсу. Ради четырёх слоёв решил не ставить отдельный сдвиговый регистр, и вывел затворы транзисторов напрямую к ардуине к ногам D4-D7. Первоначально выводил к ногам D6-D9, но потом увидел, что это разные порты - D6 и D7 это порт D, а D8 и D9 это порт B - и перенёс все на порт D. Так удобнее переключать слои. Надписи на схеме Red, Green и Blue получились условные, потом будет ясно, почему.
В той же EasyEDA развёл печатную плату:
Плата.png
И вот она у меня на столе (верх и низ соответственно):
IMG_20181116_180938.jpgIMG_20181116_180928.jpg
И уже с запаяными компонентами (список компонентов ниже):
IMG_20181116_152055.jpg
Как всегда, чего-то не хватило - два сдвиговых регистра запаяны, а не вставлены в панельку. Ардуина так же вставлена в панельку (правда она на 40 ног, а не 30), а не припаяна. Конденсатор взят от старой материнской платы.
Теперь очередь светодиодов. Как видно на плате, места для пайки я сделал уголком. Так и будем сгибать ноги.
1. Сгибаем ногу, дальнюю от минусовой вбок.
2. Сгибаем остальные три ноги перпендикулярно первой. Минусовая нога в центре.
3. Теперь плоскогубцами загибаем плюсовые ноги вниз ступенькой.
IMG_20181116_161028.jpgIMG_20181116_161053.jpgIMG_20181116_161145.jpgIMG_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
Исходный код
 
Последнее редактирование:

FreeWind

★✩✩✩✩✩✩
20 Ноя 2018
42
48
Лен.обл
Да-а-а-а-а.... Вот так сразу на печать...
Всё же отладочный образец лучше на слепыше спаять.
Вы ведь не остановитесь на 4³ ?
Надеюсь 16³ в полноцвете дело времени :)
 

ProShow

✩✩✩✩✩✩✩
15 Дек 2018
9
0
>Решил собрать собственную светодиодную матрицу на RGB светодиодах, ибо куб тяжко скорее всего
>Увидел пост
>Послал в пешее эротическое матрицу, лучше её на адресной ленте делать без колхоза

Спасибочки за пост. Теперь буду делать куб. Как раз есть 200 RGB светодиодов и 30 STP16C596XTTR. Буду тоже рубить)
 

gejmer2

✩✩✩✩✩✩✩
16 Дек 2018
1
0
А твем кубе присутствует смешивание цветов
 

SergeySAS

★✩✩✩✩✩✩
20 Дек 2018
42
10
Москва
sustavov.org
Доброго дня,
А можно взглянуть на Вашу версию в прошивке функции renderCube(). Или аналога. В монохроме все просто, яркость управляется таймингами. в RGB смешивать цвета сложнее. Для полноценного цвета на мой взгляд нужно выделять количество тактов когда горит тот или иной цвет.
Т.е. в монохроме мы определяем какие светодиоды зажигать и они горят 50 мс... а тут придется на 1 такт слоя разложить на 16 тактов для яркости каждого цвета...
Или может Вы нашли другое решение?
 

pi1985

★✩✩✩✩✩✩
2 Ноя 2018
21
15
А твем кубе присутствует смешивание цветов
Само собой. Иначе зачем всё это делать?
Сдвиговый регистр позволяет реализовать 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;
  }
}

Ссылку на прошивку добавил в первый пост. Прошивка будет обновляться по мере наличия у меня свободного времени.
 
Последнее редактирование:

SergeySAS

★✩✩✩✩✩✩
20 Дек 2018
42
10
Москва
sustavov.org
А если этот Ваш drawCube обернуть сверху в 16 мс - т.е. отрисовку делать не 1 цикл а 16 циклов, то каждого цвета будет по 16 градаций... конечно это не 8 бит на канал.
 

pi1985

★✩✩✩✩✩✩
2 Ноя 2018
21
15
Ну я где-то читал, что можно на сдвиговом регистре сделать ШИМ, но такого рода эксперименты не проводил.
 

SergeySAS

★✩✩✩✩✩✩
20 Дек 2018
42
10
Москва
sustavov.org
Как я понимаю это и получается программный ШИМ. Пойду возьму у ребенка UNO и пару RGB светодиодов. И на 2 регистрах погоняю глубину цвета. Лучше взять 4 штуки чтобы имитировать слои.
 

ProShow

✩✩✩✩✩✩✩
15 Дек 2018
9
0
Ну я где-то читал, что можно на сдвиговом регистре сделать ШИМ, но такого рода эксперименты не проводил.
Я читал здесь о нем: http://codius.ru/articles/Arduino_Сдвиговый_регистр_74НС595_или_размножаем_экономим_выходы_платы

По-моему RGB куб не имеет право зваться RGB, пока в нем такое ограниченное количество, как вы указали. Используя ШИМ становится намного больший цветовой диапазон. Будете делать?
 

pi1985

★✩✩✩✩✩✩
2 Ноя 2018
21
15
Светодиоды RGB, смешение цветов есть. Ну и что, что ШИМ нет, так сдвиговый регистр и не поддерживает его. Если нужен, то смотрите сторону tlc5940 и им подобных.

По-моему RGB куб не имеет право зваться RGB, пока в нем такое ограниченное количество, как вы указали.
Вы вольны его называть как угодно, от этого он RGB быть не перестанет.
 

SergeySAS

★✩✩✩✩✩✩
20 Дек 2018
42
10
Москва
sustavov.org
Коллеги, Я тут обнаружил на Али аналог WS2812b, но в круглом исполнении. называется APA106. Цена пока кусается 500шт - 6 тыс.
И вопросов много. Но тогда вопрос RGB уже не будет стоять. Пока мысль сделать вертикальные слои. По пропайке самого куба тоже нужно придумывать. Зато для матриц куча эффектов написана ))
 
  • Лойс +1
Реакции: Wan-Derer

ProShow

✩✩✩✩✩✩✩
15 Дек 2018
9
0
Светодиоды RGB, смешение цветов есть. Ну и что, что ШИМ нет, так сдвиговый регистр и не поддерживает его. Если нужен, то смотрите сторону tlc5940 и им подобных.
Как же тогда смешивание цветов работает без ШИМа?
 

pi1985

★✩✩✩✩✩✩
2 Ноя 2018
21
15
@ProShow, это магия. А если по существу, то куб никакого смешения не делает. Он просто включает или выключает три цвета: красный, синий или зелёный - так как таких цветов светодиоды. Всё остальное делает мозг человека. Так же, как несколько разных картинок при быстрой смене объединяются в одну плавную, так же и несколько рядом расположенных цветных точек объединяются в одну с новым цветом. Если посмотреть на RGB-светодиод сбоку, то будут видны отдельные компоненты цвета. А ШИМ только регулирует яркость, не более того.
 

ProShow

✩✩✩✩✩✩✩
15 Дек 2018
9
0
@pi1985, ну так ШИМ используется для регулировки яркости, благодаря чему и оттенки меняются. Работает как изменение уровня цвета в RGB (Например, 255, 168, 0 или 0, 180, 60 и т.д.). Вы хотите сказать, что куб производит быстрое включение/выключение кристалла определенного цвета?
 

pi1985

★✩✩✩✩✩✩
2 Ноя 2018
21
15
@ProShow, ШИМ именно это и делает. Включает и выключает что-то с большой скоростью. Для светодиода это выражается в яркости свечения, для мотора в скорости вращения, для нагревателя в температуре. А в RGB светодиоде это проявляется как разные оттенки цвета.
 

ProShow

✩✩✩✩✩✩✩
15 Дек 2018
9
0
@pi1985, вот поэтому и напрашивается вопрос: Если не используете ШИМ, то каким образом делаете смешивание цветов? Или вы имели ввиду стандартные R+G, B+G и т.д.?
 

pi1985

★✩✩✩✩✩✩
2 Ноя 2018
21
15
Именно об этом я и написал в сообщении #7. На сдвиговом регистре по другому не сделать без программного ШИМ.
 

ProShow

✩✩✩✩✩✩✩
15 Дек 2018
9
0
Именно об этом я и написал в сообщении #7. На сдвиговом регистре по другому не сделать без программного ШИМ.
Да, но там Вы указали лишь 8 цветов. А потом вообще сказали, что никак сдвиговый регистр не поддерживает ШИМ. Что-то я запутался. Вы используете 8 цветов и не хотите больше, или только 8 и можно достичь?
 

pi1985

★✩✩✩✩✩✩
2 Ноя 2018
21
15
Да, но там Вы указали лишь 8 цветов. А потом вообще сказали, что никак сдвиговый регистр не поддерживает ШИМ. Что-то я запутался. Вы используете 8 цветов и не хотите больше, или только 8 и можно достичь?
Правильно, только 8. И ШИМ сдвиговый регистр не поддерживает, да. Принцип работы куба можно представить такой схемой. Попробуйте её собрать, и все вопросы сразу пропадут.
 

Вложения