Авторизация
Зарегистрироваться

Новогодняя снежинка на ws2812 "Snowflake"

Астрологи объявили предновогодние недели. Количество обзоров на самодельные гирлянды увеличилось вдвое. Не планировал присоединяться к движению, но, похваставшись в комментах и нахватав плюсов, придётся оправдывать. Не уверен, что много кто захочет повторить, но поглядеть, надеюсь, будет интересно. В конце концов, сделать это новогоднее украшение меня смотивировали, не в последнюю очередь, здешние обзоры прошлых лет. Значит не зря оно.

Ничего принципиально нового я, конечно, не придумал. Светодиодная лента с адресными диодами, которыми можно управлять индивидуально, появилась уже достаточно давно. Ну и идея делать на её основе новогодние снежинки была уже давно успешно реализована, в том числе и тут, на mysku. Акрил и лазерная резка от sav13, 3D печать от An_private, для примера. Но повторять готовые конструкции не так интересно, как изобретать свои велосипеды. Авторам же спасибо за вдохновение и мотивацию. Без них лента у меня так и лежала бы неиспользованной. А мне нечем было бы похвастаться.


Малая снежинка


Начал я с «комнатной» снежинки диаметром примерно 24 см. Делал из расчёта использовать 1 метр ленты с низкой плотностью, всего 30 диодов на метр. У снежинки 6 лучей, по 5 светиков на каждый. Но потом добавил ещё один диод, 31й, в центр. Не очень удобно, но так получалось гораздо симпатичнее. Вживую выглядит лучше, камера не вытягивает диапазон яркостей и пересвечивает, делает белыми участки рядом с диодами.

Корпус печатный. Нарисовал в Solid Works, не потому, что он такой сложный. Наоборот, я тогда только изучал эту систему, вот и тренировался на простеньких моделях. Каждый луч и крышка к нему печатаются отдельно, напечатать снежинку целиком не хватает области печати 20х20 см моего принтера. Да и частями печатать проще, как по мне. Лучи потом приклеиваются к центральной части. Печатал белым PETG, при тонком слое он хорошо работает рассеивателем, яркости диодов хватает с запасом.

Паять её довольно муторно и долго, много проводочков нужно отмерить нужной длины, зачистить и припаять. Удобно делать разными цветами, питание красным и черным, желтым — сигнал управления. Питание для боковых диодов можно брать в любой удобной точке основной ветви, старался так, чтобы меньше перекрещивались провода. Главное соединить питание всех трех отрезков ленты на каждом из 6 лучей. Сигнальный канал же соединяется в определенном порядке, выход одного куска с началом следующего. Вначале основная ветвь, потом две боковые и обратно, к следующему лучу. Аккуратнее всего разводка получается, если делать как на нижнем левом луче.

В центре собираем красно-черный хоровод. Самый первый луч начинается с центрального диода.

По началу я повозился, подбирая наиболее удачную топологию проводов, но потом дело пошло побыстрее. В итоге я осилил 3 такие снежинки. Две из них потом украшали кафешку, пока пандемия её не убила.

В принципе, 31 диод — это немного, должно хватить и классической ардуины (ATmega168). Но я выбрал микроконтроллер stm32f030f4p6. Он тогда стоил вообще копейки, 69 центов, поэтому я его купил пару десятков и использовал в различных поделках. 16КБ под прошивку, 4КБ памяти, сказка за такие деньги. А при его богатой периферии, можно ещё и всё управление лентой переложить на железо. Рассчитал в софте цвета диодов для следующего кадра, подготовил всё в буфере, дал команду железу — и оно само отправляет это всё ленте, а пока отправляется, можно уже считать следующий кадр. Для трех десятков диодов не так уж нужно, но очень удобно. Минус такого подхода только один, из-за особенности протокола ws2812b, под буфер требуется много памяти, по 24 байта на пиксель (по байту на бит цвета). Так получается из-за протокола, используемого WS2812, если его эмулировать через UART или timer->dma->pwm. До сотни диодов хватает 4 килобайт оперативки, а вот 150 уже впритык, не останется на расчеты эффектов. Код управления светодиодами я взял готовый, было лень писать самому. Из этого ebrombaugh.studionebula.com/embedded/lightshow/index.html проекта. Платку под микроконтроллер взял из того, что было под рукой. Это макетка сразу под esp8266 и stm32f030. Делал для себя. Может и стоит заменить на покомпактнее вариант, но работает — не трогай. Оставлю как есть. С обратной стороны выглядит так, простите за неотмытый флюс, термоклей, грязный кабель… диайвай с изнанки — он такой:

Если захотите повторить, то можно использовать платку от китайцев, вот таких полно на али, цена в районе 3 долларов. Прошивается через UART или дешевым программатором ST-Link.

ШИМ на видео, особенно на синем цвете, это только на камере.


Большая снежинка


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

На неё ушло ровно 5 метров ленты, с той же плотностью 30 диодов на метр. Это самый дешевый вариант адресной ленты. В качестве каркаса — алюминиевая полоса из строймага. Я взял 20*2 мм, три штуки по 2 метра, метровый кусок остался. В Леруа мне сейчас показывает цену 122 рубля за двухметровую, 75р за метровую.

Соединители и центральную шайбу печатаем на принтере. Нет принтера? Какой же диайвай без принтера то? Шучу. Можно взять полосу с запасом, сложить внахлест и скрутить болтами с боков от ленты. А центральную часть выпилить из фанеры. Или сделать сурово, сварить всё из стальной полосы. Лишь бы такая снежинка не упала на кого-нибудь. Конструкция простая, точность особая не нужна, проблем быть не должно. Хотя, мне кажется, сейчас не так сложно найти кого-нибудь рядом, кто напечатает. Чертил в OpenSCAD, если что, должно быть легко подправить под другую ширину полосы. Соединение с обратной стороны:

