Curso Arduino Nível II – #2 – LED RGB

 

 

Os díodos emissores de luz (LEDs) são utilizados em praticamente todos os projetos. Por vezes, além de uma simples sinalização de status do dispositivo, queremos incluir alguns efeitos visuais. Aqui, os LEDs RGB são bastante úteis, já que RGB significa que conseguem exibir praticamente qualquer cor. Vejamos mais sobre eles!

O que são LEDs programáveis?

Os LEDs programáveis podem ser um grande mistério para alguns iniciantes. Muitas questões podem surgir-lhe, como por exemplo: É necessário algum tipo de programador especial? Não queremos manter o suspense, portanto vamos já dar-lhe a resposta. É claro que os LEDs não exigem qualquer programador, a sua programação é baseada no fato de cada LED possuir um layout integrado com o qual comunicaremos. O driver interno ajustará todos os parâmetros e o LED acenderá na cor selecionada.

Para já, muitos de vocês ainda não devem estar a perceber qual a vantagem do LED RGB sobre um LED tradicional. Vejamos o seguinte efeito que pode ser obtido através de LEDs RGB, utilizando apenas um pino do Arduino!

LED RGB

Vamos agora abordar o funcionamento destes LEDs na prática!

Fonte de Alimentação Externa para o Arduino

Durante este curso, vamos criar projetos que poderão funcionar normalmente, não serão apenas demonstrações temporárias. Portanto, a alimentação via USB ou através de uma bateria pequena não é conveniente. O ideal será a utilização de uma fonte de alimentação ligada ao conector jack do Arduino.

Ao ligarmos a fonte de alimentação, para além da tensão estável que nos vai proporcionar, existe ainda outra vantagem. No pino Vin teremos acesso a 12V de tensão, que vamos utilizar no artigo seguinte!

Constituição e Funcionamento dos LEDs RGB

Durante o nível anterior do curso Arduino, utilizamos LEDs comuns. Cada um deles possui dois terminais (cátodo e ânodo) e brilha em apenas uma cor. Adicionalmente, recorrendo ao PWM, era possível alterar o brilho.

Os LEDs RGB oferecem muito mais possibilidades. São constuidos por três estruturas luminosas, que conseguimos controlar separadamente: vermelho, verde e azul. Graças a isso, o LED, para além de conseguir brilhar em 3 cores básicas, consegue fazer misturas e criar cores diferentes das referidas.

Curso Arduino Nível II - #2 - LED RGB

Os LEDs RGB estão disponíveis com um cátodo ou ânodo comum. No nosso caso, vamos usar com cátodo comum. Isto significa que vamos ligar o terminal maior do LED ao GND (terra), e os restantes são alimentados por tensão positiva.

Exercício Prático – Introdução ao LED RGB

Material necessário:

De forma a testar o LED, deverá ter em conta a imagem seguinte:

led rgb

E realizar as seguintes conexões:

  1. Ligar vermelho ao pino 3 do Arduino, utilizando uma resistência de 1KΩ;
  2. Ligar cátodo comum ao GND;
  3. Ligar verde ao pino 5 do Arduino, utilizando uma resistência de 1KΩ;
  4. Ligar azul ao pino 6 do Arduino, utilizando uma resistência de 1KΩ.

Colocar Imagem do Esquema de Montagem

Vamos criar um código simples, que vai testar cada cor separadamente e, depois, misturá-las.

#define vermelho 3
#define verde 5
#define azul 6

void setup() {
pinMode(vermelho, OUTPUT); // Definição dos pinos do LED RGB como saídas
pinMode(verde, OUTPUT);
pinMode(azul, OUTPUT);
}

void loop() {
digitalWrite(vermelho, HIGH); // Brilha apenas em vermelho
delay(2000);
digitalWrite(vermelho, LOW); // Brilha apenas em verde
digitalWrite(verde, HIGH);
delay(2000);
digitalWrite(verde, LOW); // Brilha apenas em azul
digitalWrite(azul, HIGH);
delay(2000);
digitalWrite(azul, LOW);


digitalWrite(vermelho, HIGH); // Combinar todas as cores, uma de cada vez
delay(2000);
digitalWrite(verde, HIGH);
delay(2000);
digitalWrite(azul, HIGH);
delay(2000);

digitalWrite(vermelho, LOW); // Desligar o LED
digitalWrite(azul, LOW);
digitalWrite(verde, LOW);
delay(2000);
}

Na prática, será exatamente como previsto:

