05 março 2019

Led endereçável RGB (Neopixel) com Raspberry Pi

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 com Raspberry Pi.

Raspberry Pi 3 B+ com anel de led RGB

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.

Fita de leds Neopixel - Adafruit


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 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):

Conexão direta Neopixel com Raspberry Pi

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.

Conexão led endereçável usando conversor lógico
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:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
# 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!

Nenhum comentário:

Postar um comentário