Центральную часть я решил сделать разборной. На случай если надо будет куда-то убрать или перевезти снежинку. Пока не пригодилась, так и провисела на балконе, пока летом на жаре термоклей не размяк и она не свалилась вниз. Снежинка, что с неё взять, она и должна падать, работа у них такая. Но выжила, даже без повреждений.

Для возможности разъединения проводов припаял обычные штырьки 2.54мм. 4 штырька на каждый луч. Три пина припаиваются прямо к ленте, земля, данные, +5 вольт. А на четвертый возвращается провод данных с дальнего конца луча. В центре это соединяется вот таким пауком (и да, я знаю, что у паука 8 лап, мой просто жертва беспощадного диайвая):

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


Попробовал взять «мозги» от мелкой снежинки и подключить к новой. Тут-то мне памяти и перестало хватать. Нет, впихнуться, я уверен, было можно. В оптимизацию я могу и умею. Я, к примеру, делал LED куб 8*8*8 диодов на ATmega32U4. Таких кубиков в инете полно. Вот только мой был ещё и с градациями яркости, динамическая индикация слоев одновременно с ШИМом отдельных диодов. Выглядит гораздо интереснее. (Видео плохо передаёт яркость, но примерно понять можно: youtu.be/tFre3wmwgtU). Так вот, в этот раз я заленился и решил просто взять что-то побольше. АТмеги памятью не славятся. STM32F100 с оперативкой более 8КБ идут в больших корпусах, что тоже какой-то оверинжиниринг, учитывая что нужен всего один пин для управления лентой. Да и цены на них росли ещё до силиконового кризиса, не говоря уж о дефиците сейчас. Наверное, STM32F103Cx, который стоит на BluePill, подошел бы, 20КБ памяти, 72МГц. Но я в итоге выбрал esp8266 в виде модуля ESP-07. Оверинжиниринг, скажете? Ну, вроде как да. Зато дешево, компактно, много памяти. И у меня их в запасе больше сотни, для меня — рабочая лошадка. Использую их в приводах штор LazyRolls. Что касается лишнего Wi-Fi, да пусть будет, хоть и не нужен. Пока что я его не использую. Но можно и задействовать, использовать как вход для цветомузыки. Или для обновления прошивки, если потом захочется добавлять эффектов, не снимая с окна. И чем ещё еспшки мне нравятся, они проще новичкам. Я не думал, что снежинку буду предлагать для повторения, но если вдруг кто захочет, ему будет проще, всякие NodeMCU широко распространены, код можно по своему вкусу быстренько подправить в Arduino IDE, которая для новичка гораздо проще, чем ставить Keil или PlatformIO, которые использовал я. А библиотека FastLED, хоть её иногда критикуют за монструозность, поддерживает разные типы управляемых лент, что делает прошивку более универсальной.

Что мне не нравится в тех проектах, что я видел, так это анимация. Я пробовал и WLED, и прошивку для ёлки от Jason Coon (Evil Genius Labs). Нет, эффекты красивые, тут вопросов нет. Но вот смена эффектов обычно происходит мгновенно, вот были «искорки», вдруг бац, уже радуга. Кому как, а мне такой вариант не по вкусу. Мне хотелось сделать так, чтобы один эффект плавно переходил в другой. Яркость предыдущего эффекта снижается, а следующего — нарастает. При этом какое-то время оба эффекта движутся по своим программам одновременно. Это требует несколько больших вычислительных мощностей. Зато перетекание одного эффекта в другой само по себе даёт причудливые эффекты, иногда удачные, иногда и нет. Но разнообразия добавляет. Вот что у меня получилось. Видео снято изнутри. Наледь на стеклах балкона хорошо рассеивает диоды и их так проще заснять. Да и зима на улице не располагает к съёмкам дрожащими руками на большом зуме.


Софт


Цвета для анимации считаются в HSV координатах. Т.е. тон, насыщенность, яркость. Так гораздо проще делать яркие эффекты. К примеру, плавный переход между красным и голубым проходит по всем оттенкам радуги, через оранжевый, желтый, зеленый. Достаточно только плавно менять значение цвета H, оставляя насыщенность S и яркость V в максимуме. В RGB такое считать очень неудобно. Перед выводом ещё желательно немного скорректировать гамму. Глаз воспринимает яркость нелинейно. Половинная яркость диода выглядит всего лишь чуть-чуть менее яркой. Я в мелкой снежинке сделал простейшую коррекцию по степеням двойки, рассчитанная яркость в диапазоне 0-255 превращается в фиксированные десять уровней: 0, 1, 2, 4, 8, 16, 32, 64, 128, 255. Неидеально, но на практике даёт вполне приличный результат. На украшении такое упрощение совсем незаметно. В библиотеке FastLED гамма-коррекция уже есть, стал использовать её.

Палитры для эффектов задаются из 6 цветов в HSV. Мне этого представляется достаточным, учитывая что промежутки между ними интерполируются. Можно задать как радугу, так и палитры из трех и двух цветов, повторяя нужные цвета. Например, белый, синий и красный для флага. Или палитра «кока-кола» из чистых красного и белого. Камрадам из РБ может понравится, но будьте осторожны, если решите повторить.

Эффекты считаются в двухмерных координатах. Для каждого светодиода в прошивке рассчитаны координаты, по ним и определяется цвет в каждый момент времени для каждого светодиода. Такой подход офигителен тем, что прошивку легко модифицировать под любое число диодов, расположенных произвольным образом. Достаточно только рассчитать (ручками, линейкой или в какой-нибудь программе) координаты светиков в пространстве. Можно хоть матрицу сделать, хоть надпись, хоть снежинку. И будет работать. Поэтому мне было легко отмасштабировать маленькую снежинку в большую, взяв тот же код. Сами эффекты, конечно, я затачивал под круговой рисунок, у которого есть центр и на котором хорошо смотрится, к примеру, вращение. Но потом добавил и эффекты типа «развевающийся флаг», который подошёл бы на прямоугольное украшения даже лучше, чем на снежинку.
Координаты диодов рассчитаны как в декартовых координатах (0-255 по X и Y), так и в угловых (угол от вертикали и расстояние от центра, оба параметра 0-255). Одно в другое можно легко пересчитать программно. Для такой формы, как снежинка, проще вручную задать угловые координаты, а программно пересчитать в декартовы. Для других узоров, возможно, будет проще наоборот, забить константы X-Y, а в угловые пересчитать программно. Для снежинки я добавил ещё одну «координату», по ней можно определить, к чему относится диод, центральной точке, основному лучу или боковым отросткам. Это тоже можно использовать в эффектах. Только когда готовил иллюстрации к этому тексту, я заметил, что не совсем точно задал угловые координаты для второстепенных лучей, получились слегка куриные лапки. Ну и ладно, запишем криворукость в фирменный авторский стиль.

