Домой / Видео / Rgb светодиоды – разбор схемы управления

Rgb светодиоды – разбор схемы управления

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

Как формируется цвет при помощи светодиодов.

Начнем с самого начала — определимся, как формируется цвет, вообще, в жизни (все знают, но на всякий случай …). Любой оттенок цвета формируется при помощи трех основных цветов. В нашем случае, когда цвет формируют источники света (аддитивный синтез) – это:
— R red красный
— G green зеленый
— B blue синий

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

Соответственно, для того чтобы светильник смог сформировать любой оттенок цвета, он тоже должен иметь, как минимум, три источника основных цветов. На практике так и есть. Например, любой RGB-светодиод – это, по факту, три отдельных светодиода (излучающих кристалла) в одном корпусе.

Для управления RGB-светодиодом микроконтроллер должен отдельно управлять каждым из трех основных цветов и иметь три отдельных выхода для каждого цвета.

Управляя светодиодами при помощи цифрового сигнала (включен/отключен) можно получить всего 7 цветов:
— три основных цвета (когда засвечен только один основной цвет)
— три составных цвета (когда засвечено по два основных цвета)
— белый цвет (засвечены все три основных цвета)

Для того чтобы получить множество цветовых оттенков, нужно управлять интенсивностью свечения каждого из основных цветов. Для управления интенсивностью свечения применяется широтно-импульсная модуляции цифрового сигнала (ШИМ или PWM). Изменяя скважность сигнала, для глаза создается иллюзия изменения яркости свечения светодиода. Чтобы глаз не замечал переключений светодиода, частота ШИМ-сигнала должна быть не менее 50-60Гц.

Так как в светильнике три источника излучения, соответственно, светильником нужно управлять тремя ШИМ-сигналами R, G, B. Каждый уровень ШИМ (и яркость светильника) – это определенное значение скважности сигнала.

Чаще всего значение скважности задается числом размером в байт – 8 бит (и мы будет использовать байт). Это 256 градаций каждого из основных цветов и 256*256*256=16777213 оттенков цветов вообще. На самом деле — это не совсем так – ниже я расскажу почему.

Из вышесказанного приходим к тому, что МК должен для светодиодного светильника формировать три ШИМ-сигнала частотой выше 60 Гц и с разрешающей способностью 256 значений (8 бит).

Применяя микроконтроллеры AVR (как, впрочем, и любые другие) – это не является проблемой, так как в большинстве из них есть достаточное количество аппаратных 8-ми битных ШИМ формирователей (таймеров), которые минимально расходуя ресурсы МК могут обеспечить любую частоту формирования ШИМ, вплоть до десятков килогерц. В случае применения программных формирователей ШИМ – количество таких формирователей можно увеличить до количества свободных ножек у МК (частота формирования ШИМ, в этом случае, возможна до нескольких килогерц).

Параметры регулирования LED-светильника.

Определимся с параметрами цвета, которые нам-бы хотелось изменять. Раз мы имеем три значения скважности для основных цветов R, G, B, логично было-бы регулировать именно эти три параметра — то есть интенсивности красной, зеленой и синей составляющей цвета. На практике — это не очень правильный подход, так как не позволяет комфортно выбрать цвет нашего светильника. Например, для того чтобы сделать яркость светильника меньше оставив цвет свечения прежним. Нужно провернуть сразу три регулятора, еще и на разный угол. Фактически, каждое изменение (подстройка) нашего светильника будет выглядеть как настройка его с нуля. Гораздо естественней регулировать яркость (или какой либо другой параметр) одним регулятором.

Вообще, существует множество систем регулирования (выбора цвета) для различных применений

Система RGB — это одна из них, с тремя регуляторами для каждого из основных цветов, как описано выше.

Системы XYZ , LAB и другие, нам не очень подходят.

Наиболее естественно изменяет (задает) параметры освещения — система HS B (и подобные ей HSL, HSV). В HSB палитра цветов формируется путем установки различных значений базовых параметров:

