Перед новым годом, мы с семьёй традиционно наряжаем ёлку. И для украшения часто используем гирлянду. Я подумал, почему бы не сделать маленькую гирлянду для своей настольной ёлочки.
Всё началось с выбора светодиодов. Решил выбрать 3мм светодиоды жёлтого свечения. Для управления ими использовал микроконтроллер ATtiny13a, так как его ножек хватает для задачи, а для питания схемы использовал 12 вольт.
Задача контроллера обслуживать 4 канала гирлянды и одну кнопку. На каждый канал, установил транзистор для управления нагрузкой. Питание микроконтроллера осуществляется линейным понижающим стабилизатором на 5 вольт, а 12 вольт идут через транзисторы на гирлянду.
Вероятно возник вопрос: «Почему 4 канала»? Отвечу, что это было сделано для создания эффектов, то есть для комбинирования линий гирлянды. Количество линий определило наличие свободных ножек у микроконтроллера. Оставшийся пин использовал под кнопку для переключения эффектов свечения гирлянды.
Изготовление гирлянды.
Начну с того, как рассчитать количество светодиодов на канал:
-
Необходимо узнать падение напряжения. У меня получилось 1.8В на жёлтых светодиодах.
-
Делим напряжение питания (12В) на напряжение падения (1.8В), получаем чуть больше 6. Следовательно на каждый канал будет установлено 6 последовательно включённых светодиода.
Остаётся только спаять гирлянду. Для этого потребовалось 24 светодиода(6 на каждую часть гирлянды), провода и термоусадка.
Печатная плата
Плату я проектировал с учётом изготовления по технологии ЛУТ (вся разводка произведена на нижнем слое). Перемычки обозначены на верхнем слое. Сопротивление резисторов, которые относятся к анодам светодиодов(R7 — R10), надо рассчитывать в зависимости от использования определённых светодиодов. Резисторы и конденсаторы использованы в smd исполнении(для посадочных мест 0805, так же можно использовать компоненты 0603).
Программа.
Это самое интересное, что реализовано в проекте. У меня была идея добавить режимы с ШИМ, но у контроллера нет достаточного количества ножек аппаратных поддерживающих ШИМ, и поэтому решил реализовать его программно-аппаратным путём(аппаратным, так как всё равно используется таймер-счётчик).
Для увеличения скорости переполнения счётного регистра таймер-счётчика установил максимальную частоту контроллера. Получается, что при чистоте 9.6МГц (E: FF, H: FF, L: 7A), прерывание по переполнению счётного регистра срабатывает каждые 0.027 мс. Следовательно получается реализовать программный ШИМ и оставить время для работы основной программы(так как вне прерывания остаётся около 300 тактов для выполнения программы).
В самом прерывании, переменная считает до максимального значения разрешения ШИМ (который можно изменить) и обнуляется по достижению. В то время как в основной программе сравнивается значение с этой переменной и выставляется нужный сигнал (высокий или низкий определённой длительности) на выбранный канал.
В программе пять режимов:
-
Включенная гирлянда
-
Поочерёдное мигание каждым из каналов гирлянды
-
Плавное увеличение и уменьшение яркости (при помощи ШИМ),
-
Так же как в предыдущем, но каждый канал проходит этот цикл и переключается на следующий по завершению.
-
Выключенная гирлянда(удобно, для того чтобы не отключать от сети)
Рассмотрим осциллограмму каждого из режимов. В первом и последнем режиме нет ничего интересно. А вот три последующих рассмотрим:
1. Циклическое переключение каналов:
Примечание: смена фронтов на Channel 3, это нажатие кнопки. А после её отжатия начинает работать выбранный режим.
2. Плавное возрастание и уменьшение значений ШИМ:
3. Циклическое переключение каналов с ШИМ каждого из них:
Ближе:
Кнопка для переключения режимов отрабатывает по отжатию и циклически считает номер для установки определённого режима. Так же количество режимов можно изменить.
В памяти микроконтроллера остаётся ещё около 300 байт для написания программы, так что можно ещё добавить эффекты для гирлянды.
Код я оформил, так чтобы легко можно было бы изменить скорость каждого из режимов и разрешение ШИМ (я выбрал шести битный, так как это оптимально по плавности и скорости).
// ===== USER SETTINGS ===== #define NUMBER_MODES 5 //Count of modes/effects // ------------------------------------ #define PWM_RESOLUTION 64 //Bit PWM (64 - 6-bit) - 500Hz ///////// (127 - 7-bit) - 300Hz ///////// (255 - 8-bit) - 130Hz // ------------------------------------ #define DELAY_BOUNCE_BUTTON 1480 //Button chatter elimination (~40ms) //(x - count) * 0.027ms #define DELAY_SWITCH_BLINK 15000 //Garland Channel Switching (405ms) //--------------------- // ------------------------------------ #define DELAY_DIMMING_MODE_1 1000 //PWM values increase time, for the effect this value is half (1000ms) //(x - count) * 1ms #define DELAY_DIMMING_MODE_2 110 //PWM values increase time, for the effect this value is complete (110ms) //-----------------
Список радиоэлементов
Обозначение | Тип | Номинал | Количество | Примечание | Магазин | Мой блокнот | |
---|---|---|---|---|---|---|---|
DD1 | МК AVR 8-бит | ATtiny13A | 1 | В DIP исполнении | |||
DA1 | Линейный регулятор | LM7805 | 1 | ||||
VT1-VT4 | Биполярный транзистор | 2N5551 | 4 | ||||
SB1 | Кнопка | 3×6 мм | 1 | ||||
HL5 | Светодиод | 3мм | 1 | для индикации питания | |||
R1-R6 | Резистор | 10 кОм | 6 | SMD 0603 | |||
R7-R10 | Резистор | 30 Ом | 4 | SMD 1206 | |||
R11 | Резистор | 470 Ом | 1 | SMD 0603 | |||
C1 | Конденсатор | 0.1 мкФ | 1 | SMD 0603 | |||
C2 | Конденсатор | 220 мкФ | 1 | 8X11.5MM | |||
C3 | Конденсатор | 2.2 мкФ | 1 | SMD 0603 | |||
XS1-XS4 | Разъём | PLS-2 | 4 | Для подключения гирлянд | |||
XS5 | Разъём | 2×5 мм | 1 | Клеммник | |||
XP1 | Разъём | PLD-6 | 1 | Для ISP программатора | |||