Помимо того, что для анимации выбираются случайным образом эффект и палитра, ещё выбирается случайно параметр, который, в зависимости от эффекта, может менять направление анимации на обратное, отображать эффект горизонтально или вертикально, менять скорость и т.п. Это ещё увеличивает разнообразие. Был бы я китайцем, посчитал бы все комбинации, говорил бы про 100500 эффектов. Но это не наш путь.

Эффекты


Линейная волна
Самый примитивный эффект, в общем-то сделан просто для теста работы диодной ленты, но остался. Просто бегущая волна по всем диодам подряд, без учёта координат. Из параметров только смена направления и переворот палитры в обратном направлении.


Радиальная волна
Расходящиеся круги на воде. За счёт более высокой плотности диодов у краёв снежинки получается более яркий всплеск. Немного напоминает этим салют. Параметры могут сделать круги сходящимися к центру и отзеркалить палитру.


Вращающаяся волна
Эффект вращения вокруг центра. Тут уже немного больше разнообразия. Может меняться не только направление вращения и палитры. Хвостики снежинки могут вращаться навстречу основным лучам (как на примере). Или могут вращаться только хвосты, получается такой хоровод. Неплохо смотрится вариант с палитрой «flash», где яркие цвета чередуются с чёрным. Вращающиеся желтый, зеленый и красный изображают векторную диаграмму напряжений трехфазной сети :)


Потоковый накопитель
Две встречные волны по четным и нечетным лучам снежинки. Навеяно машиной времени из «Назад в будущее». Там было три сходящихся луча. Ну а тут удвоенная версия :) Мне особенно нравится в варианте чередующихся черного и зеленого.


Вспышки
Случайные вспышки, плавно затухающие. Или, как вариант, капли дождя. Разноцветного, правда, ну, уж какая экология есть. Эффект не зациклен, поэтому на превью дергается в месте склейки, в железе такого, конечно, нет.


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


Спираль
Отдельно эффект спирали. Похоже на вращающийся фейерверк. Тут наверное стоит разнообразить параметрами, сейчас только направление и палитра меняются. Но эффект достаточно симпатичный, пока не надоел.


Деревья
Стволы и ветви переливаются по отдельности. Эффект мигания, меньше анимации, больше привлечения внимания :) Для разнообразия и такое полезно. Смахивает на простую двухканальную гирлянду.


Флаг
Развевающийся флаг. Может быть отзеркален и повернут на 90 градусов. Я в прошивке добавил 33% вероятности выпадения цветов флага РФ для этого эффекта. Но можно поменять на любую другую палитру или вообще убрать приоритет. Для флага РФ также отключаются вращение и отзеркаливание. Вот чего я не подумал, что надо добавить запрет на флаг в сочетании с палитрой «радуга». А то мало ли. Выглядит, кстати, красиво, но показывать не буду.


Плоская волна
Дабы закрыть тему волн, добавил ещё одну, в декартовых координатах, т.е. прямоугольную. С вариациями вертикальной, горизонтальной, диагональной, угловой, в разных направлениях.


Один цвет
Ещё один простой эффект без изысков. Просто монохромно переливается по заданной палитре. Скучновато, но с разными цветами пойдёт. В сочетании с переходами к соседним эффектам тоже даёт неплохие комбинации.


Бегущие огни 2
Алгоритм смешанный из бегущих огней 1, спирали и вращающейся волны. Сильно зависит от параметров. Палитра может вращаться по кругу или нет. Кольца/спирали. Пульсация.


Прожекторы
Алгоритмически это должны были быть 3 круга, движущиеся в пространстве, как световые пятна от поисковых прожекторов, каждый по двум противоположным веткам. На снежинке это выглядит странновато, но в целом что-то в этом есть.


Стрелки
Эффект с акцентом на хвостики, стрелочки, куриные лапки. Параметрами может меняться радиальная или угловая анимация, добавляться бегающие посередине точки


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


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

Для иллюстраций к этому обзору я накалякал приложение под десктоп для симуляции снежинки. Его же можно будет использовать и для отладки новых эффектов. Код анимаций взят прямо из прошивки большой снежинки. В том числе можно заценить и плавные переходы между эффектами. Кнопка save сохраняет последовательность png'шек для анимированных gif'ок (делать сохранение сразу в анимированный gif было лень). Компилируется в QT5.7. Бинарник под винду есть на гитхабе, если кто не брезгует запускать незнакомые exe. Под линукс тоже должно скомпилироваться, но мне лень проверять, у меня лапки, я виндузятник.

Прошивку для esp8266 я писал в PlatformIO IDE, это гораздо удобнее, чем Arduino IDE. Но если нужно что-то подправить по мелочи, то можно сделать и в последней, через неё же и прошить. Достаточно взять файл «src\main.cpp» из исходников, переименовать в snowflake.ino и открыть в ардуине. И не забыть подключить библиотеку FastLED 3.4.0.

В самом начале прошивки есть константы настроек. Тип ленты, порядок цветов, пин для подключения.

Можно изменить число светодиодов, но это немного сложнее, так как потребует пересчёта координат. Массив led_coord_r содержит расстояния диодов от центра, диапазон значений 0-255. Так как лучи одинаковые, симметричные относительно центра, то в массиве 6 одинаковых строк:
17, 34, 51, 68, 85, 102, 119, 136, 153, 170, 187, 204, 221, 238, 255,   180, 192, 204, 216, 228,    180, 192, 204, 216, 228