Hue (оттенок цвета). Задается в градусах от 0 до 360. 0 – красный цвет. 120 – зеленый, 240 – синий. Все что между ними – смешение основных цветов.
Мы будем использовать значение Hue размером в байт (от 0 до 255) .
0 – красный цвет. 85 – зеленый, 170 – синий.

Saturation (насыщенность). Задается в процентах от 0 до 100. 100 – это максимальная насыщенность цвета. При уменьшении к нулю – это потеря цвета вплоть до серого.
Мы будем использовать значение Saturation размером в байт (от 0 до 255).

Brightness (яркость). Задается в процентах от 0 до 100. 100 – это максимальная яркость цвета (но не белый цвет!). При уменьшении к нулю – это потеря яркости вплоть до черного.
Мы будем использовать значение Brightness размером в байт (от 0 до 255).

Если использовать эту систему при регулировке цвета, то получается все очень удобно. Крутим один регулятор – меняем цветовой тон (оставаясь в той-же яркости), крутим другой – меняем яркость (не меняя цвета) – здорово! Но есть у системы и недостатки. Первый — храня значения в переменных размером в байт, мы теряем часть информации о цвете (например, для хранения всех возможных вариантов для цветового тона нужно 768 значений, а мы все это пытаемся уложить в 256 значений). Второй – все равно, в итоге, конечное значение должно быть в системе RGB для вывода ШИМ-сигналов на светодиоды. И третий – в случае, когда нужно будет еще какое либо преобразование – это будет гораздо сложнее сделать с системой HSB, чем с RGB.

В устройстве AAL я решил реализовать различные преобразования следующим образом:
1 Информация о цвете хранится в трех байтах R_ base, G_ base, B_ base (система RGB). Я назвал это значение базовым. Оно хранит информацию о цвете без потерь.
2 Для преобразований используется значение величины преобразования (сдвига) Shift размером в байт.
3 Нужное преобразование осуществляется в соответствующих процедурах, исходными данными для которых служат базовое значение цвета R_base, R_base, R_base и величина соответствующего преобразования Shift. На выходе мы получаем три значения в системе RGB (R_ shift, G_ shift, B_ shift ), которые выдаются на светодиоды в виде ШИМ-сигналов.

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

Реализация преобразований цвета в микроконтроллере.

Проблема реализации управления цветом в микроконтроллере заключается в том, что для подавляющего большинства преобразований требуется умножение байта на дробный коэффициент преобразования (число от 0 до 1).
Например, уменьшение яркости вдвое:
R_shift = R_base * 0,5
G_shift = G_base * 0,5
B_shift = B_base * 0,5

С целочисленным умножением в AVR-микроконтроллерах все прекрасно (8-ми битное умножение осуществляется одним оператором всего за 2 такта — до 10 миллионов умножений в секунду!), а вот если мы перейдем в систему чисел с плавающей запятой – это будет на пару порядков медленнее и очень громоздко. В случаях, где нужны будут быстрые пересчеты большого количества значений, микроконтроллер просто не будет успевать.
Еще хуже дело с делением (это как вариант уйти от дробного умножения) — аппаратного его просто нет. Программная реализация деления тоже довольно громоздка.

В идеале, все преобразования цвета желательно реализовать при помощи целочисленного умножения, сдвигов бит, сложения и вычитания. Деление вообще не желательно применять.
Вот этим мы сейчас и займемся!

Проблема умножения на дробный коэффициент решается очень просто! Если в качестве коэффициента использовать значение размером в байт (0 – 255), принимая максимальное значения байта (255) за единицу, то можно обойтись только целочисленным умножением.

0 ~ 0/255 = 0
10 ~ 10/255 = 0,04
128 ~ 128/255 = 0,5
255 ~ 255/255 = 1

