Чудная лампа настроения своими руками

Чудная лампа настроения своими руками

Романтичная лампа своими руками.

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

Всё началось с того, что в этом году я решил на все праздники дарить подарки, сделанные своими руками… Дело было феврале и близился самый трудный день в году для многих мужчин – 8-е марта ))). Я, как обычно, полез в интернет за вдохновением, и первым делом на глаза мне попался, конечно же «Радиокот». А уже оттуда меня занесло на сайт одного из участников форума, где наткнулся я на интересную и очень простую вещицу. Название ей «Лампа настроения на ATtiny13». Это такой светодиодный RGB светильник, в котором цвет плавно меняется от одного к другому совершенно хаотичным образом. Зрелище довольно красивое и местами даже романтичное…. «Вот оно!»,- подумал я. Самое то: Конструкция электронная и женской половине должна понравиться, а такое, надо сказать, бывает ооочень редко(электроника, которая нравится). Тогда решено: «За дело!».

Схема достаточно тривиальна и известна на просторах тырнета. Но что меня привлекло именно к этой вариации – это использование, наверное, самого дешёвого МК в арсенале Atmel. На чипе собран трехканальный ШИМ, к выходам которого, через полевые транзисторы, подключен мощный RGB светодиод. Я взял 1-ваттный, потому что он у меня был, но можно более мощный, главное правильно подобрать транзисторы по току. К примеру, на 3 ватта можно смело ставить с теми же номиналами в схеме. Резисторы нужно подбирать так, чтобы в цепях трёх кристаллов проходил одинаковый ток. Если этого не сделать, то какого-то цвета всегда будет больше. У меня, например, сначала чаще всего появлялись оттенки розового, поэтому я увеличил сопротивление резистора на красный цвет до 13 оМ.

А дальше началось самое интересное: поиски подходящего корпуса.… Которые собственно закончились полным крахом. Делать нечего, мы же не хуже китайцев, руками тоже умеем работать. Для начала берём подходящую стеклянную емкость. Я выбрал самую простую вазу наподобие большого стакана, абсолютно прозрачную.

Сверлим в ней отверстие снизу, для выхода шнура питания. И начинаем творить…

Первым делом необходимо сделать поверхность матовой. Самый простой способ – использовать специальную матирующую пасту или воспользоваться подобными услугами у стекольщиков (обычно с пескоструйным аппаратом). Но т.к. ни того ни другого у нас в городе не нашлось, пришлось делать всё весьма изощрённым способом – наждачной бумагой. В ручную это заняло бы уйму времени и сил, и я придумал небольшую автоматизацию из того что было под рукой. Взял отвёртку с резиновой ручкой, вставил в подходящую пластиковую трубку (внутри которой были продольные насечки), и на трубку накрутил наждачную бумагу, закрепив изолентой. Вставив эту конструкцию в дрель, получаем «шлифовальный автомат». Тут главное правильно подобрать зернистость (мне понравилась «320») и двигаться равномерно, не задерживаясь долго на одном месте, иначе обработка получится неравномерной. Не забываем о технике безопасности: пользуемся респиратором, очками, и желательно вне дома, чтобы близкие не пострадали от стеклянной пыли. Но я советую всё-таки воспользоваться сторонними услугами.

После матирования вазы, наклеиваем, заранее подготовленные трафареты бабочек на самоклеящейся бумаге. Добавляем рельефный рисунок с помощью клеевого пистолета (я использовал прозрачные стержни). И в самом конце всё это дело красим. Я использовал обычную аэрозольную краску (акриловую) в баллончиках, белого цвета. Белую, потому что при включении лампы она становится практически прозрачной и светится нужным светом. Может для стекла существуют какие-то специальные краски, потому как впоследствии оказалось, что краска плохо держится на стекле. Или может, я плохо обезжирил поверхность. Нужно красить всю вазу целиком без стыков, тогда получается довольно крепко, если не царапать. Ваза как бы обтянута плёнкой из краски.

После покраски мне показалось, что получилось как-то бледно, когда лампа в выключенном состоянии. И я добавил искусственных цветов, воспользовавшись клеевым пистолетом. Лучше перед приклеиванием немного зачистить стекло от краски: цветки с термоклеем легко откалупливают краску, но мёртво держатся на чистом стекле.

Когда наконец всё готово, ставим внутренности на своё законное место, не забыв подключить питание (я использовал старый зарядник от телефона с напряжением 5 вольт). Печатную плату я делал под определённый радиатор (нашёл круглый и в корпус идеально подходт), ведь, как известно, мощные светодиоды нуждаются в хорошем отводе тепла. Особо не заморачивался с расположением деталей, места и так предостаточно. Детали ставил, что под руку попались. Если ставить SMD и расположить более компактно, получится весьма миниатюрно. Светодиод припаял с обратной стороны, а в плате просверлил отверстие для него. Печатная плата придавливает диод к радиатору через теплопроводную пасту или лучше прокладку. Отверстие должно быть больше диаметра линзы диода, иначе можно её случайно выдавить из корпуса, когда будете затягивать болты.


Контроллер прошивал до впаивания в плату, прошивка и исходники по просьбе автора остались на его сайте по этой ссылке: https://trolsoft.ru/sch/moodlamp/ Фьюзы в CVAVR ниже:

И в самом конце, лампу я решил загерметизировать от влаги и любопытных глаз. Для этого взял обычную пластиковую крышку от 3-х литровой банки и надел сверху, подошла, как ни странно на 100%. Видно на самой первой фотке в статье.

Вот собственно и всё:

