You are here

ESP8266: WS2812 - NeoPixel カラーLEDの使用

WS2812:NeoPixelのESP8266-LEAF-R5へ接続

NeoPixel/WS2812は電源も信号も定格が5Vとなっているため、生のESP-WROOM-02では、接続して適切に動かすことはできません。

ESP8266-LEAF-R5にはWS2812(NeoPixel)/RCサーボを直接接続できる端子が搭載されています。
この端子(CN4)は3端子構成で、GND,5V,5V化されたD2(GPIO02)信号出力が接続されています。
ESP8266-LEAF-R5には、3.3V信号を5Vに変換する回路が組み込まれているので、WS2812(NeoPixel)やRCサーボを簡単に接続して利用することができます。

NeoPixel/WS2812カラーLEDの接続

NeoPixelライブラリを使用したスケッチ

ここでは、Adafruitが提供しているNeoPixelライブラリを使用して、WS2812カラーLEDを利用する方法を示します。

このライブラリは、UNO等の多くのArduinoボードや、ESP-ROOM-02(ESP8266), ESP-WROOM-32(ESP32)にも対応しており、大変便利に使っています。:-)

NeoPixelライブラリは、以下のURLで公開されています。
https://github.com/adafruit/Adafruit_NeoPixel

このページからライブラリをダウンロードしてArduino IDEにインストールすることもできますが、Arduino IDEのライブラリマネージャで簡単にインストールすることができます。

ライブラリマネージャを開いて、上部の検索領域にNeoPixelと入力すると、NeoPixel用の幾つかのライブラリ項目が表示されるので、それらのライブラリの中から"Adafruit NeoPixel"と記載されているライブラリをインストールします。

ライブラリマネージャでのNeoPixelライブラリのインストール

NeoPixelライブラリの使用法は、以下のURLで公開されています。
https://learn.adafruit.com/adafruit-neopixel-uberguide/arduino-library

NeoPixelライブラリをインストールすると、いくつかのサンプルプログラムが利用できるようになります。
strandtestというサンプルが色の変化やパターンがきれいなので、最初に試してみてはいかがでしょうか?
strandtestを利用する際には、LEDを接続するピン番号(6行でもとは6)を2に、LEDの個数(16行でもとは60)を自分の利用するLEDの数に変更してください。

ESP8266-LEAF-R5に、WS2912を24個搭載したリングを接続し発光させるプログラム例を示します。

#include <Adafruit_NeoPixel.h>

// ESP8266-LEAF-R5のWS2812用の出力ピン
#define PIN 2

// 24個のWS2812(NeoPixel)を制御できるように初期化
Adafruit_NeoPixel strip = Adafruit_NeoPixel(24, PIN, NEO_GRB + NEO_KHZ800) ;

// Input a value 0 to 255 to get a color value.
// The colours are a transition r - g - b - back to r.
uint32_t Wheel(byte WheelPos) {
  if (WheelPos < 85) {
    return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0) ;
  } else if (WheelPos < 170) {
    WheelPos -= 85 ;
    return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3) ;
  } else {
    WheelPos -= 170 ;
    return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3) ;
  }
}

void setup()
{
  strip.begin() ;
  strip.setBrightness(50) ; // 明るさを少し抑えます
}

int color = 0 ;

void loop()
{
  color++ ;
  if (color > 255)
    color = 0 ;
  
  for (int i = 0; i < strip.numPixels(); i++) {
    strip.setPixelColor(i, Wheel(color)) ; // 24個のWS2812に色を設定
  }
  strip.show() ; // 色の設定データをWS2812に送信

  delay(10) ;
}

NeoPixelライブラリは、下記のコンストラクタとメソッドでカラーLEDを操作します。


  • Adafruit_NeoPixel()
    コンストラクタ
    第1引数は接続されているカラーLEDの個数、第2引数はカラーLEDを接続する端子
    第3引数は NEO_GRB + NEO_KHZ800
  • begin()
    初期化のために最初に呼び出す
  • setPixelColor()
    第1引数で指定したカラーLEDに、第2引数で32ビット指定した色を設定する
    もしくは、第2、第3、第4引数でR,G,Bを指定する
    色の設定は下記のshow()メソッドを実行するまで反映されない
  • show()
    setPixelColor()で指定した色情報を、カラーLEDに送信して表示色を更新する
  • setBrightness()
    0~255を指定し、カラーLEDの発光強度を制御する255が最高でデフォルト値
  • numPixels()
    接続されているカラーLEDの数を返す。
    Adafruit_NeoPixel()コンストラクタの第1引数で指定した数値

WS2812はかなり明るいLEDなので、すぐそばに置いて実験をする場合には目を傷めたりしないように、setBrightness()を使用して明るさを絞った方がよいように思います。
また、定格では、WS2812は最大で(RGBをすべてつけた白色の発色時)に55-60mA程度消費します。個数が増えると消費電流も増加するため、十分な電源を用意していない場合には、過剰な電流を消費しないようにするためにも、明るさを適切に抑えることが望まれます。
ちなみに、USBの供給電流は、USB2.0は500mAまで、USB3.0は900mAまでとなっています。

上記のスケッチに記載しているWheel()関数は、NeoPixelライブラリのサンプル内で定義されている関数を使わせてもらっています。Wheel()関数は、0-255の数値を与えることにより、3原色を混合した色情報を生成してくれる便利な関数です。


利用したパーツ



開発ソフト: 
チップファミリー: 
MCUチップ: 
技術: