29 março 2016

Arduino com painel de Led RGB 8x8 e Anel de led RGB WS2812

Você já sabe como usar leds endereçáveis com o Arduino, certo ? Vimos isso no post Semárofo 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.

Neopixel led enderecavel 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.

Led Matrix RGB WS2812

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.

Anel de led RGB WS2812 16 leds

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:

Circuito Arduino Painel de Led WS2812
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.

 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
83
84
85
86
87
88
89
//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 8x8).

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:

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



Nenhum comentário:

Postar um comentário