Você já sabe como usar leds endereçáveis com o Arduino, certo? Vimos isso no post Semáforo com Arduino e Led Endereçável WS2812B. Vamos continuar esse assunto, mostrando como você pode ligar ao Arduino mais dois componentes: o Painel de Led RGB WS2812 e o Anel de Led RGB WS2812.
Ao contrário dos leds endereçáveis que vimos no post anterior, que precisavam ser conectados um a um, tanto o painel de led como o anel já tem todos os leds interligados, tornando mais fácil e rápida a adaptação ao seu projeto.
Como os leds endereçáveis individuais, você ainda pode conectar vários módulos como esses em cascata. Veja como fazer isso nos procedimentos à seguir.
Painel de led RGB WS2812 endereçável
O painel de led RGB tem 64 leds que podem ser ativados individualmente ou em grupo de acordo com o seu programa. A ligação com o microcontrolador e alimentação é feita por meio de um conector de 3 pinos: um pino de sinal (DIN), Vcc (5V) e GND.
Como os outros sistemas de leds endereçáveis, temos também um conector de saída (DOUT, 5V e GND) para ligar outra matriz em cascata. Com isso, você pode criar efeitos visuais incríveis para o seu projeto.
Anel de led RGB WS2812 – 16 leds
O anel de led RGB segue o mesmo princípio do painel, mas os leds são dispostos em formato circular. Os anéis são apresentados em várias versões, como o anel com 12 leds, 16 leds e 24 leds, entre outras.
Com o anel de led você também consegue efeitos muito interessantes para o seu projeto. Nos testes deste post, vou usar interligar dois anéis de 16 leds.
Ligação do Painel de de led WS2812
Vamos mostrar a ligação desses componentes ao Arduino, começando pelo Painel de Leds. A ligação é bem simples, usando o pino 7 como controle da matriz:
Perceba que estamos utilizando a alimentação do próprio Arduino, apenas para efeito de testes. Se você for utilizar o circuito por um tempo mais prolongado ou os leds com brilho máximo, escolha uma fonte de alimentação externa, assim você não corre o risco de danificar a sua placa.
Outra recomendação é ligar um capacitor de 1000µF entre os pinos de alimentação, para evitar picos de tensão que podem queimar os leds.
Para testar o circuito, utilize o programa abaixo, instalando primeiro a biblioteca Neopixel da Adafruit, disponível neste link.
//Programa: Arduino Painel de led WS2812 //Alteracoes e adaptacoes: Arduino e Cia //Baseado no programa exemplo da biblioeca Neopixel #include <Adafruit_NeoPixel.h> #ifdef __AVR__ #include <avr/power.h> #endif //Pino de dados da matriz de led #define PIN 7 //Parametros: numero de leds, pino de ligacao Adafruit_NeoPixel strip=Adafruit_NeoPixel(64,PIN,NEO_GRB + NEO_KHZ800); void setup() { strip.begin(); strip.show(); //Define o brilho dos leds strip.setBrightness(50); } void loop() { //Acende os leds na cor vermelha colorWipe(strip.Color(255, 0, 0), 20); //Acende os leds na cor verde colorWipe(strip.Color(0, 255, 0), 20); //Acende os leds na cor azul colorWipe(strip.Color(0, 0, 255), 20); //Pisca os leds alternadamente theaterChase(strip.Color(127, 127, 127), 50); // White theaterChase(strip.Color(127, 0, 0), 50); // Red theaterChase(strip.Color(0, 0, 127), 50); // Blue //Efeito arco-iris rainbow(20); } void colorWipe(uint32_t c, uint8_t wait) { for (uint16_t i = 0; i < strip.numPixels(); i++) { strip.setPixelColor(i, c); strip.show(); delay(wait); } } void rainbow(uint8_t wait) { uint16_t i, j; for (j = 0; j < 256; j++) { for (i = 0; i < strip.numPixels(); i++) { strip.setPixelColor(i, Wheel((i + j) & 255)); } strip.show(); delay(wait); } } void theaterChase(uint32_t c, uint8_t wait) { for (int j = 0; j < 10; j++) { //do 10 cycles of chasing for (int q = 0; q < 3; q++) { for (int i = 0; i < strip.numPixels(); i = i + 3) { strip.setPixelColor(i + q, c); //turn every third pixel on } strip.show(); delay(wait); for (int i = 0; i < strip.numPixels(); i = i + 3) { strip.setPixelColor(i + q, 0); //turn every third pixel off } } } } uint32_t Wheel(byte WheelPos) { WheelPos = 255 - WheelPos; if (WheelPos < 85) { return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3); } if (WheelPos < 170) { WheelPos -= 85; return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3); } WheelPos -= 170; return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0); }
O programa é baseado no programa exemplo da própria biblioteca, e utiliza vários efeitos como acender os leds em sequência, piscar, arco-íris, etc. Você pode utilizar este programa com praticamente qualquer tipo de led endereçável, mudando o valor referente à quantidade de leds na linha 14 do programa (no caso, está configurado para acender 64 leds, que é o tamanho da nossa matriz 8×8).
Ligação do Anel de Led WS2812
Para a ligação do anel de leds ao Arduino, vamos usar o mesmo pino 7, mas agora com 2 anéis de leds ligados em cascata. Vamos também adicionar um potenciômetro ao circuito (usei um de 10K).
Para ligação em cascata, conecte o pino DOUT do primeiro anel ao pino DIN do segundo. Ligue também os pinos Vcc e GND. Use o mesmo procedimento de acordo com a quantidade de componentes que você tiver.
Carregue o programa abaixo:
//Programa: Arduino Anel de Leds Enderecaveis WS2812 //Autor: Arduino e Cia #include <Adafruit_NeoPixel.h> //Pino Leds Enderecaveis #define PIN 7 //Pino Potenciometro #define PINPOT A1 //Define a quantidade de leds e o pino de ligacao Adafruit_NeoPixel pixels = Adafruit_NeoPixel(32, PIN); uint8_t offset = 0; //Cor dos leds uint32_t color = 0x00ff22; int valor = 0; void setup() { Serial.begin(9600); pinMode(PINPOT, INPUT); pixels.begin(); //Brilho dos leds pixels.setBrightness(50); } void loop() { //Le o valor do potenciometro valor = analogRead(PINPOT); //Verifica se o potenciometro esta na posicao central while (analogRead(PINPOT) >= 490 && analogRead(PINPOT) <= 520) { delay(10); } //Define o sentido de rotacao como horario e //ajusta a velocidade if (valor >= 512) { offset++; valor = map(valor, 0, 1023, 150, 38); } //Define o sentido de rotacao como anti-horario e //ajusta a velocidade else { offset--; valor = map(valor, 0, 1023, 38, 150); } uint8_t i; for (i = 0; i < 32; i++) { uint32_t c = 0; if (((offset + i) & 7) < 2) c = color; // 4 pixels on... { //Primeiro anel pixels.setPixelColor( i, c); //Segundo anel pixels.setPixelColor(16 + i, c + 40); } } pixels.show(); delay(valor); }
O programa lê o valor do potenciômetro e determina não só a velocidade com que os leds serão acesos, mas também o sentido em que os anéis vão “girar”. Confira no vídeo abaixo:
Gostou? Confira outros posts usando displays aqui mesmo no Arduino e Cia!