RGB LEDモジュール WS2812を使いました。
データ線で1本で複数のLEDを個別にでフルカラー発色制御できます。
Arduino環境でLEDの数やPCB基板形状の違うモジュールを制御します。
記事の概要
フルカラーLEDモジュール WS2812を使った内容を記事にしました。
LEDの数やPCB基板の形状の違うモジュールを複数紹介しています。
LEDを複数点灯したした時の消費電力や発熱について調査しました。
Arduino環境で開発するための準備と、調査や実験に使った回路とスケッチを記載しています。
RGB LEDモジュール(WS2812)
簡単紹介
信号線一本で複数のフルカラーLEDを個別に制御できる。

◆種類
簡単紹介ではLED1個モデルです。
数や形状、サイズ違いのものが多くあります。
種類ごとのLEDの番号は使ってみた物について記載します。

◆入手
国内電子部品販売店サイト、AliExpressで入手できます。
形状やLED数で価格幅がありますが参考です。
◆関連記事
ピン配置
◆シングル

◆ラインアレイ

◆マトリクスアレイ
PCB毎にLEDの並びに違いがあります。


◆サークル

外観
◆シングル

◆ラインアレイ

◆マトリクスアレイ


◆サークル

使ってみた
◆発光
赤と緑と青を混色することで多くの色を再現します。
各色輝度調整は256階調(0 ~ 255)で設定で、PWM制御輝度調整をしているようです。
こちらは発光の様子を撮影したものです。
撮影はデジタルマイクロスコープを使用しました。
輝度は各色16(最大輝度255に対して)に設定し、青、赤、緑が発色している様子です。

低輝度設定でも明るいので、室内で使用するのであれば最大輝度の1/4程度でも十分に思います。
◆開発
Arduino環境で作成します。
ライブラリにはAdafruitの「Adafruit NeoPixel by Adafruit」を使いました。
簡単な命令セットでLEDの色や明るさを制御できます。
WS2812の配置がマトリクスの場合、PCB基板の設計により座標への変換式が異なることがあるので、使用するPCB基板の設計を確認する必要があります。
ピン配置とLED並び順
◆連結
WS2812モジュールのDOUTを次のWS2812モジュールのDINに接続することで連結できます。
制御上は連結されるモジュールの最後のLEDの次は、連結するモジュールの先頭のLEDになります。

◆消費電力、発熱
複数制御した時の消費電力や発熱具合についてモニタしました。
赤、緑、青の各1色あたり最大輝度で約10mA/個、3色点灯時30mA/個でした。
発熱は白32個点灯時に5分の温度読み取り時間を待ち、57℃(室温22℃)でした。
全点灯や夏場の使用では冷却の仕組みが必要そうです。

◆マイコン基板実装タイプ
マイコン基板に実装されている物も多くあります。
今回は5050のモジュールについて制御し、個別のマイコン基板やマイコンに接続する専用モジュールについては別記します。
◆作例:ぷよぷよ風ゲーム
同じ色のドットが4個隣り合うと消えるぷよぷよ風ゲームです。
準備
使うもの
Arduino環境でRaspberryPi Picoを使用します。
Arduino環境の準備はこちらの記事で紹介しています。
ボードライブラリ
今回Raspberry Pi Picoを使用します。
Arduino IDEのボードマネージャからRP2040用のライブラリのインストールとボードの選択をします。
ボードライブラリには「Raspberry Pi Pico/RP2040 by Earle F. Philhower, III」を使用します。
Generic RP2040またはRaspberry Pi Picoを使用します。
追加のボードマネージャのURL | https://github.com/earlephilhower/arduino-pico/releases/download/global/package_rp2040_index.json |
検索 | RP2040 |
ボードライブラリ | Raspberry Pi RP2040 Boards(x.x.x)※ |
選択するボード | Raspberry Pi RP2040 Boards(x.x.x) > Raspberry Pi Pico |
モジュールライブラリ
1.モジュールライブラリのインストール
モジュールライブラリにはAdafruit LOLIN EPD_Libraryを使用します。
ライブラリ名 | 検索 | 確認時のバージョン |
---|---|---|
Adafruit NeoPixel by Adafruit | nexpixel | 1.12.3 |
スケッチサンプル
LEDのカラフル点灯
説明
1秒ごとに色を変えながらLEDを点灯します。
色変化は黒(無点灯)>赤>緑>黄>青>紫>水>白 です。
輝度は256階調(0 ~ 255)の分の16です。
最大輝度での発行はかなりまぶしく残影が残るので明るさ調整には注意します。
配線

