Новогодняя миниатюрная ёлка
Автор: eliterr Здравствуйте, уважаемые коты и любители котов.
Скоро Новый Год, каждому хочется новогоднего настроения, даже если ты кот, и даже если ты игрушечный кот. Специально для игрушечных котов у меня уже несколько лет есть малюсенькая ёлочка с питанием от 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 приложены.
Файлы: Все вопросы в Форум.
|
|
|||||||||||||||
|
||||