Теперь, предыдущий пример будет выглядеть следующим образом:
R_shift = (R_base * 128) / 255
G_shift = (G_base * 128) / 255
B_shift = (B_base * 128) / 255

После умножения двух 8-ми битных значений (R_base*128) мы получаем 16-ти битный результат (два байта). Откидывая младший байт и используя только старший — мы осуществляем деление значения на 256.
Деля на 256 , вместо положенных 255 , мы вносим в результат небольшую погрешность. В нашем случае, когда результат используется для формирования яркости посредством ШИМ, погрешностью можно пренебречь, так как она не будет заметна для глаз.

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

Переходим к самим преобразованиям.

Напомню, в любом преобразовании участвуют:
— базовый цвет, заданный тремя переменными R_base, G_base, B_base (размер Byte)
— коэффициент преобразования Shift (размер Byte)

Результат:
— «сдвинутый» цвет, в виде трех значений R_shift, G_shift, B_shift (размер Byte)

Записи формул ниже могут показаться странными, но я их прописывал таким образом, чтобы, во-первых, было видно последовательность действий, во-вторых, максимально упростить действия, сводя все к 8-битному умножению, сложению, вычитанию и сдвигу бит.

Яркость (Brightness)

— самое простое преобразование.
При:
Shift=0 светодиод погашен
Shift=255 светодиод горит базовым цветом.
Все промежуточные значения Shift – это затемнение базового цвета.

R_shift = (R_base * Shift) / 256
G_shift = (G_base * Shift) / 256
B_shift = (B_base * Shift) / 256

* напоминаю, деление на 256 — это просто откидывание младшего байта результата целочисленного умножения 2-х байт.

Осветление (Tint)

— эта величина не входит в систему HSB, но ее удобно использовать в регулировках. Tint – это, своего рода продолжение регулировки яркости в белый цвет.
При:
Shift=0 – светодиод горит базовым цветом
Shift=255 – светодиод горит белым цветом
Все промежуточные значения Shift – это осветление базового цвета.

R_shift = (R_base*(255 — Shift)) / 256 + Shift
G_shift = (G_base*(255 — Shift)) / 256 + Shift
B_shift = (B_base *(255 — Shift)) / 256 + Shift

* коэффициент (255 — Shift) можно реализовать одним оператором – битовой инверсией (конечно, при условии, что Shift — это Byte|Char)

Светимость (Lightness)

— эта величина тоже не входит в систему HSB. Регулировка осуществляется от выключенного светодиода, через базовый цвет и к белому цвету.
При:
Shift=0 – светодиод погашен
Shift=128 – светодиод горит базовым цветом
Shift =255 – светодиод горит белым цветом.

Реализуется посредством двух предыдущих преобразований.
При Shift < 128 применяем Brightness c Shift(for Brightness) = Shift*2
При Shift >=128 применяем Tint c Shift(for Tint) = (Shift-128)*2

Насыщенность (Saturation)

— цветность — переход от серого к цветному
При:
Shift=0 – светодиод горит белым цветом с яркостью, равной среднему значению базового цвета
Shift=255 – светодиод горит базовым цветом
Все промежуточные значения Shift – это «потеря» цвета.

RGB_average= ((R_base + B_base)/2 + G_base) / 2

* правильней, конечно, так (R_base + G_base + B_base)/3, но придется делить на 3, а это сдвигом не сделаешь

R_shift = (R_base * Shift) / 256 + (RGB_average * (255 — Shift)) / 256
G_shift = (G_base * Shift) / 256 + (RGB_average * (255 — Shift)) / 256
B_shift = (B_base * Shift) / 256 + (RGB_average * (255 — Shift)) / 256

Изменение тона (Hue)

Круговое изменение оттенка цвета.
Сложное преобразование, которое отличается в каждой из трех зон значений Shift
К примеру, если базовый цвет красный, то при:
Shift=0 – светодиод светится красным
Shift=85 – светодиод светится зеленым
Shift=170 – светодиод светится синим
Shift=255 – светодиод снова светится красным

