УПРАВЛЯЕМ RGB СВЕТОМ С ARDUINO

RGB светодиод или лента – очень крутая штука, ведь используя даже 8-ми битный ШИМ (0-255) мы можем получить 16.7 миллионов цветов и оттенков! Рассмотрим подключение светодиодов и лент к Arduino.

Светодиоды


Светодиоды можно питать от пинов Arduino, естественно через токоограничивающий резистор на 150-300 Ом (больше – меньше яркость). Для плавного управления яркостью каждого канала подключать нужно к ШИМ пинам (D3, D5, D6, D9, D10, D11 на Arduino Nano/UNO/Pro Mini). Светодиод с общим катодом подключается общей ногой на GND, с общим анодом – на VCC (т.е. на 5V).

Светодиодные ленты через драйвер


RGB светодиодные ленты обычно имеют общий анод, т.е. общий канал 12 Вольт.

Для управления цветом можно использовать так называемый LED amplifier (бывает RGB и RGBW). Купить на Aliexpress

Светодиодные ленты через транзисторы


Вместо драйвера можно использовать полевые транзисторы, схема вот такая:

Какие транзисторы? Вот мой список транзисторов в корпусах to220: IRF3704ZPBF, IRLB8743PBF, IRL2203NPBF, IRLB8748PBF, IRL8113PBF, IRL3803PBF, IRLB3813PBF, IRL3502PBF, IRL2505PBF, IRF3711PBF, IRL3713PBF, IRF3709ZPBF, AUIRL3705N, IRLB3034PBF, IRF3711ZPBF

В корпусах D-PAK: IRLR024NPBF, IRLR024NPBF, IRLR8726PBF, IRFR1205PBF, IRFR4105PBF, IRLR7807ZPBF, IRFR024NPBF, IRLR7821TRPBF, STD60N3LH5, IRLR3103TRPBF, IRLR8113TRPBF, IRLR8256PBF, IRLR2905ZPBF, IRLR2905PBF

Также можно распаять платку

БИБЛИОТЕКА GYVERRGB

Мощная библиотека для удобного управления RGB светодиодами и лентами для Arduino

  • 1530 значений для colorWheel
  • Работа в пространстве RGB
  • Работа в пространстве HSV
  • Установка цвета в формате HEX
  • Установка цветовой температуры
  • 16 предустановленных цветов
  • Настройка полярности ШИМ
  • Функция плавной смены цвета
  • Ограничение тока (по расчёту)
  • Регулировка общей яркости
  • Поддержание яркости LED ленты по мере разряда АКБ
  • Возможность управления 6-ю RGB диодами/лентами с одной Arduino (встроенный генератор ШИМ на ВСЕХ 20 пинах atmega328)
  • Режим с настройкой частоты ШИМ
  • Матрица коррекции LUT
  • Коррекция по минимальному сигналу ШИМ
  • CRT гамма-коррекция яркости

Поддерживаемые платформы: все Arduino (используются стандартные Wiring-функции)

ДОКУМЕНТАЦИЯ


// объявление
GRGB(uint8_t rpin, uint8_t gpin, uint8_t bpin);

// объявление с выбором режима генерации ШИМ (NORM_PWM / ANY_PWM)
// NORM_PWM - дефолтные ШИМ пины (3, 5, 6, 9, 10, 11 для UNO/NANO/MINI)
// ANY_PWM - любой пин делается ШИМ пином (частота ~150 Гц). Подробности в библиотеке GyverHacks
GRGB(uint8_t rpin, uint8_t gpin, uint8_t bpin, boolean pwmmode);

// NORMAL / REVERSE - направление ШИМ
// общий катод - NORMAL
// общий анод - REVERSE
void setDirection(boolean direction);

// установка ограничения по току: 
// numLeds - количество светодиодов
// vcc - напряжение питания в милливольтах
// maxCur - максимальный ток
void setMaxCurrent(uint16_t numLeds, float vcc, int maxCur);
                 
void setBrightness(byte bright);                     // установка яркости (0-255)
void constantBrightTick(int minVolts, int vcc);      // корректировка под напряжение питания
void gammaTick(int vcc);                             // корректировка красного цвета при падении напряжения питания

void setHEX(uint32_t color);                         // установка цвета в формате HEX (вида 0x808080 )
void setRGB(uint8_t r, uint8_t g, uint8_t b);        // установка цвета в пространстве RGB (каждый цвет 0-255)
void setHSV(uint8_t h, uint8_t s, uint8_t v);        // установка цвета в пространстве HSV (каждая велиична 0-255)
void setHSV_fast(uint8_t h, uint8_t s, uint8_t v);   // более быстрый, но менее красивый вариант предыдущей функции
void setKelvin(int16_t temperature);                 // установить цвет как температуру в Кельвинах (от 1000 до 10'000 - от красного к синему)
void colorWheel(int color);                          // установить цвет (0 - 1530). Максимально широкая палитра ярких цветов (смеси RGB)
 
