【ESP32入門】高性能LEDで遊び倒す!【3回目】

2023/01/11

ESP32 HOW2 LED WS2812B レベルメーター 電子工作

t f B! P L
レベルメータ作成のまとめはこちら

はじめに

どうもtakaです。
1回目2回目でESP32の準備が完了しました。
今回は高性能LEDのWS2812B(これ本当に便利なんです)を遊び倒す投稿です!
応用すれば動画のような事がいとも簡単にできるようになります♪


それでは行ってみよ~

WS2812BとはどんなLEDか?

前回ESP32の動作テストで使用したLEDは一定の電圧以上を印加すると点灯します。
(詳細原理を語り始めると電子の世界まで深堀することになります)

対してWS2812Bはデータで点灯するLEDです。
(実物はこちら)

WS2812BはフルカラーLED※1ですが何個制御しようとも必要な足は1本だけです。
一般的なフルカラーLEDは電源と三色分の足を持った4本足のLEDです(実物はこちら)。

※1:1パッケージに赤/緑/青の3色のLEDが含まれているLED

百聞は一見に如かず

今回使用するLEDはこちらの2種類(1[m]テープLEDと円型LED)です!

こちらで購入しました!


少しだけ加工

テープ型も円型も若干加工が必要です。

テープ型に付属しているケーブルですが若干加工が必要です。
写真は加工後です。
テープ型に付属しているケーブルはリード線が切りっぱなしのためブレッドボードに挿しづらいためピンを圧着しています。円型は基板のみのためリード線の半田付けが必要です。

圧着するピンはこちらを使用しておりますがブレッドボード用の配線を切断して使用してもいいと思います!

点灯方法

点灯ステップをふんわり説明

テープ型も円型もWS2812Bが1直線に接続されており、LED1個1個に住所が割り当てられており、各住所に赤緑青(RGB)の配色情報を渡すことで点灯させます。

イメージ図

イメージ図を実際にプログラムに起こすと下記になります。
簡単ですね!(CRGBはおまじないです)

leds[0]=CRGB(255,0,0);
leds[1]=CRGB(0,255,0);
leds[2]=CRGB(0,0,255);
leds[3]=CRGB(255,0,255);
leds[4]=CRGB(255,255,255);

サンプルプログラムを動かす

準備

IDEにライブラリ※を追加する必要があります。
※便利な道具が詰め込まれた道具箱のようなものです

今回は”FastLED"を追加します。このライブラリはWS2812Bを含む数多くのプログラマブルLEDを簡単に制御するためのツールが詰まっています。
ここを参考にFastLEDライブラリをIDEに追加してください♪(簡単ですよ)

接続

ESP32とWS2812Bを接続します。接続はすごくシンプルで、リード線赤色をESP32の5Vピン、白色をGNDピン、緑色をGPIO25ピンへ接続します。
※配線の色は異なる可能性があるため梱包の袋をご確認ください
バーコードのあたりにリード線色の説明があります。
写真の例ではVCC(5V)が赤、GNDが白、DATAが緑となっています。

コード

説明は抜きにしてコピペしてください。
#define GPIO_LED	25
#define LEDMAXVAL	16
#define BRIGHTNESS	30
#define DELAYTIME_MS	500

CRGB leds[LEDMAXVAL];

void setup() {
	delay(1000);
	FastLED.addLeds<WS2812B, GPIO_LED, GRB>(leds,LEDMAXVAL).setCorrection( TypicalLEDStrip );
	FastLED.setBrightness(BRIGHTNESS);
}

void loop()
{
  FastLED.clear();
  for(int i=0; i<LEDMAXVAL; i++) {
    leds[i].red=255;
    leds[(LEDMAXVAL-1)-i].blue=255;
    FastLED.show();
    delay(DELAYTIME_MS);
  }
}

焼きこみ&点灯!

※コンパイル時に下記警告が出ますが無視してください。
In file included from C:\Users\takayuki\Documents\Arduino\libraries\FastLED\src/FastLED.h:67,
                 from D:\電子工作\ESP32\ws2812bTest2\ws2812bTest2.ino:4:
C:\Users\takayuki\Documents\Arduino\libraries\FastLED\src/fastspi.h:145:23: note: #pragma message: No hardware SPI pins defined.  All SPI access will default to bitbanged output
 #      pragma message "No hardware SPI pins defined.  All SPI access will default to bitbanged output"
                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
(SPI通信のピンが指定されていないとの警告ですが、WS28シリーズはSPI通信不要のためそもそも警告が出ることがおかしいです。公式でも警告を消すようにと有志から指摘されていますが未対応のようです。イシューを上げたようなのでその内対応されるかもしれません)

成功すると下記のように点灯します!


ソース説明

LEDの制御部分のみ抜粋し説明します。
FastLEDは説明しきれないほど多機能で便利なライブラリのためぜひ公式をご確認ください!

・10行目(初期設定)
GPIO_LED:WS2812Bのデータ線が接続されているGPIO番号
leds:配色情報を格納するための変数(配列ポインタ)
LEDMAXVAL:制御するLEDの個数。(今回使用したテープは60個ありますがカメラに収まらないため16個に制限しています)

・ 18,19行目(配色指定)
配色を制御したいLEDの番地を"[]"内に設定します。
先にleds[]=CRGB(255,0,0)の方法を説明しましたがleds[].red=255と指定することも可能です。

番地の指定はC言語のfor文を利用します。
leds[i].red=255;
leds[(LEDMAXVAL-1)-i].blue=255;
この場合、
赤色は0番地からLEDMAXVAL-1番地まで点灯していきます。
青色はLEDMAXVAL-1から0番地まで点灯していきます。
配色を指定しない場合は前回値が保持されるため赤と青が交差すると紫色になります。
leds[i]=CRGB(255,0,255)
とした場合と同じです。
最後にshow()を呼び出して初めて発光します。

・その他
.setBrightness()は最大輝度を設定できます。
輝度を半分にしたい場合、leds[i].red=255/2でもOKですが.setBrightness(50)でもOKです。(輝度が50%になる)
一行で最大輝度変更できるためコードが複雑になってくると威力を発揮します。

.clear()はledを前消灯させますがshow()を呼び出すまで発光には影響がありません。


今回は以上です!
WS2812Bの制御はいかがでしたか?
大量にELDを制御したい場合に非常に強力なLEDですね。

次回はESP32で音声信号を扱いますのでこうご期待!
全投稿のまとめページはこちら

中の人

自分の写真
モノ作りが好きです。GUIアプリの作成からアナログ回路まで手当たり次第です。 アンプの修理を紹介するためにブログを始めました。 (Twitter:@TakaElc)

記事カテゴリ

5M21 (10) A-6 (5) A-717 (2) A-950 (1) AB級 (8) Arduino (2) A級 (29) C-21 (1) C29 (1) ESP32 (9) EUMIG (13) FFT (2) HOW2 (6) LED (2) LUXMAN (10) M-1000 (13) M-22 (23) MATLAB (1) mcintosh (1) MCP3208 (3) OPアンプ (1) Pioneer (26) QUAD (1) Simulink (1) WS2812B (4) YAMAHA (6) アンプ (62) スピーカ (3) プリ (1) プリアンプ (1) プリメイン (6) レベルメーター (8) 化石 (1) 山水 (3) 自作アンプ (7) 電子工作 (20) 日記 (1)

QooQ