Controlando LED RGB com Raspberry Pi

Não abandonei o meu querido amigo RPi. Aliás, de tanto gostar, até arrumei uns amigos pra ele.


Mesmo tendo apenas um pino PWM (à partir da versão 0.5.2 do RPi.GPIO isso passa a ser um mito) dá pra controlar as cores de um LED RGB usando o RPi com facilidade. O processo é basicamente o mesmo de qualquer lógica para acender LEDs comuns: cátodo no negativo, ânodo no positivo e corrente passando por eles. Como não temos pinos PWM disponíveis para controlar cada cor, então podemos optar pelas cores primárias e secundárias, gerando assim 7 cores, dispensando o uso do PWM.

Para implementar isso teremos que considerar como as cores serão obtidas: cada pino pode assumir o estado ligado e desligado. Dessa maneira, com 3 pinos representando as três cores primárias, dá pra conseguir o seguinte:

RGBCor
100Vermelho
110Amarelo
111Branco
011Ciano
001Azul
101Magenta
010Verde
Agora é só criar uma coleção (array) com esses valores:

cores = [[1,0,0],[1,1,0],[1,1,1],[0,1,1],[0,0,1],[1,0,1],[0,1,0]]

Onde 1 vai servir de True e 0 vai servir de False. Note que estou usando LEDs com ânodo comum, ou seja: essa tabela, pra mim, deverá ser invertida para que as cores correspondam exatamente ao que será lido na coleção.

Para o laço de repetição, posso decidir se quero que as cores se apresente aleatoriamente ou uma depois da outra. Vou fazer das duas maneiras, criando um código, ao pressionar ENTER, o programa termine, porém, antes, percorra toda a coleção e exiba suas cores na ordem em que foram catalogadas. Adicionalmente, sempre que o programa iniciar, as cores serão percorridas também. Vamos ao código:

#Bibliotecas utilizadas:
#RPi.GPIO: para manipular os pinos
#time: fornece controle do tempo
#random: gera números aleatórios
#sys: captura comunicação do sistema
#select:

import RPi.GPIO as io, time, random, sys, select

io.setmode(io.BCM) #use io.BOARD para se orientar pelo número do pino

R = 24 #Cor vermelha no GPIO24
G = 23 #Cor verde no GPIO23
B = 22 #Cor azul no GPOI22

#Tabela de cores
anodo = [[0,1,1],[0,0,1],[0,0,0],[1,0,0],[1,1,0],[0,1,0],[1,0,1]]
catodo = [[1,0,0],[1,1,0],[1,1,1],[0,1,1],[0,0,1],[1,0,1],[0,1,0]]
cores = anodo

#Configura os pinos para enviar dados (a voltagem) quando ativado
io.setup(R, io.OUT)
io.setup(G, io.OUT)
io.setup(B, io.OUT)

#Altera as voltagens dos pinos para alterar a cor exibida pelo LED
def toColor(r, g, b, t):
  io.output(R, r)
  io.output(G, g)
  io.output(B, b)
  time.sleep(t) #aguarda tempo = t
  
#Percorre as cores de 0 até 6
def toScale():
for i in range(0,6):
toColor(cores[i][0], cores[i][1], cores[i][2], 0.125)

#Roda o programa até que ENTER seja pressionado
toScale()
roda = True
while roda:
  cor = random.randint(0, 6)
  toColor(cores[cor][0], cores[cor][1], cores[cor][2], 1)
  
  if sys.stdin in select.select([sys.stdin], [], [], 0)[0]:
    roda = False
    toScale()
print("Até")
io.cleanup()

Pronto, nenhum mistério. Os comentários no código explicam o que cada seção faz, aí fica fácil entender e, também, modificar, para ficar mais próximo daquilo que você quer.

O Circuito

Os componentes usados são:
- 1 LED RGB
- 3 resistores de aproximadamente 300ohms (270, 330...)
- Raspberry Pi

Os resistores serão conectados aos pinos correspondentes e, na outra ponta, as pernas do LED relativas a cor, conforme o código-fonte. O ânodo será conectado ao pino de 3.3v caso seu LED seja do tipo cátodo comum. Se for do tipo ânodo comum, ligue essa perna em algum terra.


Comentários

Postagens mais visitadas deste blog

Tá na hora de piscar LEDs de maneira melhorada

LEDs on/off com PHP, Python e RPi

PagSeguro e PHP - Usando a tela do PagSeguro (checkout redirect)