// плавно изменить текущий цвет к новому за вермя fadeTime в миллисекундах
// для HEX цвета
void fadeTo(uint32_t newColor, uint16_t fadeTime);
 
// для R G B
void fadeTo(uint8_t new_r, uint8_t new_g, uint8_t new_b, uint16_t fadeTime);

ПРИМЕРЫ


/*
   Пример управления RGB светодиодом из набора готовых цветов
   Светодиод/мосфеты подключены к ЛЮБЫМ ПИНАМ
*/
// НЕ ЗАБУДЬ включить в самой библиотеке параметр ALLOW_ANYPWM

#include "GyverRGB.h"

GRGB diode1(2, 3, 4, ANY_PWM);    // куда подключены цвета (R, G, B)
GRGB diode2(6, 7, 8, ANY_PWM);    // куда подключены цвета (R, G, B)

byte H;

void setup() {

}

void loop() {  
  H++;
  diode2.setHSV(H, 255, 255); 
  diode1.setHSV(H, 255, 255);
  delay(20);  
}
/*
  Туточки демонстрируется работа сразу двух методов:
  setMaxCurrent и setBrightness
  Что происходит: яркость ленты регулируется потенциометром (пин А0)
  и ограничивается по току (расчётному)  
*/
#include "GyverRGB.h"
GRGB strip(3, 5, 6);  // куда подключены цвета (R, G, B)

void setup() {
  Serial.begin(9600);

  strip.setDirection(REVERSE);
  strip.setRGB(200, 180, 0);    // ставим жёлтый цвет
  delay(2000);                  // любуемся результатом 2 секунды

  // ограничиваем ток. Метод принимает в качестве аргументов:
  // количество светодиодов (тут 30)
  // напряжение питания в милливольтах (тут 12 вольт)
  // максимальный ток в миллиамперах (тут 50)
  // после вызова яркость ленты сразу упадёт до такой, при которой будет потребляться ~50 ма
  strip.setMaxCurrent(30, 12000, 50);
}

void loop() {
  // этот метод меняет общую яркость ленты, принимает 0-255 (что мы и делаем с аналог пина)
  // можно почувствовать, как яркость упирается в лимит по току! Чудесно
  strip.setBrightness(analogRead(0) / 4);
  delay(100);
}
/*
   Пример управления RGB светодиодом из набора готовых цветов
   Светодиод/мосфеты подключены к ШИМ пинам!
   Для УНО и НАНО это 3, 5, 6, 9, 10, 11
    _____
   /     \
  |       |
  |       |
  |_______|
   | | | |
   | | | |
   | | | |
     | | |
       |
   B G   R
*/

#include "GyverRGB.h"
GRGB diode(6, 5, 3);  // куда подключены цвета (R, G, B)

/*
  Доступные цвета для setColor
  WHITE
  SILVER
  GRAY
  BLACK
  RED
  MAROON
  YELLOW
  OLIVE
  LIME
  GREEN
  AQUA
  TEAL
  BLUE
  NAVY
  PINK
  PURPLE
*/

void setup() {

}

void loop() {
  diode.setHEX(RED);
  delay(1000);
  diode.setHEX(YELLOW);
  delay(1000);
  diode.setHEX(LIME);
  delay(1000);
  diode.setHEX(AQUA);
  delay(1000);
  diode.setHEX(PINK);
  delay(1000);  
}
// пример с установкой цвета как цветовой температуры в Кельвинах
// отправляем значение в Кельвинах в порт

#include "GyverRGB.h"
GRGB diode(6, 5, 3);  // куда подключены цвета (R, G, B)

void setup() {
  Serial.begin(9600);
}

void loop() {
  if (Serial.available()) {
    int buf = Serial.parseInt();
    Serial.println(buf);
    diode.setKelvin(buf);
  }
}
/*
   Демонстрация работы метода colorWheel, который
   устанавливает цвет по значениям 0-1530,
   делая плавный переход красный-зелёный-синий-красный
   Откройте монитор/плоттер для наглядного представления алгоритма
*/

#include "GyverRGB.h"
GRGB diode(5, 6, 9);  // куда подключены цвета (R, G, B)

void setup() {
  Serial.begin(9600);
}

