RGB ночник из керосиновой лампы. Сборка

Это вторая часть статьи про RGB ночник из «Летучей мыши». Здесь будет рассмотрен процесс сборки конструкции, дан небольшой обзор на управляющую электронику и программу микроконтроллера. Первая часть тут. Под катом много картинок, у кого трафик имейте ввиду!

 

Содержание

Раскрой и сборка

В качестве источника света используются отрезки светодиодной ленты WS2812B, в каждом из которых 10 светодиодов. Количество отрезков 8 штук. Ленту брал 144 светодиода/метр. Кусочки светодиодной ленты необходимо как-то закрепить внутри колбы лампы и обеспечить им достаточный теплоотвод. Решил сделать каркас из фольгированного стеклотекстолита. Размечаем, разрезаем, собираем! 😉

Прихватываем пайкой отрезки текстолита, формируя восьмиугольник:

Припаиваем нижний диск из текстолита:

Припаиваем верхнее кольцо из медной проволоки, стягивая всю конструкцию:

Отмываем от остатков флюса и получаем вот такой результат:

Лента, настало твое время!

Отрезаем от катухи 8 кусков по 10 светодиодов (на фотке показано 6):

Приклеиваем отрезки ленты к каркасу и просверливаем отверстия вверху и внизу для проводов:

Далее, пайка! 🙂 Провода питания к отрезкам ленты подпаиваем с верхней части конструкции, data-провод соединяет все отрезки ленты последовательно снизу вверх.

Делаем регулятор яркости. Первым делом разбираем узел подачи фитиля:

Задача состоит в впиливании каким-то образом переменного резистора на 50 килоом внутрь горелки керосиновой лампы, причем штатная ручка регулирования лампы должна быть соединена с движком резистора так, чтоб ничто не выдавало модификацию данного узла. После некоторых раздумий получаем следующее:

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

Далее, прикручиваем светодиодную «горелку» к основанию керосиновой лампы. В дальнейшем был изготовлен светофильтр для рассеивания света из обычного листа А4, но лучше использовать какой-либо белый матовый пластик или пленку.

Примеряем регулятор яркости:

Как тут и был!

Так как в дальнейшем планируется устанавливать управляющую электронику внутрь емкости для керосина, приступаем к выпиливанию дна у лампы. Ну и заодно сверлим отверстие для крепления кнопки:

Отпиливаем от крышки бочка основание, теперь это у нас ручка настройки режима:

Монтируем кнопку и регулятор в корпус лампы:

Вклеиваем внутрь обрезка крышки часть от ручки переменного резистора:

И насаживаем самодельную ручку на резистор:

Фух, этот этап завершен! Далее идет не менее увлекательный процесс программирования, создания режимов, отладки прошивки и так далее. Описание программы будет в последней части статьи, а пока займемся схемой и пайкой. Вот фотка процесса отладки прошивки и схемы:

Схема

Принципиальная электрическая схема нашей лампы:

Большая часть схемы собрана из готовых модулей с Aliexpress. Питание +12 вольт подается от внешнего импульсного блока питания. Отладочная плата DD3 на микроконтроллере STM32F103C8T6 запитана 5-ю вольтами посредством стабилизатора 78L05 через разъем USB на плате, точнее провод припаян к ножке диода, которая электрически соединена с контактом питания USB разъема. Переменный резистор R1 подключен к выводу A4 платы и отвечает за изменение яркости свечения лампы, R2 подключен к A3 и управляет режимом работы. С помощью кнопки S1, которая подключена к выводу A6, можно выбрать один из 8-и режимов работы. На транзисторе Q1 выполнен преобразователь логического уровня управляющего сигнала, идущего от отладочной платы к светодиодной ленте. Лента через step-down преобразователь DD2 на микросхеме LM2596, питается напряжением 3,6 вольта. Преобразователь подвергнут нескольким переделкам, а именно добавлены керамические конденсаторы по 0,1 мкФ на входе и выходе преобразователя, а подстроечный резистор был заменен на 2 последовательно спаянных smd-резистора в сумме имеющие сопротивление 610 Ом.

Из куска пластика был вырезан круг диаметром 11 см, который является дном ламы и основой для крепления радиоэлектронных компонентов. Далее фотки процесса сборки электроники:

Нижнюю часть сделал на разъеме, чтоб все было по красоте 🙂 Припаиваем провода и ответную честь разъема к компонентам, интегрированным в корпус лампы, просверливаем крепежные отверстия для дна и вклеиваем туда гайки М3:

Торжественное соединение вершков и корешков!

Прикручиваем днище:

Ну и перед окончательной сборкой не забываем загрузить в микроконтроллер последнюю версию прошивки 😉

Софт

Управляющая программа написана на Си в среде IAR ARM 7.50.2, ссылки на исходники в конце статьи. Алгоритм работы следующий. При нажатии пользователем на кнопку выбора режима, на ленте должен загораться светящийся столбик, отображающий номер текущего режима. После прекращения нажатий на кнопку, столбик отображается еще 1 секунду, а потом начинается демонстрация выбранного режима.