Легко увидеть, что первые 15 диодов расположены на примерно равномерно возрастающем удалении от центра, а две группы по 5 диодов стартуют где-то между 10-11 диодами основной ветки и также удаляются от центра. Угловая координата диодов (примерно как время на стрелочных часах) указывается в массиве led_coord_a. Так как лучи снежинки, опять таки, повторяются, только сдвигаются на 60 градусов, то координаты достаточно рассчитать для одного, а потом повторить 6 раз с прибавлением константы. Делается это так:
#define t 21
t, t, t, t, t, t, t, t, t, t, t, t, t, t, t, t-3, t-6, t-9, t-12, t-15, t+3, t+6, t+9, t+12, t+15,

определяется «базовый» угол t для луча. У меня снежинка расположена в двух створках окна, поэтому повернута одним лучом горизонтально, а двумя другими — по диагонали. Т.е. первый луч имеет наклон 30 градусов, что в диапазоне 0-255 даёт значение 30/360*256 = 21. Все 15 диодов на основной ветви имеют этот угол. Ну а диоды отростков расставляем со сдвигом 3-15 в одну и другую сторону. Остальные лучи копируем и меняем только значение t. Довольно просто.

Ещё для некоторых эффектов используется псевдо-координата led_coord_br. Она определяет принадлежность к основной или боковой ветви. Тут вообще просто, основные диоды обозначаем 0, боковые — 128. Получается 6 таких строчек:
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,

Если рисунок снежинки модифицировать, то таким образом можно выделить какие-то участки.

Если прошивку нужно адаптировать под какой-то более сложный рисунок, то можно наоборот, вручную задать координаты X/Y диодов, а программно пересчитать в угловые. Вот к примеру, можно как-то так сделать, останется только гирлянду разложить в нужном порядке:


Как прошить esp8266, я писать не буду, это уже тысячи раз написано, легко гуглится. Прошить можно как готовую прошивку, так и прямо из исходников.

С подключением ленты есть небольшой нюанс. WS2812B питается от 5 вольт. И за логическую единицу, по даташиту, принимает сигналы выше 0.7VDD, т.е. от 3.5В. Еспшка же питается от 3.3В, соответственно столько и выдаёт в качестве единицы. Из-за этого бывают сбои в данных, выглядящие как случайные цветные вспышки части диодов. Может зависеть от гирлянды, у меня было так, с одной работает, с другой — подглючивает. Идеальный вариант — использовать преобразователь уровней (level shifter). Его можно сделать из куска ленты в один светодиод и обычного диода, hackaday.com/2017/01/20/cheating-at-5v-ws2812-control-to-use-a-3-3v-data-line/ Я же решаю проблему проще. Для большой звезды нужен блок питания 5В и хотя бы 3А (2А точно не хватает на некоторых эффектах). Я использую 5В 5А, и на нём есть подстройка напряжения. Достаточно снизить до ~4.8В и глюки пропадают. На яркости это визуально никак не сказывается.

Прикинем бюджет для большой снежинки:
122+122+75 = 219р — алюминиевая полоса
$10.52 — лента, первый лот, что попался (5M 30 IP30). https://aliexpress.com/item/item/4000875413944.html
3D печать, около 60 грамм. Ну т.е. около 50р за сам пластик.
Модуль NodeMCU — около $2 https://aliexpress.com/item/item/32656401198.html
Провода, блок питания — лучше найти что-то в хозяйстве. Можно старый компьютерный БП использовать или мощную зарядку для мобил. У меня питается от Mean Well RS-25-5, 5В 5А, просто он у меня был. Цена нового 990р в бутике Чип и Дип. На авито б.у. сильно дешевле можно найти. Провод можно из витой пары взять, как вариант. Больше всего, около 5 метров, нужно под линию данных, а там любого сечения хватит, даже самого тонкого. Да и на питание много не надо.
Итого где-то 1200-2200р или US$16-30. Много это или мало — решайте сами. По мне, радость от результата — бесценна. Ах, да, ещё на электричество раскошелиться придётся. Посмотрим, что там умная розетка нам говорит:

В среднем около 15 ватт. Треть киловаттчаса в сутки, если не выключать. 2 рубля каждый день. Дорого, я днём выключаю :)

Все исходники, прошивки, модели для печати, демо приложение под Win доступны на github'е. Но про код хочу сразу предупредить. Писал как попало, местами экспериментировал и потом оставлял, как есть, не приводя в порядок. Работает и ладно. В качестве примера брать только чтобы пугать детей. Но если что-то непонятно, спрашивайте в комментариях, постараюсь разъяснить.
https://github.com/ACE1046/Snowflake

Когда-то давно, на рубеже тысячелетий, встречался софт, помимо распространенных freeware и shareware, который назывался cardware. Автор разрешал пользоваться его программой бесплатно, а взамен просил прислать ему открытку. Так вот, если используете что-то из этого проекта или повторите его, как есть, то не поленитесь, скиньте фотку в комментарии. Мне будет приятно.
Добавить в избранное +175 +265
свернуть развернуть
Комментарии (79)
RSS
+
avatar
  • linkar
  • 16 декабря 2021, 15:53
+3
Шедевр. Сколько дней ушло на все?)

ЗЫ: за исходники, отдельный, особый респект(!).
+
avatar
  • ACE
  • 16 декабря 2021, 15:56
+47
Сложно сказать. Ну снежинка делается за один день не спеша. Прошивку писал, наверное, несколько дней. Просто по принципу «придумал, какой бы ещё эффект запилить, сделал, два часа любуешься» :) А вот обзор с воскресенья пишу, тяжело мне человеческий текст даётся, это не на ассемблере писать, думать приходится.
+
avatar
  • DimmoN
  • 16 декабря 2021, 15:59
0
Круто!!!
+
avatar
  • ssurneed
  • 16 декабря 2021, 16:01
