Leds endereçáveis RGB podem ser utilizados em uma grande variedade de projetos, indo desde um simples efeito de iluminação até uma utilização em conjunto com sensores e módulos para gerar interessantes efeitos visuais, e hoje vamos mostrar como usar o led endereçável RGB Neopixel com Raspberry Pi.
Graças às bibliotecas da Adafruit, os leds endereçáveis, geralmente com chip WS2812 ou WS2811 são muito simples de utilizar com Arduino e também com Raspberry Pi, que por ter um sistema operacional Linux multi-tarefa tinha alguns problemas para acionar os leds corretamente.
Mas vamos ver que isso foi contornado pela biblioteca e como fazer a conexão e utilização com Raspberry Pi usando um programa em Python.
O led endereçável RGB WS2812
O led endereçável RGB já foi visto em alguns posts aqui do blog, sempre com Arduino e como já mencionei a utilização é bastante simples, utilizando apenas um pino do microcontrolador para conexão.
Os tipos mais comuns de componente que usam o led endereçável são o anel de led RGB e a fita de led RGB, com modelos com apenas um led até fitas com 10 metros de comprimento (ou mais). Cada led pode ser acionado individualmente graças ao chip WS2812 presente em cada um, o que permite os mais variados e interessantes efeitos visuais.
Outra característica bacana do led endereçável é a possibilidade de ligar os módulos em cascata, ou seja, a saída de um módulo é conectado na entrada do outro, e você continua controlando todos esses módulos com apenas um pino.
Conectando anel de led RGB Neopixel na Raspberry Pi
Vamos testar a conexão do led endereçável na Raspberry Pi 3 B+ usando um anel de led RGB de 12 leds, mas o princípio de funcionamento é o mesmo para os outros modelos de led endereçável baseados no chip WS2812: pino de alimentação 5V, pino GND e um pino de controle.
Vou mostrar os dois tipos de conexão, uma direta (que eu não recomendo e usei apenas para testes), e a conexão usando um conversor de nível lógico.
A conexão direta, como o próprio nome diz, conecta os pinos de alimentação e sinal do led endereçável diretamente na GPIO da Raspberry Pi.
Isso pode ou não funcionar, ok? Como o led endereçável é alimentado com 5V e “espera” um comando mediante um sinal de 5V, a Raspberry, que usa tensão de 3.3V para o sinal, pode não conseguir realizar essa comunicação. Outro detalhe é que a Raspberry talvez não forneça toda a corrente necessária para o funcionamento dos leds.
Avisos dados, vamos à conexão direta. No anel de led que estamos usando temos os pinos IN (conectado na GPIO 18, pino 12 da Rasp), VCC (conectado no pino 2, tensão 5V), e o GND (conectado no pino 6):
Na conexão usando um conversor de nível lógico 3.3-5V bidirecional, uso também uma fonte externa para alimentação do anel de leds.
O conversor de nível lógico utiliza as tensões de referência de cada componente do circuito: 3.3V do Raspberry Pi e 5V da fonte de alimentação, fazendo com que se comuniquem de forma adequada. Mais informações sobre o uso do conversor de nível lógico você encontra neste link.
Programa led endereçável com Raspberry Pi
Antes de começar vamos fazer aquela boa e velha atualização no Raspbian, o sistema operacional utilizado na placa. Para isso, execute os comandos abaixo em uma janela de terminal:
sudo apt-get update sudo apt-get upgrade
Finalizada a atualização, que dependendo da sua conexão de internet pode demorar alguns (longos) minutos, execute o comando abaixo para carregar a biblioteca Neopixel da Adafruit:
sudo pip3 install rpi_ws281x adafruit-circuitpython-neopixel
Agora copie ou digite o programa abaixo, que vai acionar a matriz de leds com efeitos variados. Modifique o valor na linha 15 do programa (num_pixels) de acordo com a quantidade de leds endereçáveis que você estiver usando:
# Programa: Led enderecavel Neopixel com Raspberry Pi # Adaptacoes: Arduino e Cia # Baseado no programa exemplo da Adafruit import time import board import neopixel import RPi.GPIO as GPIO # Pino de conexao Raspberry # (podem ser utilizados os pinos 10, 12, 18 ou 21) pixel_pin = board.D18 # Numero de leds que serao controlados num_pixels = 12 # Ordem dos pixels de cor - RGB ou GRB # Em alguns módulos as cores verde e vermelha estao invertidas ORDER = neopixel.GRB pixels = neopixel.NeoPixel(pixel_pin, num_pixels, brightness=0.1, auto_write=False, pixel_order=ORDER) def wheel(pos): # Utiliza um valor entre 0 e 255 para definir a cor # As cores sao uma transicao r - g - b if pos < 0 or pos > 255: r = g = b = 0 elif pos < 85: r = int(pos * 3) g = int(255 - pos*3) b = 0 elif pos < 170: pos -= 85 r = int(255 - pos*3) g = 0 b = int(pos*3) else: pos -= 170 r = 0 g = int(pos*3) b = int(255 - pos*3) return (r, g, b) if ORDER == neopixel.RGB or ORDER == neopixel.GRB else (r, g, b, 0) def rainbow_cycle(wait): for j in range(255): for i in range(num_pixels): pixel_index = (i * 256 // num_pixels) + j pixels[i] = wheel(pixel_index & 255) pixels.show() time.sleep(wait) try: while True: # Desabilite esta linha se for usar Neopixel RGBW/GRBW pixels.fill((255, 0, 0)) # Habilite esta linha se for usar Neopixel RGBW/GRBW # pixels.fill((255, 0, 0, 0)) pixels.show() time.sleep(1) # Desabilite esta linha se for usar Neopixel RGBW/GRBW pixels.fill((0, 255, 0)) # Habilite esta linha se for usar Neopixel RGBW/GRBW # pixels.fill((0, 255, 0, 0)) pixels.show() time.sleep(1) # Desabilite esta linha se for usar Neopixel RGBW/GRBW pixels.fill((0, 0, 255)) # Habilite esta linha se for usar Neopixel RGBW/GRBW # pixels.fill((0, 0, 255, 0)) pixels.show() time.sleep(1) # Efeito arco-iris com ciclo de 1ms por passo rainbow_cycle(0.001) except KeyboardInterrupt: #Apaga todos os leds pixels.fill((0,0,0)) pixels.show() GPIO.cleanup()
Para executar o programa, você pode usar a interface do Python3 dentro do Raspbian ou então o comando abaixo:
sudo python3 nomedoprograma.py
Confira outros posts sobre leds endereçáveis Neopixel WS2812 aqui mesmo no Arduino e Cia!