「obnizのパーツライブラリを試す」シリーズでは、obnizのJavaScript SDKパーツライブラリに掲載されているパーツを実際に購入して試した結果をレポートします。
第3回は、コントローラチップとしてWS2812Bを使ったフルカラーLEDです。
- コントローラチップWS2812Bを使ったフルカラーLEDを試してみた。
- LEDが8個搭載されているLED Barをamazonで安く購入した。
- 端子の半田付けが必要。
- 各LEDに色が設定される仕組みを説明した。
- LED Barを複数台数珠つなぎすると動作しなかった。
- 外部電源にしたら数珠つなぎでも動作した。
パーツライブラリのページ
WS2812Bはパーツライブラリの「LED」に分類されています。
パーツライブラリのページはこちらです。
購入先
パーツライブラリのページにはスイッチサイエンスとadafruitの商品ページのリンクが掲載されています。
どちらも1,000円程度するので、もっと安いものはないかと探してみたら、8個のLEDが直線状に並んでいる製品を見つけました。5個セットで810円なのでお買い得です。この製品には名前がついていないので、このブログ記事では「LED Bar」と表記することにします。
ピン配置
LED Barには、入力用の4ピンと出力用の4ピンの計8ピンが用意されています。下の写真で、左側が入力ピン、右側が出力ピンです。入力用4ピンの内訳は、GND、DIN、4-7VDC、GNDとなっていてGNDが2つあるので、実質は3ピンです。出力側も同様です。
1つ目のLED Barの出力ピントと2個目のLED Barの入力ピンを接続することで、LED Barを数珠つなぎにできます。
amazonで購入したLED Barは上の写真のような状態であり、他の機器と接続するためのピンやソケットがありません。そこで、obnizへの接続がしやすく数珠つなぎがやり易いように、入力側にピンヘッダー、出力側にピンソケットを半田付けしました。
ピンヘッダーとピンソケットは秋月電子通商で購入しました。
ピンが40個繋がった製品なので、4ピンになるようにニッパーで切断します。
こちらは4ピンの製品なのでそのまま使います。
動作の仕組み
obnizから色情報の列をLEDに送ります。下図の例では、”赤、青、緑”を送っています。各LEDは、受け取った色情報の先頭の色を自分に設定し、残りの色情報を次のLEDに送信します。
下図の例では次のような動作になります。
- 1番目のLEDは”赤、青、緑”を受け取り、赤を自分に設定して、”青、緑”を2番目のLEDに送る。
- 2番目のLEDは”青、緑”を受け取り、青を自分に設定して、”緑”を3番目のLEDに送る。
- 3番目のLEDは”緑”を受け取り、緑を自分に設定する。残りのデータがないので次には送らない。
配線
まずはパーツライブラリのページに記載されている配線を分析してみます。
WS2812Bのパーツライブラリのページには次のようなプログラムが掲載されています
io0がgnd、io1がvcc、io2がdinを接続するプログラムになっています。
次の写真のように、LED Barをobnizに接続した場合、ピンの接続の順番はio0がGND、io1がDIN、io2が4-7VDC、io3がGNDになります。パーツライブラリのプログラムとはピンの順番が異なることが分かります。
この並び順に対応するためには、プログラムを次のように変更すればよいはずです。
プログラムを動かしてみる
パーツライブラリのwired( )関数の説明部分にあるプログラム動かしてみます。引数部分を上述のように変更して次のようなプログラムにしました。プログラムを実行すると、1番目のLEDが赤に、2番目のLEDが青になります。写真ではLEDの発光が少なく写っていますが、肉眼ではかなり明るく光っています。
次に8個のLEDを全部光らせてみます。led.rgbsに与える配列の要素を8個に増やします。
<html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <script src="https://unpkg.com/obniz@2.0.2/obniz.js" crossorigin="anonymous"></script> </head> <body> <div id="obniz-debug"></div> <h1>LED Bar WS2812B</h1> <script> var obniz = new Obniz("OBNIZ_ID_HERE"); obniz.onconnect = async function () { var led = obniz.wired("WS2812B", {gnd:0, din: 1, vcc: 2}); // LEDを表向きに led.rgbs([ [0x3F, 0x00, 0x00], [0x00, 0x3F, 0x00], [0x00, 0x00, 0x3F], [0x3F, 0x3F, 0x00], [0x3F, 0x00, 0x3F], [0x00, 0x3F, 0x3F], [0x3F, 0x3F, 0x3F], [0x1F, 0x1F, 0x1F] ]); } </script> </body> </html>
このプログラムはobniz cloud上のここに置いてあります。
http://obniz.io/ja/console/program?root=/users/266/repo&filename=M-WS2812B-1-LED-Bar-8Colors.html
プログラムを実行すると、8個のLEDが別々の色で光ります。
LED Barを2本数珠つなぎしてみる
LED Barを1本追加してみました。
プログラムは、led.rgbsに与える配列の要素をコピペして2倍にしました。
<html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <script src="https://unpkg.com/obniz@2.0.2/obniz.js" crossorigin="anonymous"></script> </head> <body> <div id="obniz-debug"></div> <h1>LED Bar WS2812B Double</h1> <script> var obniz = new Obniz("OBNIZ_ID_HERE"); obniz.onconnect = async function () { var led = obniz.wired("WS2812B", {gnd:0, din: 1, vcc: 2}); // LEDを表向きに led.rgbs([ [0x3F, 0x00, 0x00], [0x00, 0x3F, 0x00], [0x00, 0x00, 0x3F], [0x3F, 0x3F, 0x00], [0x3F, 0x00, 0x3F], [0x00, 0x3F, 0x3F], [0x3F, 0x3F, 0x3F], [0x1F, 0x1F, 0x1F], [0x3F, 0x00, 0x00], [0x00, 0x3F, 0x00], [0x00, 0x00, 0x3F], [0x3F, 0x3F, 0x00], [0x3F, 0x00, 0x3F], [0x00, 0x3F, 0x3F], [0x3F, 0x3F, 0x3F], [0x1F, 0x1F, 0x1F] ]); } </script> </body> </html>
このプログラムはobniz cloudのここに置いてあります。
https://obniz.io/ja/program?root=/users/266/repo&filename=M-WS2812B-3-LED-Bar-Double.html
このプログラムを実行してみると、LED Barは両方とも光りませんでした。
電源が不足している可能性があるので、外部電源を接続して試してみました。外部電源は、USBからブレッドボードに電源を供給できる変換ボードを使いました。
今度はLED Barが2本とも光りました。
パーツリスト
パーツ名 | 購入先 |
WS2812 5050 RGB LED | amazon |
ピンヘッダ 1×40 (40P) | 秋月電子通商 |
ピンソケット(メス) 1×4(4P) | 秋月電子通商 |
ブレッドボードBB-801 | 秋月電子通商 |
ブレッドボード用USB電源ボード SBM-007 | (記憶が曖昧ですが、千石電商の実店舗で購入した気がします) |
サンハヤト ジャンプワイヤキット SKS-100 | amazon |
ブレッドボード・ジャンパーワイヤー(オスーオス)10cmセット | 秋月電子通商 |