フルカラーLEDをArduino互換ボードで動かしてみました

マイコン内蔵のフルカラーLEDというのものを購入したので、これをArduino互換ボードで動かしてみました。
・動画(youtube)

マイコン内蔵フルカラーLED


型番:WS2812B

ケース内に3つのLED(R,G,B)とマイコンが搭載されており、通常のLEDとは異なりシリアルの制御線によって明るさや色合いを変更できるようです。最近はLED内部にもマイコンが内蔵されるようになったのですね。

もう一つ面白いのは、同じLEDを数珠つなぎにしてシリアル制御で一括制御できることです。
なので電源が許せる限り、いくつもLEDを繋いでイルミネーションのようなものが割と簡単に作れてしまうようです。

機会があればイルミネーションのようなものも作ってみたいですが、今回はお試しということで1個だけ使用して動かしました。

Arduino互換ボード

ブログ(KiCadで基板を作る)の基板作成記事で作ったものを使用しました。
参考:Arduino互換基板の作成(1) 
arduino5

その他基板

電源入力用およびフルカラーLEDの実装用の基板はDCジャック変換基板を利用しました。
これもブログの基板作成記事で作った基板です。
参考:DCジャック変換基板の作成(1)
DCjack1
 

ブロック図

ブロック図

スケッチ

LEDの制御については、AdafruitのNeoPixelライブラリを使用しました。
スケッチもNeoPixelのサンプルスケッチ「simple」をもとに作成しました。

Arduinoのデジタル入出力6番ピンから制御信号を出力しており、周期的に色合いと明るさが変化する動作となっています。

#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
  #include <avr/power.h>
#endif

// Which pin on the Arduino is connected to the NeoPixels?
// On a Trinket or Gemma we suggest changing this to 1
#define PIN            6

// How many NeoPixels are attached to the Arduino?
#define NUMPIXELS      1

// When we setup the NeoPixel library, we tell it how many pixels, and which pin to use to send signals.
// Note that for older NeoPixel strips you might need to change the third parameter--see the strandtest
// example for more information on possible values.
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);

int delayval = 500; // delay for half a second
int ledState = LOW;

void setup() {
  // This is for Trinket 5V 16MHz, you can remove these three lines if you are not using a Trinket
#if defined (__AVR_ATtiny85__)
  if (F_CPU == 16000000) clock_prescale_set(clock_div_1);
#endif
  // End of trinket special code

  pixels.begin(); // This initializes the NeoPixel library.
  pixels.setPixelColor(0,pixels.Color(0,0,0));
  pixels.show();
  delay(500);
  pinMode(7, OUTPUT);
}

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<100;i++){
    for(int j=0;j<100;j++){
      for(int k=0;k<10;k++){
        pixels.setPixelColor(0,pixels.Color(i,j,30));
        pixels.show();
        delay(1);
      }
    }
    for(int j=100;j>0;j--){
      for(int k=0;k<10;k++){
        pixels.setPixelColor(0,pixels.Color(i,j,30));
        pixels.show();
        delay(1);
      }
    }

    if (ledState == LOW) {
      ledState = HIGH;
    } else {
      ledState = LOW;
    }
    digitalWrite(7, ledState);
  }