Лампа настроения не работает
Романтичная лампа своими руками.
Автор: Глебов Эдуард
Опубликовано 06.06.2013
Создано при помощи КотоРед.
Всё началось с того, что в этом году я решил на все праздники дарить подарки, сделанные своими руками… Дело было феврале и близился самый трудный день в году для многих мужчин – 8-е марта ))). Я, как обычно, полез в интернет за вдохновением, и первым делом на глаза мне попался, конечно же «Радиокот». А уже оттуда меня занесло на сайт одного из участников форума, где наткнулся я на интересную и очень простую вещицу. Название ей «Лампа настроения на ATtiny13». Это такой светодиодный RGB светильник, в котором цвет плавно меняется от одного к другому совершенно хаотичным образом. Зрелище довольно красивое и местами даже романтичное…. «Вот оно!»,- подумал я. Самое то: Конструкция электронная и женской половине должна понравиться, а такое, надо сказать, бывает ооочень редко(электроника, которая нравится). Тогда решено: «За дело!».
Схема достаточно тривиальна и известна на просторах тырнета. Но что меня привлекло именно к этой вариации – это использование, наверное, самого дешёвого МК в арсенале Atmel. На чипе собран трехканальный ШИМ, к выходам которого, через полевые транзисторы, подключен мощный RGB светодиод. Я взял 1-ваттный, потому что он у меня был, но можно более мощный, главное правильно подобрать транзисторы по току. К примеру, на 3 ватта можно смело ставить с теми же номиналами в схеме. Резисторы нужно подбирать так, чтобы в цепях трёх кристаллов проходил одинаковый ток. Если этого не сделать, то какого-то цвета всегда будет больше. У меня, например, сначала чаще всего появлялись оттенки розового, поэтому я увеличил сопротивление резистора на красный цвет до 13 оМ.
А дальше началось самое интересное: поиски подходящего корпуса.… Которые собственно закончились полным крахом. Делать нечего, мы же не хуже китайцев, руками тоже умеем работать. Для начала берём подходящую стеклянную емкость. Я выбрал самую простую вазу наподобие большого стакана, абсолютно прозрачную.
Сверлим в ней отверстие снизу, для выхода шнура питания. И начинаем творить…
Первым делом необходимо сделать поверхность матовой. Самый простой способ — использовать специальную матирующую пасту или воспользоваться подобными услугами у стекольщиков (обычно с пескоструйным аппаратом). Но т.к. ни того ни другого у нас в городе не нашлось, пришлось делать всё весьма изощрённым способом — наждачной бумагой. В ручную это заняло бы уйму времени и сил, и я придумал небольшую автоматизацию из того что было под рукой. Взял отвёртку с резиновой ручкой, вставил в подходящую пластиковую трубку (внутри которой были продольные насечки), и на трубку накрутил наждачную бумагу, закрепив изолентой. Вставив эту конструкцию в дрель, получаем «шлифовальный автомат». Тут главное правильно подобрать зернистость (мне понравилась «320») и двигаться равномерно, не задерживаясь долго на одном месте, иначе обработка получится неравномерной. Не забываем о технике безопасности: пользуемся респиратором, очками, и желательно вне дома, чтобы близкие не пострадали от стеклянной пыли. Но я советую всё-таки воспользоваться сторонними услугами.
После матирования вазы, наклеиваем, заранее подготовленные трафареты бабочек на самоклеящейся бумаге. Добавляем рельефный рисунок с помощью клеевого пистолета (я использовал прозрачные стержни). И в самом конце всё это дело красим. Я использовал обычную аэрозольную краску (акриловую) в баллончиках, белого цвета. Белую, потому что при включении лампы она становится практически прозрачной и светится нужным светом. Может для стекла существуют какие-то специальные краски, потому как впоследствии оказалось, что краска плохо держится на стекле. Или может, я плохо обезжирил поверхность. Нужно красить всю вазу целиком без стыков, тогда получается довольно крепко, если не царапать. Ваза как бы обтянута плёнкой из краски.
После покраски мне показалось, что получилось как-то бледно, когда лампа в выключенном состоянии. И я добавил искусственных цветов, воспользовавшись клеевым пистолетом. Лучше перед приклеиванием немного зачистить стекло от краски: цветки с термоклеем легко откалупливают краску, но мёртво держатся на чистом стекле.
Когда наконец всё готово, ставим внутренности на своё законное место, не забыв подключить питание (я использовал старый зарядник от телефона с напряжением 5 вольт). Печатную плату я делал под определённый радиатор (нашёл круглый и в корпус идеально подходт), ведь, как известно, мощные светодиоды нуждаются в хорошем отводе тепла. Особо не заморачивался с расположением деталей, места и так предостаточно. Детали ставил, что под руку попались. Если ставить SMD и расположить более компактно, получится весьма миниатюрно. Светодиод припаял с обратной стороны, а в плате просверлил отверстие для него. Печатная плата придавливает диод к радиатору через теплопроводную пасту или лучше прокладку. Отверстие должно быть больше диаметра линзы диода, иначе можно её случайно выдавить из корпуса, когда будете затягивать болты.
Контроллер прошивал до впаивания в плату, прошивка и исходники по просьбе автора остались на его сайте по этой ссылке: https://trolsoft.ru/sch/moodlamp/ Фьюзы в CVAVR ниже:
И в самом конце, лампу я решил загерметизировать от влаги и любопытных глаз. Для этого взял обычную пластиковую крышку от 3-х литровой банки и надел сверху, подошла, как ни странно на 100%. Видно на самой первой фотке в статье.
Вот собственно и всё:
На данный момент собрано уже 3 таких лампы, и все три подарены. В архиве моя печатка и схема. По ссылкам несколько видео работы лампы:
Качество не очень и снято днём, ночью выглядит гораздо эффектнее и цвета более яркие…
Источник
RGB светильник или лампа настроения на ATtiny13
На носу Новый год, праздничное настроение, разноцветные огни. И конечно нужно задуматься о новогодних подарках для своих близких. Вы уже придумали что подарить? Я долго размышлял над этим и решил что лучший подарок, это подарок сделанный своими руками. В результате чего была затеяна данная конструкция RGB светильника. Её можно использовать везде и как угодно, она интуитивно понятна и проста, а значит понравится любому человеку. Функция светильника очень проста: освещать окружающий интерьер различными меняющимися цветами. Для этой нехитрой задачи пойдёт практически любой микроконтроллер, но я остановился на AVR микроконтроллере Attiny13, так как он достаточно распространён, дешёв и у меня его много. В качестве светодиода я использовал матовый RGB светодиод с четырьмя выводами, с общим катодом.
Принципиальная схема RGB светильника:
На схеме указано подключение RGB светодиода с общим анодом.
Но во время разработки я наткнулся на одну неприятность, у микроконтроллера Attiny13 всего лишь два аппаратных ШИМ выхода на таймере 0 и на этом всё. Ох, а нужно ведь три ШИМа, на три цвета. И засада, таймер в МК один. Поэтому я решил поизвращаться и реализовал три программных ШИМа на таймере 0, получилось очень даже хорошо, но, данный метод плох тем что частота этого ШИМа получается низка. И чтобы не было видно мерцаний светодиода пришлось запускать микроконтроллер на частоте 9,6 МГц. Прошивку я писал в среде BASCOM-AVR. Главное что всё работает!
Питание RGB светильника осуществляется от двух мизинчиковых батареек AA типа по 1.5 вольт каждая. В сумме получается 3 вольта, то что нужно устройству. Для удобной эксплуатации светильника батарейки вставляются в специальный для них отсек, который я приобрёл в радио магазине. Светодиод нужно использовать RGB с четырьмя выводами, общим выводом может быть как анод так и катод, от этого поменяется только подключение светодиода по схеме, плата и прошивка. Микроконтроллер Attiny13 можно использовать с любыми буквенными индексами, в любом корпусе (желательно в DIP чтобы подходил на плату). Для установки микроконтроллера используйте панель DIP-8, это позволит быстро и удобно извлечь микроконтроллер из платы в случае замены или прошивки.
Прототип RGB светильника на макетной плате с механическими контактами:
Сам светильник я реализовал на круглой печатной плате диаметром 5 см. Плата сделана по ЛУТ технологии на стеклотекстолите, чтобы плату сделать абсолютно круглой я сначала её высверлил и обработал напильником по контуру окружности. Для наилучшего качества я рекомендую, сначала, перевести рисунок на квадратный кусок текстолита, протравить его в растворе хлорного железа или медного купороса и лишь потом, по контуру окружности рисунка, высверливать и подгонять, круглую плату. Рисунок печатной платы я делал в программе Sprint Layout 4.0, исходные файлы платы вы можете найти ниже.
T13RGBA.LAY — Файл печатной платы светильника под светодиод с общим анодом
T13RGBK.LAY — Файл печатной платы светильника под светодиод с общим катодом
В качестве корпуса всего светильника я решил использовать маленький круглый цветочный горшочек, собственно под него и делалась печатная плата.
RGB светильник без корпуса (плата и отсек для батареек):
Для работы светильника нужно прошить микроконтроллер соответствующей прошивкой, для этого вам потребуется программатор AVR микроконтроллеров. Программатор можно использовать практически любой, главное чтобы он поддерживал ISP режим и микроконтроллер Attiny13. Я написал две версии прошивки, одна для светодиода с общим анодом, другая для светодиода с общим катодом. Файлы прошивки и исходники в среде BASCOM-AVR вы можете найти ниже.
FWT13RGBA.HEX — Файл прошивки светильника под светодиод с общим анодом
FWT13RGBK.HEX — Файл прошивки светильника под светодиод с общим катодом
Не зависимо от файла, после прошивки нужно прошить соответствующие фьюз-биты указанные ниже.
Источник
Лампа настроения реагирующая на звук
Дата публикации: 21 июля 2015 .
Лампа настроения (mood lamp) — небольшая декоративная настольная лампа, которая периодически случайным образом плавно меняет свой цвет. В сети полно разных вариантов самодельных ламп настроения (в том числе и на AVR), но просто смена цвета случайным образом — это достаточно скучно. В этой статье я расскажу о том как сделать простую лампу настроения, которая реагирует на звук.
Идея
Итак, идея в том что бы снабдить привычную лампу настроения микрофоном, и заставить её менять цвет не просто случайным образом, а в зависимости от того что она «слышит» через этот микрофон. Лампа будет работать в трех режимах (режим переключается единственной кнопкой):
— Простой режим , или режим обычной лампы настроения. Лампа просто периодически случайным образом меняет цвет.
— Реакция на резкий зву к. В этом режиме лампа не меняет цвет самопроизвольно, а делает это только когда услышит резкий звук, вроде хлопка, громкого крика или легкого удара по корпусу ламы или столу.
— Анализ частоты звука . В этом режиме лампа меняет цвет в зависимости от частоты звука который она «слышит», то есть что-то типа цветомузыки.
Реализация
С идеей понятно, приступим к реализации. Для такой лампы понадобятся, как минимум, три вещи: яркий трехцветный светодиод — что бы светить, микрофон — что бы слышать, и микроконтроллер — что бы управлять всем этим хозяйством.
Светодиод
В качестве светодиода я использовал сверхъяркий трехцветный (RGB) светодиод мощностью 3Вт (по 1Вт на каждую из цветовых компонент). Сам светодиод установлен на алюминиевой пластине-радиаторе, и выглядит вот так:
Светит достаточно ярко и имеет широкий «угол обзора» — нет яркого пятна посредине.
К сожалению, подключить такой светодиод напрямую к ножкам микроконтроллера не получится, потому что тока ему нужно около 200Ма на канал, а, например, максимально допустимый ток через ножку контроллера ATMega8 — всего 40Ма. Поэтому на каждый канал светодиода я поставил по транзистору — контроллер открывает/закрывает транзистор, меняя напряжение на базе. А транзистор зажигает/тушит светодиод, ведь максимально допустимый ток транзистора целых 800Ма (для BC337), что с головой хватает что бы зажечь светодиод.
Микрофон
В качестве микрофона используется обычный электретный микрофон (капсюль), подключенный к АЦП микроконтроллера через усилительный каскад.
В принципе, можно было бы использовать цифровой микрофон, но на нашем радиорынке оказалось гораздо проще найти электретный микрофон.
Микроконтроллер
Здесь выбор казался вполне очевидным — 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.
Результат
Собственно результат, как и фото процесса изготовления, можно посмотреть на этом видео:
Источник