Коньки со световыми эффектами на ATmega328P
Однажды на катке автору этой статьи пришлось наблюдать, как на лёд вышли трое подростков в светящихся коньках. Конечно, коньки были оснащены простейшей светодиодной подсветкой без каких-либо световых эффектов. Но выглядело красиво и поразило, как на это глядели другие дети. В этот момент появилась идея сделать для коньков более совершенное свето-динамическое устройство, которое и предлагается вниманию читателей.
Рис. 1
Устройство динамической синхронной подсветки коньков предназначено для их украшения на катке. Ассортимент световых эффектов разнообразен: простые статические, мигающие, линейные, мерцающие, радиальные, контурные, словно светлячок перепрыгивает с одной ноги на другую. Чтобы "подсветить" коньки, нужно изготовить два электронных модуля (рис. 1), каждый из которых питает батарея из двух гальванических элементов или Ni-MH аккумуляторов типоразмера АА, установленная над его платой. Модули закрепляют двусторонней липкой лентой между подошвами ботинок и лезвиями коньков, как показано на рис. 2.
Рис. 2
Для синхронной работы модули связаны по ИК-каналу. Один из них — ведущий, а второй — ведомый. Размещая модули на левом и правом коньках, следует позаботиться, чтобы ИК-излучатель ведущего модуля и фотоприёмник ведомого были направлены один в сторону другого.
Рис. 3 Схема коньков со световыми эффектами (увеличить...)
Схема модуля (общая для ведущего и ведомого) изображена на рис. 3. В штрихпунктирные рамки на ней заключены детали, монтируемые только в ведущем или только в ведомом модуле, остальные присутствуют в обоих. По периметру модуля установлены 12 сверхъярких светодиодов (HL1— HL12), сгруппированных попарно. Каждая пара состоит из светодиодов разного цвета свечения. Всеми светодиода-ми по командам, посылаемым микроконтроллером DD1 по интерфейсу SPI, управляет специализированная микросхема STP16CP05 (DD2), содержащая 16-разрядный сдвиговый регистр и выходной буфер.
Все выходы микросхемы STP16CP05 выполнены по схеме с открытым стоком, в каждый из них может втекать ток до 100 мА. Включать токозадающие резисторы последовательно с каждым светодиодом не требуется. Ток одновременно для всех выходов задают резистором R4. Его значение — около 20 мА при сопротивлении 1 кОм. Увеличивать ток нет смысла вследствие ограниченной мощности источника питания.
Первичный источник питания — батарея GB1. Её напряжение через плавкую вставку FU1 и узел защиты от переполюсовки на транзисторе VT1 поступает на импульсный повышающий преобразователь напряжения, собранный на микросхеме NCP1450ASN50T1 (DA1) и элементах С2, С4, С6, L1, VT3, VD3. Падение напряжения на открытом транзисторе VT1 указанного на схеме типа не превышает 12 мВ. Микросхема NCP1450ASN50T1, хотя и требует дополнительных внешних компонентов, выбрана благодаря своей распространённости и дешевизне.
На выходе повышающего преобразователя поддерживается постоянное напряжение 5 В, достаточное для питания светодиодов любого цвета свечения. При понижении напряжения батареи вплоть до 1,2 В преобразователь продолжает работать, но при этом уже с трудом выдерживает нагрузку тремя одновременно включёнными светодиодами.
Резистор R3 и конденсатор С9 необходимы для работы АЦП, встроенного в микроконтроллер и используемого для контроля напряжения батареи GB1. При его значении 1,2 В модуль некоторое время сигнализирует об этом миганием светодиода HL3 со скважностью 4, а затем выключается во избежание чрезмерной разрядки батареи, если она аккумуляторная.
Установленные только в ведущем модуле элементы R1, R2, VD1, VD2, VT2 образуют ИК-передатчик. На резисторе R1 и диоде VD1 здесь выполнен логический узел И, модулирующий импульсы частотой 36 кГц, сформированные микроконтроллером на выходе РВ1, информационным сигналом с выхода TXD. Для программной реализации этой операции скорость работы микроконтроллера при кварцевом резонаторе ZQ1 на 4 МГц оказалась недостаточной. Такая сравнительно низкая тактовая частота была выбрана, чтобы обеспечить стабильную работу микроконтроллера при температуре ниже нуля. Тем не менее уже при -18 °С устройство запускается с заметной задержкой.
Имеющийся только в ведомом модуле ИК-приёмник В1 принимает и демодулирует сигналы ведущего и передаёт их на вход RXD микроконтроллера.
Чертёж печатной платы модуля, одинаковой для ведущего и ведомого, изображён на рис. 4. Расположение на ней деталей показано на рис. 5. Все они смонтированы на той стороне платы, где находится большее число печатных проводников.
За исключением фотоприёмника, излучающего диода и светодиодов, в модулях использованы детали в исполнении для поверхностного монтажа. Все резисторы, а также конденсаторы СЗ и С5 типоразмера 0805. Того же типоразмера дроссель (ферритовая бусина) L2, но его можно заменить перемычкой. Резистор R4 желательно применить с допуском ±1 %. Конденсаторы С1, С4, С8—СЮ типоразмера 0603. Оксидные конденсаторы С2 (типоразмера А) и С6 (типоразмера С или D) должны быть танталовыми, стабильно работающими на морозе. Конденсатор С7 тоже танталовый типоразмера С, но его устанавливать не обязательно, если увеличить ёмкость конденсатора С6 до 220 мкФ.
В любом случае суммарная ёмкость конденсаторов С6 и С7 не должна быть менее 200 мкФ, иначе будут наблюдаться провалы выходного напряжения повышающего преобразователя при одновременном включении нескольких светодиодов. Этот преобразователь весьма чувствительный к выбору деталей узел, особенно это касается диода Шотки MBR0520LT1 (VD3), который можно заменить разве что на MBR0530T1. Полевые транзисторы IRLML6244 могут быть IRLML2502 или IRLML0030; замены перечислены в порядке ухудшения параметров преобразователя, да и в узле защиты от переполюсовки на таких транзисторах будет падать большее напряжение. Биполярный транзистор ВС807 можно заменить любым другим структуры p-n-р с таким же расположением выводов.
Дроссель L1 — SDR0604-100ML, вместо которого с успехом подойдёт сравнительно дорогой 744053100. Он меньше по высоте и в магнитном экране. Кварцевый резонатор ZQ1 — HC-49US для поверхностного монтажа.
Микросхема STP16CP05 аналогов не имеет Микроконтроллер ATrnega328P-AU можно заменить на ATmega88 или ATmega168 в корпусе TQFP при условии, что объём загружаемой в них программы не превысит 8 Кбайт. Микроконтроллер можно монтировать на плату ^запрограммированным, на ней предусмотрена группа контактных площадок ХТ1 для соединения с программатором. Фотоприёмник TSOP34836 рассчитан на приём ИК-импульсов, следующих с частотой 36 кГц. Если используется приёмник, настроенный на другую частоту, то рекомендуется настроить на неё же ИК-передатчик ведущего модуля, изменив соответствующую константу, хранящуюся в EEPROM микроконтроллера. Вместо излучающего ИК-диода TSAL4400 можно применить, например, L-34F3C. Желательно, чтобы излучающий диод и фотоприёмник были согласованы по длине волны ИК-излучения. Рекомендуется также спилить и отполировать пастой ГОИ шарообразную головку корпуса излучающего диода, чтобы расширить сектор, в котором возможна надёжная связь с ведомым модулем. По завершении сборки каждого модуля, прежде всего, необходимо проверить работу его повышающего преобразователя напряжения. Подключите к модулю батарею GB1 или любой другой источник постоянного напряжения 2...3 В, установите щупы вольтметра на контрольные точки ХТЗ (минус) и ХТ4 (плюс). Он должен показать 5 В. Если напряжения нет, проверьте на замыкание вторичные цепи преобразователя, отпаяйте дроссель L2, проверьте монтаж, исправность деталей и соответствие их номиналов указанным на схеме. Добившись нормальной работы преобразователя, необходимо подключить к модулю программатор, припаяв идущие от него провода к контактным площадкам ХТ1 в соответствии с их назначением, указанным на схеме рис. 3, и запрограммировать микроконтроллер. Одинаковые для ведущего и ведомого загрузочные коды программы приложены к статье в двух форматах — HEX (файл dals_firmware_v1.1 .hex) и ELF (файл dals_firmware_v1.1.elf). Рекомендуется использовать файл .elf, в котором кроме кодов, записываемых во FLASH-память, содержатся информация о содержимом EEPROM ведущего модуля и сведения о конфигурации микроконтроллера. Загрузить такой файл можно стандартными средствами AVR Studio.
Использование формата HEX всем известно, но при этом имеется риск неправильно запрограммировать конфигурацию микроконтроллера. Устанавливая её вручную, следует отключить предварительный делитель тактовой частоты (CDIV8), выбрать внешний кварцевый резонатор на 4 МГц и не включать сторожевой таймер WDT, управление которым предусмотрено в программе.
Записывать коды из файла eeprom_master_default.hex в EEPROM микроконтроллера ведущего модуля не обязательно. При запуске программы микроконтроллер сам просканирует EEPROM и, обнаружив, что оно свободно (заполнено кодами 0FFH), перепишет в него необходимую информацию из тела программы. Коды из файла eeprom_slavejjefault.hex необходимо обязательно записать в EEPROM ведомого модуля. Содержимое EEPROM ведущего и ведомого описано в табл. 1. При необходимости изменить тот или иной параметр в него можно вносить коррективы.
Таблица 1
Параметр | Адрес в EEPROM | Описание |
secretKey | 0000H | Ключ опознавания ведущего ведомым. Во избежание взаимных помех должен быть уникальным для каждой их пары |
timeout |
0001Н (мл. байт) | Время до выключения после последнего нажатия на кнопку SB1 (для ведущего) или после последнего принятого синхропакета (для ведомого). Стандартные значения 0012Н (около 20 мин) в первом случае и 0001Н (около 1 мин) во втором |
0002Н (ст. байт) | ||
isMaster (разр. 0) | 0003H |
1 — ведущий, 0 — ведомый |
isDemo (разр. 1) |
У ведущего: 1 —демонстрационный режим, 0 — рабочий режим. У ведомого всегда автоматически устанавливается isDemo=0 |
|
ir_freq | 0004Н | Частота ИК-имлульсов, кГц. Возможные значения 30—37 (1 EH—25H). Значение за пределами этого интервала будет автоматически заменено на 24Н (36 кГц) |
actorPlayTime | 0005Н (мл. байт) | Длительность проигрывания каждого актёра в автоматическом режиме. Допустимые значения О—7FFFH, стандартное—015ЕН (около 18с) |
0006Н (ст. байт) | ||
abTimeout | 0007Н (мл. байт) | Продолжительность мигания светодиода HL3 перед выключением при ошибке связи. Стандартное значение — 028АН (около 5 с) |
0008Н (ст. байт) | ||
batLowLevel | 0009Н | Минимальный результат работы АЦП при измерении напряжения батареи (порог её отключения). Стандартное значение — 0FOH (около 1,2 В) |
Если всё сделано правильно, программа должна запуститься. Через 2 с инициализация модуля завершится, и им можно пользоваться. Кратковременно нажмите на кнопку SB1 ведомого модуля, все светодиоды с нечётными номерами (одного цвета свечения) должны несколько раз мигнуть и плавно сбавить яркость до минимума, что свидетельствует о режиме ожидания команды ведущего. Нажмите на кнопку SB1 ведущего модуля, после чего на нём также несколько раз мигнут нечётные светодиоды, затем оба модуля, если они расположены рядом, должны начать синхронную работу.
Кратковременные нажатия на кнопку SB1 ведущего модуля должны досрочно сменять световые эффекты, причём то же самое одновременно должно происходить и на ведомом. В противном случае необходимо проверить ИК-связь. Наблюдая излучающий диод VD2, например, через фотокамеру сотового телефона, убедитесь, что он вспыхивает каждые 4 с. Короткие и двойные нажатия на кнопку SB1 ведомого не должны оказывать какого-либо действия.
При удержании не менее 3 с нажатой кнопки SB1 на ведущем модуле оба модуля должны одновременно выключиться. Они выключаются и через 20 мин после последнего нажатия на кнопку SB1 ведущего. Если светодиоды не включаются и на нажатия кнопки никак не реагируют, измерьте вольтметром напряжение между контрольными точками ХТ2 и ХТЗ модуля. В любом режиме, кроме дежурного, его уровень должен быть логически высоким, а в дежурном — низким. Если он постоянно низкий и нажатие на кнопку ничего не меняет, проверьте работоспособность микроконтроллера.
По завершении сборки и проверки модулей над их платами термоклеем закрепляют отсеки ВН321-1А для батарей GB1. Кроме того, платы необходимо залить силиконовым герметиком, чтобы защитить от влаги.
Прилагаемый к статье исходный текст программы написан на языке С для компилятора AVR Toolchain. Программа представляет собой своеобразный "каркас", объединяющий процедуры, реализующие различные световые эффекты, задавая определённые последовательности включения и выключения светодиодов HL1—HL12. Будем называть эти процедуры "актёрами". Их можно изменять и дополнять новыми по своему усмотрению. Естественно, после каждого изменения требуются повторная компиляция программы и загрузка в микроконтроллер полученных кодов.
Чтобы скомпилировать программу, потребуется указать компоновщику программных модулей (линкеру) новую библиотеку. В среде разработки программ AVR Studio 6 это можно сделать, открыв пункт меню "AVR/GNU Linker: Libraries". Имя библиотеки dalscore нужно добавить в верхний список, путь к файлу libdalscore.a — в нижний.
Все актёры представляют собой функции, написанные по приведённому в табл. 2 шаблону, и имеют два параметра:
phase — порядковый номер такта, который при каждом вызове функции инкрементируется, пока не достигнет значения константы actorPiayTime, хранящегося в EEPROM;
*CustomVars — указатель на описанное в файле dalscore.h глобальное объединение, используемое для временного хранения переменных в процессе выполнения функции и автоматически обнуляемое при смене актёра.
Таблица 2
#include "dalscore.h"
// пример функции актера
void MyActor(uintl6_t phase, actorCustomVar* CustomVars)
{
// тело функции
}
В теле функции необходимо через программный драйвер передавать информацию о состоянии и яркости све-тодиодов в текущем такте, используя для этого объявленные в файле dalsco-re.h функции. Нельзя пользоваться циклами задержки и прерываниями. Длина кода каждого актёра не должна превышать 250 ассемблерных инструкций. Имя нового актёра необходимо внести в хранящийся в файле ActorList.c список. Очерёдность их вызова задаётся именно этим списком. Более подробно разобраться в особенностях создания и работы актёров можно, просмотрев имеющиеся в программе уже готовые функции.
Предусмотрены два режима вызова актёров: автоматический и циклический. В автоматическом режиме актёры исполняют свои эффекты по очереди, причём время работы каждого ограничено. В циклическом режиме непрерывно работает один и тот же актёр. Переключают режимы двойным нажатием на кнопку SB1 ведущего модуля. Переключение сопровождается специфической светодиодной сигнализацией.
Следует упомянуть ещё один режим работы, который вряд ли потребуется на практике, но включив его случайно, можно подумать, что произошёл сбой программы. Это демонстрационный режим. В нём модули работают, не выключаясь, перебор актёров происходит значительно быстрее, причём циклическое повторение одного и того же эффекта не предусмотрено. Признак работы в этом режиме хранится в EEPROM. Входят в него или возвращаются в рабочий режим включением питания при нажатой кнопке SB1.
Для синхронизации работы ведущего и ведомого модулей первый передаёт второму команды по ИК-каналу связи. Обмен информацией происходит по последовательному интерфейсу (с использованием модулей UART микроконтроллеров) со скоростью 2400 Бод — это предел для ИК-приёмника TSOP34836 от систем ДУ телевизора. Реализован специальный пакетный протокол с идентификационным ключом и контролем по CRC. Ключ необходим, чтобы ведомый мог опознать "своего" ведущего, если рядом их работает несколько. Контроль по CRC блокирует ошибки приёма. Кроме того, приём пакета прекращается, не дожидаясь его окончания, в случае обнаружения недопустимого значения очередного принятого байта. На практике это обеспечивает практически полное отсутствие влияния работающих поблизости ИК-пуль-тов дистанционного управления.
Программа построена так, что пропуски синхронизирующих пакетов ведомым модулем остаются практически незаметными, даже если время работы актёра на исходе, поскольку ведомый модуль "знает", какой актёр будет следующим. Если, однако, информация от ведущего модуля не поступает слишком долго (около минуты), ведомый модуль автоматически выключается.
Радио №11, 2013г
В. ИНШАКОВ, г. Елец Липецкой обл.