До нового года осталось меньше двух недель, а новогоднего настроения все нет? Нужно срочно сделать что-то электронно-новогоднее, со светодиодами и ассемблером. Забегая вперед, вот что вышло:
Новогодняя елка из светодиодов, классика жанра! Вдохновленный постом Gum , продумал схему, соединения, размеры и прочее. Питание взял от USB-порта. Падение напряжения на светодиоде нагуглилось около 2.5В, получилось по 2 светодиода последовательно. Также хотел поиграть с ШИМом, в ATTiny24A аппаратный шим присутствует на 4 ногах, поэтому все светодиоды поделил на 4 группы — 1 красный и 3 группы зеленых по 8 светодиодов. Управлять таким напрямую, конечно, нельзя. Поэтому решил использовать мосфеты с низким порогом срабатывания. В ближайшем магазине нашлись нужные мне по характеристикам — IRLML2502TR (порог 1.2В, максимальное напряжение 20В и ток 4.2А – за глаза). На размеры транзистора я тогда внимания не обратил, а зря, 3х1.5мм, такую мелюзгу паять еще не приходилось:
В Sprint Layout развел печатную плату, на этом варианте неправильно подключены кнопки — подтяжка не стой стороны, и вообще оказалось, что кнопка замыкает другую пару контактов (и вообще не знаю зачем мне их две нужно было):
Изготавливал плату ЛУТом. В качестве бумаги использовал вырванный лист из первого попавшегося рекламного журнала, могу сказать, что результат получился отличный, только немного расплылись площадки под мосфеты.
Протравил плату в растворе лимонной кислоты и перекиси водорода. Некоторый промежуточный результат:
Ацетона или растворителя в нужном количестве не было, поэтому можно увидеть темные места – не до конца оттертый тонер.
Дело осталось за самым главным — светодиодами. Все оказалось не так уж и сложно. На листе бумаги разметил схема будущей елки в разрезе, и по ней гнул светодиоды:
Далее обрезал лишние ножки, для удобства пайки (из упаковки оригинальной arduino из Италии, между прочим) была сделана такая приспособа:
Не знаю, насколько без нее бы затянулся весь процесс, но она в разы все ускорила. Собран первый ярус, в центре – общая для всех светодиодов земля:
На заднем плане светодиод с прикрученным резистором на 220 Ом – это мой заменитель тестера, с первой версией которого я сжег тиньку – светодиод попался бракованный, с неправильной длиной ног, в результате чего я перепутал полярность.
Окончательно собрал всю конструкцию:
Чтобы заставить ее работать, нужна еще и программа. Вооруженный Atmel Studio и ассемблером, запрограммировал несколько режимов мигания:
1. Все горят.
2. Все мигают.
3. Красный горит, группы загораются по часовой стрелке.
4. Все мигают 2 раза и меняются по часовой стрелке.
5. Красный горит, группы загораются против часовой стрелки.
Также изготовил подставку — из остатков ДСП от установки дверей и куска тонкого пенопласта.
Изначально программа работала с прерываниями, вместо этого задержка в смене состояния была реализована в коде, но по мере постижения ассемблера, все-таки сделал смену состояний по таймеру и режимов по прерыванию PCINT, что оказалось довольно просто.
В целом это мой первый опыт работы с микроконтроллерами (исключая мигание светодиодами и некоторых опытов с ардуино), но результатом доволен.
В процессе пострадали:
— 1 микроконтроллер (сгорел от не той полярности),
— 1 микропереключатель (возможно, бракованный попался, не было плотного контакта),
— 1 гнездо microUSB (взял не тот тип, с контактами посередине гнезда, и при нескольких попытках подпаяться, контакт все-таки отвалился).
Текстолит был куплен слишком тонкий (1мм) — повело винтом после нагрева, в том числе из-за этого пришлось делать подставку.
Видео работы девайса:
Опишу примерные затраты, т.к. что-то было куплено давно:
— ATTiny24A –
70р.;
— IRLML2502TR – 4×24р = 96р;
— текстолит 5х11 —
24р.;
— светодиоды – 25х10р. = 250р.;
— кнопки – 2х10р. = 20р.;
— панелька под МК –
15р.;
— резисторы и прочее —
20р.;
— полученный опыт – бесценно.
Итого было затрачено около 550 рублей.
Проект на гитхабе (печатная плата, проект Atmel Studio).
- avr,
- diy,
- новый год,
- елка,
- светодиоды,
- led
- +7
- 21 декабря 2015, 21:22
- positron48
Комментарии ( 22 )
Премиленько получилось… и елочка такая, всамделишная 🙂 а у меня вот пространственное мышление отсутствует напрочь, попытка представить что-то сложнее кубика вызывает лютый диссонанс…
где текстолит такой недорогой брал?)
- DySprozin
- 21 декабря 2015, 23:22
- ↓
- positron48
- 22 декабря 2015, 00:13
- ↑
- ↓
а у меня вот пространственное мышление отсутствует напрочь
это называется образное мышление, за это отвечает правое полушарие
5% людей мыслят правым полушарием лучше левого
для меня вот написать прогу очень сложно, потому что левое не работает
так же я не запоминаю числа, имена, даты и нихера не понимаю матан
зато плюшки правого полушария перекрывают все это
- kalobyte-ya
- 22 декабря 2015, 20:58
- ↑
- ↓
за это отвечает правое полушарие
- DySprozin
- 22 декабря 2015, 21:30
- ↑
- ↓
- kalobyte-ya
- 23 декабря 2015, 03:01
- ↑
- ↓
не слишком хорошая идея. Одну руку проще натренировать и… в общем, просто оставлю это здесь
"Как Новый год встретишь — так его и проведешь" — давно ставшая крылатой фраза, в какой-то степени заставляющая заранее готовиться к самому любимому празднику. И если такие традиционные атрибуты, как оливье и мандарины, незаменимы, то выбор различных инсталляций и украшений ежегодно заставляет ломать голову, радиолюбителям и электронщикам — в особенности.
Просмотренные в Интернете видео с поделками на "умных" светодиодах WS2812B сразу породили множество идей их применения. В конце ноября мне наконец-то пришла долгожданная, заказанная на eBay лента из 200 диодов. Доставка бесплатна, стоимость одного диода — около шести рублей. И так как до Нового года оставался всего месяц, я решил совместить приятное с полезным — и с подключением диодов разобраться, и к празднику подготовиться.
WS2812B — трехцветный светодиод с интегрированным драйвером и схемой, реализующей протокол управления. Имеет 4 вывода, как и "обычный" RGB-диод, однако их назначение отличается: два вывода отведены под питание схемы, один вывод под вход данных, и один — под выход (диоды можно соединять последовательно). Нет необходимости придумывать сложные алгоритмы для регулировки яркости и цвета каждого диода — разработчику достаточно передать в цепочку диодов последовательность байт и выдержать необходимые временные интервалы — после чего цепочка будет гореть заданным цветом либо до подачи другой последовательности, либо до отключения питания. При этом расходуется всего один вывод МК или ПЛИС!
В даташите на диоды (прикреплен в конце статьи) подробно расписаны все характеристики, здесь же приведу наиболее важные параметры:
- размер одного диода 5х5 мм, корпус — для поверхностного монтажа;
- напряжение питания — 3,5. 5,3В;
- максимальное количество диодов в одной цепочке — 1024, при частоте обновления 30 кадров в секунду. Стоит заметить, что подключить такое число диодов возможно при идеальном следовании таймингам протокола, что бывает проблематично;
- светодиоды реализуют RGB-модель: каждый цвет кодируется одним байтом — теоретически возможно получить более 16 млн цветов. Однако на глаз разница между даже не столь близкими цветами незаметна.
Схема подключения диодов выглядит следующим образом:
При подаче питания диоды не инициализированы и горят синим цветом. Для инициализации цепочки диодов требуется выполнить следующие действия:
- Передать 8 бит G7..G0 для установки зеленого цвета первого диода;
- Передать биты R7..R0 для установки красного цвета;
- Передать биты B7..B0 для установки синего цвета;
- Повторить пункты 1-3 для второго, третьего и др. диодов. То есть, после инициализации первого диода, данные начинают проходить через него на следующий диод;
- Установить на входе логический "0" как минимум на 50 мкс, после чего все инициализированные диоды примут заданный цвет.
Передача единиц и нулей осуществляется не непосредственно, но выдержкой определенных временных интервалов; суммарное время передачи одного бита — 1,25 мкс, настройки одного светодиода — 30 мкс. На практике требуется соблюсти лишь длительность высокого уровня, длительность низкого может выходить из пределов в большую сторону.
Далее я подробно прокомментирую программу, которая инициализирует диоды, отвечает за управление и смену эффектов. Программа написана на языке ассемблера, проект в среде ATmelStudio 6.2 прикреплен в конце статьи. Будет рассмотрена только логика загрузки и переключения эффектов; очевидные вещи, вроде инициализации стека и настройки прерываний и портов, опущены. Также подразумевается, что цепочка диодов подключена к порту PD7 контроллера, рабочая частота — 8 МГц.
Идея программы заключается в следующем. Имеется некий набор эффектов, которые поочередно требуется выводит на светодиоды. Эффект характеризуется:
- частотой кадров;
- временем работы;
- "интеллектуальностью". "Умным" называется эффект, который проще запрограммировать (например, плавные переливы цветов, одинаковые для многих эффектов); "глупый" же эффект описывается покадрово, массивом.
Перед объяснением логики работы следует пояснить, для чего нужны следующие регистры и константы:
Учитывая приведенные выше характеристики эффекта, он выглядит примерно следующим образом:
В первой строке находятся 4 байта характеристик:
- два байта настройки прерывания таймера, определяющие частоты смены кадров. В данном случае частота — 15 кадров/сек;
- байт длительности эффекта (в кадрах). Данный эффект продлится 16 секунд;
- байт "умности" эффекта. Так как данный эффект (перелив) проще запрограммировать, байт равен единице.
Далее в массиве следуют:
- 51 байт цветовых характеристик каждого диода (в случае покадрового описания их было бы на порядок больше);
- маркер конца массива.
Под хранение буфера и некоторых констант в ОЗУ выделено следующее количество места:
Хочется подробнее пояснить "программируемость" эффектов. Дело в том, что в массиве должны быть перечислены интенсивности каждого цвета (от 0 до 16). В свою очередь, данные значения умножаются на значения следующий регистров (заодно приведены константы-помощники в реализации перелива):
Произведение констант из массива и соответствующих регистров формируют таблицу цветов (ColorsTable) для каждого из диодов. В случае, если эффект программируется, значения регистров R,G,B можно динамически менять. Описание всех кадров такого эффекта нецелесообразно (требует слишком много памяти контроллера).
В случае, если эффект не программируемый, все кадры перечислены в массиве, а интенсивности вместо значений регистров умножаются на 15.
После получения таблицы цветов необходимо получить последовательность байт, которая будет загружаться непосредственно в диоды. Это выполняет следующая функция:
То есть, данная функция преобразует один байт в четыре, которые будут загружаться в диоды.
Откуда взялась волшебная константа 0х88? Нужная длительность низких и высоких уровней формируется путем выдерживания определенного значения на выходе порта. Команды lsl — nop — out выполняются за три такта, то есть за 375 нс, что укладывается в допустимую погрешность. Таким образом, передача нуля сводится к загрузке последовательности 1000, а единицы — 1100. То есть, в одном байте передаются два бита, а в двенадцати байтах — настройки одного диода (24 бита = 3 байта G,R,B), что сразу делает понятной данную строку:
.equ BUFFER_SIZE = LED_COUNT*12+1 ;размер буфера (будет пояснено позднее)
Именно поэтому в начале байт равен 0x88, функция ColorToBytes попросту выставляет единицы на позициях 6 и 2, если это необходимо, и загружает байт в выходной буфер.
В упомянутом выше прерывании таймера реализовано следующее:
- загрузка следующего кадра эффекта;
- если же эффект дошел "до конца", то следующим кадром будет являться начало эффекта;
- если эффект отыграл установленное время, следующим кадром будет начало следующего эффекта;
- если эффект "умный", будут изменены значения интенсивностей в регистрах.
Общий алгоритм работы представлен следующей блок-схемой:
Также в конце статьи прикреплен шаблон проекта, незначительная правка которого позволит очень быстро работать с WS2812B.
Осталось продемонстрировать готовое устройство на "умных" светодиодах — новогоднюю елку. Схема елки достаточно проста и приведена ниже:
Основной компонент схемы — микроконтроллер ATmega8A в TQFP-корпусе. Также я оставил две кнопки для будущей доработки елки. Остальные компоненты почти полностью представлены резисторами и конденсаторами типоразмера 0805. Питается елка от 5 Вольт через разъем micro-USB, что позволяет разместить елку где угодно при подключении к внешнему ЗУ типа PowerBank. Файл с ПП елки находится в архиве (плата двусторонняя).
Фото вырезанной на ЧПУ-станке платы (одна сторона):
Впервые в жизни попробовал вырезать плату из тонкого (0.3мм) текстолита, так как планировал закрепить елку на листе бумаги формата А3. Для больших плат механическая прочность такого текстолита низка; советую брать текстолит от 1 мм толщиной. На фото даже видно просвечивающие дорожки другой стороны!
Пайка и прошивка схемы трудностей вызвать не должны, все необходимые файлы прикреплены в конце статьи. Фото елки в работе (эффект северного сияния, фрагменты гирлянд):
Далее осталось закрепить (или не закреплять) елку на какой-либо поверхности либо опоре, задекорировать мишурой. В общем, здесь простор для творчества еще больше.
Небольшое видео работы (пример эффекта перелива):
В конце статьи прикреплен архив, где находятся:
- исходный проект новогодней елки в AtmelStudio 6.2;
- шаблон проекта в этой же среде;
- файл печатной платы елки;
- файл схемы елки;
- прошивка елки;
- FUSE-биты контроллера;
- схема подключения диодов;
- даташит на WS2812B.
Теперь у Вас есть почти 9 месяцев, чтобы подготовиться к следующему Новому году! А также поделиться предложениями, идеями и замечаниями в комментариях и на форуме.
- Цена: $5.03 за комплект
- Перейти в магазин
До Нового Года осталось совсем чуть-чуть, поэтому обзор в тему. Данный комплект приобретался специально для новогодней ёлки.
Раньше на ёлке висела защищённая лента RGB 5050, купленная 3 года назад в оффлайне за приличные деньги, но она оказалась некачественной и сейчас светит вот так…
Использовать защищённую ленту на комнатной ёлке не имеет смысла — украшения из металла давно на делают и замыкания исключены.
Для обычной декоративной подсветки новая лента не подходит, т.к. цветные светодиоды 3528 пространственно разнесены и получить белый цвет не выйдет.
Всё запаковано в общий антистатический пакет
Содержимое
На пакете наклейка магазина Hello Fish
Бобина ленты
Инфракрасный контроллер и пульт к нему самые простейшие из возможных, батарейки CR2025 в комплекте не было
Общая длина ленты реально 498см, ширина 8мм
После размотки с катушки, половина ленты смята гармошкой. Мне это не критично, но кто будет её клеить — будет сильно огорчён.
Лента оказалась довольно странная — спаяна из кусочков по 30LED (0,5м).
Но и это ещё не всё — сегменты тоже разные, по 6LED (10см) и 9LED (15см), которые чередуются 6-9-6-9… Истиная причина, по которой надо было так делать, мне неизвестна, предполагаю, чтобы кратность резки была 10-15-25…
На всякий случай набросал эту странную схему
Запитал ленту сетевым адаптером 12В 2А
Продавец заявил 2,88Вт/м, но реально отрезанный 1 метр ленты потребляет 4,6Вт, видимо перестраховался для исключения претензий.
Отрезки спаяны между собой плохо и пока проводил тесты, контакт пропадал в разных местах. Пришлось заново пропаивать все соединения отрезков и проблема ушла. Все 300 светодиодов оказались работающими.
С обоих концов ленты припаяны разъёмы для подключения к контроллеру, однако в комплекте тройника нет.
С одной стороны все 5 метров запитывать нельзя, т.к. на свободном конце яркость свечения будет значительно меньше, чем в начале подключения.
Немного теории
Есть несколько способов подключения длинных светодиодных лент, имеющие свои особенности:
0. Неверный — подключение длинной ленты с одного конца.
Достоинство — подключение проще некуда.
Недостаток — яркость свечения на свободном конце значительно падает, баланс цвета сильно нарушен.
1. Классический — подключение с обоих концов.
Достоинство — не надо паять, т.к. разъёмы уже припаяны, простое подключение в кольцо.
Недостаток — при линейном использовании приходится тянуть 4 длинных провода до конца ленты, баланс цвета немного нарушен в центре ленты.
2. Серединный
Достоинство — минимальная длина проводов подключения
Недостаток — провода надо припаивать к середине ленты, баланс цвета немного нарушен по краям ленты.
3. Диагональный
Достоинство — до конца ленты идёт всего один провод.
Недостаток — требуется повышенное напряжение с БП для компенсации падения напряжения на ленте, баланс цвета немного нарушен.
4. Комбинированный (1 + 2)
Достоинство — малое падение напряжения и соответственно отсутствие заметного нарушения баланса цвета.
Недостаток — сложное подключение.
Чтобы наглядно показать, подключил, измерил и сфотал подключение ленты с одной стороны.
Общая потребляемая мощность всей ленты получилась 12,04В х 0,982А = 11,8Вт
В начале ленты измерил ток на каждом светодиоде (по падению напряжения на токоограничивающем резисторе).
R (12,04В) — 19,4мА
G (12,04В) — 16,6мА
B (12,04В) — 17,8мА
В конце ленты всё очень печально
R — 7,8мА
G — 1,8мА
B — 2,2мА
Ток синего и зелёного светодиодов в конце ленты снижен от исходного в 8-9 раз!
Фотографии на разных выдержках показывают это безобразие.
На небольшую 170см ёлку 5 метров ленты оказалось вполне достаточно, подключил по самому оптимальному (в данном случае) серединному способу.
Общая потребляемая мощность всей ленты получилась 11,90В х 1,42А = 16,9Вт
Ток светодиодов около подключения (в середине)
R (11,90В) — 19,1мА
G (11,90В) — 16,0мА
B (11,90В) — 17,2мА
В конце ленты
R — 9,0мА
G — 8,4мА
B — 9,3мА
Ток снижается на концах ленты до 2 раз, но падение яркости в глаза сильно не бросается — результат всех устроил.
Частота работы ШИМ модуляции контроллера 225Гц
После отключения питания, состояние работы запоминает
Что в итоге получилось (снималось в полной темноте)
На ёлке висит ещё одна простая лампочная гирлянда — не стал её отключать ибо не мешает.
Рекомендовать к покупке не могу, если нет желания её доделывать паяльником.
В заключение — Поздравляю всех с наступающим Новым Годом 🙂