0
Гиганская снежинка видимо будет на esp32 ;)
+
avatar
  • ACE
  • 16 декабря 2021, 16:02
+8
Что же тогда на raspberry можно сделать? :) Большой снежинковый коллайдер :)
+
avatar
  • ssurneed
  • 16 декабря 2021, 16:07
+2
+
avatar
  • ACE
  • 16 декабря 2021, 16:13
+3
Да, камрад donBaton зачотные вещи делает и отличные обзоры пишет. Мне до него далеко.
+
avatar
  • Avacha
  • 16 декабря 2021, 16:55
+4
Хотел спросить, как вы его узнали, но он в комментах сам спалился. Пыльная Зебра, надо же! Снежинка классная, особенно эффекты, но имеет фатальный недостаток, свойственный почти всем муськовским снежинкам: сделать не успею, а до следующего НГ забуду((
+
avatar
+1
я гирлянду в средине января делал. В конце декабря случайно нашел свою гирлянду в елочных украшениях))). Почти Ваш случай, с той лишь разницей, что сделал- и забыл
+
avatar
  • ACE
  • 16 декабря 2021, 23:56
+1
Я по комментариям тут помнил, что donBaton что-то такое во льду делал. Ну и ещё уточнил по роликам ютьюба, там и в обзорах тут.
+
avatar
  • Addiss
  • 16 декабря 2021, 16:23
0
За статью заслуженный плюс. Было бы здОрово почитать подобную статью про кубик 8х8х8.
+
avatar
  • ACE
  • 16 декабря 2021, 23:53
+1
Про кубик мало что можно интересного написать. С железячной стороны там все стандартно, 8 регистров MC74HC573 для управления одной плоскостью в 64 диода. 8 транзисторов, выбирающих плоскость. А в софте сложность только в том, что 16МГц хватает впритык, чтобы динамически подсвечивать все слои по очереди и ещё иметь запас для ШИМ яркости и всё это не мерцало визуально. Если делать в лоб, то 16МГц делится на 100Гц динамической индикации, на 8 слоев, на, хотя бы 64 уровня ШИМа, получается всего 320 тактов на каждый шаг, в который надо записать 8 внешних регистров и просчитать данные для следующего. Уже почти впритык. А ещё нужно когда-то считать анимацию. Да и 64 уровней ШИМа маловато, хочется больше, чтобы диапазон яркости был больше. Вот и пришлось оптимизировать, немножко ассемблера, немного алгоритмов типа BAM (Bit Angle Modulation). Сейчас бы просто поставил stm32 с частотой побольше, да ещё и аппаратные возможности можно было бы задействовать :) Но иногда интересно и вот так побаловаться с оптимизацией.
+
avatar
+4
Круто.

По-поводу RGB, вот усредненная и подкорректированная гама-коррекция:

const BYTE WSgamma[ 256 ] =  {
	0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2,
	2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5,
	6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 11, 11,
	11, 12, 12, 13, 13, 13, 14, 14, 15, 15, 16, 16, 17, 17, 18, 18,
	19, 19, 20, 21, 21, 22, 22, 23, 23, 24, 25, 25, 26, 27, 27, 28,
	29, 29, 30, 31, 31, 32, 33, 34, 34, 35, 36, 37, 37, 38, 39, 40,
	40, 41, 42, 43, 44, 45, 46, 46, 47, 48, 49, 50, 51, 52, 53, 54,
	55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70,
	71, 72, 73, 74, 76, 77, 78, 79, 80, 81, 83, 84, 85, 86, 88, 89,
	90, 91, 93, 94, 95, 96, 98, 99,100,102,103,104,106,107,109,110,
	111,113,114,116,117,119,120,121,123,124,126,128,129,131,132,134,
	135,137,138,140,142,143,145,146,148,150,151,153,155,157,158,160,
	162,163,165,167,169,170,172,174,176,178,179,181,183,185,187,189,
	191,193,194,196,198,200,202,204,206,208,210,212,214,216,218,220,
	222,224,227,229,231,233,235,237,239,241,244,246,248,250,252,255
};


Использовать так:

WSR = WSgamma[ R ];
WSG = WSgamma[ G ];
WSB = WSgamma[ B ];


где WSR/G/B — то, что отправлять в ленту, R/G/B — обычные значения цвета.

По таблице гаммы видно, как там все плохо с цветами )

Я вот на HD107S / SK9822 / APA102 засматриваюсь — все таки 16 бит и высокочастотный ШИМ — это что-то + возможность задавать яркость не поганя цвет из коробки.
+
avatar
  • ACE
  • 17 декабря 2021, 00:13
+1
Я первую гирлянду делал на какой-то ленте из ещё до ws2812b времён (ну, по крайней мере до того, как я про неё узнал). Помню, стоила жутко дорого, что-то вроде $70 за 5 метров. А, вот, нашёл проект. 2012 год, чип HL1606 распаян на ленте. Индивидуальное управление диодами, но 1 бит, т.е. всего 8 цветов. Делал динамическую индикацию для полноцветности. Скорости не хватало, приходилось задирать частоту SPI, начинало глючить, 256 диодов тянуло на пределе. Но кое-как работало, даже украшало окно некоторое время. Вот там было всё плохо, 2812 просто сказка после них :) Но новые надо бы тоже заценить, интересно, да.
За таблицу гаммы спасибо, как раз лень было считать табличку, утащу в закрома.
+
avatar
+1
«Стандартной» гаммой мониторов считается 2.2. Это означает, что яркость, отображаемая пользователю равняется исходной яркости, возведенной в степень 2.2 (гамма — это показатель степени). Например, половинная яркость 128/255 возведенная в степень 2.2 будет 0.2195, умножаем это на «максимум» в виде 255, получаем — 55.97. В вашей таблице — 55, то есть, по сути, плюс-минус то же самое.

Для данного проекта и для ESP в целом это совершенно неактуально, т.к. таблица гаммы занимает всего 256 байт. Однако, для более мелкого МК (типа Atmel) лишние 256 байт могут оказаться проблемой (лично делал контроллер RGB-ленты на attiny с 4 КБ ПЗУ и там это было значимо).

