シリアル制御LEDとESP-DevkitCでイルミネーション製作

電子工作

みなさん、こんにちは。
シリアル通信で制御するLEDとESP32でイルミネーションライトを製作しましたのでご紹介します。題名の通り、今回は初回編としてスタンドアロンで動作するものを製作しました。応用編としてWi-Fi経由でスマホから操作できる環境も製作します。こちらは完成次第ご紹介します。今回はスタンドアロン編ということで、製作物単体でイルミネーションライトになるものをご紹介します。

Arduinoのソースコードも掲載していますが独学のためヘタクソです。ご留意くださいませ。

使用部品

まずは今回使用した部品についてご説明します。

No名称型格メーカー名備考
テープLEDBTF-5V-030L-B(WORLDSEMI)WS2812B(WORLDSEMI)が実装
ESP-DevlitCESP-DevlitC(Espressif)ESP-WROOM-32が実装
ESP-DevlitC用基板でんゆう
使用部品

テープLED

こちらのテープLEDはアマゾンで購入しました。

実装されているチップLEDはWS2812B(WORLDSEMI)というもので、ひとつひとつにマイコンが搭載されており、RGBのフルカラー点灯することができいます。そのためシリアル通信で各色の制御が可能になっています。

簡単にチップLED単体のスペックを確認しておきます。

パラメータ特性値
電源電圧+3.7V~+5.3V
通信電圧最大定格VDD-0.3V~VDD+0.3V
VIH+2.7V~VDD+0.7V
VIL-0.3V~0.7V
消費電流データシートに記載無し
WS2812Bスペック

電源電圧についてはUSBなどから5Vを入力すればOKです。通信電圧に関しても5Vでも大丈夫ですが、Arduinoや今回使用するESP32のような3.3Vレベルでも通信可能です。消費電力についてはデータシートに記載がありませんでしたが、メーカーHPを見ると各色12mAと記載がありました。LED1個あたり36mA消費する計算になります。

電流値以外で注意すべきことはありません。ハサミで必要な分だけカットして手軽に使用できる便利なフルカラーLEDです。

ESP-DevkitC

ESP-DevkitCとは、ESP-WROOM-32(Espressif)が実装された開発基板です。

ESP-WROOM-32はSoCであるESP32を搭載した無線モジュールでWi-FiやBlutoothが利用可能です。また書き込むファームウェアはArduino IDEでコンパイルできるため非常に扱いやすい無線モジュール開発基板となっています。

冒頭にも記載した通り、次の取り組みではWi-Fi経由でスマホから操作したいため、無線モジュールであるESP-DevkitCを使用します。

ESP-DevkitC用基板

ESP-DevkitCを手っ取り早く使用したかったため専用の基板を利用しました。

こちらは私が制作し、ラクマやメルカリで販売しております。必要があればご購入お願いいたします!

製作できたもの

上記で説明した部品で製作したものがこちらです。

ざっくり回路図はこちらです。デバッグ用LEDを付けていますが無くても問題ありません。

LEDはSPI通信で制御

LEDのシリアル通信について

自分に必要なデータ以外はそのまま出力

WS2812Bにはデータ入力端子と出力端子があります。テープLED状態では隣のLED同士が入出力端子で繋がっています。

WS2812Bデータシート|WORLDSEMI

この数珠つなぎの1本の通信ラインですべてのLEDを制御することができます。出力元からは全LEDの点灯情報を一気に送信します。

図のとおり、それぞれのLEDは自分に必要なデータだけ消化し、以降のLEDが必要としているデータは以降のLEDにそのままリレーしています。こうすることで直列に接続されたLEDをそれぞれ制御することが可能になります。

注意点として、LEDの接続数は把握しておく必要があります。例えばLEDが3個接続されているのに2個分のLEDデータだけ出力すると、3個目のLEDは点灯しないことになります。ファームウェアを作成する際はLEDの個数を間違えないようにしましょう。

1つのLEDに必要な情報は24bit(8bit×3)

前項において自分のデータを消化していくと説明しました。このデータ容量はひとつのLEDあたり24bitです。RGBそれぞれ8bitずつで合計24bitとなります。LEDを複数繋げて使用する場合は24bit×LED個数分のデータが必要となります。

通信方式は独自:High時間とLow時間の組み合わせで1または0を表現

通信方式は一般的なシリアル通信と違い、High時間とLow時間の組み合わせで1または0を表現します。それぞれの時間規定は以下の通りです。

こちらの表現で各色0x00~0xFFまで表現します。おおよそ1bitあたり1250nsつまり800kbps程度の通信速度となります。

ポイントとなるのはHigh時間で380nsまでのHighであれば0と判定し、580ns以上のHighであれば1と判定されます。

例えば1つのLEDを約30%で黄色に光らせたいとします。各色の配色は以下の通りです。

  • G(緑):0x50
  • R(赤):0x50
  • B(青):0x00

注意が必要なのが、24bitデータの構成としてGRBの順番であることです。

各bitの0または1に対して時間規定どおりの波形を出力できればLEDは黄色に発行します。

SPI通信で簡単に制御

前項で説明した通りnsオーダーの制御が必要になりますが、Arduinoで簡易的に使用できるdelay関数ではusオーダーとなります。タイマーを利用すれば実現できると思いますが、今回はSPIを駆使して簡易的に実現しました。

SPIでの通信方法

SPIでの通信方法を解説します。まず時間規定に沿って以下の通りそれぞれの時間を決定します。

1bitあたり1200nsとなり833.3kbpsの通信となります。これを1bit 300nsのシリアル通信に置き換えます。

シリアル通信としては333.3kHzの通信で0x8または0xCのどちらかの出力となります。バイナリ1bitに対してSPIは4bit使うので、1色あたり32bit必要になります。

バイナリから送信データを作る

バイナリから送信データを作成する際は以下の関数を使用しています。

バイナリデータを1bitずつ見ていき、0なら0x8を1なら0xCを格納していきます。次のデータで上書きされないように最後は4bit分ビットシフトさせます。

この方法で先程例に挙げた黄色(G(緑):0x50、R(赤):0x50、B(青):0x00)を点灯させてみます。

書き込んだソースコードです。

1個目のLEDを最低限光らせるためのコードです。binary_data_GRB[3]の設定値を0x00~0xFFの範囲で変えることで色を変えることができます。

イルミネーション化

最終的にイルミネーション機能を盛り込んだソースがこちらです。

イルミネーション化した際のポイントはこちらです。
設定値に1bitずつ近づけてじんわり変化させていく
カラー設定値目がけて1処理ごとに1bitずつ近づけていきます。こうすることでLEDがなめらかに変色していきます。また処理ごとにdelay時間をもたせることで変化速度を調節できます。下図でいうとカメの歩く速度です。

ランダム関数を使用することで不規則なイルミネーションが可能
ランダムに整数を生成するランダム関数を使用することで、変化色が不規則なイルミネーションができます。

またランダム整数に範囲をもたせることで色系を定めたイルミネーションにすることも可能です。

SPIでの出力値をシリアル出力してみました。(HEX表記)

Cと8で1bitずつ変化しているのがわかります。

まとめ

今回はシリアル制御LEDをSPIで制御しイルミネーションを製作しました。次はスマホで色系統を設定できる仕組みを作りたいと思っていますのでお読みいただければと思います!

また、LEDをシーケンシャルに光らせて見たいのでいずれやります!

お読みいただきありがとうございました!

タイトルとURLをコピーしました