понедельник, 27 мая 2019 г.

Управляем RGB-светодиодом с помощью Arduino nano

Недавно я написал о том, как подключить rgb-светодиод к Arduino nano. Теперь же, немного с ним поигравшись, я решил поделиться алгоритмом управления светодиодом.



В предыдущей статье я привел пример кода со статическими цветами из палитры RGB, в этой хочу показать, как управлять светодиодом, чтоб цвета динамически плавно переливались и при этом не менялась яркость свечения. Как и раньше мы будем использовать аппаратный ШИМ, да и схема подключения не поменялась.

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



Это скрин Arduino IDE с готовым скетчем. Как видите, есть три цикла по 255 итераций каждый. Каждая итерация разделена задержкой в 50 миллисекунд. Дайте подробно разберем один цикл.

for (int i0 = 0; i0 <= 255; i0++){
analogWrite(red1, 255);
analogWrite(green1, 0+i0);
analogWrite(blue1, 255-i0);
delay(50);
  }

Поскольку наш светодиод с общим анодом, то для того, чтоб он светился, нужно подать минус на катод, тоесть шиму передаем значение 0. Красный у нас полностью выключен, так как ШИМ на него 255. Так же выключен синий, ибо шим туда тоже 255. Зеленый с параметром шима 0 светится на максимальной мощности.
При следующей итерации переменная i0 принимает значение 1, это значение добавляется к параметру шима для зеленого и он принимает значение 1, тоесть светит чуть тусклее. При этом в следующей строке эта же переменная отнимается от параметра шима синего светодиода, он начинает светится. При каждом прохождении цикла переменная i0 увеличивается на единицу, тоесть зеленый светится всё тусклее, а синий всё ярче. И так пока i0 не достигнет значения 255 - тогда зеленый будет полностью выключен, а синий будет гореть в полную мощность.
Поскольку частота микроконтроллера 16 мегагерц, то прохождение цикла будет очень быстрым. Дабы его замедлить в конце каждой итерации добавлена задержка на 50 миллисекунд в виде стандартного ардуиновского delay.
Из цикла мы выходим с выключенными красным и зеленым светодиодами и включенным синим.

В следующем цикле учтено состояние выхода из предыдущего цикла, тоесть красный и зеленый потушены, горит синий. Только теперь мы будем зажигать вместе с синим красный, а зеленый оставим в покое. Я сделал переменную i для каждого цикла отдельной, хоть она и локальная.
В следующем цикле мы тушим красный и зажигаем зеленый. За счет того, что красный и зеленый при равных пропорциях дают желтый - его мы и будем наблюдать в средине цикла.
После прохождения третьего цикла возвращаемся к первому циклу, в который войдем с горящим зеленым.

Этот код для RGB-светодиода не учитывает всю палитру цветов, ибо используются одновременно только два из них. Зато в нем реализована постоянная яркость светодиода за счет одинаковой суммы всех напряжений на светодиоде. Например, чтобы зажечь белый с той же яркостью, что и в этом коде, параметр шима для трех цветов должен быть 85, дабы в сумме получилось 255.

Для комнаты этого алгоритма вполне достаточно и с его помощью можно управлять не только одним светодиодом, но и использовать RGB-ленту, например. В дальнейшем я покажу, как можно управлять rgb светодиодом с помощью других микроконтроллеров, у которых есть ШИМ.

среда, 15 мая 2019 г.

Arduino nano и RGB-светодиод с общим анодом

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



На фото выше представлены два светодиода, один обычный, второй rgb. Как видим, у ргб 4 ноги, это обусловлено тем, что, по сути, RGB-светодиод - это три светодиода в одном корпусе: красный, зеленый и синий (Red, Gren, Blue). Общий анод и по одному катоду на три цвета. Давайте подключим наш светодиод к ардуино нано и для начала мигнем по очереди тремя цветами. Посмотрим как подключить RGB светодиод с общим анодом к ардуино.



На схеме я изобразил наш RGB-светодиод в виде трех отдельных светодиодов, соединенных вместе анодами. Этот совместный анод подсоединяем на плюс питания, через катоды будем управлять свечением, их подключаем к выводам ардуино.
На схеме я не указал резисторы, их можно подключить как на каждый анод отдельно, так и один резистор на катод. Я подключил три резистора по 240 Ом между каждым катодом и выводом ардуины. Собрал все на макетной плате, получилось как-то вот так.



Электрическая часть схемы закончилась, переходим к программной. Вся суть нашей электрической части в общем аноде - на катоды нам нужно подавать минус. То есть, конфигурируем вывод ардуины в качестве выхода, устанавливаем на нем низкое состояние (логический ноль) - светодиод светится. При высоком состоянии (логическая единица) светодиод не светится. Поскольку мы управляем яркостью свечения с помощью ШИМа, то все расчеты для высчитывания яркости придется оборачивать обратно пропорционально. ШИМ может принять одно из 256 значений - от 0 до 255 (потому как регистр восьмибитный). Для того, чтоб зажечь светодиод - нужен 0. Для того, чтоб потушить - 255. Напишем скетч для поочередного мигания тремя цветами нашего RGB-светодиода.



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

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