Перед новым годом, мы с семьёй традиционно наряжаем ёлку. И для украшения часто используем гирлянду. Я подумал, почему бы не сделать маленькую гирлянду для своей настольной ёлочки.
Всё началось с выбора светодиодов. Решил выбрать 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 | Кнопка | 3x6 мм | 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 | Разъём | 2x5 мм | 1 | Клеммник | Поиск в магазине Отрон | ||
XP1 | Разъём | PLD-6 | 1 | Для ISP программатора | Поиск в магазине Отрон | ||
Скачать список элементов (PDF)
Прикрепленные файлы:
- PCB_GARLAND_top.pdf (20 Кб)
- PCB_GARLAND_ver1_0_0_bottom.pdf (33 Кб)
- main_1.c (6 Кб)
- GARLAND_ver1_0_6.hex (2 Кб)
Комментарии (19) | Я собрал (0) | Подписаться
Для добавления Вашей сборки необходима регистрация
Единственное, придётся порт вывода поменять, компилятор не выводит предупреждение об этом.
Код написан с использованием низкого уровня, что радует и говорит о высоком уровне знаний автора. Я такое ещё понимать и писать не научился, хотя двигаюсь в этом направлении. Код написан на мой взгляд очень грамотно и красиво.
Такой вопрос, что за программа для эмуляции работы?
[Автор]
1. Для того чтобы перенести программу на Arduino UNO, необходимо не только поменять порты вводы-вывода, но и вектор прерывания и переконфигурировать таймер-счётчик и подстроить значения переменных для выдержки правильных(или нужных) таймингов в программе(из-за другой частоты работы МК). Так как я не думал, что программу будут использовать на других МК, то я писал основываясь только на выбранном МК. В дальнейшем при желании, можно писать уже более гибкие программы, которые будут опосредованы от железа и настраиваться.
2. Показания работы разных режимов производились с помощью логического анализатора Saleae Logic, и снятые им показания в записывались одноимённой программе.
[Автор]
А можно и наоборот делать. Разработать на уно, а потом пару нажатий на клаву - и оно работает на аттини. Чем не гибкость?
[Автор]
Очень сложный код для восприятия, перегруженный доп. функциями и переменными. Более менее наглядным и логичным является только основная программа main, всё остальное... ну такое. Работает конечно, я взял этот код как референс и намерен его полностью переделать и дополнить новыми эффектами.
А ещё в режиме off усыпить контроллер режимом powerdown для экономии работы от батарейки.