スケッチ
#include <Adafruit_NeoPixel.h>
#define DIN_PIN (0)
#define LED_COUNT (1)
#define BRIGHTNESS (16)
Adafruit_NeoPixel pixels(LED_COUNT, DIN_PIN, NEO_GRB + NEO_KHZ800);
void setup(void)
{
pixels.begin();
}
void loop(void)
{
int32_t Palette = 0;
for(int16_t i = 0; i < 8; i ++)
{
switch(i)
{
case 0: Palette = pixels.Color(0, 0, 0);break;
case 1: Palette = pixels.Color(BRIGHTNESS, 0, 0); break;
case 2: Palette = pixels.Color(0, BRIGHTNESS, 0); break;
case 3: Palette = pixels.Color(BRIGHTNESS, BRIGHTNESS, 0); break;
case 4: Palette = pixels.Color(0, 0, BRIGHTNESS); break;
case 5: Palette = pixels.Color(BRIGHTNESS, 0, BRIGHTNESS); break;
case 6: Palette = pixels.Color(0, BRIGHTNESS, BRIGHTNESS); break;
case 7: Palette = pixels.Color(BRIGHTNESS, BRIGHTNESS, BRIGHTNESS); break;
}
pixels.setPixelColor(0, Palette);
pixels.show();
delay(1000);
}
}
結果
カラフルな発色変化をしました。

ラインアレイLEDの点灯
説明
ラインアレイLEDモジュールの点灯制御をします。
初期化では使用するLEDの個数を設定し、個別のLED番号を指定とそのLEDに点灯させる色情報を設定します。
このスケッチでは8個のLEDを各3原色の組み合わせで8色点灯(1個は白の微点灯)させます。
配線

スケッチ
#include <Adafruit_NeoPixel.h>
#define DIN_PIN (0)
#define LED_COUNT (8)
#define BRIGHTNESS (16)
Adafruit_NeoPixel pixels(LED_COUNT, DIN_PIN, NEO_GRB + NEO_KHZ800);
void setup(void)
{
pixels.begin();
pixels.setPixelColor(0, pixels.Color(1, 1, 1));
pixels.setPixelColor(1, pixels.Color(BRIGHTNESS, 0, 0));
pixels.setPixelColor(2, pixels.Color(0, BRIGHTNESS, 0));
pixels.setPixelColor(3, pixels.Color(BRIGHTNESS, BRIGHTNESS, 0));
pixels.setPixelColor(4, pixels.Color(0, 0, BRIGHTNESS));
pixels.setPixelColor(5, pixels.Color(BRIGHTNESS, 0, BRIGHTNESS));
pixels.setPixelColor(6, pixels.Color(0, BRIGHTNESS, BRIGHTNESS));
pixels.setPixelColor(7, pixels.Color(BRIGHTNESS, BRIGHTNESS, BRIGHTNESS));
pixels.show();
}
void loop(void)
{
}
結果
ラインアレイの各LEDが点灯しました。
画像では各色がすべて白っぽく見えますが肉眼ではきれいな発色を確認できます。

サークルLEDの点灯
説明
サークルLEDを点灯させます。
サークル形状をしていますがラインアレイと同じです。
このサンプルスケッチでは、青のグラデーションが回転しているような演出をします。
青のグラデーションパレットテーブルを作成します。
while()ループ内ではグラデーションの先頭を1つずつずらしながらすべてのLEDの輝度を変更します。
配線

