Например TDA7294

РадиоКот > Схемы > Светотехника > Бегущие огни и световые эффекты

Новогодняя миниатюрная ёлка

Автор: eliterr
Опубликовано 26.12.2014.
Создано при помощи КотоРед.

Здравствуйте, уважаемые коты и любители котов.

 

Скоро Новый Год, каждому хочется новогоднего настроения, даже если ты кот, и даже если ты игрушечный кот.  Специально для игрушечных котов у меня уже несколько лет есть малюсенькая ёлочка с питанием от USB, и все они любят сидеть вокруг неё долгими зимними вечерами.  Ёлка переливается разными цветами, затухая и разгораясь, а коты сидят вокруг — просто идиллия.

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

 

Шаг первый — вскрытие.  Вскрытие показало, что внутреннее устройство ёлки примитивно до невозможности — один RGB-светодиод и один токоограничивающий резистор.  Понятно, что светодиод не простой а самомерцающий (см. отличную статью про искусственную свечу), но в любом случае неремонтнопригодный.  Будем менять на микроконтроллер.

У меня были MSP430 G-серии разных видов — жирные 2553 в PDIP и простые 2201 в TSSOP.  Так как вскрытие также показало, что подставка очень неглубокая, контроллеры в PDIP были отметены как неподходящие — чтобы использовать их, нужно будет переделывать подставку, а это уже выходит за рамки починки.  Да и куда ж такую процессорную мощь девать?  Управление светодиодами — дело слишком простое.

Электрическия схема проста до безобразия — контроллер с тремя GPIO, к которым подключены светодиоды, регулятор напряжения для получения напряжения питания, резисторы-конденсаторы, что было в наличии.

Из-за ограничения по месту я не смог снабдить резисторами каждый светодиод, он на всю схему один :)  Яркость при одновременном включении светодиодов плавает, но это не страшно.  Не точный оптический прибор делаем, а игрушку.

Глубина подставки от силы миллиметров пять в самом глубоком месте.  Если делать печатную плату и монтировать детали на ней — получится слишком высоко, придётся переделывать подставку. Выхода нет, надо делать навесным монтажом. Микросхема мелковата, конечно, и паять TSSOP без платы — сущее мучение, но как раз незадолго до этого мне попалась статья о том, как упростить пайку. Предложенный метод определил выбор ног для светодиодов.

Программирование и отладка велись в Linux при помощи vim, fossil, mspgcc, mspdebug.  Экспериментальным контроллером был 2553 в беспаечной макетной плате и MSP430 Launchpad в качестве программатора.  Программировался "настоящий" контроллер прямо в ёлке, для этого предусмотрена возможность подцепления "крокодилов" к земле, RST и TST.

 

Несколько слов про реализацию.

Для зажигания светодиодов изначально выбпан BAM.  BAM (Bit Angle Modulation) — это метод, позволяющий на протяжении временного интервала 2kt иметь выход в состоянии 1 в течение времени xt, где x — заранее заданное число 0 ≤ x < 2kt.  При этом требуется таймер, отмеряющий не зависящие от x интервалы 1t, 2t, ... 2k-1t.  В течение i-ого интервала длиной 2it выход имеет состояние (x and 2i), что суммарно даёт x.

Самое главное в мерцающей ёлке — алгоритмы перехода, то есть переливания цветов. Алгоритмы переходов можно было налисать самому, но великий интернет нашёл на дружественном сайте статью (вот ведь совпадение!) BAM, или управляем кучей светодиодов, в которой автор реализовал несколько переходов.  Программа послужила донором алгоритмов, адаптация для моего случая потребовалась минимальная — конфигурирование контроллера, использование аппаратного таймера, причёсываение ногодрыганья и реализация генератора случайных чисел.

Поскольку требования к случайным числам некритичные, а свободная флэш-память есть, я просто взял табличный ГСЧ из другого проекта.  Из случайных 255 байт, выбираемых последовательно, получается 255 псевдослучайных 16-битных числа.  Лучше было бы, конечно, сделать для этой конкретной задачи 3 бита на rand, по количеству эффектов, но я уж переделывать не стал.

Для BAM использован TimerA, для выполнения основной программы — WDT в режиме таймера.  Обработчики таймеров максимально простые.  Никаких вычислений в них нет, в порты GPIO выводятся заранее просчитанные данные.

Самая большая сложность при отладке оказалась в том, что напряжение на "настоящем" контроллере из-за выбранного подключения светодиодов оказывалось меньше, чем необходимое для работы DCO на максимальных 16MHz, и контроллер зависал.  Поэтому пришлось уменьшать частоту, пока он не стал работать стабильно.

Исходный код и принципиальная схема в формате Fritzing приложены.


Файлы:
Исходный код


Все вопросы в Форум.


ID: 2050