На данный момент собрано уже 3 таких лампы, и все три подарены. В архиве моя печатка и схема. По ссылкам несколько видео работы лампы:

Качество не очень и снято днём, ночью выглядит гораздо эффектнее и цвета более яркие…

Лампа настроения с регулировкой скорости смены цветов и функцией стоп-цвет

Приветствую всех. Однажды приглянулся мне стеклянный шар, который в темноте испускает свет, накопленный за день, да и к тому же в подставке к нему была RGB подсветка. Однако подсветка эта была настолько халтурная (8 цветов, да и те скачком менялись), что было решено сделать свою, да еще и с плюшками. Основа схемы – микроконтроллер AVR Attiny13. Хотя он поддерживает только 2 канала аппаратного ШИМ (широтно импульсная модуляция), а RGB светодиод требует 3, не проблема – реализуем программный ШИМ. Плюшки следующие помимо ШИМ регулирования RGB светодиодов: регулировка скорости смены цветов от 1 секунды на цикл смены цветов до 1000 секунд, а также возможность остановить световые эффекты нажатием кнопки и заморозить текущий цвет. Назвал я эту функцию “Стоп-цвет”. О количестве цветов: здесь также реализована фишка – изменение цветов происходит не только линейно от красного до фиолетового по цветам радуги, но и по сочетанию нулевых и максимальных значения цвета – то есть от 100 процентной насыщенности до нулевой насыщенности цветов, то есть до белого цвета. Программа изменения цвета линейная, строго задана программой. Флэш память Attiny13 не позволила реализовать рандомное непредсказуемое изменение цвета. Может это и к лучшему.

Схема получилась вот такой:

Что да как делалось. Регулировка скорости. Начнем с задержек функцией _delay_ms(); , обычное ее использование сводится к записи в скобки какого-то значения, в течении которого должна проходить задержка, но если же в скобочки поставить переменную, то размер программы резко увеличится. Это совсем не годится, ведь уже рискуем не влезть в память Attiny13. Выход прост – организуем цикл вызова конечного числа раз функции задержки длительностью, скажем 1 мили секунда. Размер программы для контроллера снова в норме. Теперь эту функцию можно использовать для регулировки скорости выполнения светового эффекта. Далее откуда брать динамическое изменение переменной задержки? Тоже все просто, тинька имеет на борту АЦП (аналого цифровой преобразователь) 10 бит, значение от 0 до 1024 – отлично сгодится для значения задержки. То есть выходит, что задержка между увеличением или уменьшением яркости будет от 1 мили секунды до 1 секунды. От 1 потому, что при нулевой задержке будет просто мельтишение, некрасиво, поэтому ноль исключен. Итак, берем значение из АЦП и толкаем в значение переменной задержки. Также значение АЦП можно брать как 10 бит, то есть 1024 отсчета, так и просто поделить это значение на 2, 4, 8 и так далее и получится более узкий диапазон регулировки. Аппаратно регулировка будет производиться потенциометром или переменным резистором, подключенным крайними выводами к плюсу и минусу питания, а средним ко входу АЦП микроконтроллера. R3 для защиты порта, токоограничительный. R1 ограничивает напряжение таким образом, чтобы максимальное значение АЦП было 1000, остальные 24 отсчета планировалось для подключения еще одной кнопки, но внятного функционала она не получила, поэтому осталось так для возможности в будущем что-нибудь “допилить”. Источником опорного напряжения АЦП выбрано напряжения питания 5 вольт микроконтроллера. Что касательно остановки эффекта изменения цвета, то при нажатии кнопки S2 происходит перебрасывание из основного бесконечного цикла со световым эффектом в другой пустой бесконечный цикл, повторное нажатие кнопки перебрасывает выполнение программы обратно в основной бесконечный цикл. Простенько и сердито.

В программе задействовано 2 прерывания: прерывания по переполнению таймера 0 для опроса состояния кнопки, а также прерывания по завершению преобразования АЦП. Как отмечалось, смена цветов происходит не только от цвета к цвету, но и с изменением их насыщенности, то есть не только горизонтально, но и вертикально. При минимальной насыщенности цвета будут размываться друг с другом (см. рисунок ниже) и в конце концов получится белый цвет, хотя по палитре на рисунке там присутствует и серый, но возможности RGB светодиодов не позволяют передать его, как и черный цвет. Получается просто яркость белого цвета вместо перехода от черного к белому. Поэтому уровни черного цвета не было даже попытки реализовать))

Между прочим, подобную палитру можно посмотреть в любом графическом редакторе, например, Paint.

Программно дело получается так (программный код на gcc):

Переменная k отвечает за остановку изменения цвета, перекидывает в разные циклы программы.
Переменная n отвечает за переход от 100% насыщенности цветов до размытия их до белого, не может быть больше чем 1/2 от pwm
Переменная pwm – значение дискретизации ШИМ

Это вся главная программа работы микроконтроллера для данного устройства.

