A combinação de cores é uma arte tanto visual quanto técnica, permitindo a criação de uma infinidade de tonalidades a partir das cores primárias. Na tecnologia, especialmente no controle de LEDs RGB (vermelho, verde e azul), essa combinação é realizada de forma precisa por meio de técnicas digitais. Utilizando a modulação por largura de pulso (PWM), é possível ajustar a intensidade de cada LED individualmente, misturando as cores de maneira controlada para obter a cor desejada. Essa abordagem não apenas facilita a criação de efeitos visuais vibrantes, mas também exemplifica a interseção entre arte e engenharia na geração de cores de forma digital.
Proporcionalidade e o sinal Modulado por Largura de Pulso (PWM)
O controle da intensidade de cada LED (R, G e B) é feito por uma tensão em formato digital (que assume dois valores: baixo 0 V ou alto [3,3 V no caso da BitDogLab]). Porém, este chaveamento de baixo para alto e alto para baixo é feito muito rapidamente, com uma frequência igual ou superior a 400 Hz (400 variações no segundo) e o olho uma não é capaz de enxercar esta variação. Porém, o tempo em que este sinal fica no estado alto e no estado baixo é variável, fazendo que, na média, o LED pareça estar acendendo com maior e menor intensidade.
Sinal PWM e o Ciclo de Trabalho (Duty Cycle)
Na figura, vemos um exemplo de sinal PWM.

O sinal digital alterna entre os níveis alto (1) e baixo (0).
- Tempo em Nível Alto (ton): Este é o tempo em que o sinal está no nível alto (1).
- Tempo em Nível Baixo (toff): Este é o tempo em que o sinal está no nível baixo (0).
- Período (T): O tempo total para um ciclo completo, somando ton e toff.
Para calcular o quanto do tempo o sinal fica no nível alto, usamos o Ciclo de Trabalho ou Duty Cycle.
O Duty Cycle é simplesmente a porcentagem de tempo que o sinal está no nível alto dentro de um ciclo completo.

A figura a seguir mostra 3 sinais modulados por largura de pulso, com Duty Cycles de 25%, 50% e 75%

Ao variar o Duty Cycle, podemos controlar a média de potência que chega ao LED, fazendo com que ele pareça mais brilhante ou mais fraco.
Essa técnica é essencial para criar uma vasta gama de cores e intensidades usando LEDs RGB, tudo isso com a precisão da tecnologia digital. Porém ela pode também ser usada para controlar motores, ventiladores, buzzers e outros periféricos.
Programe na BitDogLab
O LED RGB, abaixo do Logo do BitDog, está conectado aos pinos ao microcontrolador da seguinte forma:
GPIO 13 ao LED vermelho,
GPIO 11 ao LED verde e
GPIO 12 ao LED azul.
O programa a seguir usa a função led(r, g, b) para controlar o Duty Cycle de cada cor:
# Importa as blibiotecas de função
from machine import Pin, PWM
import time
# Configuração dos pinos PWM para o LED RGB
# Definindo os pinos 13, 12 e 11 como saídas PWM para controlar o LED RGB
led_r = PWM(Pin(13)) # Pino para o componente vermelho do LED RGB
led_g = PWM(Pin(11)) # Pino para o componente verde do LED RGB
led_b = PWM(Pin(12)) # Pino para o componente azul do LED RGB
# Configuração da frequência PWM para 1000 Hz
# Isso define a velocidade com que o LED pisca para simular diferentes intensidades de cor
led_r.freq(1000)
led_g.freq(1000)
led_b.freq(1000)
def led(r, g, b):
# Função para definir a cor do LED RGB
# Convertendo os valores de 0-255 para 0-65535, que é o intervalo aceito pela função duty_u16()
led_r.duty_u16(int(r * 65535 / 255))
led_g.duty_u16(int(g * 65535 / 255))
led_b.duty_u16(int(b * 65535 / 255))
# Função para testar o LED RGB com várias cores
def test_rgb():
print("led(50, 0, 0) resulta em vermelho") # Mensagem indicando a cor resultante
led(50, 0, 0) # Define o LED para vermelho
time.sleep(2) # Espera 2 segundos
print("led(0, 50, 0) resulta em verde") # Mensagem indicando a cor resultante
led(0, 50, 0) # Define o LED para verde
time.sleep(2)
print("led(0, 0, 50) resulta em azul") # Mensagem indicando a cor resultante
led(0, 0, 50) # Define o LED para azul
time.sleep(2)
print("led(50, 50, 0) resulta em amarelo") # Mensagem indicando a cor resultante
led(50, 50, 0) # Define o LED para amarelo (combinação de vermelho e verde)
time.sleep(2)
print("led(0, 50, 50) resulta em ciano") # Mensagem indicando a cor resultante
led(0, 50, 50) # Define o LED para ciano (combinação de verde e azul)
time.sleep(2)
print("led(50, 0, 50) resulta em roxo") # Mensagem indicando a cor resultante
led(50, 0, 50) # Define o LED para roxo (combinação de vermelho e azul)
time.sleep(2)
print("led(50, 50, 50) resulta em branco") # Mensagem indicando a cor resultante
led(50, 50, 50) # Define o LED para branco (combinação de todas as cores)
time.sleep(2)
print("led(0, 0, 0) resulta em led apagado") # Mensagem indicando que o LED está apagado
led(0, 0, 0) # Desliga o LED
time.sleep(1)
print(" ")
print("Agora você pode tentar digitando o comando led seguido dos argumentos para cada cor")
time.sleep(1)
print("Exemplo: led(200,50,25)") # Exemplo de como o usuário pode definir uma cor específica
# Chama a função de teste para mostrar as cores
test_rgb()
Basta carregar este programa no Thonny e na janela do Shell digitar:
led(50, 0, 0) para acender o LED na cor vermelha.