void loop() {
  diode.colorWheel(map(analogRead(0), 0, 1023, 0, 1530));

  Serial.println(
    String(diode.showR) + " " +
    String(diode.showG) + " " +
    String(diode.showB));

  delay(20);
}
// скетч управляет лентой, поддерживая яркость по мере разряда аккумуляторов
// R1 ближе к Vin, R2 к GND
/*
  (12V)                 (GND)
    |                     |
    |--[ R1 ]--|--[ R2 ]--|
               |          |
              (A1)      (GND)
*/

#include "GyverRGB.h"
GRGB strip(3, 5, 6);  // куда подключены цвета (R, G, B)

#define R1 100700   // 100 ком
#define R2 9999     // 10 ком
float dividerCoef = (float)((R1 + R2) / R2);
int voltage;

void setup() {
  Serial.begin(9600);
  strip.setDirection(REVERSE);
  strip.setHEX(WHITE);
  delay(2000);    // задержка для оценки яркости
}

void loop() {
  // получить напряжение с пина А0 (делитель) и перевести в милливольты
  voltage = (float)analogRead(1) * 5 / 1.023 * dividerCoef;

  // данный метод поддерживает яркость такой, какой она была бы при напряжении
  // питания 9000 милливольт (9 вольт), сравнивая его с текущим напряжением voltage
  // таким образом по мере разряда АКБ от 12 до 9 вольт яркость остаётся постоянной
  strip.constantBrightTick(9000, voltage);

  // по мере разряда "едут" цвета, данный метод чуть чуть исправляет ситуацию
  strip.gammaTick(voltage);
  delay(20);
}
/*
   Пример управления RGB светодиодом плавная установка цвета
   Для УНО и НАНО это 3, 5, 6, 9, 10, 11
*/

#include "GyverRGB.h"
GRGB diode(6, 5, 3);  // куда подключены цвета (R, G, B)

/*
  Доступные цвета для fadeTo (HEX)
  WHITE   // белый
  SILVER  // серебро
  GRAY    // серый
  BLACK   // чёрный
  RED     // красный
  MAROON  // бордовый
  YELLOW  // жёлтый
  OLIVE   // олива
  LIME    // лайм
  GREEN   // зелёный
  AQUA    // аква
  TEAL    // цвет головы утки чирка https://odesign.ru/teal-color/
  BLUE    // голубой
  NAVY    // тёмно-синий
  PINK    // розовый
  PURPLE  // пурпурный
*/
void setup() {

}

void loop() {
  diode.fadeTo(RED, 500);
  diode.fadeTo(BLACK, 500);
  diode.fadeTo(LIME, 500);
  diode.fadeTo(BLACK, 500);
  diode.fadeTo(BLUE, 500);
  diode.fadeTo(BLACK, 500);
}
/*
   Пример управления цветом RGB светодиода одним потенциометром
   Потенциометр подключен к А0
   Светодиод/мосфеты подключены к ШИМ пинам!
   Для УНО и НАНО это 3, 5, 6, 9, 10, 11
*/
#include "GyverRGB.h"
GRGB diode(9, 10, 11);  // куда подключены цвета (R, G, B)

void setup() {
 // раскомментировать нужное
 /*
  // частота на пинах 5 и 6 - 31.4 кГц (влияет на millis() )
  TCCR0A |= _BV(WGM00);
  TCCR0B = TCCR0B & 0b11111000 | 0x01;
 */
 
 /*
  // частота на пинах 5 и 6 - 7.8 кГц (влияет на millis() )
  TCCR0A |= _BV(WGM00) | _BV(WGM01);
  TCCR0B = TCCR0B & 0b11111000 | 0x02;
 */
 
 /*
  // частота на пинах 9 и 10 - 31.4 кГц (влияет на servo)
  TCCR1B &= ~_BV(WGM12);
  TCCR1B = TCCR1B & 0b11111000 | 0x01;
 */
 
 /*
  // частота на пинах 9 и 10 - 7.8 кГц (влияет на servo)
  TCCR1B |= _BV(WGM12);
  TCCR1B = TCCR1B & 0b11111000 | 0x02;
 */
 
 /*
  // частота на пинах 3 и 11 - 31.4 кГц (влияет на tone() )
  TCCR2A |= _BV(WGM20);
  TCCR2B = TCCR2B & 0b11111000 | 0x01;
 */
 
 /*
  // частота на пинах 3 и 11 - 7.8 кГц (влияет на tone() )
  TCCR2A |= _BV(WGM20) | _BV(WGM21);
  TCCR2B = TCCR2B & 0b11111000 | 0x02;		
 */
}

void loop() {
  byte H = analogRead(0) / 4; // получаем 0-255

  // меняем только цвет. Яркость и насыщенность вручную
  diode.setHSV(H, 255, 255);
}
/*
   Пример управления RGB светодиодом в пространстве HSV
   (цвет, насыщенность, яркость).
   Потенциометры подключены к А0, А1 и А2
   Светодиод/мосфеты подключены к ШИМ пинам!
   Для УНО и НАНО это 3, 5, 6, 9, 10, 11
*/