В качестве RGB светодиода использовалась светодиодная лента на этих самых RGB светодиодах. Конкретной марки или модели ленты не знаю, вроде что-то от RoHS. Лента имеет в себе уже токоограничительные резисторы, баланс белого хорошо настроен. Так как лента требует питания 12 вольт, в схеме был использован повышающий DC-DC преобразователь на микросхеме MC34063. Сделано это для того, чтобы была возможность питать схему от трех пальчиковых аккумуляторов или просто от USB порта. Ясное дело АА аккумуляторы придется часто заряжать, зато красиво и ярко. При замене питания на 12 вольтовое, преобразователь можно заменить на обычные линейные преобразователи типа 7805 и соответственно перерасключить питание в схеме. Для управление светодиодами используется микросхема ULN2003. По сути это просто 7 транзисторов в корпусе микросхемы (7 сборок дарлингтонов), заменить можно на обычные транзисторы подходящей мощности и габаритов. Выводы микросхемы ULN2003 соединены попарно для увеличения мощности выходов. Каждая ножка по даташиту имеет предел по току в 0,5 А, а в сумме по всем значение составляет 2,5 А. Это стоит учитывать, если предусматривается нагрузка побольше, чем 1 юнит светодиодной ленты в моем случае. Для регулировки скорости эффекта смены цветов используется потенциометр R2, можно применить любой, подходящий по вкусу. Кнопка S1 осуществляет сброс контроллера (reset). На всякий случай. Конденсатор C8 для большей надежности, им можно пренебречь.

Читайте также:  Домашний камин своими руками (фото, мастер-класс)

Готовое устройство получилось вот такого вида ( собрано с применением макетной платы собственного производства для tiny13 ):

Область применения этого устройства, как и почти любого другого, ограничивает лишь фантазия инженера или радиолюбителя. Устройство может быть легко модернизировано под любую другую цель благодаря простоте, повторяемости и возможности просто вносить свои изменения в схему.

Фьюз биты для программирования микроконтроллера Attiny13:

К статье прилагаются проект протеус, макетная печатная плата, на которой построена схема, прошивка для микроконтроллера, а также небольшое видео, хоть и не совсем хорошо, но демонстрирующее работу устройства (в реальности устройство получилось намного более красочное)

RGB светильник на PIC12F629/675

Многоцветный светильник на микроконтроллере

В новогодние праздники, да и не только, возникает большая потребность в световой иллюминации.

Данное устройство можно назвать по-разному: лампой настроения, RGB-светильником, новогодней лампой, светодиодным маяком и пр. Как его использовать – подскажет фантазия.

Вот схема многоцветного RGB-светильника на микроконтроллере PIC12F629 (или PIC12F675). Для увеличения кликните по изображению.

Внешний вид собранного RGB-светильника.

Видео работы светильника в режиме “лампы настроения” (Mood Lamp).

Схема предлагаемого устройства весьма проста, но обладает множеством режимов работы. Вот лишь некоторые из них:

Медленная смена цветов. Зелёное, красное и синее свечение разной интенсивности смешиваются, что позволяет получить плавный перебор цветов радуги;

Быстрое поочерёдное мигание красным, зелёным и синим цветом;

Плавное увеличение белого свечения и затем 4 вспышки. Затем идёт повторение цикла;

Поочерёдное резкое вспыхивание и медленное затухание основных цветов (синего, красного, зелёного). После цикл повторяется.

Ровное свечение красным;

Ровное свечение синим;

Ровное свечение зелёным;

Ускоренная смена цветов;

Ровное белое свечение;

Ровное белое свечение с пониженной яркостью;

Ровное белое свечение с минимальной яркостью;

Ровное свечение фиолетовым (красный + синий);

Ровное свечение оранжевым (красный + зелёный).

Это основные режимы работы светильника. Все остальные являются вариантами плавной смены цветов радуги с разной скоростью.

Чтобы оценить по достоинству всю богатую палитру режимов и работоспособность устройства лучше сначала его собрать на беспаечной макетной плате. Так называемой, “хлебной доске” (Breadboard).

Чтобы свечение от разных светодиодов смешивалось и образовывало ровный цветовой оттенок, светодиоды нужно размещать как можно ближе друг к другу. Также после макетирования схемы можно взять белый лист формата А4, свернуть его в цилиндр и закрепить по сторонам скрепками. Получившийся бумажный цилиндр устанавливаем на беспаечную макетную плату – закрываем светодиоды. В результате у нас получится своеобразный матовый плафон. Вот что из этого может получиться.

Микроконтроллер перед запайкой в плату нужно “прошить”. О том, как это сделать, я уже рассказывал на страницах сайта. Чем прошивать – отдельный вопрос. Если нечем, то сначала нужно собрать самостоятельно USB программатор микроконтроллеров PIC или купить уже готовый. Он ещё не раз пригодится.

Во время прошивки PIC12F629 или PIC12F675 нужно обратить внимание на калибровочную константу. Не лишним будет сначала считать (“Read”) данные с чистого микроконтроллера и записать куда-нибудь на бумажину значение константы. После прошивки микроконтроллера нужно проверить соответствует ли значение константы в ячейке 0x3FF считанному ранее значению. Если оно отличается, то меняем константу. О том, что такое калибровочная константа я уже рассказывал здесь.

Список необходимых радиодеталей для сборки RGB-светильника.

НазваниеОбозначениеПараметры / НоминалМарка или тип элемента
МикроконтроллерDD18-битный микроконтроллерPIC12F629 или PIC12F675
Интегральный стабилизаторDA1на выходное напряжение 5 вольт78L05, MC78L05ACP (любой аналог)
MOSFET-транзисторыVT1 – VT32N7000 или КП501А ( Внимание! У КП501А другая цоколёвка!)
Полупроводниковый диодVD1(не обязателен)1N4148, 1N4007 или аналог
СветодиодыHL1 – HL4красного цвета свечениялюбые яркие диаметром 5 мм.
HL5 – HL7зелёного цвета свечения
HL8 – HL10синего цвета свечения
РезисторыR1120 ОмМЛТ, МОН (на мощность рассеивания – 0,125 Вт)
R2, R368 Ом
КонденсаторыС2220 нФ (0,22 мкФ)Керамические многослойные или любые аналоги
С3100 нФ (0,1 мкФ)
Электролитический конденсаторC147 мкФ * 16 вольтлюбой алюминиевый (К50-35 или зарубежные аналоги)
КнопкаSB1любая тактовая кнопка (например, KAN0610-0731B)
ДжамперJ1(не устанавливается)

