RGB цвет и яркость

YG
Offline
Зарегистрирован: 20.01.2016

Здравствуйте!

Делаю первую поделку, прошу помощи:

Необходимо управлять цветом и яркостью светодиода. Цветом будут управлять 3 ШИМ выхода. Вопрос в том, как управлять яркостью?

Вижу 2 варианта: "в лоб" и "по-правильному"

В лоб- изменение напряжения питания светодиодов

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

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

ШИМ это и есть управление яркостью, ничего выдумывать не надо. Вопрос чисто от недопонимания принципа работы.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

YG пишет:

Необходимо управлять цветом и яркостью светодиода. 

....

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

Обычный, 20мА чытырёхногий RGB светодиод?

Там техника такая:

1. Сначала нужно правильно подобрать резисторы, т.к. они разные: для красного - больше, для голубого - меньше. Подбирать надо так, чтобы ни один цвет не вылазил за 20мА и при этом красный с зелёным (поровну) давали чёткий жёлтый (при одинаковых резисторах - получается сильно ближе к красному), зелёный с голубым давали синий, красный с голубым - пурпурный.

2. Управлять действительно можно ШИМ'мом пропорционально. Но это от диода зависит. На одних нормально, а на других нужны ещё танцы с бубнами. У меня как-то получилось так, что при полном питании (255) цвета нормальные, а при меньших (пропорционально) начинали заваливаться. Пришлось подавать ШИМ не пропорционально, а по специальной корректировочной таблице (таблицу составил эмпирически).

Кстати, диоды с общим чем? Вы же понимаете. что если они с общим анодом, то скважность ШИМа (параметр analogWrite) надо переворачивать (параметр == 0 - полный цвет, а 255 - этого цвета вовсе нет).

И ещё, на забудьте, что через общий анод/катод будет идти ток трёх светодиодов. Так что если по каким-то причинам придётся сажать его (общий анод/катод) на ногу ардуины - надо ставить транзистор, т.к. ток там будет для ноги великоват.

YG
Offline
Зарегистрирован: 20.01.2016

Дополню ТЗ.

Управлять буду лентой (соответственно через полевик).

Мне надо сначала выставить цвет - меняю поочередно каждый из каналов, пока не выберу нужный цвет, допустим получил 20-20-100 (RGB). Теперь мне надо убавить яркость не меняя цвет- меняю все три канала пропорционально и получаю 10-10-50.

Получится ли так?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

да если бы светодиоды были бы идеальные, а с реальными ну почти правильно

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

YG пишет:

допустим получил 20-20-100 (RGB). Теперь мне надо убавить яркость не меняя цвет- меняю все три канала пропорционально и получаю 10-10-50.

Получится ли так?

Как повезёт (см. мой п.2 выше). Попробуйте. Получится - отлично! Не получится (цвет изменится), подгоняйте цвет и составляйте корректировочную таблицу. Моя практика говорит, что чаще не получается - "Жизнь такова, какова она есть, и больше никакова"

 

YG
Offline
Зарегистрирован: 20.01.2016

Andy пишет:

ШИМ это и есть управление яркостью, ничего выдумывать не надо. Вопрос чисто от недопонимания принципа работы.

ШИМ-яркость согласен. Вопрос в убийстве 2-х зайцев одним выстрелом. 1 - RGB выбор цвета по 3 каналам. 2 - изменение яркости выбраного цвета используя те же каналы. Возможно я не правильно поставил вопрос.

YG
Offline
Зарегистрирован: 20.01.2016

Спасибо за помощь!!!

Еще маленький вопрос: задав переменную int а=10 и поделив ее на 3 у меня получится а=3?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

YG пишет:

Еще маленький вопрос: задав переменную int а=10 и поделив ее на 3 у меня получится а=3?

Надеюсь :)

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Можно использовать не RGB, а HSV, там как раз яркость есть. Обычно этот формат используют для формирования радуги.

В частности библиотека FastLED так и делает. В ней же есть конверторы из RGB в HSV и обратно.

Про HSV можно здесь почитать: https://ru.wikipedia.org/wiki/HSV_(%D1%86%D0%B2%D0%B5%D1%82%D0%BE%D0%B2%D0%B0%D1%8F_%D0%BC%D0%BE%D0%B4%D0%B5%D0%BB%D1%8C)

