17 de outubro de 2021

Do bit Ao Byte

Embarcados, Linux e programação

Controle de LED endereçado pixel a pixel

Controle de LED endereçado

Algumas bibliotecas oferecem controles rápidos com pouco código, outras facilitam o controle de LED endereçado pixel a pixel, como veremos nesse artigo.

Já escrevi outros artigos relacionados, sempre que escrevo algo sobre um mesmo tema mostro diferentes abordagens. Como estou interessado em utilizar esse tipo de LED em um projeto, aproveitei para passar o conceito de controle.

Se desejar dar uma olhada nos outros artigos, tem uma breve manipulação do WS2811 aqui, assim como o da barrinha de LEDs endereçados, finalizando com a utilização no ESP8266.

Para esse artigo estou utilizando o Arduino Leonardo, mas poderia ser qualquer um, bastando indicar o número de pixels e o pino a utilizar no barramento I2C.

Como fazer o controle de LED endereçado pixel a pixel

Quando escrevemos o código, geramos um array para os LEDs. Para atribuirmos os valores de R, G e B, utilizamos um outro recurso da biblioteca – no caso, estou utilizando a FastLED agora, que oferece a chamada CRGB(R,G,B). Temos 1 Byte de faixa de atuação para cada pixel e aqui estamos controlando apenas as cores de uma forma direta.

Como o recurso que está mais à mão é o anel de LEDs endereçados da UsinaInfo, aproveitei para utilizar ele mesmo, mas no projeto precisarei de 64 pixels individuais. Os detalhes sobre o wiring você vê nesse artigo. A média de consumo por pixel pode chegar a 60mA, ligando as 3 cores no máximo (255,255,255). Alimentando o Arduino por fonte externa, podemos drenar até 900mA pelo pino 5V, mas necessitando mais que isso, basta adicionar uma fonte externa de 5V e interligar o GND da fonte com o GND do Arduino.

Código de controle de LED endereçado com a FastLED

Instale a biblioteca FastLED a partir do repositório de bibliotecas, seja pela IDE do Arduino ou pela interface do PlatformIO no Visual Studio Code (meu ambiente preferido). Essa biblioteca suporta uma série de LEDs endereçados, tanto SPI como I2C. Esse anel de LEDs usa o WS2811 mas poderia ser o WS2812 etc.

O código básico para acender pixel a pixel desligando o previamente ligado é esse:

#include <FastLED.h>

#define LED_PIN 2
#define NUM_LEDS 18

uint8_t i = 0;
CRGB leds[NUM_LEDS];

void setup(){
    FastLED.addLeds<WS2811,LED_PIN,GRB>(leds,NUM_LEDS);
}

void loop(){
  delay(2000);
  leds[i] = CRGB(20,0,0);
  if (i > 0){
    leds[i-1] = CRGB(0);
  }
  FastLED.show();
  i = i > 17 ? 0 : i+1;
}

Nada mal, hum? Quase nada de código. Repare que para acessar um pixel individualmente basta acessar sua posição em leds[posicao], passando o valor com a função CRGB(red,green,blue). No exemplo, liguei cada um dos pixels individualmente com o valor bem baixinho. Esse controle nos permite criar animações visuais interessantes, onde sua imaginação é o limite. Mas não apenas isso, pois interagindo com outros sensores podemos torná-lo útil, além de agradável aos olhos. Por exemplo, junto com um giroscópio MPU6050 para indicar posicionamento, ou com um sensor infravermelho para indicar proximidade em um ponto que esteja instalado um único pixel etc.

No próximo artigo que citá-lo pretendo já tê-lo implementado em meu projeto. Servirá bem de exemplo de aplicação.

Caso queira ver um vídeo relacionado a esse anel, siga para nosso canal DobitaobyteBrasil no Youtube, é uma animação bem breve. Aproveite para se inscrever e clique no sininho para receber notificações.

Onde comprar o anel de LEDs endereçados?

Esse anel de 18 LEDs você encontra na UsinaInfo através desse link.

 

Revisão: Ricardo Amaral de Andrade