スケッチ
#include <Adafruit_NeoPixel.h>
#define DIN_PIN (0)
#define LED_COUNT (16)
Adafruit_NeoPixel pixels(LED_COUNT, DIN_PIN, NEO_GRB + NEO_KHZ800);
void setup(void)
{
pixels.begin();
}
void loop(void)
{
int32_t div = 256 / LED_COUNT;
int32_t palette[LED_COUNT];
int16_t pIndex = 0;
for(int16_t i = 0; i < LED_COUNT; i ++)
{
palette[i] = pixels.Color(0, 0, (div * (i + 1)));
}
while(1)
{
for(int16_t i = 0; i < LED_COUNT; i ++)
{
pixels.setPixelColor(i, palette[(pIndex + i) % LED_COUNT]);
}
pixels.show();
delay(50);
pIndex ++;
if(LED_COUNT <= pIndex) pIndex = 0;
}
pixels.show();
}
結果
サークル形状を使用しているので回転しているような制御にできました。
マトリクスアレイLEDの点灯
説明
マトリクスアレイLEDモジュールの点灯制御をします。
XとYの2次元配置ですが実態はラインアレイです。
Y軸はX軸LED数のY倍で求めます。
このスケッチではX軸方向に各3原色の組み合わせで7色点灯、Y軸は256階調の8分割分ずつ輝度を明るくしています。
配線ではWS2812の5V電源は別のUSB電源から供給しています。
WS2812の複数LED同時点灯は消費電力が大きくRaspberry Pi Picoでは供給能力を超えそうなためです。
配線

スケッチ
#include <Adafruit_NeoPixel.h>
#define DIN_PIN (0)
#define LED_COUNT (64)
Adafruit_NeoPixel pixels(LED_COUNT, DIN_PIN, NEO_GRB + NEO_KHZ800);
void setup(void)
{
Serial.begin(115200);
delay(1000);
pixels.begin();
const int32_t res = 256 / 8;
int32_t Brightness = 0;
int32_t Palette = 0;
for(int16_t y = 0; y < 8; y ++)
{
Brightness = ((y + 1) * res) - 1);
for(int16_t x = 0; x < 8; x ++)
{
switch(x)
{
case 0: Palette = pixels.Color(0, 0, 0);break;
case 1: Palette = pixels.Color(Brightness, 0, 0); break;
case 2: Palette = pixels.Color(0, Brightness, 0); break;
case 3: Palette = pixels.Color(Brightness, Brightness, 0); break;
case 4: Palette = pixels.Color(0, 0, Brightness); break;
case 5: Palette = pixels.Color(Brightness, 0, Brightness); break;
case 6: Palette = pixels.Color(0, Brightness, Brightness); break;
case 7: Palette = pixels.Color(Brightness, Brightness, Brightness); break;
}
pixels.setPixelColor((y * 8) + x, Palette);
Serial.printf("x,y,pal = %d, %d, %08x\n", x, y, Palette);
}
}
pixels.show();
}
void loop(void)
{
}
結果
低輝度でもしっかり発色するのでわかりにくいですが奥が低輝度、手前が高輝度です。

モジュールの連結
説明
複数のモジュールを連結して制御します。
スケッチはラインアレイと同じ制御の仕方です。
配線はモジュールのDO(DOUT)からの配線先を次のモジュールのDI(DIN)に接続します。
電源とGNDは連結しても並列しても構いません。
今回のLEDの番号は下図配線図上で上から0, 1, 2番です。
配線

スケッチ
#include <Adafruit_NeoPixel.h>
#define DIN_PIN (0)
#define LED_COUNT (3)
#define BRIGHTNESS (16)
Adafruit_NeoPixel pixels(LED_COUNT, DIN_PIN, NEO_GRB + NEO_KHZ800);
void setup(void)
{
pixels.begin();
pixels.setPixelColor(0, pixels.Color(BRIGHTNESS, 0, 0));
pixels.setPixelColor(1, pixels.Color(0, BRIGHTNESS, 0));
pixels.setPixelColor(2, pixels.Color(0, 0, BRIGHTNESS));
pixels.show();
}
void loop(void)
{
}
結果
3個のLEDモジュールが点灯しました。
制御自体はラインアレイと同じですが、モジュールを離れた位置に配置する場合など配線で延長した先にモジュールを連結する使い方ができます。

コメント