![]() |
![]() |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Светодиодная "сосулька": одна и много
Автор: *Trigger* Предисловие Последнее время всё чаще перед Новым Годом улицы городов украшают весьма необычными гирляндами: светодиодными сосульками. Такая гирлянда представляет собой несколько прозрачных трубочек, внутри каждой из которых находится плата со светодиодами, расположенными в одну линию. При подаче питания на такую "сосульку" по трубочке спускается световая "капля" через некоторые интервалы времени. Подробнее - на видео (взято из Интернета): И вот, перед прошлым Новым Годом я решил сделать подобные сосульки. К тому же, у меня давно ждала своего часа сотня белых SMD-светодиодов типоразмера 3528. Часть первая, базовая. Светодиодная сосулька Каждая сосулька представляет собой законченное устройство, начинающее отображение "падающих капель" сразу после подачи питания. Схема сосульки и принцип действия Схема сосульки приведена ниже: Для управления светодиодами был выбран микроконтроллер ATtiny2313 по причине его доступности и наличия у него достаточного количества выводов. Резисторы R4 - R8 - токоограничивающие. R1 и C2 - цепь начального сброса микроконтроллера IC1. Конденсатор C1 - помехоподавляющий. Разъём J1 служит для программирования МК и подачи питания на устройство. Назначение переключателей S1 - S3, а также резисторов R2 и R3 будет описано во второй части статьи. Светодиоды HL1 - HL20 включены в матрицу 5 x 5 с объединёнными строками и столбцами. Такое включение выбрано для удобства разводки узкой и длинной печатной платы со светодиодами в одном слое: требуется провести всего 5 проводников. При "традиционном" включении в матрицу 5 x 4 требуется 9 проводников, провести которые на узкой плате трудно. Однако, за удобство разводки приходится платить усложнением управления светодиодами. В один момент времени горит только один светодиод. Для его зажигания на соответствующую строку матрицы подаётся лог. 1 с МК, а на столбец - лог. 0 (на диагонали матрицы светодиодов нет, поэтому строка и столбец различны). Остальные линии при этом находятся в высокоимпедансном состоянии. Таким образом, используется динамическая индикация со скважностью 20. Яркость светодиодов при этом достаточная, но всегда можно уменьшить сопротивление резисторов R4 - R8, если её будет не хватать. Для обеспечения независимой регулировки яркости каждого светодиода применяется 6-битная широтно-импульсная модуляция (ШИМ). Как известно, человеческий глаз воспринимает яркость нелинейно. Для компенсации этого эффекта используется таблица перекодировки яркости, сопоставляющая каждому числу от 0 до 15 ширину импульса ШИМ (от 0 до 63). Таким образом, яркость любого светодиода может принимать одно из 16 значений. При подаче питания МК начинает отображать на светодиодах световой эффект "падающая капля". При этом скорость "падения" и пауза между эффектами выбираются при помощи генератора псевдослучайных чисел. Напряжение питания - 5 В. Конструкция и детали Сосулька выполнена на односторонней печатной плате, чертёж которой приведён ниже (файл печатной платы в формате Sprint Layout 6.0 можно скачать в конце статьи): Микроконтроллер IC1 применён в корпусе SO-20. Светодиоды HL1 - HL20 - SMD типоразмера 3528. Все резисторы и конденсаторы - SMD типоразмера 0805. Разъём J1 - типа IDC-6M. Ниже - монтажные схемы сосульки.
После сборки и проверки сосульки печатная плата изолируется при помощи прозрачных термоусадочных трубок диаметрами 12,7 мм и 19 мм (до усадки). При этом тонкая трубка надевается на узкую часть платы сосульки до разъёма, а толстая подготавливается следующим образом: в ней проделывается прямоугольное отверстия для разъёма. Размеры отверстия следует подобрать экспериментально. Далее обе трубки усаживаются. Готовые сосульки (до изоляции) выглядят так: Программирование МК Прошивка МК (а также исходники) доступна в конце статьи. Фьюз-биты МК следует установить следующим образом: "Галочка" означает, что фьюз-бит запрограммирован, т.е. установлен в лог. 0. Часть вторая, дополнительная. Контроллер светодиодных сосулек Для тех, кому одной сосульки мало... Пришло время наконец рассказать, зачем же нужны упоминавшиеся ранее переключатели и резисторы на схеме сосульки. А вот зачем. Каждая сосулька может работать как сама по себе, без внешнего управления (такой режим назовём автономным), так и с управлением по шине I2C. Почему выбран именно этот интерфейс? Всё просто: так можно использовать для связи с сосулькой разъём программирования, а работу с интерфейсом реализовать почти полностью на аппаратном уровне, используя модуль USI (Universal Serial Interface). Линия MOSI при этом становится линией SDA, а SCK превращается в SCL. Протокол управления Протокол управления - стандартный для I2C устройств. Для записи в память сосульки используется следующая последовательность действий:
Для чтения используется такая последовательность:
Адрес сосульки на шине состоит из двух частей. Первые 4 бита адреса фиксированы и равны 0xB (0b1011). Следующие 3 бита соответствуют состоянию выводов PD5, PD4, PD3 микроконтроллера сосульки. Последний бит равен 1 при чтении и 0 при записи.
Таким образом, полный адрес сосульки на шине задаётся при помощи переключателей S1 - S3. Конструктивно они выполнены в виде близко расположенных контактных площадок на плате сосульки, которые замыкаются припоем. Замкнутый переключатель соответствует лог. 0 в соответствующем разряде адреса. Также, при обращении по адресу 0x00 (0b00000000) (General Call Address) в обмене данными участвуют все устройства на шине. Это используется, например, для одновременного гашения всех светодиодов всех сосулек или синхронного зажигания первого светодиода. Ниже приведена карта регистров сосульки:
Как видно из таблицы, по адресу 0x00 находится конфигурационный регистр, а остальные регистры задают яркость свечения светодиодов (по 4 бита на светодиод). Биты конфигурационного регистра имеют следующие функции:
Бит EFFECT_EXEC инвертирован не случайно. Поскольку выходные каскады устройств I2C выполнены с открытым коллектором, между всеми устройствами реализовано "монтажное И". При чтении некоторого регистра из всех устройств сразу (General Call Address) все подключенные сосульки выдают на шину значение своего регистра. Таким образом, ведущее устройство считывает с шины результат побитового И данного регистра всех сосулек. Благодаря инверсии бита EFFECT_EXEC, можно, считав конфигурационный регистр из всех устройств сразу, узнать, завершено ли выполнение эффекта на всех сосульках. Если хоть одна из них выполняет эффект, считанный бит EFFECT_EXEC будет равен 0. Схема контроллера сосулек и его принцип действия Схема контроллера сосулек приведена ниже: Подключение микроконтроллера IC1 и светодиодного семисегментного индикатора с общим катодом HL1 - стандартное, тут описывать нечего. Две пары выводов МК объединены для использования аппаратного модуля TWI через разъём программирования J1. Цепочки R13VD1R17, R14VD2R18, R15VD3R19, R16VD4R22 служат для защиты входов устройства. R20, R21 - подтягивающие резисторы шины I2C. Для управления устройством используются тактовые кнопки S1 - S3. Устройство питается от БП с выходным напряжением 5 В. Конструкция и детали Контроллер сосулек выполнен на односторонней печатной плате, чертёж которой приведён ниже: Как обычно, в конце статьи можно скачать файл этой платы в формате Sprint Layout 6.0. Микроконтроллер IC1 применён в корпусе TQFP-32, транзисторы VT1 - VT4 - в корпусах SOT-23. Все резисторы и конденсаторы, кроме C3, - SMD типоразмера 0805. C3 - электролитический, на напряжение не ниже 16 В. Стабилитроны VD1 - VD4 - маломощные выводные в миниатюрном стеклянном корпусе. Индикатор HL1 - светодиодный четырёхразрядный с общим катодом (зелёного цвета свечения). Кнопки S1 - S3 - тактовые размером 6 x 6 мм и общей высотой 13 мм. Разъём J1 типа IDC-6M. Ниже приведены монтажные схемы контроллера сосулек:
Как видно, на печатной плате имеются 4 проволочные перемычки (отмечены синим цветом на монтажной схеме). Печатная плата размещена в стандартном пластмассовом корпусе размерами 83,5 х 57,5 х 24 мм. Она фиксируется четырьмя шурупами, скрепляющими половинки корпуса. На левой стенке корпуса установлен разъём питания 5,5 x 2,1 мм. В печатной плате сделан вырез, в который входит разъём. В специальных углублениях на передней, задней и левой стенках корпуса расположены наклейки с поясняющими надписями. Передняя и левая наклейки заламинированы прозрачной плёнкой и приклеены на двусторонний скотч. Две задние наклейки покрыты с двух сторон обычным прозрачным скотчем, после чего приклеены клеем "Момент 1". Изображения наклеек приведены ниже:
Задние наклейки имеют 2 варианта расцветок. В конце статьи можно скачать векторные изображения в форматах CorelDraw и PDF. Сосульки подключаются к контроллеру при помощи 6-жильного плоского шлейфа с разъёмами IDC-6F. Пояснение: резисторы R2 и R3 на схеме сосульки - дополнительные подтягивающие резисторы шины I2C. Их следует установить на плате последней (самой далёкой от контроллера) сосульки в цепи, если часто возникают ошибки обмена данными. Эти резисторы улучшат согласование линий SDA и SCL. Номинал - от 3,3 до 10 кОм. При низких номиналах нужно увеличить сопротивления резисторов R20, R21 в контроллере сосулек, чтобы не допустить перегрузки портов МК. Программирование МК В конце статьи доступен для скачивания файл прошивки *.hex, а также там можно скачать исходники (проект CVAVR). Фьюз-биты МК выставляются согласно этой картинке: "Галочка" - запрограммировано, т.е. лог. 0. Управление устройством и его функции Чтобы понять, как управлять контроллером сосулек, а также увидеть доступные световые эффекты (программы), просмотрите видео ниже. Модификация прошивки МК Моей фантазии хватило на 20 эффектов (программ). Если Вам этого мало, и у Вас есть идея для новой программы (эффекта), Вы можете самостоятельно добавить её в прошивку МК. Конечно, требуются некоторые навыки программирования на языке C. Итак, если Вы не боитесь написания программ, приступим. Сначала нужно установить среду разработки CodeVision AVR 3.12 (можно и более новую версию). Программа платная, но не мне Вам объяснять, где её взять... После чего загрузите архив с исходниками и распакуйте его куда-нибудь. Далее перейдите в папку "Программа управляющего модуля" и откройте файл *.prj в CVAVR. Теперь несколько слов о структуре программы МК. Каждый эффект (программа) разделяется на части, называемые "кадры" (frame) и "шаги" (step). Каждый кадр состоит из какого-то числа шагов. Рассмотрим, например, программу под номером 7 (см. видео). Она представляет собой следующее: все сосульки синхронно заполняются "падающими" сверху горящими светодиодами, а потом все синхронно очищаются сдвигом горящего столбика вниз. В данном случае шагом является перемещение "падающего" светодиода на 1 вниз (при заполнении) и уменьшение длины столбика на 1 при очистке. Кадры - все шаги данного "падающего" светодиода (при заполнении) и весь процесс сдвига столбика при очистке. Таким образом, есть 21 кадр (20 кадров для заполнения и 1 для очистки). Первые 20 кадров состоят из 20, 19, 18, ... , 1 шагов, последний кадр - из 20 шага. У каждой программы есть такие параметры, как задержка (delay) и скорость (speed). Первая определяет время ожидания между двумя кадрами (после окончания одного кадра и перед началом следующего), а вторая - частоту выполнения шагов (в нашем случае - скорость движения горящего светодиода). Определены следующие константы и переменные, которые можно (и нужно) использовать при написании нового эффекта:
Пожалуйста, всегда используйте определённые константы (#define) вместо "магических чисел" (в том числе, при обращении к флагам). Это сделает возможным изменение, например, количества светодиодов без переписывания всей программы. Для управления сосульками используются следующие функции:
При добавлении новой программы (например, с номером 21) нужно сделать следующее: 1. Изменить количество программ:
2. Добавить соответсвующий #define:
3. Добавить минимальные и максимальные значения скорости и задержки в соответствующие массивы. Скорости записываются в виде
где freq - частота шагов в Герцах. Задержки записываются в виде
где delay - величина задержки в миллисекундах. 4. При необходимости модифицировать операторы switch в функции set_speed(), используемой для задания скорости программы. Обычно это нужно для программ, использующих эффект "падающая капля". В этом случае нужно добавить
в верхнюю часть обоих switch (после PROG_2, PROG_3, PROG_4). 5. Модифицировать функцию program_init(), которая вызывается перед началом программы. В оператор switch добавляется новая ветвь для PROG_21. 6. Модифицировать прерывание по таймеру 1:
Точнее, добавить новую ветвь
в оператор switch. Для примера ниже приведена ветвь для седьмой программы (с комментариями):
Небольшое дополнение: стоит минимизировать количество операций чтения / записи по I2C. Тактовая частота МК не очень высокая, а обмен по шине долгий. Например, для перемещения горящей точки не нужно перезаписывать всю таблицу яркостей сосульки: достаточно погасить один светодиод и зажечь другой. После того, как Вы внесёте изменения в программу, её нужно скомпилировать. Для этого выберите пункт главного меню Project -> Build All (также можно нажать Ctrl + F9, или использовать соответствующую кнопку на панели инструментов). Если компиляция пройдёт успешно, Вы увидите окно с объёмом используемой памяти и некоторыми другими параметрами. Если же в программе допущена ошибка, то об этом будет написано в появившемся окне. Вам нужно будет перейти к соответствующей строке, в которой допущена ошибка, и исправить её. После этого снова можно запустить компиляцию. После успешной компиляции готовый файл прошивки *.hex будет доступен по следующему пути:
На этом всё. Удачи!
Файлы: Все вопросы в Форум.
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
![]() |
![]() |


![]() |
![]() |
|||
|
||||
![]() |
![]() |