История ещё одного 3д-куба 10х10х10
В последнее время на портале появлялись статьи о создании светодиодных кубов. Это своего рода игрушки, которые могут формировать трёхмерную картинку, но сделать большое разрешение очень проблематично и трудоёмко. Большинство работ ограничивается форматом 3×3х3, или в лучшем случае 5×5х5. Спустя время я нашёл свой старый 10 «этажный» куб, немного восстановил его и решил написать о своём опыте создания устройства.
Первый куб я спаял где-то в 2012 году, на подарок, с разрешением 4×4x4, в нем использовалась готовая схемотехника и программа, найденная в интернете. Увлёкшись, решил сделать такой же себе, но, увеличив разрешение до 5×5x5. Схемотехнику, опираясь на готовое решение, сделал сам, полностью скопировав саму логику подачи напряжения на ноги светодиодов.
Надо сказать, в тех кубах на светодиоды напряжение шло полностью от выводов МК, поэтому мне пришлось взять МК с большим количеством ног, ведь их нужно было уже 25 только на столбцы, и 5 на строки. В разрыве между МК и светодиодом был только токоограничивающий резистор, а напряжение на «этажах» стекало через полевой транзистор на землю.
Затем с Ebay заказал 1000 диодов, и решил собрать совсем большой, по моим меркам, куб. Кстати, мои небольшие эксперименты привели к тому, что лучший выбор пал на диоды с большой диаграммой направленности. Они не вытянутые, как обычно, а образуют полусферу, их свечение видно почти со всех углов, найти их можно по запросу strawhat led. Стоят они дороже, зато светят намного эффектнее. Спаять куб— это ещё то испытание. Тут, как и с корпусом, мне помогал мой хороший друг, так как я тяжело приспособлен к такой кропотливой работе. Делали как и все, просверлив отверстия под шляпки диодов, и сделав матрицу 10×10. Затем паяем все этажи отдельно, и накладываем их друг на друга. Процесс занял около 3 дней, почти безвылазного сидения перед паяльником.
Корпус сделан из обычного оргстекла, которое нам любезно раскроили на лазерной резке. Клеили с помощью Cosmofen PMMA, вроде специальный клей для оргстекла, на деле же, обычный суперклей справляется не хуже, но требует большей аккуратности, потому что, если нанесёте лишнего, то смыть уже не будет возможности.
На нижней платформе, заранее на лазерной резке наметили 100 отверстий под светодиоды. Легко просверлив их шуруповёртом, аккуратно погружаем туда спаянный куб, и припаиваем снизу переходники.
Также, чтобы спрятать электронику, пришлось подогнать и окрасить низ куба. Эта задача была простой, главное, что мы уяснили из прошлого опыта покраски маленького куба — красить нужно под углом, желательно сверху-вниз, чтобы краска не проникала в склеенные промежутки граней, под действием силы тяжести.
Теперь оставалось придумать как закрепить куб с основанием в декоративный корпус. Нужно было платформу с отверстиями зафиксировать на стыке с окрашенной частью. Для этого были вырезаны маленькие квадратики из оргстекла с вкрученными винтами. Их пришлось сделать столь крошечными, чтобы сам куб из диодов смог «пролезть» на своё законное место. Квадратики усиленно залили суперклеем, держится отлично. На самой платформе также просверлили отверстия, и зафиксировали куб гайками.
Ах да, ещё нужно рассказать о том, как мы его чистили после припоя. Паяли куб с использованием ЛТИ 120, соответственно, все диоды были в жёлтом налёте от канифоли. Такой большой ультразвуковой ванны не было, а кисточкой даже вручную ничего не очищалось. Кстати от ацетона диоды немного мутнеют, что недопустимо. Решение было найдено неожиданно, путём проб и ошибок — аммиак. Загрузили его в ёмкость от бывшего очистителя стёкол — и пшикали на куб. Потом пять минут ожидания и смываем водой. Потом опять аммиак — так около четырёх подходов и куб засиял чистотой.
После окончательной сборки куб принял следующий вид:
К сожалению, к процессу проектирования электроники подошли не совсем вдумчиво и, в итоге, спаяли матрицу по аналогии со старыми кубами, на этажах был общий катод, а столбцы зажигались анодами диодов. Это решение не очень выгодно с точки зрения подачи большого тока на столбец, ведь если в 5 этажном кубе для хорошей яркости достаточно подать один ток, то в 10 этажном, как минимум, нужно в 2 раза больше.
Об этой проблеме я сильно не задумывался и первая плата была создана с помощью широко известных сдвиговых регистров 74hc595, так как уже имел опыт работы с ними. Задачу по коммутации исполнял МК AtMega128, а током на этажах управляли полевые транзисторы.
Запаяв все элементы и, использовав те же резисторы, я написал простую программу и были шокирован, что на куб можно с удовольствием смотреть только в темноте. Днём его яркость не устраивала и программными методами это никак не решалось. Вопрос не сложный — подумал я, и запаял резисторы меньшего номинала, рассчитав, чтобы на диоды шёл ток около 70 ма. После включения разочарование ещё больше усилилось — куб почти ничего не показывал, зажигая редкие диоды, зато ярко. Открыв даташит на 74hc595 стало всё ясно — напряжения на выходах нормируются для токов не более 8 мА, а суммарный ток через выводы земли и питания не должен превышать 70 мА., что нам абсолютно не подходило.
Начал штудировать микросхемы, которые бы подошли для этой задачи. В нашей южной столице ничего почти не было в наличии, и ещё из всех даташитов микросхем, которые рассчитаны на большой ток, я начал замечать одну неприятность — они все на конечном каскаде содержат пару Дарлингтона, и по схемам в даташите соединяют выходной контакт с землёй. Для нашей конфигурации куба, где катод был на этажах, это никак не подходило. Посмотрев схему популярного uln2003 и, увидев аналоги на светодиодных матричных драйверах, я понял, что это решение никак не применить:
На мой взгляд, изучив потом конструкцию популярных мискросхем, решил, что проще подавать на этажи плюс, через мощный транзистор, а столбцы, с помощью ULN2003, скидывать на землю т.е. делать схему куба с общим анодом.
Отчаявшись искать решение, куб был отложен на неопределённый промежуток времени, как вдруг он резко понадобился для одного мероприятия. У нас было три дня, чтобы запустить его на нормальной яркости. Решение придумали простое — на каждый выход 74hc595 вешаем обычный транзисторный ключ, а в программе инвертируем биты. Была распакована пачка каких-то простых BC846B, давно валявшихся с EBAY, и быстро разведена плата.
Она получилась громоздкой, но из неё убрали микроконтроллер. Просто от старой платы провели три управляющих провода на новую, на случай, если в будущем перейдём на stm32, или другое схемотехническое решение. После подключения всех выводов, куб запустился и порадовал нас отличной картинкой.
Исходников подобных программ я тогда нигде не нашёл, а мои навыки написания программ были далеки от идеала. Но результат был достигнут, поэтому вкратце опишу алгоритм.
Программа была написана на тот момент в CodeVision, а эффекты подгружались отельным файлом в основной листинг. Изначально были написаны подпрограммы разбивки десятизначного бинарного числа на 10 отдельных переменных для каждого ряда, и отправки этих 100 переменных в сдвиговые регистры, обнуления, и задержек для формирования этажей. Всё это привели к такому формату, который описывал, что мы видим на конкретном этаже (единицы — зажжённые диоды):
a=0b1000000001;
b=0b0000000000;
c=0b0000000000;
d=0b0001111000;
e=0b0001111000;
f=0b0001111000;
g=0b0001111000;
h=0b0000000000;
i=0b0000000000;
j=0b1000000001;
addr();output_shift();
level1();
Разбивка числа, вида 0b0001111000 осуществлялась простым алгоритмом.
if (a>0b0111111111) {
out[1]=1;
a=a-0b1000000000;
}
if (a>0b0011111111) {
out[2]=1;
a=a-0b0100000000;
}
и т.д.
Проверяем старший бит на предмет нуля или единицы путём сравнения. Если больше, то выставляем переменную регистра в единицу и уменьшаем число на этот разряд. Проделываем эту операцию десять раз, чтобы выделить все 10 значений для одного ряда, и сохраняем их во временные переменные сдвигового регистра, которые мы потом разом отправим на отображение.
Процедуру работы со сдвиговым регистром описывать нет смысла, она разобрана на многих сайтах. Затем, после описания всех 10 уровней, всё это загоняется в подпрограмму динамической индикации, где весь этот цикл повторяется необходимое число раз (время каждого фрейма задаётся для каждого кадра) для обмана человеческого зрения. Конечно для масштабных кубов написание эффекта может превратиться в мучение, и нужно делать компьютерный интерфейс. Но для нашего я быстро составил несколько эффектов, и закинул это в МК avrmega128, заняв почти 20% флэш памяти.
Ну и конечно, какой 3д-куб без финального видео. К сожалению, у меня так и не получилось выставить на фотоаппарате настройки, чтобы передать красочность куба, то диоды сливаются между собой, то слишком тёмные, для эффектности чередовал съёмку с action-камерой.
Надеюсь, наш опыт создания куба и допустимые ошибки будут кому-то полезны, ведь делали мы его около двух лет назад и тогда информации, по такому роду устройств, было мало. Недавно я нашёл его в подвале, почистил и поставил в свой магазин, всем клиентам нравится, все спрашивают где купили, и почти всегда около пары минут смотрят эффекты.