При Shift < 86:
Shift_a= Shift * 3
R_shift = (G_base * Shift_a) / 256 + (R_base * (255 — Shift_a)) / 256
G_shift = (B_base * Shift_a) / 256 + (G_base * (255 — Shift_a)) / 256
B_shift = (R_base * Shift_a) / 256 + (B_base * (255 — Shift_a)) / 256

При Shift > 85 and Shift < 171:
Shift_a= (Shift-85) * 3
R_shift = (B_base * Shift_a) / 256 + (G_base * (255 — Shift_a)) / 256
G_shift = (R_base * Shift_a) / 256 + (B_base * (255 — Shift_a)) / 256
B_shift = (G_base * Shift_a) / 256 + (R_base * (255 — Shift_a)) / 256

При Shift > 170:
Shift_a= (Shift-170) * 3
R_shift = (R_base * Shift_a) / 256 + (B_base * (255 — Shift_a)) / 256
G_shift = (G_base * Shift_a) / 256 + (R_base * (255 — Shift_a)) / 256
B_shift = (B_base * Shift_a) / 256 + (G_base * (255 — Shift_a)) / 256

Инверсия (Inversion)

— представляет собой переход от одного цвета к его инверсному варианту. Например, инверсный цвет для красного – это голубой.
Shift=0 – светодиод светится базовым цветом
Shift=128 – светодиод горит белым (серым) цветом – средняя точка инверсии
Shift=255 – светодиод светится цветом инверсным базовому
Все промежуточные значения Shift – это плавные переходы между цветами.

R_shift = ((255 — R_base) * Shift) / 256 + (R_base * (255 — Shift)) / 256
G_shift = ((255 — G_base) * Shift) / 256 + (G_base * (255 — Shift)) / 256
B_shift = ((255 — B_base) * Shift) / 256 + (B_base * (255 — Shift)) / 256

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

Осталась еще одна проблема, которую хотелось бы затронуть в разрезе этой статьи –

Нелинейность восприятия ШИМ человеческим глазом

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

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

То есть, если этот фактор не учитывать, то крутя условную ручку регулятора, мы все изменения получим за первую половину оборота, а вторая половина фактически не будет заметно изменять текущего состояния.

Именно из-за эффекта нелинейности я выше писал о том, что, по факту, 3х-байтный (24битный) цвет совсем не дает те 16 миллионов оттенков, как любят писать многие производители. Полноценных оттенков, в лучшем случае, будет на порядок меньше.

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

R_PWM = (R_shift * R_shift) / 256
G_PWM = (G_shift * G_shift) / 256
B_PWM = (B_shift * B_shift) / 256

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

Вот это, наверное, и все, о чем я Вам хотел рассказать по LED цвету. Все преобразования, описанные в статье, реализованы мною в устройстве AAL. Кроме того, я сделаю отдельный модуль Color в Демонстрацию алгоритмов на RGB-светодиоде и WS2812-пикселе можно посмотреть .

(Visited 10 683 times, 1 visits today)

Или подсветку с возможностью переключать разные цвета, поэтому тема LED драйверов очень актуальна. Предлагаемая схема такого устройства управляет RGB-светодиодами через Н-канальные МОП-транзисторы, которые позволяют контролировать светодиодные матрицы или лампы до 5 ампер на канал без применения теплоотводов.

Схема электрическая и описание

Во время тестирования контроллер подключался к 50 Вт на 12 В галогенным лампочкам, по одной на каждый канал. Температура МОСФЕТ транзисторов после 5 мин прогона составила чуть больше 50C. Теоретически общая нагрузка для всех трех каналов RGB не должна превышать 15 ампер.

Указанный транзистор STP36NF06L работает при низком напряжении на затворе. Вы можете использовать такие другие стандартные N-канальные полевые транзисторы, которые будут нормально работать при токах нагрузки до 5 ампер и не требовать слишком большого сигнала на входе для полного отпирания.

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

