Brincando com LEDs [parte 2] RGB e HSL

Síntese de cor aditiva através de potenciómetros que controlam a intensidade de cada cor primária.

1 – Montar o circuito.

O primeiro passo consiste em remover o LED monocromático usado na primeira parte e substituí-lo por um LED RGB e pelas respectivas resistências. De igual  modo, acrescentaremos mais dois potenciómetros, ficando o circuito, com um total de 3; um para cada cor primária.
O LED RGB é, na verdade, composto por 3 LEDS individuais integrados numa única cápsula. Grande parte do LEDs vermelhos admitem uma voltagem inferior relativamente aos restantes, os azuis e os vermelhos, por essa razão, a componete da cor vermelha deverá ser condicionada por uma resistência de maior valor (de forma a que consumam todos a mesma corrente). Caso contrário, as componentes cromáticas ficariam descompensadas e a mistura obtida seria sempre incorrecta. Por exemplo, se ajustássemos as 3 cores primárias com o valor máximo não iriamos obter, tal como seria de esperar, a cor branca mas talvez uma tonalidade alaranjada. Exemplos que incluem estes valores, entretanto calculados e testados, estão disponíveis para consulta em vários sítios na WEB, desde logo, no prórpio site do arduino. Destacamos o blog da autoria de Noah S. que documenta um exemplo similar ao que iremos explorar nesta parte do tutorial [arduinomega.blogspot.pt].
O valor da resistência para a componente vermelha é de 220R enquanto que para as ccomponentes Azul e Verde usaremos resistências de 100R.

.

Após montar o LED RGB, certifique-se que as respectivas resistências são conectadas aos pinos digitais PWM 11,10 e 9.
Os 3 potenciómetros deverão ser conectados aos pinos analógicos 0,1,e 2 do arduino.

2 – Modo RGB

Teste o código e tente misturar várias cores manipulando o potenciómentro. Com alguma facilidade poderá obter as cores secundárias:
Y – amarelo = R + G
C – ciano = G+B
M – Magenta = R+B

int LEDR=9;
int LEDG=10;
int LEDB=11;
int POTR=0;
int POTG=1;
int POTB=2;

void setup() {
pinMode(LEDR, OUTPUT);
pinMode(LEDG, OUTPUT);
pinMode(LEDB, OUTPUT);
}
void loop() {
// Lê os inputs
int R=analogRead(POTR)/4;
int G=analogRead(POTG)/4;
int B=analogRead(POTB)/4;
// Gera os outputs no LED
analogWrite(LEDR, R);
analogWrite(LEDG, G);
analogWrite(LEDB, B);
}

3 – Modo HSL

O sistema Hue, Saturation, Lightness (HSL, HSB ou HSV) é mais intuitivo de compreender e usar na síntese da cor do que o sistema RGB. Hue é a roda da cor e define a tonalidade cromática.Por sua vez,  a saturação corresponde à concentração da cor, isto é, se uma determinada cor é muito viva ou não. A ausência de saturação conduz às tonalidades em escala de cinza. Finalmente, a luminosidade ou valor, como o próprio nome indica, trata-se do nível de claro ou escuro que uma cor poderá adoptar. Tal como nas cores primárias, as componentes HSL são independentes, isto é, cada uma delas não depende das restantes e tem um significado distinto ao nível da cor.

A conversão das coordenadas de RGB para o sistema HSL envolve o uso de um algoritmo que transforma correctamente um espaço tridimensional noutro. O código que apresentamos no próximo exemplo foi por nós adapatado do original em javascript de mjijackson.com para a linguagem C do arduino. O resultado é bastante satisfatório.

int LEDR=9;
int LEDG=10;
int LEDB=11;
int POTH=0;
int POTS=1;
int POTL=2;
int R,G,B;
void setup() {
Serial.begin(9600);
pinMode(LEDR, OUTPUT);
pinMode(LEDG, OUTPUT);
pinMode(LEDB, OUTPUT);
}

void loop() {
// read inputs
int H=analogRead(POTH)/4;
int S=analogRead(POTS)/4;
int L=analogRead(POTL)/4;
hslToRgb(H,S,L);

// output to LED
analogWrite(LEDR, R);
analogWrite(LEDG, G);
analogWrite(LEDB, B);

}

void hslToRgb(int intH, int intS, int intL){
float r, g, b;
float h=float(intH)/255;
float s=float(intS)/255;
float l=float(intL)/255;

if(s == 0){
r = g = b = l;
}
else{
float q;
if (l < 0.5) {q=l * (1 + s);}else{q=l + s - l * s;}
float p = 2 * l - q;
r = hue2rgb(p, q, h+1.00/3.00);
g = hue2rgb(p, q, h);
b = hue2rgb(p, q, h-1.00/3.00);
}
R=int(r * 255);
G=int(g * 255);
B=int(b * 255);
}

float hue2rgb(float p, float q, float t){
if(t < 0) t -= 1;
if(t > 1) t -= 1;
if(t < 1.00/6.00) return p + (q - p) * 6 * t;
if(t < 1.00/2.00) return q;
if(t < 2.00/3.00) return p + (q - p) * (2.00/3.00 - t) * 6;
return p;
}


COMO CITAR ESTE ARTIGO
BibTex EndNote RIS APA CHICAGO
Anúncios