В таком случае можно воспользоваться «хаком» — принять значение гаммы за 2 и получать значение для ШИМ простым возведением яркости в квадрат. Визуально это практически неотличимо от гаммы 2.2, зато позволяет сэкономить немного памяти.
+
avatar
0
Да, базовая формула value = ( brightness / 255 ) ^ 2.2 * 255, но ИМХО, таблицу можно засунуть в адресное пространство кода, и это проще, чем считать по этой формуле, тем более возведение в степень — очень не тривиальная операция.
Особенно исходя из того, что мы работаем с целочисленными значениями, а замена степени на 2, дающая возможность просто перемножить даст достаточно ощутимую погрешность. Как вариант — можно, но гораздо проще использовать табличку.
+
avatar
+1
даст достаточно ощутимую погрешность
Эта погрешность будет «ощутима» (да и то, не каждым человеком) только если вы смотрите на монитор, отображающий какое-то графическое изображение. Для елочной гирлянды, где каждый светодиод вообще отображает только 256 градаций яркости, такая подмена не будет заметна совсем.

Как вариант — можно, но гораздо проще использовать табличку.
Я об этом выше сразу же написал — это актуально только если в МК мало ПЗУ.
+
avatar
  • Dimon_
  • 16 декабря 2021, 16:34
+2
Отлично. Замечательный и интересный рассказ.
За софтварный симулятор — отдельное мерси.
В Избранное, однозначно.
+
avatar
+4
Для огромной снежинки можно взять готовые профили для свтодиодных лент — там и рассеиватель есть и какая-никакая защита самих светодиодов — всё-таки в открытом виде они весьма уязвимы.
До подороже получится, но не так уж дорого, вроде
+
avatar
  • ACE
  • 17 декабря 2021, 00:18
+1
Да, с профилем было бы аккуратнее. Просто когда начинаешь что-то делать, сложно предсказать, что из этого выйдет. Сколько у меня всяких незавершенных проектов валяется. Где-то лень доделать, где-то интерес пропал, где-то идея оказалась хуже, чем казалась изначально. Вот и начинаешь новое пробовать максимально простым способом, а там уже как пойдёт. Ну и в конце уже переделывать становится лень. Сойдёт, с 12 этажа рассеиватель уже не нужен, я с улицы при всем желании отдельные диоды не вижу.
+
avatar
  • KostikMX
  • 17 декабря 2021, 11:31
0
Добрый день. Подскажи, судя по картинкам, на большой снежинке сигнал по ленте на маленькие ответвления идёт сначала на левый отросток, а потом на правый. А в маленькой наоборот. Я правильно понял. Думаю от этого на большой снежинке будет зависеть качество некоторых эффектов.
+
avatar
  • ACE
  • 17 декабря 2021, 11:38
+1
У меня просто так получилось, что в маленькой лучи подключены против часовой стрелки, а в большой — по часовой. Поэтому всё в обратную сторону. Но это, если что, в софте легко координатами поменять, если вдруг собрали не так.
+
avatar
  • boll069
  • 16 декабря 2021, 17:13
+1
Всё отлично и понравилось. Я вот думаю можно проект алекса гайвера с его огненной лампой залить. Там прелесть в управлении с телефона, реализован удачно. Ну и тоже куча эффектов. Я его проект повторил, тоже с использованием 3Д печати в своем исполнении. Мне понравилось. А в Вашем форм-факторе будет думаю и по интересней. На праздниках в промежутках между пьянками замучу. Всем удачи и крепкого здоровья.
+
avatar
+1
Гайверовская лампа это круто, делал несколько с разными прошивками,

но тут вся прелесть в том, что как писал глубокоуважаемый автор плавность переходов между эффектами. Я в прошлом году искал снежинки, но то что находил совсем не впечатляло, в эту можно сказать влюбился. При наличии всех компонентов повторить можно за один вечер, если что-то уже делал подобное.
Я в программировании понимаю плоховато, хоть и не прочь поучится, но как всегда весь запал заканчивается на том, что когда упрешься в какую то непонятку, вроде как мелочь, а спросить некого, и на этом останавливаешься.
В данной снежинке при повторе в скетче можно вообще ничего не менять, ну или только информационный пин ленты.
ACE, благодарю за подаренные исходники. Про приложение для симуляции снежинки отдельный респект, очень интересно было почитать, буду пробовать разбираться дальше. Про угловую координату даже не слышал, не знал, что так можно.
+
avatar
  • ACE
  • 17 декабря 2021, 00:30
+2
Вот кстати лампу Гайвера я так и не сделал, а давно хочу. Для декоративности и в качестве светового будильника использовать. Вроде даже симпатичный плафон от старой лампы на даче присмотрел, но руки так и не дошли.
+
avatar
+6
Да класс. Очень, подробно и совсеми тонкостями. Плюсую однозначно.
+
avatar
  • mrBlue
  • 17 декабря 2021, 02:08
+2
Модуль NodeMCU — около $2 https://aliexpress.com/item/item/item/32656401198.html
Ох уж эти китайцы
+
avatar
  • ACE
  • 17 декабря 2021, 02:57
+1
На коллекцию нажимать, на всякий случай, не буду, но магазин хороший, много всяких модулей у них покупал
+
avatar
  • Saloed
  • 17 декабря 2021, 03:04
+2
Отлично. Но если где завалялась esp32 с картой памяти можно прошить ESPixelStick и туда скидывать проекты из XLights. И там можно хоть плавные переходы хоть что угодно.
+
avatar
  • ACE
  • 17 декабря 2021, 11:54
+1
Про XLights не знал, посмотрел. Круто, но это было бы из пушки по воробьям, слишком сложно. Вот если бы моя снежинка выступала на открытии олимпиады, тогда да. А так алгоритмически эффекты сделать проще. Имхо. Вот если делать светомузыкальное оформление дома…
Но, насколько вижу, XLights поддерживает WLED, который можно прошить в esp8266, так что аппаратно всё готово, если кто хочет поэкспериментировать.
+
avatar
  • Romureg
  • 17 декабря 2021, 03:15