Вот один из вариантов реализации, который использует 20 светодиодов RGB типа Пиранья. Собрана лампа в коробе 25 х 50 х 1000 мм из алюминия. Позже она была приспособлена под настенную полку, чтобы осветить стол. Свет очень яркий и дает хорошее ровное освещение без какого-либо дополнительного рассеивателя.

На этом занятии мы будем использовать цифровые и аналоговые выходы с «широтно импульсной модуляцией» на плате Arduino для включения RGB светодиода с различными оттенками. Использование RGB LED ленты позволяет создать освещение интерьера с любым оттенком цвета. Расскажем про устройство и распиновку полноцветного (RGB) светодиода и рассмотрим директиву #define в языке C++.

Устройство и назначение RGB светодиода

Для отображения всей палитры оттенков вполне достаточно три цвета, используя RGB синтез (Red - красный, Green - зеленый, Blue - синий). RGB палитра используется не только в графических редакторах, но и в сайтостроении . Смешивая цвета в разной пропорции можно получить практически любой цвет. Преимущества RGB светодиодов в простоте конструкции, небольших габаритах и высоком КПД светоотдачи.

RGB светодиоды объединяют три кристалла разных цветов в одном корпусе. RGB LED имеет 4 вывода — один общий (анод или катод имеет самый длинный вывод) и три цветовых вывода. К каждому цветовому выходу следует подключать резистор. Кроме того, модуль RGB LED Arduino может сразу монтироваться на плате и иметь встроенные резисторы — этот вариант более удобный для занятий в кружке .

Фото. Распиновка RGB светодиода и модуль с RGB светодиодом для Ардуино

Распиновка RGB светодиода указана на фото выше. Заметим также, что для многих полноцветных светодиодов необходимы светорассеиватели, иначе будут видны составляющие цвета. Далее подключим RGB светодиод к Ардуино и заставим его светится всеми цветами радуги с помощью «широтно импульсной модуляции».

Управление RGB светодиодом на Ардуино

Аналоговые выходы на Ардуино используют «широтно импульсную модуляцию» для получения различной силы тока. Мы можем подавать на все три цветовых входа на светодиоде различное значение ШИМ-сигнала в диапазоне от 0 до 255, что позволит нам получить на RGB LED Arduino практически любой оттенок света.

Для занятия нам понадобятся следующие детали:

  • плата Arduino Uno / Arduino Nano / Arduino Mega;
  • макетная плата;
  • RGB светодиод;
  • 3 резистора 220 Ом;
  • провода «папа-мама».

Фото. Схема подключения RGB LED к Ардуино на макетной плате

Модуль «RGB светодиод» можно подключить напрямую к плате, без проводов и макетной платы. Подключите модуль с полноцветным RGB светодиодом к следующим пинам: Минус — GND, B — Pin13, G — Pin12, R — Pin11 (смотри первое фото). Если вы используете RGB LED (Light Emitting Diode), то подключите его по схеме на фото. После подключения модуля и сборки схемы на Ардуино загрузите скетч.

Скетч для мигания RGB светодиодом

#define RED 11 // Присваиваем имя RED для пина 11 #define GREEN 12 // Присваиваем имя GREEN для пина 12 #define BLUE 13 // Присваиваем имя BLUE для пина 13 void setup () { pinMode(RED, OUTPUT ); pinMode(GREEN, OUTPUT ); // Используем Pin12 для вывода pinMode(BLUE, OUTPUT ); // Используем Pin13 для вывода } void loop () { digitalWrite (RED, HIGH ); // Включаем красный свет digitalWrite (GREEN, LOW ); digitalWrite (BLUE, LOW ); delay (1000); digitalWrite (RED, LOW ); digitalWrite (GREEN, HIGH ); // Включаем зеленый свет digitalWrite (BLUE, LOW ); delay (1000); // Устанавливаем паузу для эффекта digitalWrite (RED, LOW ); digitalWrite (GREEN, LOW ); digitalWrite (BLUE, HIGH ); // Включаем синий свет delay (1000); // Устанавливаем паузу для эффекта }

