Hoje vamos estudar um componente chamado WS2812b (datasheet aqui), que é um LED tricolor (Vermelho, Verde e Azul, ou RGB) montado em um encapsulamento 5050 (5x5mm) e que recebe informação de cor através de um único pino “serial”.
   Vários LED’s RGB podem ser “acorrentados” uns aos outros (em série), permitindo criar efeitos visuais lindos!. Este LED é muito popular nos dias de hoje devido á grande facilidade de uso, graças á uma biblioteca escrita pela Adafruit. Vamos utilizar esta biblioteca para testar este LED hoje.
   A forma de conexão do WS2812b é bem simples pois exige apenas 3 pinos: +5V, GND e Din (entrada de sinal).
   O módulo pode ser conectado á qualquer pino digital do Arduino. No meu caso eu escolhi o pino 2.
   E a foto da montagem:
   O código para fazer o WS2812b funcionar depende de uma biblioteca desenvolvida pela Adafruit, que pode ser acessada neste link. Antes de começar a programar você deve baixar e instalar esta biblioteca, seguindo este tutorial que eu escrevi um tempo atrás.
   Eu modifiquei o sketch (código) “simple.ino” que vem como exemplo na biblioteca da Adafruit, para que ele pisque entre as cores Vermelho, Verde e Azul a cada 0,33 segundos:
 #include <Adafruit_NeoPixel.h>  
 #ifdef __AVR__  
  #include <avr/power.h>  
 #endif  
   
 // Which pin on the Arduino is connected to the NeoPixels?  
 #define PIN      3  
   
 // How many NeoPixels are attached to the Arduino?  
 #define NUMPIXELS   1  
   
 Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);  
   
 int delayval = 333; // delay  
   
 void setup() {  
   pixels.begin(); // This initializes the NeoPixel library.  
 }  
   
 void loop() {  
   
  // For a set of NeoPixels the first NeoPixel is 0, second is 1, all the way up to the count of pixels minus one.  
   
  for(int i=0;i<NUMPIXELS;i++){  
   
   // pixels.Color takes RGB values, from 0,0,0 up to 255,255,255  
   pixels.setPixelColor(i, pixels.Color(150,0,0)); // Moderately bright green color.  
   pixels.show(); // This sends the updated pixel color to the hardware.  
   delay(delayval); // Delay for a period of time (in milliseconds).  
   pixels.setPixelColor(i, pixels.Color(0,150,0)); // Moderately bright green color.  
   pixels.show(); // This sends the updated pixel color to the hardware.  
   delay(delayval); // Delay for a period of time (in milliseconds).  
   pixels.setPixelColor(i, pixels.Color(0,0,150)); // Moderately bright green color.  
   pixels.show(); // This sends the updated pixel color to the hardware.  
   delay(delayval); // Delay for a period of time (in milliseconds).  
   
  }  
 }  

 

   No vídeo abaixo você vê o código em funcionamento com apenas um LED RGB:
   Explicando o código, as duas linhas mais importantes do código acima são:
– pixels.setPixelColor(i, pixels.Color(150,0,0)); É a linha que diz qual cor RGB enviar (150, 0, 0 é vermelho) e para qual pixel: neste caso temos apenas um pixel, então “i” vai receber o valor 1
pixels.show(); É o comando que efetivamente liga o WS2812b para mostra a cor requisitada
   Realmente não tem segredo, a biblioteca da Adafruit faz todo o trabalho; você apenas define a cor (em RGB) e manda para o pixel, que vai executar na hora.
______________________________________

Utilizar mais de um LED também é muito tranquilo, e é possível inclusive definir uma cor para cada LED; tudo isto utilizando um único pino de controle: veja imagem abaixo.

Detalhes da solda dos fios:

O código para fazer os três LED’s funcionar é similar àquele utilizado para um LED, com a diferença que agora cada LED tem que ser “chamado pelo nome”: 0, 1, 2, 3 … e asssim vai. Note que ao invés de números, eu atribuí letras (i, j, l) aos LED’s, e consequentemente números às letras. Veja o código abaixo: a função dele é piscar cada LED em três cores, alternando a cada 0,3 segundos e dando a impressão que as cores estão “correndo” de um LED para outro:

 #include <Adafruit_NeoPixel.h>  
 #ifdef __AVR__  
  #include <avr/power.h>  
 #endif  
   
 // Which pin on the Arduino is connected to the NeoPixels?  
 #define PIN      3  
   
 // How many NeoPixels are attached to the Arduino?  
 #define NUMPIXELS   3  
   
 Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);  
   
 int delayval = 333; // delay  
 int i = 0;  
 int j = 1;  
 int l = 2;  
   
 void setup() {  
   pixels.begin(); // This initializes the NeoPixel library.  
 }  
   
 void loop() {  
   
   // pixels.Color takes RGB values, from 0,0,0 up to 255,255,255  
   pixels.setPixelColor(i, pixels.Color(148,0,211));  
   pixels.setPixelColor(j, pixels.Color(0,211,148));  
   pixels.setPixelColor(l, pixels.Color(211,148,0));  
   pixels.show();   
   delay(delayval);  
   
   pixels.setPixelColor(i, pixels.Color(0,211,148));  
   pixels.setPixelColor(j, pixels.Color(211,148,0));  
   pixels.setPixelColor(l, pixels.Color(148,0,211));  
   pixels.show();   
   delay(delayval);  
   
   pixels.setPixelColor(i, pixels.Color(211,148,0));  
   pixels.setPixelColor(j, pixels.Color(148,0,211));  
   pixels.setPixelColor(l, pixels.Color(0,148,211));  
   pixels.show();   
   delay(delayval);  
     
   
    
 }  

Não tenho vídeo do efeito produzido, mas as cores são essas:

____________________________________________________________

Para finalizar: os LED’s RGB estão na moda no momento, e as possibilidade de criação são infinitas (ainda mais quando é fácil assim brincar com eles). Aproveite e aprenda algo novo você também.

Quer adquirir este LED RGB WS2812b no MercadoLivre? Clique Aqui!.

Ligando Led RGB com Arduino – WS2812b
Classificado como:                            

2 ideias sobre “Ligando Led RGB com Arduino – WS2812b

  • junho 3, 2016 em 9:50 pm
    Permalink

    Muito bom seu artigo, estou aprendendo muito com suas postagens, visto que não tenho com quem trocar experiências

    Resposta
  • fevereiro 14, 2017 em 9:40 am
    Permalink

    entrei adaptar essa programação a ligar com flex sensor e não dá, poderia me dizer como faz essa programação ???

    Resposta

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Solve : *
2 + 26 =