#include "GyverRGB.h"
GRGB diode(6, 5, 3);  // куда подключены цвета (R, G, B)

void setup() {

}

void loop() {
  byte H = analogRead(0) / 4;
  byte S = analogRead(1) / 4;
  byte V = analogRead(2) / 4;
  diode.setHSV(H, S, V);
}
/*
   Пример управления RGB лентой в пространстве HSV одним потенциомтером
   Выход ШИМ инвертирован (255-0) для драйвера
   Потенциометр подключен к А0
   Драйвер подключен к ШИМ пинам!
   Для УНО и НАНО это 3, 5, 6, 9, 10, 11
*/

#include "GyverRGB.h"
GRGB diode(6, 5, 3);  // куда подключены цвета (R, G, B)

void setup() {
  diode.setDirection(REVERSE);  // NORMAL / REVERSE - направление ШИМ
        // общий катод - NORMAL
        // общий анод - REVERSE
}

void loop() {
  byte H = analogRead(0) / 4;
  diode.setHSV(H, 255, 255);
}
/*
  Простенький алгоритм "огня" - симуляция мерцаний пламени свечи/костра
  Откройте плоттер порта, чтобы посомтреть на случайность происходящего
*/

#include "GyverRGB.h"
GRGB strip(5, 6, 9);  // куда подключены цвета (R, G, B)

void setup() {
  Serial.begin(9600);
  strip.setDirection(REVERSE);
}

int hue, val;
boolean hueFlag;
float valK = 0.3;

void loop() {
  if (hueFlag) {
    hue += random(-1, 3);
    if (hue > random(12, 16)) hueFlag = false;
  } else {
    hue -= random(-1, 3);
    if (hue < random(0, 6)) hueFlag = true;
  }
  hue = constrain(hue, 3, 16);

  val = val * (1 - valK) + map(hue, 3, 16, 20, 255) * valK;

  Serial.println(String(hue) + " " + String(val));
  strip.setHSV(hue, 255, val);
  delay(random(10, 40));
}
#define SMOOTH_K 0.25     // коэффициент сглаживания
#define TIME_CHANGE 200   // период изменения огня
#define MIN_BRIGHT 30     // мин яркость (красный)
#define MAX_BRIGHT 255    // макс яркость (жёлтый)

#include "GyverRGB.h"
GRGB diode(5, 6, 9);  // куда подключены цвета (R, G, B)

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  randomSeed(analogRead(0));
  diode.setDirection(REVERSE);
}

float k = 0.25;
int val, rndVal;
uint32_t prevTime;

void loop() {
  if (millis() - prevTime > TIME_CHANGE) {
    rndVal = random(0, 13) * 10;
    prevTime = millis();
  }
  val = val * (1 - SMOOTH_K) + rndVal * SMOOTH_K;
  diode.colorWheel(val);
  diode.setBrightness(map(val, 0, 120, MIN_BRIGHT, MAX_BRIGHT));
  Serial.println(val);
  delay(40);
}
/*
   Пример управления RGB светодиодом в пространстве RGB
   (красный, зелёный, синий).
   Потенциометры подключены к А0, А1 и А2
   Светодиод/мосфеты подключены к ШИМ пинам!
   Для УНО и НАНО это 3, 5, 6, 9, 10, 11
    _____
   /     \
  |       |
  |       |
  |_______|
   | | | |
   | | | |
   | | | |
     | | |
       |
   B G   R
*/

#include "GyverRGB.h"
GRGB diode(6, 5, 3);  // куда подключены цвета (R, G, B)

void setup() {
  
}

void loop() {
  byte R = analogRead(0) / 4;
  byte G = analogRead(1) / 4;
  byte B = analogRead(2) / 4;
  diode.setRGB(R, G, B);
}
/*
   Пример управления цветом RGB светодиода одним потенциометром
   Потенциометр подключен к А0
   Светодиод/мосфеты подключены к ШИМ пинам!
   Для УНО и НАНО это 3, 5, 6, 9, 10, 11
*/

#include "GyverRGB.h"
GRGB diode(6, 5, 3);  // куда подключены цвета (R, G, B)

void setup() {
  
}

void loop() {
  byte H = analogRead(0) / 4; // получаем 0-255

  // меняем только цвет. Яркость и насыщенность вручную
  diode.setHSV(H, 255, 255);
}

ОСТАЛЬНЫЕ БИБЛИОТЕКИ

У меня есть ещё очень много всего интересного! Смотрите полный список библиотек вот здесь.