Inserir imagens do LED nas diferentes cores

Claro que a combinação das três cores dá branco. Com o PWM, que já conhecemos, podemos ajustar o brilho de cada cor separadamente. Graças a isso, é possível gerar uma infinidade de cores. Mas, antes de irmos para esse exemplo, vamos ligar um segundo LED RGB.

Exercício Prático – Conexão de dois LEDs RGB

Material necessário:

Este segundo LED vai ser ligado aos três canais PWM seguintes. Pode aproveitar o esquema montado anteriormente e fazer as seguintes ligações adicionais:

  1. Ligar vermelho ao pino 9 do Arduino, utilizando uma resistência de 1KΩ;
  2. Ligar cátodo comum ao GND;
  3. Ligar verde ao pino 10 do Arduino, utilizando uma resistência de 1KΩ;
  4. Ligar azul ao pino 11 do Arduino, utilizando uma resistência de 1KΩ.

Para pouparmos cabos jumper, e mantermos o esquema organizado, cortamos os terminais dos LEDs para ficarem mais pequenos, e colocámos dois deles a fazerem a ligação entre cada LED e o local da breadboard que vai estar ligado ao GND.

Inserir Imagem do Esquema de Montagem

Agora, vejamos o programa de teste dos LEDs:

//Definição dos pinos do primeiro LED
#define vermelho 3
#define verde 5
#define azul 6

//Definição dos pinos do segundo LED
#define vermelho2 9
#define verde2 10
#define azul2 11

void setup() {
pinMode(vermelho, OUTPUT); //Configuração dos pinos dos LEDs como saídas
pinMode(verde, OUTPUT);
pinMode(azul, OUTPUT);
pinMode(vermelho2, OUTPUT);
pinMode(verde2, OUTPUT);
pinMode(azul2, OUTPUT);
}

void loop() {
digitalWrite(vermelho, HIGH); //LEDs a piscar com cores diferentes
digitalWrite(verde2, HIGH);
delay(1000);
digitalWrite(vermelho, LOW);
digitalWrite(verde2, LOW);
digitalWrite(azul, HIGH);
digitalWrite(vermelho2, HIGH);
delay(1000);
digitalWrite(azul, LOW);
digitalWrite(vermelho2, LOW);
}

O efeito do programa é o seguinte:

Inserir Imagens

Exercício Prático – Combinação de Cores

Para este exercício deverá utilizar o esquema montado anteriormente.

Podemos agora passar para a parte interessante, isto é, para a combinação das cores. Para isso, basta gerar o sinal PWM de acordo com o que pretendemos. Acreditamos que já todos percebam a ideia, por isso vamos limitar-nos a um simples exemplo.

Primeiramente, vamos apresentar o programa na versão mais simples. O controlo PWM é feito através da função analogWrite (pino, duty cycle), onde o segundo parâmetro é um valor de 0 a 255, que se traduz numa percentagem de 0 a 100%.

Vamos escrever um programa que irá ajustar suavemente duas cores de cada LED. Começemos com uma simples função loop:

//Definição dos pinos do primeiro LED
#define vermelho 3
#define verde 5
#define azul 6

//Definição dos pinos do segundo LED
#define vermelho2 9
#define verde2 10
#define azul2 11

void setup() {
pinMode(vermelho, OUTPUT); //Configuração dos pinos dos LEDs como saídas
pinMode(verde, OUTPUT);
pinMode(azul, OUTPUT);
pinMode(vermelho2, OUTPUT);
pinMode(verde2, OUTPUT);
pinMode(azul2, OUTPUT);
}

void loop() {
int mudanca = 0;

for (mudanca = 0; mudanca < 255; mudanca++) { //Mudança suave de cor
analogWrite(vermelho, 0);
analogWrite(verde, mudanca);
analogWrite(azul, 255 - mudanca);

analogWrite(vermelho2, mudanca);
analogWrite(verde2, 255 - mudanca);
analogWrite(azul2, 0);

delay(10); //Pequeno atraso para melhor efeito
}
}

O loop é executado 255 vezes. Em cada circuito, a variável mudanca aumenta em um. Então, esse valor é definido como o duty cycle de uma das cores do LED e é subtraído do duty cycle da segunda cor, que por padrão é 100%.

Para usar a terceira cor, vamos recorrer a uma função que envia um número aleatório. Discutimos este assunto no 10º artigo do Curso Arduino iniciante. Para uma maior clareza nos efeitos, vamos gerá-lo antes de cada ciclo loop. O código seguinte deve mostrar-nos dois LEDs que mudam de cor aleatoriamente.