+1
Одина из очень немногих самоделок на муське которую хочется повторить. Спасибо что поделились.
+
avatar
  • Frolv
  • 17 декабря 2021, 03:17
0
Добрый день! Спасибо за проект «Снежинка» — обязательно соберу, есть
светодиоды (отдельно русыпью) и есть Вемос. Лучи хочу, и надеюсь
успеть, собрать из пластиковых кабель каналов. Единственное
препятствие — что прошивать в вемос? Прочто бин файл?
+
avatar
  • Frolv
  • 17 декабря 2021, 03:18
0
Добрый день! Спасибо за проект «Снежинка» — обязательно соберу, есть
светодиоды (отдельно русыпью) и есть Вемос. Лучи хочу, и надеюсь
успеть, собрать из пластиковых кабель каналов. Единственное
препятствие — что прошивать в вемос? Прочто бин файл? И сколько диодов на один луч?
+
avatar
  • ACE
  • 17 декабря 2021, 11:34
+1
Из отдельных светодиодов собирать — это будет очень муторно. Лентой гораздо проще.
Да, можно просто бин файл залить. Или из Ардуино ИДЕ из исходников. Как удобнее.
На один луч 25 диодов.
+
avatar
  • Frolv
  • 18 декабря 2021, 03:14
0
Просто отдельно светодиоды УЖЕ есть, а лента до НГ не успеет с Али приехать. Паяльник в руках из плеч, делов то на один-два вечера.
+
avatar
  • KostikMX
  • 17 декабря 2021, 11:44
+2
Судя по картинкам: сам луч 15 шт. и плюс 2 лучика по 5 шт.
+
avatar
  • Cucumber
  • 17 декабря 2021, 06:31
+1
Хорошо получилось!
У меня валялся не использованный Sonoff. Подключил его к гирлянде ws2811, залил прошивку WLED, наделал пресетов. Жду белую искусственную елку, чтобы вся светилась )
+
avatar
  • ACE
  • 17 декабря 2021, 11:50
+2
По мне, WLED, со встроенными эффектами, для елки не очень. Для линейной ленты оно хорошо, а ёлка — это всё-таки хотя бы двухмерное полотно. Эффекты должны учитывать расположение диодов. Например, как у www.evilgeniuslabs.org/tree-v2 Намного красивее.
+
avatar
  • Cucumber
  • 17 декабря 2021, 12:05
+1
Согласен. Следующий проект будет Tree v2
+
avatar
0
Ооо, премного благодарен. Круто и как раз в тему, у меня как раз с прошлого года лежит вязанка 2811 в виде гирлянды. Что то они меня не впечатлили, я поэтому их отложил, а тут ваша подсказка. Нужно попробовать обязательно.
Хотя wled и имеет линейную структуру, но поскольку в наших маленьких квартирах елки в основном стоят у стены и сзади не видны wled визуально эмитирует 2d пространство отблесками сквозь елку.
+
avatar
  • Drue
  • 18 декабря 2021, 17:24
0
youtube.com/shorts/GA93yFxHmx4?feature=share

Пластик hips, стм32 и какая-то либа линейная. Пока ваши эффекты не смотрел
+
avatar
  • nik_nik
  • 19 декабря 2021, 13:58
0
Добрый день Антон,
Пожалуйста подскажите? Какая длина одного большого луча снежинки.
+
avatar
  • ACE
  • 19 декабря 2021, 14:07
+2
Приветствую
Длина луча ровно полметра. Боковушки — 16.6см, т.е. двухметровую полосу распилил на 12 штук. Пилил вначале на 6 частей, потом ещё пополам, но уже под углом 60 градусов, чтобы лучше примыкало к основному.
+
avatar
  • VLOD
  • 20 декабря 2021, 02:11
+1
Здравствуйте. Мои вопрос может не совсем в тему. У меня не получается добиться работы данных светодиодов на ATtiny85 при программировании через isp. При использовании Digispark все получается, использовал библиотеку Adafruit_NeoPixel.h. Насколько я понял дело в рабочей частоте процессора. Реально запустить ws2812 используя ATtiny85 не в качестве Digispark?
+
avatar
  • ACE
  • 20 декабря 2021, 02:29
0
Да вроде в этой библиотеке заявлена поддержка attiny на 8 MHz, 12 MHz и 16 MHz.
Проверьте, чтобы F_CPU в компиляторе совпадала с реальной, выставленной фьюзами.
И ещё, на странице баблиотеки есть такой код:
void setup() {
#if defined(__AVR_ATtiny85__) && (F_CPU == 16000000)
  clock_prescale_set(clock_div_1);
#endif

  pixels.begin();
}

Ну и смотреть, есть ли вообще данные на линии и что там происходит.
+
avatar
  • VLOD
  • 20 декабря 2021, 08:34
0
Спасибо, " будем искать".
+
avatar
0
Респект автору. Можно схематично обозреть схему соединений всех лент в снежинке? Спасибо.
+
avatar
  • ACE
  • 20 декабря 2021, 13:07
+3
Вот как-то так:
+
avatar
  • Frolv
  • 22 декабря 2021, 09:58
0
если соединить «боковые» лучики не с левой на правую, а на оборот, с правой на левую — это повлияет на эффекты?
+
avatar
  • ACE
  • 22 декабря 2021, 12:59
0
Тогда лучше и лучи подключить в обратном порядке, не по часовой, а против.
+
avatar
  • Jaster
  • 20 декабря 2021, 16:28
+1
Спасибо, что вы нас услышали, и запилили обзор снежинки!)
Завтра куплю кабель-каналов и попытаюсь повторить до НГ…
Ещё раз большое спасибо!
Плюсанул и забрал в избранное)
+
avatar
  • mataor
  • 20 декабря 2021, 18:46
