Захотелось сделать под новый год что-то эдакое, чтобы было и визуально красиво, и легко управлялось с телефона\ПК без всяких сторонних программ, прошивания МК или других костылей. Для этого вполне подходит WEB-управление по WiFi, ничего дополнительного не нужно, управляется с любого девайса с браузером, правда, первоначальные вложения, так сказать, довольно большие требуются в написании прошивки, WEB-морды (а я в этом вообще профан, ибо никогда не занимался версткой и JavaScript).
Ну, кое-чего получилось таки. В итоге выработалась более-менее работающая концепция проекта и со временем проект буду постепенно развивать. Под катом подробности и ссылки для скачивания первой версии. ;)
Все началось с данного проекта rtl8710_blinkenlights — тут есть довольно хороший драйвер светодиодов WS2812 на основе SPI с DMA. Есть некоторые недоработки (HSV в RGB преобразование упрощено, буфер под значения светодиодов не динамически выделяется, а по максимуму всегда, и еще по мелочи), но память расходуется достаточно экономно (по сравнению с другими виденными мною решениями на том же STM32), и как бонус есть еще простой сервер эффектов с WEB управлением.
Компилировать и тестировать названный выше проект я не стал, а просто взял основы оттуда (драйвер светодиодов), далее же творчески переработал остальное — там для фильтров были применены связанные списки , что круто, но для такой простой вещи довольно неплохо усложняет понимание кода сходу. Также своеобразно была организована работа «фильтров», мог быть активен только один, и общая логика несколько усложнена. Стопицот структур параметров также только мешают пониманию, что и где находится и как вообще работает. Хотя с упрощением я таки косякнул — там везде вычисления HUE (и остального) в фильтрах производились в uint32_t, а потом просто сдвигом приводились к необходимому uint8_t, что давало высокую плавность переходов, а также не было проблем с большим количеством светодиодов, у меня же при тестировании на ~220 светодиодах появляются иногда ступеньки резкие переходов и т.п. Ну это дело поправимое, решим (главное, не повторяйте моих ошибок! ;) )!
Итак, прошивка. Вкратце вышла такая структурная схема работы:
По пунктам:
- WEB — это переработанный оригинальный пример WEB-сервера от pvvx, в который добавлены дополнительные параметры для управления гирляндой, отключена авторизация и полностью заменены все html\js\css файлы;
- LedEffectsServer — верхний слой абстракции гирлянды, в котором производится инициализация двух нижних и содержится простой таск по работе фильтров в цикле;
- LedFilters — здесь уже содержатся все функции фильтров и структуры их параметров;
- WS2812 — самый нижний слой, являющийся драйвером управления светодиодами WS2812 посредством SPI DMA.
Работа так называемых фильтров у меня построена по следующей иерархии:
Главными являются фильтры цветового тона, которых на данный момент два:
- Радуга — плавное изменение угла цветового тона (HUE) на заданном промежутке радуги и копирование этих промежутков на всю длину гирлянды;
- Оттенок — просто выбор одного оттенка на всю гирлянду.
Далее идут фильтры яркости, которые уже модифицируют результат первых только по яркости. Фильтров на данный момент также два:
- Выцветание — плавное уменьшение и величение яркости на всю длину гирлянды с заданием минимума и максимума яркости, а также скорости процесса;
- Волна — синусообразное изменение яркости на всей гирлянде с заданием «длины» волны и скорости.
Итоговый результат уже выводится на светодиоды (гирлянду).
WEB-интерфейс же состоит из следующих основных файлов:
Основная страница Index.html содержит кнопки-табы на две ниже стоящие страницы, которые подгружаются в iframe элемент по вызову. Страница Filters.html содержит в себе все доступные настройки фильтров. Страница Settings.html на данный момент содержит в себе только настройки Wi-Fi, в дальнейшем сюда добавятся настройки поведения пользовательской кнопки и светодиодов на самом модуле управления. В файле elements.css содержатся в основном классы внешнего оформления элементов для всех трёх страниц, а в файле elements.js содержатся функции для обработки евентов от элементов на страницах (на самом деле js код можно разделить еще на 2 файла, т. к. почти все функции разделены на 2 группы по страницам, где они используются).
Внешний вид страниц пока получился достаточно лаконичным и вроде бы даже удобным (нажми для увеличения):
Во время работы над html js я почувствовал себя вебером… мне даже в какой то момент понравилось, что у меня много получалось довольно быстро, и я втянулся в процесс, от этого потом стало немного грустно. Я же не вебер…
Прошивку и файлы WEB-морды можно посмотреть и скачать здесь. На данный момент есть еще следующие проблемы, которые будут устранены в дальнейшем (буду вычеркивать по мере устранения):
- Упрощенное преобразование HSV -> RGB, которое иногда дает неверный оттенок.
- Некорректный расчет HUE в фильтре Радуга, что иногда даёт ступеньку перелива оттенка.
- Некорректный расчет яркости в фильтре Волна, что даёт ступеньку яркости.
- Не отключаются взаимно конфликтующие фильтры и в итоге работает доминантный из них (к примеру, если включить Радугу и Оттенок — оба работают с цветом, но работает только один из них — Радуга).
- Мало интересных фильтров.
- Не работает сохранение параметров (да-да, Wi-Fi настройки не сохраняются!) и их загрузка при старте.
- Не функционирует кнопка (для сброса параметров по умолчанию).
- Не функционируют статусные светодиоды (Ок и Ошибка).
- D-дэзигн, еще далек от хорошего…
На опере и хроме кнопка-лампа не загружает своё состояние при загрузке страницы (хотя в Edge все работает), отчего при загрузке страницы показывается, что гирлянда выключена, хотя реально она может находиться во включенном состоянии (с этим вообще идей нет, почему так).- Что-то еще?
Дальше аппаратная часть. Вначале делаем схему… я хочу сделать простейшую плату ЛУТом (чего не делал уже года 3!! К хорошему быстро привыкаешь — заказывать платы с красивой маской, шелкографией и т.д и т.п.), минимально затратив на неё по времени, т.к. на ней толком-то и деталей не должно быть, отлаживал почти все вообще на мартышке, за полчаса спаянной.
Итак, получившаяся схема (нажми для увеличения):
На ней можно отметить следующие функциональные блоки по компонентам:
- A1 — собственно мозг гирлянды и модуля управления в частности, сам модуль RTL-00 со всей необходимой обвязкой по питанию (C6, C7), прошивке (R1…R3, C1);
- DA1 — LDO на 3,3В с минимальной обвязкой, более чем хватает любого LDO на ток 150-200 мА в корпусе SOT-23-5 (пробовал как китайский XC6204B332MR-G, так и MIC5205-3.3YM5 — все нормально);
- DD1 — формирователь уровня 5В из 3,3В для светодиодов на копеечном шинном трансивере SN74AVC1T45;
- SB1, HL1, HL2 — пользовательские приблуды, можно сделать простой сброс настроек или отображение ошибки\работы.
Перечень элементов (нажми для увеличения, на гите он же в екселе есть):
Описывать больше собственно и нечего… надо разводить плату! А плату же хочется сделать простую в изготовлении, значит односторонюю будем делать! ;)
Итоговый результат разводки (нажми для увеличения):
Вписались в размеры 30 * 30 мм. Аппаратную часть в виде проекта для Altium Designer можно посмотреть и скачать здесь.
Режем плату по-быстрому дремелем… криво, но сойдет. Главное, чтобы работало. :) Печатаем зеркально Top слой для ЛУТа и гладим утюгом:
Такс, уже не плохо пошло, может даже спустя столько лет и получится хороший результат сходу (давным-давно я много плат ЛУТом делал, усилители, того же УМЗЧ ВВ Сухова в различных модификациях… получалось очень даже хорошо).
Ну…. почти. :) Подмажем цапон лаком и травить (тут тоже новшество для меня, раньше все в хлорном железе травил, в этот раз решил опробовать пятно-безопасный раствор из лимонной кислоты и перекиси водорода):
Довольно долго травилось, много пузырьков было, думаю из-за них как раз в паре мест отлетели даже дорожки из тонера и некоторые буквы. Лудим:
Под модуль клеим на плату термоскотч (каптон) для исключения замыканий дорожки под модулем на оголённые участки от маски на пузе модуля:
Берем сгенерированный сборочный и паяем по перечню:
В итоге после пайки компонентов плата вышла и не такая уж и ужасная, как казалось, подтравы были конечно в пару местах, перемычки кинул, замыканий нет и заработала сразу:
Так-с, плата — это хорошо, но раз есть 3D принтер и SolidWorks, то почему бы и не…
Ааааа… (свежесть мема зашкаливает ;) )
Быстренько печатаем и примеряем:
Отлично, все вполне хорошо подошло и даже кнопка нажимается, правда пока не задействована в прошивке. :)
Файлы STL для печати и исходные файлы для SolidWorks 2016 можно посмотреть и скачать здесь.
Небольшое видео о работе этой глупой гирлянды во время тестирования (повесил, куда можно было, лишь бы у рабочего стола рядом :D ):
На этом всё, с наступающим новым годом всех!!
Побольше разработок, воплощения идей и удачи в начинаниях. ;)