Пояснения к коду:

  1. с помощью директивы #define мы заменили номер пинов 11, 12 и 13 на соответствующие имена RED , GREEN и BLUE . Это сделано для удобства, чтобы не запутаться в скетче и понимать какой цвет мы включаем;
  2. в процедуре void setup() мы назначили пины 11, 12 и 13, как выходы;
  3. в процедуре void loop() мы поочередно включаем все три цвета на RGB LED.
  4. Плавное управление RGB светодиодом

    Управление rgb светодиодом на Arduino можно сделать плавным, используя аналоговые выходы с «широтно импульсной модуляцией». Для этого цветовые входы на светодиоде необходимо подключить к аналоговым выходам, например, к пинам 11, 10 и 9. И подавать на них различные значения ШИМ (PWM) для различных оттенков. После подключения модуля с помощью проводов «папа-мама» загрузите скетч.

    Скетч для плавного мигания RGB светодиода

    #define RED 9 // Присваиваем имя RED для пина 9 #define GREEN 10 // Присваиваем имя GREEN для пина 10 #define BLUE 11 // Присваиваем имя BLUE для пина 11 void setup () { pinMode (RED, OUTPUT ); // Используем Pin9 для вывода pinMode (GREEN, OUTPUT ); // Используем Pin10 для вывода pinMode (BLUE, OUTPUT ); // Используем Pin11 для вывода } void loop () { analogWrite (RED, 50); // Включаем красный свет analogWrite (GREEN, 250); // Включаем зеленый свет analogWrite (BLUE, 150); // Включаем синий свет }

    Пояснения к коду:

    1. с помощью директивы #define мы заменили номер пинов 9, 10 и 11 на соответствующие имена RED , GREEN и BLUE . Это сделано для удобства, чтобы не запутаться в скетче и понимать какой цвет мы включаем;
    2. пины 11, 12 и 13 мы использовали, как аналоговые выходы analogWrite .

Теперь же разберемся с многоцветным светодиодом, который часто называют сокращенно: RGB-светодиод .

RGB — это аббревиатура, которая расшифровывается как: Red — красный, Green — зеленый, Blue — синий. То есть внутри этого устройства размещается сразу три отдельных светодиода. В зависимости от типа, RGB-светодиод может иметь общий катод или общий анод.

1. Смешение цветов

Чем RGB-светодиод, лучше трех обычных? Всё дело в свойстве нашего зрения смешивать свет от разных источников, размещенных близко друг к другу. Например, если мы поставим рядом синий и красный светодиоды, то на расстоянии несколько метров их свечение сольется, и глаз увидит одну фиолетовую точку. А если добавим еще и зеленый, то точка покажется нам белой. Именно так работают мониторы компьютеров, телевизоры и уличные экраны.

Матрица телевизора состоит из отдельно стоящих точек разных цветов. Если взять лупу и посмотреть через нее на включенный монитор, то эти точки можно легко увидеть. А вот на уличном экране точки размещаются не очень плотно, так что их можно различить невооруженным глазом. Но с расстояния несколько десятков метров эти точки неразличимы.

Получается, что чем плотнее друг к другу стоят разноцветные точки, тем меньшее расстояние требуется глазу чтобы смешивать эти цвета. Отсюда вывод: в отличие от трех отдельностоящих светодиодов, смешение цветов RGB-светодиода заметно уже на расстоянии 30-70 см. Кстати, еще лучше себя показывает RGB-светодиод с матовой линзой.

2. Подключение RGB-светодиода к Ардуино

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

В уроке мы используем RGB-светодиод с общим катодом, так что провод к земле будет только один.

Принципиальная схема