После подачи питания устройство начинает работать сразу. Нажатием кнопки SB1 можно переключать режим работы RGB-светильника. Кнопку можно нажимать хоть до бесконечности – переключение режимов происходит по кругу.

Печатную плату легко изготовить с помощью маркера для плат. Так делал я. Если маркера для плат нет, то можно применить “карандашный” метод или цапонлак. Умеете делать платы ЛУТ’ом – ещё лучше.

Ну, а если нет ничего из перечисленного, а сделать самоделку очень хочется, то вместо стеклотекстолита можно использовать толстый картон, кусок тонкого пластика или фанеры. В общем, всё то, на чём можно смонтировать схему навесным монтажом. Соединения можно выполнить медным проводом с обратной стороны основания.

Сейчас такой совет покажется дикостью, но когда я только начинал заниматься электроникой, то пробовал всякие способы монтажа схем. В те недалёкие времена расходники и детали покупали на радиорынках, которые были только в крупных городах. О заказе радиодеталей онлайн мы могли тогда только мечтать.

Пояснения к схеме.

MOSFET-транзисторы 2N7000 чрезвычайно чувствительны к статическому электричеству. В этом я убедился на собственном опыте. Если паять их обычным паяльником (типа ЭПСН или аналогичным), то с большой вероятностью транзисторы придут в негодность. Они будут либо постоянно открыты или открываться непредсказуемо. Во всяком случае, после первой сборки у меня транзисторы вели себя именно так.

Возможно, угробил их статикой ещё задолго до сборки устройства. А, может, всё дело именно в паяльнике.

Поэтому рекомендую впаивать транзисторы 2N7000 паяльной станцией. Ну, а если кроме обычного паяльника ничего нет, то нужно перед пайкой замкнуть все три вывода транзистора, впаять, а затем убрать перемычку.

В качестве перемычки может быть кусочек фольги (запечатываем корпус так, чтобы выводы транзистора тоже замкнулись) или несколько витков медного провода без изоляции, которыми обматываем выводы. Естественно, после монтажа перемычку нужно снять с выводов транзистора.

Расположение выводов МОП-транзистора 2N7000.

Если кому интересно, как обозначаются различные полевые транзисторы на принципиальных схемах, то загляните на страницу про обозначение полевых транзисторов на схеме.

Транзисторы 2N7000 можно заменить на КП501А. Но стоит учесть, что у КП501А другая цоколёвка! Вот такая.

Защитный диод VD1 можно не впаивать в схему. Он служит для защиты схемы при неправильном подключении питания – переполюсовке. Если такая защита не нужна, то диод VD1 тоже не нужен.

Резисторы можно подобрать с номиналами, близким к указанным на схеме (стандартное допустимое отклонение ±20%). Я, например, устанавливал R1 на 130 Ом, а R2, R3 – 82 Ом.

Для питания схемы потребуется стабилизированный блок питания с выходным напряжением 12 вольт. Подойдёт, например, регулируемый блок питания, схема которого описана тут. Также для питания устройства можно использовать блок питания на основе понижающего DC/DC модуля.

Лампа настроения реагирующая на звук

Дата публикации: 21 июля 2015 .

Лампа настроения (mood lamp) – небольшая декоративная настольная лампа, которая периодически случайным образом плавно меняет свой цвет. В сети полно разных вариантов самодельных ламп настроения (в том числе и на AVR), но просто смена цвета случайным образом – это достаточно скучно. В этой статье я расскажу о том как сделать простую лампу настроения, которая реагирует на звук.

Идея

Итак, идея в том что бы снабдить привычную лампу настроения микрофоном, и заставить её менять цвет не просто случайным образом, а в зависимости от того что она “слышит” через этот микрофон. Лампа будет работать в трех режимах (режим переключается единственной кнопкой):

– Простой режим , или режим обычной лампы настроения. Лампа просто периодически случайным образом меняет цвет.
– Реакция на резкий зву к. В этом режиме лампа не меняет цвет самопроизвольно, а делает это только когда услышит резкий звук, вроде хлопка, громкого крика или легкого удара по корпусу ламы или столу.
– Анализ частоты звука . В этом режиме лампа меняет цвет в зависимости от частоты звука который она “слышит”, то есть что-то типа цветомузыки.

Реализация

С идеей понятно, приступим к реализации. Для такой лампы понадобятся, как минимум, три вещи: яркий трехцветный светодиод – что бы светить, микрофон – что бы слышать, и микроконтроллер – что бы управлять всем этим хозяйством.

Светодиод

В качестве светодиода я использовал сверхъяркий трехцветный (RGB) светодиод мощностью 3Вт (по 1Вт на каждую из цветовых компонент). Сам светодиод установлен на алюминиевой пластине-радиаторе, и выглядит вот так:

Светит достаточно ярко и имеет широкий “угол обзора” – нет яркого пятна посредине.

К сожалению, подключить такой светодиод напрямую к ножкам микроконтроллера не получится, потому что тока ему нужно около 200Ма на канал, а, например, максимально допустимый ток через ножку контроллера ATMega8 – всего 40Ма. Поэтому на каждый канал светодиода я поставил по транзистору – контроллер открывает/закрывает транзистор, меняя напряжение на базе. А транзистор зажигает/тушит светодиод, ведь максимально допустимый ток транзистора целых 800Ма (для BC337), что с головой хватает что бы зажечь светодиод.