Для реализации всего этого пришлось городить огород из программных таймеров и конечных автоматов, ибо так проще. В конце дам ссылку на ооочень хорошие статьи про конечные автоматы. Для людей, занимающихся разработкой под МК материал обязателен для прочтения.

Вся логика работы лампы сосредоточена в одном файле main.c, в остальных файлах реализованы драйверы периферии и протоколы обмена. Итак, поехали!

Вначале рассмотрим все вспомогательные функции, которые используются в программе.

Библиотека обмена с светодиодной лентой на базе WS2812B взята собственной разработки, описание тут: Драйвер светодиодной ленты на WS2812B для STM32F103C8.

Далее, в файлах color.c и color.h находится код конвертера HSV_to_RGB() из палитры HSV в RGB и TColorToRGB(), который преобразует цветовую температуру так же в RGB. К слову сказать, не нравится мне результат работы TColorToRGB(), тут или конвертер кривой, или сама светодиодная лента не может вытянуть нужные цвета, не знаю. Но все же оставил этот режим, хай будет. Приводить текст тут не буду, особо интересного там ни чего нет, кому надо — смотрите в исходниках.

Далее файл inputs.c. Тут находится все связанное с кнопкой и крутилками. Код кнопки:

Далее регуляторы. Тут уже веселее. Каждый резистор включен в режиме делителя напряжения. Выходы заведены на аналоговые входы микроконтроллера. Так как на соединительные провода резисторов оказывают влияние внешние помехи, прочитанное значение положения ручки регуляторов пропускается через простейший фильтр «скользящее окно». После фильтра отсутствуют сильные скачки считанных значений с аналоговых входов микроконтроллера.

Код фильтра:

Ну и далее, само чтение данных с аналоговых входов:

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

Функция инициализации таймера:

А в прерывании увеличиваем на единицу каждый программный таймер:

Так, основное готово. Продолжаем:

Ну и простой пример, как этим всем пользоваться. Пусть нам надо с частотой 50 Гц (период 0,02 сек.) выполнять какое-то действие Do():

Тут следует отметить одну важную вещь. Перепишем код вот так:

Тут мы сначала что-то делаем, а потом сбрасываем таймер. В этом случае функция Do() будет выполняться каждые 0,02+время_выполнения_Do. С этим, думаю, все ясно. Поехали дальше.

Давайте теперь посмотрим в main():

Из интересного тут только бесконечный цикл, в котором вызываются 2 функции: sfm_main() и fsm_disp(). Это и есть те самые конечные автоматы, реализующие всю логику работы лампы.

Код конечного автомата sfm_main():

Он отвечает за обработку событий нажатия на кнопку, изменение номера режима, и дает команду конечному автомату fsm_disp() об отображении номера режима.

Код конечного автомата fsm_disp():

fsm_disp() отвечает за вызов функции «отрисовки» эффекта Display() с частотой 50 Гц и отображение номера текущего режима disp_mode().

Функция disp_mode():

Тут все просто: рисуем столбик из NumMode светодиодов, соответствующий номеру режима, разным цветом.

Так, приближаемся к «сердцу» всей системы. Функция Display():

Тут у нас огроменный switch, который вызывает функцию нужного нам режима NumMode. Еще раз обращаю внимание на тот факт, что Display() выполняется 50 раз в секунду. Это важно для динамических эффектов, так как они внутри себя имеют счетчик номера вызова, ориентируясь на который производятся вычисления промежутков времени в анимациях.

Количество режимов 8 штук. Все рассматривать не будем, давайте только взглянем на самый простой и самый сложный режим. Режим «Одиночный цвет:»

Ориентируясь на положения ручек яркости и настройки режима, функцией HSV_to_RGB() получаем компоненты RGB палитры HSV и потом в цикле заполняем все светодиоды выбранным цветом.

Ну и самый сложный, самый мой любимый режим: DynamicRain() — капли дождя:

Тут я даже пытаться не буду объяснять, как это работает 🙂

Чтобы добавить новый режим, нужно сделать 3 вещи. Первое: написать функцию, реализующую определенный режим, затем в Display() добавить еще одну конструкцию case с номером на единицу больше номера последнего режима (в данном случае 9). И напоследок, в функции IncrMode() в условии if(NumMode > 8) увеличить константу сравнения на единицу (тут тоже на 9). Отлично, новый режим интегрирован в систему!

На этом, в принципе, все! Спасибо за внимание!!! 😉

Ссылки

  1. Часть 1: RGB ночник из керосиновой лампы
  2. Программа для МК: https://github.com/DiMoonElec/KeroseneRGBLamp
  3. Применение Switch-технологии при разработке прикладного программного обеспечения для микроконтроллеров. Часть 1
Метки: , , , , , . Закладка Постоянная ссылка.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *