terça-feira, março 01, 2016

Anel de LED RGB "Endereçável" (baseado no CI WS2812B)

Neste post, e nos seguintes, vamos dar uma olhada em uma outra opção de LED RGB para ligação em série com controle individual, desta vez usando o CI WS2812B e organizado em anel.



O modelo na foto acima foi comprado na FilipeFlop (em tempos de dólar mais camarada). A FilipeFlop possui outros modelos baseados no mesmo CI, você não terá dificuldade em achar em outras lojas, inclusive na China.

O WS2812B é voltado para a mesma aplicação que o APA102 que nós vimos anteriormente, mas a forma de comunicação é diferente. O WS2812B utiliza apenas um sinal de dados, dispensando o sinal de clock. Embora isto reduza a necessidade de conexões, acaba complicando o interfaceamento. O problema é que o WS2812B trabalha com tempos fixos e curtos. O datasheet mostra o formato básico da comunicação e os tempos envolvidos:

Códificação dos bits (não está em escala!)
Tempos na figura acima
Note que é necessário gerar um pulso de 0,4 microssegundos, com uma precisão de 150 nano segundos. O nosso velho amigo Arduino utiliza um clock de 16MHz, portanto as instruções mais rápidas executam em 0,0625 microssegundos. Olhando de outra forma, durante os 0,4 us temos 6,4 ciclos do ATmega. Esqueça gera o sinal com auxílio do timer, é hora de escrever código em assembler e contar os ciclos!

Obs.: Em teoria o ciclo para envio de um "0" é maior que o de envio de "1", mas isto pode ser ignorado gasta às tolerâncias.

A figura abaixo, também do datasheet, mostra como a comunicação funciona com vários LEDs:




Basicamente, é necessário enviar um reset (manter o sinal de dado baixo por pelo menos 50 microssegundos) para sinalizar o início dos pacotes e depois enviar 24 bits para cada LED (usando as convenções para 0 e 1). Os 24 bits controlam a intensidade dos LEDs (oito bits para cada cor):


Nos próximos posts vamos ver um projeto prático utilizando este anel de LEDs, uma lanterna baseada em um artigo da revista Make.

Nenhum comentário: