понедельник, 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 светодиодом с помощью других микроконтроллеров, у которых есть ШИМ.