//Definição dos pinos do primeiro LED
#define vermelho 3
#define verde 5
#define azul 6

//Definição dos pinos do segundo LED
#define vermelho2 9
#define verde2 10
#define azul2 11

void setup() {
pinMode(vermelho, OUTPUT); //Configuração dos pinos dos LEDs como saídas
pinMode(verde, OUTPUT);
pinMode(azul, OUTPUT);
pinMode(vermelho2, OUTPUT);
pinMode(verde2, OUTPUT);
pinMode(azul2, OUTPUT);

randomSeed(analogRead(A5)); //Seed para gerar números aleatórios
}

void loop() {
int mudanca = 0;
int mudancaAleatoria = random(255);

for (mudanca = 0; mudanca < 255; mudanca++) { //Mudança suave de cor
analogWrite(vermelho, mudancaAleatoria);
analogWrite(verde, mudanca);
analogWrite(azul, 255 - mudanca);

analogWrite(vermelho2, mudanca);
analogWrite(verde2, 255 - mudanca);
analogWrite(azul2, mudancaAleatoria);

delay(10);
}
}

Está bem, mas podia estar melhor. Depois do loop for, o código volta ao início abruptamente, o que resulta numa mudança de cor pouco atrativa. Para melhorar isto, devemos fazer a mudança das cores suavemente na direção oposta.

Desta vez vamos propor uma solução pouco sofisticada. Copiamos o loop e mudamos a condição para que seja feito ao contrário uma segunda vez. Naturalmente, esta não é a melhor solução, mas como pretendemos que os LEDs pisquem apenas uma vez, podemos implementar este código.

O programa final é o seguinte:

//Definição dos pinos do primeiro LED
#define vermelho 3
#define verde 5
#define azul 6

//Definição dos pinos do segundo LED
#define vermelho2 9
#define verde2 10
#define azul2 11

void setup() {
pinMode(vermelho, OUTPUT); //Configuração dos pinos dos LEDs como saídas
pinMode(verde, OUTPUT);
pinMode(azul, OUTPUT);
pinMode(vermelho2, OUTPUT);
pinMode(verde2, OUTPUT);
pinMode(azul2, OUTPUT);

randomSeed(analogRead(A5)); //Seed para gerar números aleatórios
}

void loop() {
int mudanca = 0;
int mudancaAleatoria = random(255);

for (mudanca = 0; mudanca < 255; mudanca++) { //Mudança suave de cor
analogWrite(vermelho, mudancaAleatoria);
analogWrite(verde, mudanca);
analogWrite(azul, 255 - mudanca);

analogWrite(vermelho2, mudanca);
analogWrite(verde2, 255 - mudanca);
analogWrite(azul2, mudancaAleatoria);

delay(10);
}

for (mudanca = 255; mudanca > 0; mudanca--) { //Mudança suave de cor ao contrário
analogWrite(vermelho, mudancaAleatoria);
analogWrite(verde, mudanca);
analogWrite(azul, 255 - mudanca);

analogWrite(vermelho2, mudanca);
analogWrite(verde2, 255 - mudanca);
analogWrite(azul2, mudancaAleatoria);

delay(10);
}
}

O efeito do código acima, é visível na seguinte animação:

LED RGB

Obtivemos um dispositivo luminoso aleatório, que poderia ter um efeito visual bastante mais interessante, se tivessemos conectado mais LEDs. Aqui surge um problema. Até agora, a adição de cada LED requeria três novos canais PWM. Ao conectarmos dois LEDs RGB, já utilizamos a capacidade máxima do Arduino UNO (6 canais PWM).

E se os LEDs pudessem ser controlados com menos ligações? Vamos então abordar os LEDs programáveis, que vamos utilizar daqui em diante.

Introdução aos LEDs Programáveis

A tecnologia LED está a ganhar popularidade em um ritmo incrível. Os LEDs RGB têm sido utilizados numa imensidão de projetos complexos e publicidades luminosas. No entanto, controlar cada LED individualmente é uma tarefa árdua.

Portanto, foram criados sistemas dedicados para utilização em conjunto com os LEDs. Estes permitem controlar a cor e o brilho de muitos LEDs de uma forma simples e muito mais rápida. A popularidade dessa solução levou à criação dos sistemas WS2812. Estes são a combinação de um driver com LEDs RGB, tudo num único módulo ou fita, principalmente em SMD.