Читайте также:  Автоматическая подсветка лестницы с помощью Arduino

Микрофон

В качестве микрофона используется обычный электретный микрофон (капсюль), подключенный к АЦП микроконтроллера через усилительный каскад.

В принципе, можно было бы использовать цифровой микрофон, но на нашем радиорынке оказалось гораздо проще найти электретный микрофон.

Микроконтроллер

Здесь выбор казался вполне очевидным – ATMega8. Что-то слабее использовать не получится, так как нужно три канала ШИМа (по каналу на каждый из трех цветов светодиода). Использовать что-то более мощное , казалось, не имеет смысла. Поэтому я и остановил свой выбор на микроконтроллере ATMega8.

Но здесь меня подстерегали грабли. Дело в том, что для реализации программы управляющей лампой мне понадобилось использование арифметики с плавающей точкой, а AVR-ки, к сожалению, не имеют FPU. Поэтому для дробных чисел используется программная реализация FPU, которая занимает достаточно много места в памяти микроконтроллера. В результате память ATMega8 оказалась забита под завязку. Если бы сейчас я решил собрать еще одну лампу, то наверняка поставил бы как минимум ATMega32.

Схема и печатная плата

С основными компонентами разобрались, теперь осталось объединить все это воедино:

Обвязка микроконтроллера стандартная: питание, кнопка сброса, разъем программатора.

Для того что бы запустить контроллер на максимальной частоте (16Мгц), добавлен кварцевый осциллятор (в левом нижнем углу схемы).

На вход аналогового питания (AVCC) подключен LC-фильтр (дроссель и конденсатор), по рекомендации даташита на ATMega8 (см. раздел даташита “Analog Noise Canceling Techniques”). Правда, как оказалось – найти на нашем радиорынке подходящий дроссель достаточно проблематично, поэтому я поставил что нашел, а именно – старый советский дроссель на 120мкГн.

Кнопка BUTTON используется для переключения режимов работы лампы.

Светодиод DBG_LED использовался для отладки прошивки, и ставить его не обязательно.

В правом верхнем углу схемы изображен усилительный каскад для подключения микрофона к АЦП микроконтроллера. Сам микрофон подключается в разъем MIC.

Немного ниже изображена схема для подключения RGB светодиода. Базы транзисторов подключены к ножкам контроллера которые умеют генерировать аппаратный ШИМ (OC1A, OC1B, OC2). Катоды светодиода через транзисторы посажены на землю. Джампер JP1 нужен что бы можно было отключать канал OC2 от транзистора. Дело в том, что OC2 является по совместительству и входом MOSI для программатора, поэтому при прошивке микроконтроллера со включенным джампером светодиод начинает раздражающе моргать. Ставить его, в принципе, не обязательно.

Печатную плату хотелось сделать полностью односторонней, но, к сожалению, не получилось. Пришлось кинуть несколько перемычек по другой стороне (изображены красными дорожками).

Корпус

В качестве корпуса используется выпотрошенный обычный светильник. Плата прикручена болтами к нижней части корпуса. Микрофон прижат припаянным к корпусу куском провода.

Светодиод крепко держится на куске текстолита, прижатый припаянными к нему проводами. Сам кусок текстолита прикручен шурупами к деревянному брусочку, который прикручен к основной плате.

Собранная лампа в корпусе выглядит вот так:

Программная часть

Прошивка написана на С. Местами присутствует ярый говнокод, т.к. лампа делалась в качестве подарка, и нужно было обязательно успеть к празднику. Зато сам код достаточно хорошо закомментирован и разобраться несложно.

Сначала немного об общей структуре программы. Поддержка разных режимов сделана с помощью указателей на функции, поэтому менять/добавлять новые режимы очень просто. Есть enum Mode, в котором перечислены все режимы в которых умеет работать лампа. Есть два массива с указателями на функции: mode_callbacks и mode_switch_callbacks. Массив mode_callbacks содержит указатель на главную процедуру для каждого режима. Массив mode_switch_callbacks, по аналогии, содержит указатели на функции смены режимов. Функция смены режима нужна что бы дать пользователю понять что произошло переключение в новый режим работы.

В функции main находится главный цикл который состоит ровно из трех строчек:

mode_callbacks[mode](); Фактически это вызов главной процедуры для текущего режима работы. Она будет выполняться до тех пор пока пользователь не нажмет на кнопку.
mode = (mode + 1) % ModeLastInvalid; Переходим к следующему режиму.
mode_switch_callbacks[mode](); И вызываем обработчик смены режима для нового режима. Все что сейчас делают эти обработчики – мигают пять раз каким-то цветом. После выполнения этой строки мы вновь возвращаемся в начало цикла.

Еще, пожалуй, стоит упомянуть функции schedule_delay и pick_random_color.

Функция schedule_delay используется для генерации задержек. Она необходима потому что нельзя просто вызвать стандартную функцию вроде _delay_ms и уснуть, ведь нужно считывать данные с АЦП и проверять состояние кнопки (не нажал ли её пользователь). Именно эти задачи функция schedule_delay и выполняет. На самом деле, можно было бы использовать режим непрерывного преобразования в АЦП, а обработку нажатия на кнопку повесить на прерывание, но как показала практика, в режиме непрерывного преобразования шумы на АЦП больше чем в режиме одиночного преобразования.

