Новогодняя
гирлянда на светодиодах WS2811.
Новогодние
праздники не оставляют равнодушными никого. Особенно, если в семье есть дети.
Вот и мне захотелось сделать новогоднюю гирлянду, которая повторяет бегущие
ёлочные огоньки из известных советских мультфильмов про новый год. Конечно,
сейчас это легко сделать с помощью адресуемых полноцветных светодиодов на
микросхемах WS2811 и WS2812. Гирлянду из 50 светодиодов я купил заранее, ещё летом, а до
реализации задумки дошли руки только за неделю до нового года.
Гирлянда вот
такая:
Покупал здесь.
Для управления
применил имеющуюся у меня в наличии плату STM32F0discovery. С неё много
проектов начиналось.
Сначала железо.
Гирлянда имеет на
концах два разъёма для соединения в длинную цепочку. Мне длиннее не было нужно,
поэтому с выходного конца я обрезал разъём с проводами и использовал его для
подключения к плате Discovery. Питание 5 вольт я взял от зарядного
устройства 5В 3А. Расчёт такой: максимальный ток через светодиод 20 мА. Три
светодиода на лампочку – 60 ма. 50 Лампочек в гирлянде – 3 ампера. Это при
включённых всех лампочках на полный белый свет, обычно раза в три меньше. На
гирлянде были провода питания, я их удлинил и припаял USB штеккер для подключения
к зарядному устройству.
Для микросхем WS2811 входные уровни должны быть не меньше 0,8 –
3,5В, а питание процессора в плате Discovery – 3В. Нужен преобразователь уровня. Для
простоты я использовал оставшийся у меня компаратор на микросхеме SN75176 . Плату я не переделывал, выход Discovery подключил к входу B, вход A зашунтировал конденсатором 0,1 мкФ. Выход подключил к входу цепочки
лампочек. Скорости работы компаратора с головой хватит для передачи управляющих
импульсов. Саму плату изолировал термоусадкой, она совсем маленькая. Три
провода (земля, питание +5В и выход Discovery) подключил
тремя проводами к трём выводам платы, благо подходящие ножки оказались на плате
рядышком. Все работы по пайке были выполнены за пол часа.
Теперь программа управления светодиодами. Аппаратный уровень.
Управлять микросхемами
WS2811 очень просто. Нужно передавать отрицательные
имульсы определённой длительности для передачи битов 0 и 1 и импульс большой
длительности для сброса счётчиков данных
во всей цепочке. Способов управление множество: ногодрыг, использование UARTили SPI. Мне больше всего
подошёл способ управления с помощью таймера ШИМ и ДМА. Я настроил таймер на
передачу импульсов с периодом 1250 нс и длительностью 450 или 800нс для
передачи 0 и 1 соответственно. Для сброса счётчиков я записываю в регистр
сравнения таймера 0 и на выходе процессора также появляется ноль. Для работы
ДМА я подготавливаю буфер размером 24 ячейки * число лампочек в гирлянде (число
бит в посылке) и плюс 1 стоповый элемент. Размер элементов буфера равен размеру
регистра сравнения таймера. В моём случае это 16 бит. Итого буфер занимает
немало: 2402 байта. В буфер заношу данные цветов светодиодов побитно, а в
последнюю ячейку заношу нулевое значение, которое сбрасывает счётчики
микросхем. Запустив таймер в связке с ДМА, я получаю на выходе пачку импульсов,
зажигающую мою гирлянду. После передачи последнего импульса срабатывает
прерывание ДМА, в котором я останавливаю передачу. Запуск новой пачки импульсов
производится по системному таймеру каждые 20 мс. После окончания передачи мой
контроллер освобождается и выставляется сообщение программе верхнего уровня,
что можно заполнять буфер свежими данными.
Прикладной уровень программы.
В принципе,
каждый может написать свою программу управления цветами. Здесь очень широкий
выбор. Поскольку мне хочется повторить бегущий огонёк из мультфильма, я
придумал для себя следующий уровень абстракции:
Источником света
является светлячок. Это сущность, которая имеет свои атрибуты:
- размер в
пикселях (лампочках на гирлянде),
- паттерн
заполнения (может быть несколько лампочек разных цветов),
- положение на
гирлянде (может быть за пределами существующих лампочек),
- скорость и
направление движения,
- скорость
зажигания и погасания лампочек,
- цвет погасания
(могут тухнуть не до конца или вообще переходить из одного цвета в другой).
Можно придумать
ещё другие свойства, например изменение паттерна со временем, но мне хватило и
этого.
Светлячков может
быть несколько. Их аттрибуты индивидуальны. Огоньки отображаются на слой.
Слой – это
текущее состояние гирлянды. Это массив такого же размера, как и количество
лампочек в гирлянде. Элементом массива является структура из параметров
лампочки:
- требуемый цвет,
- текущий цвет,
- скорость
изменения цвета,
- указатель на
светлячок – хозяин (тот, который был здесь последним) этого пикселя.
Такая структура
позволяет изменять параметры цвета слоя по задуманному алгоритму, просто
периодически запуская программу обновления текущего цвета.
Слоёв может быть
несколько и для каждого слоя выполняется своя программа. Например, на фоне неярко
переливающейся гирлянды из слоя фона могут бегать несколько огоньков из слоя
фронта и т.д. Тут как фантазии хватит. Слои объединяются по принципу
максимальной яркости. То есть цвет лампочки определяется самым ярким цветом
пикселя из всех слоёв. Как вариант я попробую бинарное смешение цветов, но не
знаю, что получится. После смешения слоёв итоговый буфер с цветами лампочек
определяет заполнение данными буфера таймера.
Исходный код без подготовки, сырой, как у меня есть, выложен на Гитхабе.
Вот такая
концепция получилась. Для этого нового года я написал следующий эффект: Огонёк
из двух пикселей, первый пиксель белый, второй цветной, зажигание мгновенное,
погасание за 2 секунды. Цвет погасания такой же, как и у цветного пикселя, но
приглушённый в четыре раза. Огоньки бегут по гирлянде по очереди снизу вверх
Один бежит немного быстрее, второй медленнее. Цвета огоньков меняются заданным
образом. На гирлянде видно ярко-белую точку, которая оставляет за собой
цветной, плавно угасающий след. Видео работы чуть ниже:
Как по мне, то
получилась весьма занятная гирлянда. На следующий новый год сделаю плату в
маленькой коробочке с кнопкой выбора эффекта и понапридумываю разных эффектов.
Из материалов – процессор STM32F051, стабилизатор на 3В, SN75176 и кнопка. Да корпус для поделки покрасивее. Конечно, основные затраты
это гирлянда и блок питания. Кстати, сейчас появились очень красивые гирлянды
со светорассеивающими шариками или свечками.
Комментариев нет:
Отправить комментарий