Внешний вид макета

3. Программа для управления RGB-светодиодом

Составим простую программу, которая будет по очереди зажигать каждый из трех цветов.

Const byte rPin = 3; const byte gPin = 5; const byte bPin = 6; void setup() { pinMode(rPin, OUTPUT); pinMode(gPin, OUTPUT); pinMode(bPin, OUTPUT); } void loop() { // гасим синий, зажигаем красный digitalWrite(bPin, LOW); digitalWrite(rPin, HIGH); delay(500); // гасим красный, зажигаем зеленый digitalWrite(rPin, LOW); digitalWrite(gPin, HIGH); delay(500); // гасим зеленый, зажигаем синий digitalWrite(gPin, LOW); digitalWrite(bPin, HIGH); delay(500); }

Загружаем программу на Ардуино и наблюдаем результат.

Немного оптимизируем программу: вместо переменных rPin, gPin и bPin применим массив. Это нам поможет в следующих заданиях.

Const byte rgbPins = {3,5,6}; void setup() { for(byte i=0; i<3; i++) pinMode(rgbPins[i], OUTPUT); } void loop() { digitalWrite(rgbPins, LOW); digitalWrite(rgbPins, HIGH); delay(500); digitalWrite(rgbPins, LOW); digitalWrite(rgbPins, HIGH); delay(500); digitalWrite(rgbPins, LOW); digitalWrite(rgbPins, HIGH); delay(500); }

4. Семь цветов радуги

Теперь попробуем зажигать одновременно по два цвета. Запрограммируем такую последовательность цветов:

  • красный
  • красный + зеленый = желтый
  • зеленый
  • зеленый + синий = голубой
  • синий
  • синий + красный = фиолетовый

Оранжевый цвет мы для упрощения опустили. Так что, получилось шесть цветов радуги 🙂

Const byte rgbPins = {3,5,6}; const byte rainbow = { {1,0,0}, // красный {1,1,0}, // жёлтый {0,1,0}, // зелёный {0,1,1}, // голубой {0,0,1}, // синий {1,0,1}, // фиолетовый }; void setup() { for(byte i=0; i<3; i++) pinMode(rgbPins[i], OUTPUT); } void loop() { // перебираем все шесть цветов for(int i=0; i<6; i++){ // перебираем три компоненты каждого из шести цветов for(int k=0; k<3; k++){ digitalWrite(rgbPins[k], rainbow[i][k]); } delay(1000); } }

В результате работы программы получается:

Your browser does not support the video tag.

5. Плавное изменение цвета

Мы не зря подключили RGB-светодиод к выводам 3, 5 и 6. Как известно, эти выводы позволяют генерировать ШИМ сигнал разной скважности. Другими словами, мы можем не просто включать или выключать светодиод, а управлять уровнем напряжения на нем. Делается это с помощью функции analogWrite .

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

Const byte rgbPins = {3,5,6}; int dim = 1; void setup() { for(byte i=0; i<3; i++){ pinMode(rgbPins[i], OUTPUT); } // начальное состояние - горит красный цвет analogWrite(rgbPins, 255); analogWrite(rgbPins, 0); analogWrite(rgbPins, 0); } void loop() { // гасим красный, параллельно разжигаем зеленый for(int i=255; i>=0; i--){ analogWrite(rgbPins, i/dim); analogWrite(rgbPins, (255-i)/dim); delay(10); } // гасим зеленый, параллельно разжигаем синий for(int i=255; i>=0; i--){ analogWrite(rgbPins, i/dim); analogWrite(rgbPins, (255-i)/dim); delay(10); } // гасим синий, параллельно разжигаем красный for(int i=255; i>=0; i--){ analogWrite(rgbPins, i/dim); analogWrite(rgbPins, (255-i)/dim); delay(10); } }

Переменная dim определяет яркость свечения. При dim = 1 имеем максимальную яркость.

Загружаем программу на Ардуино.

Your browser does not support the video tag.

Задания

  1. Индикатор температуры. Добавим в схему термистор и подключим его к аналоговому входу. Светодиод должен менять свой цвет в зависимости от температуры термистора. Чем ниже температура, тем более синий цвет, а чем выше, тем более красный.
  2. RGB лампа с регулятором. Добавим в схему три переменных резистора и подключим их к аналоговым входам. Программа должна непрерывно считывать значения резисторов и менять цвет соответствующей компоненты RGB-светодиода.

Мы не раз рассматривали разнообразные светодиоды, строение, использование и т.д. и т.п. Сегодня я хотел бы остановиться на одной из разновидностей светодиодов (если так можно говорить) - RGB светодиодах.

Что такое RGB светодиод и устройство


Соединение RGB диодов с ШИМ Altmega8

Аноды RGB светодиода подключаем к линиям 1,2,3 порта В, катоды соединяем с минусом. Чтобы получить разнообразные палитры цвета на аноды будем подавать ШИМ сигнал в определенной последовательности. В этом примере мы специально используем программный ШИМ, хотя на Atmega8 можно без проблем получить аппаратный ШИМ на 3 канала. Программный ШИМ можно использовать в случаях нехватки таймеров/счетчиков и по другим причинам. Для генерации ШИМ определенной частоты используем прерывание по переполнению 8-ми битного таймера Т0(TIMER0_OVF_vect). Так как предделитель не используем частота переполнения таймера будет равна 31250Гц. А если переменная "pwm_counter" считает до 163, то частота ШИМ будет равна 190 Hz. В обработчике прерываний исходя из значений в переменных pwm_r, pwm_g, pwm_b переключаются ножки порта В. Цветовые эффекты настраиваются с помощью функций, где задается время свечения светодиода. В тестовой программе сначала загораются красный, зеленый, синий, белый цвета, а потом начинается цикл с переходами цвета.

Программный код:

// Управление RGB светодиодом. Программный ШИМ

#include

#include

volatile char pwm_counter,pwm_r,pwm_g,pwm_b;

// Прерывание по переполнению Т0

ISR (TIMER0_OVF_vect)

if (pwm_counter++ > 163)

pwm_counter = 0;

if (pwm_counter > pwm_r) PORTB |= (1 << PB1);

if (pwm_counter > pwm_g) PORTB |= (1 << PB2);

if (pwm_counter > pwm_b) PORTB |= (1 << PB3);

// Процедура задержки в микросекундах

void delay_us(unsigned char time_us)

{ register unsigned char i;

for (i = 0; i < time_us; i++) // 4 цикла

{ asm (" PUSH R0 "); // 2 цикла

asm (" POP R0 "); // 2 цикла

// 8 циклов = 1 us для 8MHz

// Процедура задержки в миллисекундах

void delay_ms(unsigned int time_ms)

{ register unsigned int i;

for (i = 0; i < time_ms; i++)

{ delay_us(250);

// Красный цвет

void red (unsigned int time)

for (char a = 0; a < 165; a++)

pwm_r = 164 - a; //увеличение

for (char a = 0; a < 165; a++)

pwm_r = a; //уменьшение

// Зеленый цвет

void green (unsigned int time)

for (char a = 0; a < 165; a++)

pwm_g = 164 - a;

for (char a = 0; a < 165; a++)

// Синий цвет

void blue (unsigned int time)

for (char a = 0; a < 165; a++)

pwm_b = 164 - a;

for (char a = 0; a < 165; a++)

// Белый цвет

void white (unsigned int time)

for (char a = 0; a < 165; a++)

pwm_r = 164 - a;

pwm_g = 164 - a;

pwm_b = 164 - a;

for (char a = 0; a < 165; a++)

// Переход цветa

void rgb (unsigned int time)

for (char a = 0; a < 165; a++)

pwm_b = 164 - a;

for (char a = 0; a < 165; a++)