Функция pick_random_color просто выбирает случайный цвет (в формате RGB). Вернее не совсем просто, а с одним нюансом: что бы чаще появлялись красивые “чистые цвета” (красный, зеленый, синий) введена константа COLOR_CLEAR_PROBABILITY, которая в процентах задает частоту появления “чистых” цветов. То есть если её значение равно 50, то примерно каждый второй случайный цвет будет красным, зеленым либо синим.

Режим лампы настроения

Главная процедура режима – mood_lamp_mode. Это самый простой режим, и его поведение вполне очевидно из кода: выбираем и запоминаем новый случайный цвет, плавно меняем текущий цвет лампы к выбранному цвету, “удерживаем” его некоторое время и начинаем все сначала.

Режим реакции на громкий звук

Главная процедура режима – sound_lamp_mode. В целом все похоже на предыдущий режим, с парой нюансов. Во первых, режим “удержания” цвета не ограничен по времени – переключение к выбору нового цвета произойдет не по таймауту, а если лампа “услышит громкий звук”. А во вторых, во время плавного перехода к новому цвету может произойти переключение к выбору нового цвета (опять же, если лампа услышит громкий звук).

Пару слов о функции sound_lamp_mode_get_mic. Её задача – получить текущий “уровень” звука на микрофоне. Работает она следующим образом: сначала отключаются все три канала ШИМ, потом прогоняется пара холостых преобразований АЦП и запоминается значение с АЦП, затем восстанавливаются значения на ШИМ-ах. Такие костыли пришлось добавить потому что работа ШИМа сильно портит показания АЦП (я подозреваю здесь сказывается китайский блок питания, который не может обеспечить стабильное напряжение).

Режим анализа звука

Главная процедура режима – sound_analysis_mode. По сути, этот режим представляет собой последовательное выполнение двух операций: определение частоты звука, и изменение цвета на цвет соответствующий этой частоте. Рассмотрим их более подробно.

Изначально я хотел использовать дискретное преобразование Фурье для определения частоты звука. Но уместить его в восьми килобайтах памяти микроконтроллера никак не получилось, поэтому пришлось использовать другой, более примитивный способ. Суть способа состоит в подсчете пересечения звуковым сигналом нуля. Реализовано это следующим образом – звуковой сигнал записывается в буфер, затем мы проходим по этому буферу и подсчитываем, как много последовательных пар элементов лежат по разные стороны от нуля. Только вот ноль это не математический ноль, а нулевая амплитуда, для которой используется константа SOUND_AMPL_ZERO. Что бы было понятнее рассмотрим пример: пусть нулевая амплитуда у нас это 100, тогда пара значений 95 и 120 пересекают ноль, т.к. они лежат по разные стороны от нулевой амплитуды (95 меньше 100 а 120 больше 100). А вот пара 80 и 90 не пересекают, т.к. оба этих значения меньше ста. Таким образом частота это количество пересечений нуля деленное на единицу времени.

Теперь о том как на основании частоты выбрать цвет. Цветовая модель RGB для этого слабо подходит, поскольку каждый её компонент фактически контролирует три параметра: тон, насыщенность и яркость, а мне же хотелось что бы частота влияла только на тон, а яркость и насыщенность оставались постоянными. Поэтому я выбрал цветовую модель HSV. Яркость и насыщенность постоянны и равны их максимальным значениям, а тон напрямую зависит то частоты. Когда на основании частоты получено значение цвета в HSV, выполняется преобразование из HSV в RGB, и полученный цвет выводится на светодиод. Весь процесс преобразования частоты звука в цвет в модели RGB выполняется в функции convert_freq_to_rgb.

Результат

Собственно результат, как и фото процесса изготовления, можно посмотреть на этом видео:


Nullblog

Еще один небольшой технический блог

24 июня 2012 г.

Лампа настроения реагирующая на звук

Итак, идея в том что бы снабдить привычную лампу настроения микрофоном, и заставить её менять цвет не просто случайным образом, а в зависимости от того что она “слышит” через этот микрофон.
Лампа будет работать в трех режимах (режим переключается единственной кнопкой):

  • Простой режим, или режим обычной лампы настроения. Лампа просто периодически случайным образом меняет цвет.
  • Реакция на резкий звук. В этом режиме лампа не меняет цвет самопроизвольно, а делает это только когда услышит резкий звук, вроде хлопка, громкого крика или легкого удара по корпусу ламы или столу.
  • Анализ частоты звука. В этом режиме лампа меняет цвет в зависимости от частоты звука который она “слышит”, то есть что-то типа цветомузыки.

Реализация

Светодиод

Микрофон

Микроконтроллер

Здесь выбор казался вполне очевидным – ATMega8. Что-то слабее использовать не получится, так как нужно три канала ШИМа (по каналу на каждый из трех цветов светодиода). И спользовать ч то-то более мощное , казалось, не имеет смысла. Поэтому я и остановил свой выбор на микроконтроллере ATMega8.

Но здесь меня подстерегали грабли. Дело в том, что для реализации программы управляющей лампой мне понадобилось использование арифметики с плавающей точкой, а AVR-ки, к сожалению, не имеют FPU. Поэтому для дробных чисел используется программная реализация FPU, которая занимает достаточно много места в памяти микроконтроллера. В результате память ATMega8 оказалась забита под завязку. Если бы сейчас я решил собрать еще одну лампу, то наверняка поставил бы как минимум ATMega32.

Схема и печатная плата

Обвязка микроконтроллера стандартная, как и в бинарных часах: питание, кнопка сброса, разъем программатора.

