Escolha uma Página

Fita de LEDs RGB endereçáveis WS2812B e a biblioteca fastLED

26 out - 2020

No post de hoje, vamos conhecer a fita de LEDs WS2812B endereçáveis e como utilizá-la com o Arduino UNO.  Essa fita de LEDs se destaca, em relação as outras do mercado, pelo fato de que seus LEDs podem ser controlados de maneira individual, permitindo que o projetista possa desenvolver diversos efeitos luminosos.

 

Conhecendo o LED WS2812B

O LED WS2812B possuí três cores, vermelho, verde e azul (RGB). A característica principal deste LED é que ele possui um controlador digital integrado ao seu encapsulamento, o que o torna ideal para aplicações com microcontroladores, por exemplo, a plataforma Arduino. Além disto, o LED WS2812B tem excelente luminosidade, excelente reprodução de cores e um protocolo de comunicação serial (comunicação NZR) de apenas um fio. Cada LED possui um pino para entrada de dados e outro para saída. Isto é, com apenas uma porta do seu microcontrolador você será capaz de controlar, individualmente, até 1024 LEDs com uma taxa de 30 frames por segundo.

LED WS2812B: um único invólucro, três cores e um circuito integrado interno dedicado ao controle digital das cores.

Você pode encontrar no mercado, esse tipo de LED em fita, avulso ou matriz. Cada tipo se situa melhor para uma determinada aplicação, recomendamos, quase sempre, a fita de LEDs, pela sua praticidade e versatilidade no seu uso.

Comunicação dos LEDs com o Arduino

Os LEDs do tipo WS2812B possuem, quatro pinos, respectivamente,  dois de alimentação, positivo e negativo, e também, mais dois pinos sendo um de entrada de dados de comunicação e o outro de saída de dados.  Observe que há dois pinos de dados, no de entrada de dados o LED recebe os dados e acende conforme as instruções. Já o pino de saída de dados, é responsável por repassar os dados para o próximo LED, e assim sucessivamente até o último LED do circuito. Através da programação do seu Arduino é possível ligar ou desligar qualquer LED, em qualquer posição da fita, de maneira individual.

Na imagem abaixo é possível ver um arranjo típico da fita de LED WS2812B

Diagrama elétrico da fita: observe o sentido em que o sinal de dados trafega através dos LEDs.

Observe que há uma seta indicando o sentido em que os dados trafegam através da fita de LEDs, em seus projetos você pode cortar a fita em quantos pedaços forem necessários, no entanto, jamais se esqueça de seguir o sentido dos dados ao interligar os segmentos de fita.

 

Alimentação dos LEDs

Uma vez que, o consumo de corrente para cada LED é da ordem de 40mA, recomenda-se uma fonte  de 5VDC dedicada a alimentação dos LED’s. Isto é, um consumo de 1A para 25 LEDs, lembre-se de observar essa demanda de corrente. Este consumo de corrente impossibilita utilizar o regulador de tensão onboard do seu Arduino, este, é capaz de fornecer somente 800mA. Uma sugestão de alimentação é dada conforme a figura abaixo, observe que a fonte externa deve ser de 5VDC uma tensão maior que esta irá acarretar a queima dos LEDs.

Sugestão de alimentação da fita: O Arduino pode ser alimentado via USB ou também receber os 5V da fonte através do pino 5V.

 

Biblioteca fastLED: a melhor opção para controlar os LEDs com Arduino

Para o controle dos LEDs é necessário utilizar uma biblioteca. Seguramente, a melhor opção de biblioteca, atualmente, é a fastLED. Desenvolvida inicialmente por Daniel Garcia e Mark Kriegsman. Essa biblioteca conta com uma infinidade funções, fórum de discussões, uma wiki extremamente detalhada sobre o funcionamento da biblioteca e suas funções.

Os destaques da biblioteca são:

  • Suporte completo ao sistema HSV de cor e também RGB.
  • Gerenciamento de consumo elétrico da fita, útil para aplicações com bateria ou fonte de baixa corrente.
  • Funções matemáticas extremamente rápidas em comparação com as funções nativas da plataforma Arduino.
  • Vasta e ativa comunidade de usuários.

Links úteis da biblioteca fastLED:

FastLED GitHub

FastLED wiki  

FastLED Reddit

Documentação da biblioteca

 

Teste prático da fita de LEDs

Com o esquema da figura anterior, carregue no Arduino um dos exemplos da biblioteca fastLED.

Vamos tomar como exemplo o programa DemoReel100.


#include <FastLED.h>

FASTLED_USING_NAMESPACE

// FastLED "100-lines-of-code" demo reel, showing just a few 
// of the kinds of animation patterns you can quickly and easily 
// compose using FastLED.  
//
// This example also shows one easy way to define multiple 
// animations patterns and have them automatically rotate.
//
// -Mark Kriegsman, December 2014

#if defined(FASTLED_VERSION) && (FASTLED_VERSION < 3001000)
#warning "Requires FastLED 3.1 or later; check github for latest code."
#endif

#define DATA_PIN    3        //pino do arduino conectado a fita de LEDS WS2812B
//#define CLK_PIN   4        //Nao utilizado na fita WS2812B
#define LED_TYPE    WS2812B
#define COLOR_ORDER GRB     //Ordem das cores na fita de led WS2812B
#define NUM_LEDS    64      //numero de leds na fita

CRGB leds[NUM_LEDS];

#define BRIGHTNESS          96   //brilho dos leds  0 a 255
#define FRAMES_PER_SECOND  120   //frames por segundo, quanto mais leds na fita menor deve ser a taxa de frames por segundo

