Главная » Световые эффекты
Призовой фонд
на май 2017 г.
1. Тестер компонентов MG328
Паяльник
2. Осциллограф DSO138
Паяльник
3. Регулируемый паяльник 60 Вт
Паяльник
4. 100 руб.
От пользователей

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

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

Скачать список элементов (PDF)

Прикрепленные файлы:

Теги:

Опубликована: 0 4
Я собрал 0 5
x

Оценить статью

  • Техническая грамотность
  • Актуальность материала
  • Изложение материала
  • Полезность устройства
  • Повторяемость устройства
  • Орфография
0

Средний балл статьи: 5 Проголосовало: 5 чел.

Комментарии (10) | Я собрал (0) | Подписаться

0
Mrshilov #
Резисторы R5, R6 и R7 не нужны - они есть в самом драйвере ULN2003.
Ответить
0

[Автор]
Gauss #
Есть, но хуже они не делают, так моей душе спокойнее за МК
Ответить
0
HWman #
Ещё бы полные исходнички увидеть...
Ответить
0
fntms #
Красиво, особо впечатлила работа с цветами. Единственное неясно (возможно ошибаюсь) касательно функции задержки и объема памяти. Насколько помниться при компиляции функция компилируется один раз, а затем может быть вызвана сколько угодно раз с любыми входящими параметрами. Т.о. если написать исходник (например инициализацию переферии) и нажать компиляцию - получим какойто объем программы, далее впишем нашу функцию - программа увеличится на объем функции+возможно команду перехода (если компилятор решит вписать функцию отдельно), емли в исходник продолжать вписывать нашу функцию - объем программы быдит увелисиваться на команду перехода + возможные предшествующие перемещения переменных (чтоб их могла принять функция) т.е. незначительно по сравнению с пераым вписыванием функции. for - тоже своего рода функция, которая также вызывается и имеет предшествующие перемещение переменых. Т.о. объем неоюходимой памяти++). В общем нужно взять конкретный компилятор и проверить. Спасибо за внимание)
Ответить
+1

[Автор]
Gauss #
Тут в статье не совсем корректно получился код почему-то (возможно проблема не на моей стороне, т.к. несколько раз так было по разным статьям). С большего вы правы во многом. Просто ситуация если в задержку _delay_ms( ); в скобки вписать переменную, например time, то объем памяти в AS4 возрастает до килобайт, если просто через for нужное количество раз вызывать задержку _delay_ms( 1), то объем уменьшается до нормального. Это как вариант. Может в других компиляторах нет такой проблемы с переменной в скобках функции задержки
Ответить
0
fntms #
Видать какие то "индивидуальные особенности" компилятора, в code vision такого не замечалось, когда то на attiny2313 производил форматный вывод через UART, там сама функция printf забрала около 800 байт, а последующие ее вызовы забирали понемногу. Еще вопрос если позволите не может ли быть это из-за того что Вы пишите _delay_ms, а не delay_ms (в смысле без подчеркивания перед словом delay)?
Ответить
0

[Автор]
Gauss #
Просто в AS нет функции delay_ms (вызов в таком виде выдаст ошибку), только можно вызывать функцию задержки в виде _delay_ms. В контроллерах пожирнее вообще все такие задержки можно не использовать (если их много), а использовать операционную систему, RTOS какой-нибудь
Ответить
0
Tig #
Еще бы сделать красивую подставку, был бы девайс офигенный
Ответить
0

[Автор]
Gauss #
Тут промашка. Будет время, надо будет организовать из старой родной (поменять мозги подсветки)
Ответить
0
Петр Дядищев #
Можно Вас просить выложить полный исходный код программы? Я только начинаю разбираться с микроконтроллерами и работаю с Arduino. Не получилось из двух фрагментов собрать рабочий вариант программы.
Ответить
Добавить комментарий
Имя:
E-mail:
не публикуется
Текст:
Защита от спама:
В чем измеряется электрическая мощность?
Файлы:
 
Для выбора нескольких файлов использйте CTRL

Набор для сборки - LED лампа
Набор для сборки - LED лампа
Модуль измерения тока на ACS712 (30А) Тестер ESR, полупроводников, резисторов, индуктивностей
вверх