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

Приветствую всех. Однажды приглянулся мне стеклянный шар, который в темноте испускает свет, накопленный за день, да и к тому же в подставке к нему была 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 происходит перебрасывание из основного бесконечного цикла со световым эффектом в другой пустой бесконечный цикл, повторное нажатие кнопки перебрасывает выполнение программы обратно в основной бесконечный цикл. Простенько и сердито.

 // задержка в миллисекундах (функция для экономии памяти) void delay_ms(unsigned int time_ms) { register unsigned int i;    for(i = 0; i < time_ms; i++)     {   	_delay_ms(1);            } }

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

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

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

 int main(void) { 	cli();                                  // запретить прерывания глобально      // настройка порта 	DDRB  = (1     n)   red   --; else temp = 3; }                               if (temp==3) {if (blue  < pwm-n)   blue  ++; else temp = 4; }   if (temp==4) {if (green >     n)   green --; else temp = 5; }   if (temp==5) {if (red   < pwm-n)   red   ++; else temp = 6; }   if (temp==6) {if (blue  >     n)   blue  --; else {temp = 1;   if (s==1) {if (n <  pwm/2)   n ++; else s = 2;}  // увеличивается яркость цветов до белого if (s==2) {if (n >      0)   n --; else s = 1;}  // уменьшается яркость до полной насыщенности  }}    delay_ms(time);  	  if (k==1) {break;}    } // конец while(1)    while (2)                                   // режим при нажатии кнопки - стоп, цвета не изменяются больше, фиксируется текущий { if (k==0) {goto begin;} } // конец while(2)     } // конец main

Переменная 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:

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

Список радиоэлементов

Обозначение Тип Номинал Количество Примечание Магазин Мой блокнот
IC1 МК AVR 8-бит ATtiny13A 1
IC2 Составной транзистор ULN2003 1
IC3 DC/DC импульсный конвертер MC34063A 1
VD1 Диод Шоттки 1N5819 1
R2 Переменный резистор 10 кОм 1
R1, R3, R5-R7 Резистор 240 Ом 5
R4 Резистор 10 кОм 1
R8 Резистор 12 кОм 1
R9 Резистор 1 кОм 1
R10 Резистор 1.5 кОм 1
R11 Резистор 180 Ом 1
R12 Резистор 0.25 Ом 1 Можно подбором нескольких в паралель
C1, C3, C7 Конденсатор 100 нФ 3
С2 Электролитический конденсатор 10 мкФ 1
С4 Конденсатор 590 пФ 1
C5, C8 Электролитический конденсатор 1000 мкФ 2
С6 Электролитический конденсатор 100 мкФ 1
L1 Дроссель 100 мкГн 1
S1, S2 Тактовая кнопка TC-A109 2
RGB светодиодная лента 1