void setup() {
  delay(3000); // 3 second delay for recovery
  
  // tell FastLED about the LED strip configuration
  FastLED.addLeds<LED_TYPE,DATA_PIN,COLOR_ORDER>(leds, NUM_LEDS).setCorrection(TypicalLEDStrip);
  //FastLED.addLeds<LED_TYPE,DATA_PIN,CLK_PIN,COLOR_ORDER>(leds, NUM_LEDS).setCorrection(TypicalLEDStrip);

  // set master brightness control
  FastLED.setBrightness(BRIGHTNESS);
}


// List of patterns to cycle through.  Each is defined as a separate function below.
typedef void (*SimplePatternList[])();
SimplePatternList gPatterns = { rainbow, rainbowWithGlitter, confetti, sinelon, juggle, bpm };

uint8_t gCurrentPatternNumber = 0; // Index number of which pattern is current
uint8_t gHue = 0; // rotating "base color" used by many of the patterns
  
void loop()
{
  // Call the current pattern function once, updating the 'leds' array
  gPatterns[gCurrentPatternNumber]();

  // send the 'leds' array out to the actual LED strip
  FastLED.show();  
  // insert a delay to keep the framerate modest
  FastLED.delay(1000/FRAMES_PER_SECOND); 

  // do some periodic updates
  EVERY_N_MILLISECONDS( 20 ) { gHue++; } // slowly cycle the "base color" through the rainbow
  EVERY_N_SECONDS( 10 ) { nextPattern(); } // change patterns periodically
}

#define ARRAY_SIZE(A) (sizeof(A) / sizeof((A)[0]))

void nextPattern()
{
  // add one to the current pattern number, and wrap around at the end
  gCurrentPatternNumber = (gCurrentPatternNumber + 1) % ARRAY_SIZE( gPatterns);
}

void rainbow() 
{
  // FastLED's built-in rainbow generator
  fill_rainbow( leds, NUM_LEDS, gHue, 7);
}

void rainbowWithGlitter() 
{
  // built-in FastLED rainbow, plus some random sparkly glitter
  rainbow();
  addGlitter(80);
}

void addGlitter( fract8 chanceOfGlitter) 
{
  if( random8() < chanceOfGlitter) {
    leds[ random16(NUM_LEDS) ] += CRGB::White;
  }
}

void confetti() 
{
  // random colored speckles that blink in and fade smoothly
  fadeToBlackBy( leds, NUM_LEDS, 10);
  int pos = random16(NUM_LEDS);
  leds[pos] += CHSV( gHue + random8(64), 200, 255);
}

void sinelon()
{
  // a colored dot sweeping back and forth, with fading trails
  fadeToBlackBy( leds, NUM_LEDS, 20);
  int pos = beatsin16( 13, 0, NUM_LEDS-1 );
  leds[pos] += CHSV( gHue, 255, 192);
}

void bpm()
{
  // colored stripes pulsing at a defined Beats-Per-Minute (BPM)
  uint8_t BeatsPerMinute = 62;
  CRGBPalette16 palette = PartyColors_p;
  uint8_t beat = beatsin8( BeatsPerMinute, 64, 255);
  for( int i = 0; i < NUM_LEDS; i++) { //9948
    leds[i] = ColorFromPalette(palette, gHue+(i*2), beat-gHue+(i*10));
  }
}

void juggle() {
  // eight colored dots, weaving in and out of sync with each other
  fadeToBlackBy( leds, NUM_LEDS, 20);
  byte dothue = 0;
  for( int i = 0; i < 8; i++) {
    leds[beatsin16( i+7, 0, NUM_LEDS-1 )] |= CHSV(dothue, 200, 255);
    dothue += 32;
  }
}

Observe no cabeçalho do programa que há algumas #DEFINES importantes e que serão comuns aos programas que você for implementar com a biblioteca fastLED. Por exemplo:

Pino do Arduino conectado a fita de LEDS WS2812B:

#define DATA_PIN 3

Tipo de LED utilizado ( a biblioteca suporta uma vasta gama de LEDs RGB, confira na documentação os modelos suportados)

#define LED_TYPE WS2812B

Ordem das cores verde, vermelho e azul na fita de led, para o modelo WS2812B a ordem é: GRB.

#define COLOR_ORDER GRB

Número de LEDs na fita

#define NUM_LEDS 64

Brilho global dos LEDs (0 a 255)

#define BRIGHTNESS 96

No próximo post iremos propor uma montagem muito interessante com esse tipo de fita de LEDs que certamente irá despertar a vontade do leitor em construí-la, aguarde o próximo  post. E também, não deixe de compartilhar as suas montagens com a gente no Instagram da Módulo Eletrônica.

Rafael Valsani Leme Passos

Rafael Valsani Leme Passos

Sobre o autor: Rafael Valsani Leme Passos é técnico em eletrônica pela ETEC Bento Quirino e graduando em Engenharia de Alimentos pela Universidade Estadual de Campinas. 

0 comentários

Enviar um comentário

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

Facebook

VEJA TAMBÉM

Regador automático de plantas com Arduino

Aprenda neste artigo, como automatizar a rega de suas plantas, utilizando o Arduino NANO. Este projeto, além do baixo custo, pode ser montado em menos de uma hora e irá garantir que as suas plantas sempre tenham água disponível, garantido um crescimento adequado e...

Display de 7 segmentos no Arduino com multiplexação

  No post de hoje, vamos aprender a trabalhar com os displays de 7 segmentos, esse tipo de display é muito comum é uma vasta gama de equipamentos eletrônicos. As vantagens desse display são o seu baixo custo, simplicidade de implementação, excelente resistência...

NEWSLETTER

Assine nossa newsletter e receba as novidades.

ATENDIMENTO

(19) 3579-7189