+2
Уже делаю уменьшенную в 2 раза версию (летна в наличии 60 св/м)… основой выбрал П образный профиль 15х10 из леруа, 3 куска по 1м и немного в остатке… порезал (малые лучи 8.5см, большие 27см), наклеил ленту, сейчас печатаю детали. Фото и STL по окончанию!
+
avatar
  • ACE
  • 20 декабря 2021, 18:56
+1
О, класс! Интересно будет посмотреть на более плотный вариант!
+
avatar
  • mataor
  • 20 декабря 2021, 19:09
+2
пока выглядит так
фотка

через пару дней соберу
+
avatar
0
+
avatar
  • ACE
  • 20 декабря 2021, 19:43
0
Да, хорошо, когда-то тоже думал так сделать, но потом передумал, слишком много подобного уже есть, скучно.
+
avatar
0
Да, этих окон уже тьма-тьмущая, но у нас в деревне такого еще никто не видел.
+
avatar
  • 6o6p2006
  • 21 декабря 2021, 00:17
+1
Да ведь это куриные лапки… %))
А по факту, красиво получилось… ))
+
avatar
  • mataor
  • 22 декабря 2021, 00:32
+3
После полуночи, но все-таки дособрал… единственно передняя крышка еще печатается.
ЕСП 12-я, разьем питания 5х2.1 круглый

еще пара фото

Разводку выполнил МГТФ толь 0.07 или 0.12 — на питание 5 светиков хватит, зато глаза не мозолит, закрепил после термоклеем аккуратно


Чтоб заюзать 2А блок питания (жалко 5в 6А) уменьшил макс яркость с 255 до 150
+
avatar
  • ACE
  • 22 декабря 2021, 01:04
0
Отличный ремейк! Очень аккуратно сделано, лучше чем у меня. Супер! И спасибо за фото!
+
avatar
  • mataor
  • 22 декабря 2021, 01:06
0
Нать файлы stl (на гитхаб в папку проекта закинуть) для желающих повторить такой вариант?
+
avatar
  • ACE
  • 22 декабря 2021, 01:15
0
Думаю что могут пригодиться кому-то, я бы закинул. Можно в почту ace@imlazy.ru
+
avatar
  • mataor
  • 22 декабря 2021, 22:16
0
Скинул
+
avatar
  • KostikMX
  • 23 декабря 2021, 10:28
+3
Тоже начал делать Вашу снежинку. Собираю в алюминиевых профилях для светодиодов

Но т.к. 3D-принтера нет, то буду крепить к лучи к фанерному кругу в середине.
+
avatar
0
Вы использовали в своем варианте WeMos D1 Mini или что-то другое?
И второй вопрос: через что у вас подключен желтый провод?
+
avatar
  • mataor
  • 03 января 2022, 23:33
+1
D1 mini
Через штатный для лент резистор 330 ом… Был смд, одной стороной припаян, на втором провод, держаться будет
+
avatar
  • Frolv
  • 22 декабря 2021, 09:56
+1
Я правильно понимаю что ленту нужно присоединить к (Wemos D1 mini) к выводу GPIO14 (D5)?
+
avatar
  • ACE
  • 22 декабря 2021, 12:58
+1
Да, верно
+
avatar
  • niorix
  • 26 декабря 2021, 17:06
0
То есть на esp8266 этот код запускается без допила?
+
avatar
  • ACE
  • 26 декабря 2021, 19:37
0
Ну да, так задумано, по крайней мере
+
avatar
0
Скиньте, пожалуйста, пару-тройку ссылок на али — какие модули можно взять.
Или по каким ключевым словам их искать.
Та ссылка, что в обзоре видимо устарела.
А я не сильно в них шарю. Боюсь ошибиться.
Очень уж хочется сделать такую же красоту.
+
avatar
  • ACE
  • 28 декабря 2021, 12:29
+1
Подойдёт любой модуль esp8266, лишь бы на нем был USB (для удобства прошивки). Объем памяти, микросхема usb интерфейся (ch340/cp2102) или ещё что, в данном случае не имеет значения, любой подойдет. Можно искать по словам nodemcu или wemos d1. Брать с распаяными пинами или те, куда их надо припаять самому — как удобнее.
Вот лот с наибольшим числом заказов, для примера:
https://aliexpress.com/item/item/4000160133215.html (варианты NodeMcu v3 CH340 и NodeMcu Lua CH340 — вполне подойдут)
Или такой
https://aliexpress.com/item/item/32831353752.html (D1 MINI)
тоже пойдёт, он чуть компактнее.
+
avatar
0
Спасибо за быстрый ответ. Положил по вашим ссылкам в корзину модуль NodeMcu v3 CH340 и ленту. Поищу промокоды на скидку. И придётся подумать как это всё закрепить. Понравилось как сделал mataor, жаль принтера нет для подобной распечатки крепежа лучиков.
+
avatar
  • ACE
  • 28 декабря 2021, 16:19
+1
Попробуйте найти кого-нибудь тут, поблизости от себя: 3dprint.alexgyver.ru/ Объем печати там небольшой, сильно дорого быть не должно.
+
avatar
0
Здравствуйте. Подскажите, а лента клеится на пластину на родной слой клея? Никаких дополнительных прокладок не сделано. Коротить о пластину не будет?
+
avatar
  • ACE
  • 04 января 2022, 20:03
+1
Приветствую! Коротить не будет, все светодиодные ленты рассчитаны на приклеивание, в том числе, и на алюминиевые светодиодные профили. Подложка там изолирующая, а напряжение низкое, достаточно тонкой изоляции. С родным клеем бывает другая проблема, что он не держит. Особенно если лента долго лежала. Мне в нескольких местах пришлось прозрачным скотчем поперек ленты обмотать вокруг направляющей. Можно суперклеем капнуть было.
+
avatar
+1
Спасибо.
Получилось отлично!





+
avatar
  • ACE
  • 05 января 2022, 16:41
0
Ооо, класс! Спасибо за фотки!
+
avatar
+1
добавил видео

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.