_mikka
Offline
Зарегистрирован: 01.11.2015

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

HSV2RGB.h

// HSV2RGB.h

#ifndef _HSV2RGB_h
#define _HSV2RGB_h

#if defined(ARDUINO) && ARDUINO >= 100
	#include "arduino.h"
#else
	#include "WProgram.h"
#endif

typedef struct {
  byte r; // 0..255
  byte g; // 0..255
  byte b; // 0..255
} RGB_t;

typedef struct {
  word h; // 0..359
  byte s; // 0..255
  byte v; // 0..255
} HSV_t;


  
class HSV2RGBClass
{
 protected:


 public:
	void init();
  RGB_t rgb(byte r, byte g, byte b);
  HSV_t hsv(word h, byte s, byte v);
  RGB_t hsv2rgb(HSV_t hsv); 
  unsigned int ABS(int val);

  
};

extern HSV2RGBClass HSV2RGB;

#endif

HSV2RGB.СPP

// 
// 
// 

#include "HSV2RGB.h"

void HSV2RGBClass::init()
{

}

inline RGB_t HSV2RGBClass::rgb(byte r, byte g, byte b) {
  RGB_t rgb = {r, g, b};
  return rgb;
}

inline HSV_t HSV2RGBClass::hsv(word h, byte s, byte v) {
  HSV_t hsv = {h, s, v};
  return hsv;
}


RGB_t HSV2RGBClass::hsv2rgb(HSV_t hsv) {

if (hsv.s == 0) { // Acromatic color (gray). Hue doesn't mind.
  return RGB_t {byte(hsv.v),byte(hsv.v),byte(hsv.v)};
  } else  {
  word base = ((255 - hsv.s) * hsv.v)>>8;

    switch(hsv.h/60) {
      case 0:
              return RGB_t {hsv.v, (((hsv.v-base)*hsv.h)/60)+base,base};
              break;
      case 1:
              return RGB_t {(((hsv.v-base)*(60-(hsv.h%60)))/60)+base,hsv.v,base};
              break;
      case 2:
              return RGB_t {base,hsv.v,(((hsv.v-base)*(hsv.h%60))/60)+base};
              break;
      case 3:
              return RGB_t {base,(((hsv.v-base)*(60-(hsv.h%60)))/60)+base,hsv.v};
              break;
      case 4:
              return RGB_t {(((hsv.v-base)*(hsv.h%60))/60)+base,base,hsv.v};
              break;
      case 5:
              return RGB_t {hsv.v,base,(((hsv.v-base)*(60-(hsv.h%60)))/60)+base};
              break;
    }
  } 

}

unsigned int HSV2RGBClass::ABS(int val)
{
  if (val<0)  {
    return -val;
  }
  else  {
    return val;
  }
}
HSV2RGBClass HSV2RGB;

Пользоваться просто


  HSV_t           hsvColor={0,0,0};                   // Переменная задает цвет

  HSV_t.h = 60; // оттенок 0..359
  HSV_t.s = 60; // чистота цвета 0..255
  HSV_t.v = 255; // яркость цвета 0..255

  RGB_t  tRGBColor = clsCOLOR.hsv2rgb (hsvColor);

  // ограничиваем верхний предел яркости  
  tRGBColor.r = constrain(tRGBColor.r, 0, 255  );
  tRGBColor.g = constrain(tRGBColor.g, 0, 255;
  tRGBColor.b = constrain(tRGBColor.b, 0, 255 );
 
 
  // задаем яркость светодиодов с учетом ограничения по каждому каналу (RED_FACTOR, GREEN_FACTOR, BLUE_FACTOR)
  analogWrite(PIN_RED,   tRGBColor.r);
  analogWrite(PIN_GREEN, tRGBColor.g);
  analogWrite(PIN_BLUE,  tRGBColor.b);

 

satelit 2
Offline
Зарегистрирован: 04.12.2016

а вот у меня другой вопрос, как подключить 10 ваттный rgb светодиод с ардуино. 

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

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

bwn
Offline
Зарегистрирован: 25.08.2014

satelit 2 пишет:

управляющим током драйвера довести до максимума тока. 

Лучше до максимума яркости (визуально), это обычно 60-70% от максимума тока. У меня так получалось.