Читайте также:  Полностью автономная камера наблюдения

Для того что бы запустить контроллер на максимальной частоте (16Мгц), добавлен кварцевый осциллятор (в левом нижнем углу схемы).

На вход аналогового питания ( AVCC ) подключен LC-фильтр (дроссель и конденсатор), по рекомендации даташита на ATMega8 (см. раздел даташита ” Analog Noise Canceling Techniques “). Правда, как оказалось – найти на нашем радиорынке подходящий дроссель достаточно проблематично, поэтому я поставил что нашел, а именно – старый советский дроссель на 120мкГн.

Кнопка BUTTON используется для переключения режимов работы лампы.

Светодиод DBG_LED использовался для отладки прошивки, и ставить его не обязательно.

В правом верхнем углу схемы изображен усилительный каскад для подключения микрофона к АЦП микроконтроллера. Сам микрофон подключается в разъем MIC .

Немного ниже изображена схема для подключения RGB светодиода. Базы транзисторов подключены к ножкам контроллера которые умеют генерировать аппаратный ШИМ ( OC1A, OC1B, OC2 ). Катоды светодиода через транзисторы посажены на землю. Джампер JP1 нужен что бы можно было отключать канал OC2 от транзистора. Дело в том, что OC2 является по совместительству и входом MOSI для программатора, поэтому при прошивке микроконтроллера со включенным джампером светодиод начинает раздражающе моргать. Ставить его, в принципе, не обязательно.

Печатную плату хотелось сделать полностью односторонней, но, к сожалению, не получилось. Пришлось кинуть несколько перемычек по другой стороне (изображены красными дорожками).

Корпус

Программная часть

Прошивка написана на С. Местами присутствует ярый говнокод, т.к. лампа делалась в качестве подарка, и нужно было обязательно успеть к празднику. Зато сам код достаточно хорошо закомментирован и разобраться несложно.

Сначала немного об общей структуре программы.
Поддержка разных режимов сделана с помощью указателей на функции, поэтому менять/добавлять новые режимы очень просто. Есть enum Mode , в котором перечислены все режимы в которых умеет работать лампа. Есть два массива с указателями на функции: mode_callbacks и mode_switch_callbacks . Массив mode_callbacks содержит указатель на главную процедуру для каждого режима. Массив mode_switch_callbacks , по аналогии, содержит указатели на функции смены режимов. Функция смены режима нужна что бы дать пользователю понять что произошло переключение в новый режим работы.

В функции main находится главный цикл который состоит ровно из трех строчек:

  • mode_callbacks[mode](); Фактически это вызов главной процедуры для текущего режима работы. Она будет выполняться до тех пор пока пользователь не нажмет на кнопку.
  • mode = (mode + 1) % ModeLastInvalid; Переходим к следующему режиму.
  • mode_switch_callbacks[mode](); И вызываем обработчик смены режима для нового режима. Все что сейчас делают эти обработчики – мигают пять раз каким-то цветом. После выполнения этой строки мы вновь возвращаемся в начало цикла.

Еще, пожалуй, стоит упомянуть функции schedule_delay и pick_random_color .

Функция schedule_delay используется для генерации задержек. Она необходима потому что нельзя просто вызвать стандартную функцию вроде _delay_ms и уснуть, ведь нужно считывать данные с АЦП и проверять состояние кнопки (не нажал ли её пользователь). Именно эти задачи функция schedule_delay и выполняет. На самом деле, можно было бы использовать режим непрерывного преобразования в АЦП, а обработку нажатия на кнопку повесить на прерывание, но как показала практика, в режиме непрерывного преобразования шумы на АЦП больше чем в режиме одиночного преобразования.

Функция pick_random_color просто выбирает случайный цвет (в формате RGB). Вернее не совсем просто, а с одним нюансом: что бы чаще появлялись красивые “чистые цвета” (красный, зеленый, синий) введена константа COLOR_CLEAR_PROBABILITY , которая в процентах задает частоту появления “чистых” цветов. То есть если её значение равно 50, то примерно каждый второй случайный цвет будет красным, зеленым либо синим.

Режим лампы настроения

Главная процедура режима – mood_lamp_mode . Это самый простой режим, и его поведение вполне очевидно из кода: выбираем и запоминаем новый случайный цвет, плавно меняем текущий цвет лампы к выбранному цвету, “удерживаем” его некоторое время и начинаем все сначала.

Режим реакции на громкий звук

Главная процедура режима – sound_lamp_mode . В целом все похоже на предыдущий режим, с парой нюансов. Во первых, режим “удержания” цвета не ограничен по времени – переключение к выбору нового цвета произойдет не по таймауту, а если лампа “услышит громкий звук”. А во вторых, во время плавного перехода к новому цвету может произойти переключение к выбору нового цвета (опять же, если лампа услышит громкий звук).

Пару слов о функции sound_lamp_mode_get_mic . Её задача – получить текущий “уровень” звука на микрофоне. Работает она следующим образом: сначала отключаются все три канала ШИМ, потом прогоняется пара холостых преобразований АЦП и запоминается значение с АЦП, затем восстанавливаются значения на ШИМ-ах. Такие костыли пришлось добавить потому что работа ШИМа сильно портит показания АЦП (я подозреваю здесь сказывается китайский блок питания, который не может обеспечить стабильное напряжение).

Режим анализа звука

Главная процедура режима – sound_analysis_mode . По сути, этот режим представляет собой последовательное выполнение двух операций: определение частоты звука, и изменение цвета на цвет соответствующий этой частоте. Рассмотрим их более подробно.

Изначально я хотел использовать дискретное преобразование Фурье для определения частоты звука. Но уместить его в восьми килобайтах памяти микроконтроллера никак не получилось, поэтому пришлось использовать другой, более примитивный способ. Суть способа состоит в подсчете пересечения звуковым сигналом нуля. Реализовано это следующим образом – звуковой сигнал записывается в буфер, затем мы проходим по этому буферу и подсчитываем, как много последовательных пар элементов лежат по разные стороны от нуля. Только вот ноль это не математический ноль, а нулевая амплитуда, для которой используется константа SOUND_AMPL_ZERO . Что бы было понятнее рассмотрим пример: пусть нулевая амплитуда у нас это 100, тогда пара значений 95 и 120 пересекают ноль, т.к. они лежат по разные стороны от нулевой амплитуды (95 меньше 100 а 120 больше 100). А вот пара 80 и 90 не пересекают, т.к. оба этих значения меньше ста. Таким образом частота это количество пересечений нуля деленное на единицу времени.

Теперь о том как на основании частоты выбрать цвет. Цветовая модель RGB для этого слабо подходит, поскольку каждый её компонент фактически контролирует три параметра: тон, насыщенность и яркость, а мне же хотелось что бы частота влияла только на тон, а яркость и насыщенность оставались постоянными. Поэтому я выбрал цветовую модель HSV. Яркость и насыщенность постоянны и равны их максимальным значениям, а тон напрямую зависит то частоты. Когда на основании частоты получено значение цвета в HSV, выполняется преобразование из HSV в RGB, и полученный цвет выводится на светодиод. Весь процесс преобразования частоты звука в цвет в модели RGB выполняется в функции convert_freq_to_rgb .

Результат


Лампа настроения с сенсорным управлением

Волею случая, попала ко мне в руки лампа. Попала совершенно случайно: ее принесли в наш сервисный центр для замены аккумулятора. И, казалось бы, дело пустяковое, но после замены выяснилось, что лампа не совсем исправна.

Atlanta ATH-2701

К слову, лампа довольно интересная: и внешне, и в плане функционала. Вот только к сожалению, качество изготовления (по крайней мере у этого экземпляра) оставило желать лучшего. Во-первых, у лампы часть светодиодов адово мерцала, а часть не горела вовсе. Что в принципе-то светодиодам присуще, и лечится элементарной заменой (при этом не помешало бы проверить, почему умерли предыдущие).

А вот вторая проблема была куда серьезнее. При попытке изменить яркость лампы, она вела себя совершенно непредсказуемо: сама включалась и выключалась, яркость резко менялась, и вообще творилось полное безобразие. И эту проблему уже так просто исправить было нельзя. Почему? Об этом ниже.

Итак, разобрав лампу (открутив 4 шурупа в нижней части, которые прячутся под приклеенными резиновыми ножками) стало понятно что исправить здесь что-то в плане управления режимами довольно затруднительно.

За сенсорное управление отвечает микросхема SGL8022W. Вообще, это полноценный контроллер светодиода, с сенсорным управлением и регулировкой яркости. И по этой микросхеме есть отдельный обзор. Но в данном случае, дело не в ней. Между этой микросхемой и транзисторным ключом, управляющим светодиодами, есть еще одна микросхема – это бескорпусный чип, залитый компаундом. Этот чип обрабатывает и сигнал с SGL8022W, и с ИК сенсора в верхней части лампы. И он же управляет светодиодами. По понятным причинам, заменить его не представляется возможным.

С таким диагнозом дорога у лампы одна – на свалку. Но светильник-то вполне симпатичный, и выбрасывать его просто жалко. Потому заказчику и было предложено дать лампе новую жизнь. На что он без колебаний согласился.

Итак, небольшое техническое задание с комментариями:

  • Управление лампой: сенсорное. ИК датчик было решено убрать. Одной кнопки вполне достаточно, а лишнее потребление совершенно ни к чему. Принцип управления следующий: кратковременное касание плавно включает и выключает лампу, длительное удержание переключает режимы. Но так же предусмотрен вариант, когда контроллера сенсорной кнопки нет в наличии. Без переделок можно будет поставить обычную тактовую кнопку, без фиксации.
  • Режимы работы: псевдослучайная генерация цвета (так называемый режим лампы настроения), постоянная смена цвета по кольцу и замораживание выбранного цвета.
  • Регулировка яркости. Дабы не перегружать одну единственную кнопку функционалом, было принято решение сделать два режима: ночник и полная яркость. Переключатель будет использоваться штатный, раньше он отключал ИК датчик лампы.
  • Минимальное потребление в выключенном состоянии. Так как лампа может питаться от аккумулятора, то это очень важный пункт. Кстати, аккумулятор был оставлен свинцово-кислотный, так как заказчик за его замену все же заплатил. Зарядное устройство штатное, схема подключения к аккумулятору такая же.

С задачами определились, теперь о элементной базе. Для управления будет применен контроллер сенсорной кнопки – TTP223. Довольно интересная микросхема, о ней так же можно почитать отдельно. Микроконтроллер – ATmega8A в корпусе TQFP. Если быть объективным, то данный контроллер избыточен для такой задачи. Но как это часто бывает, выбирается то, чего больше в наличии. А этих контроллеров у меня гораздо больше, чем тех же ATtiny13. Для управления светодиодами используем транзисторы с управлением логическим уровнем – IRLML0030. Светодиоды RGB, в корпусе 5050, с общим анодом.

С задачами определились, схема есть, разбираем лампу дальше.

Ссылка на основную публикацию