ここ数年、WS2812B LEDのようなプログラム可能なLEDライトが照明業界に旋風を巻き起こしています。 これらの小さなモジュールには、赤、緑、青の LEDが5mm x 5mmのパッケージに個別に詰め込まれており、肉眼では確認が難しいほど小さな制御チップも含まれています。この小さなチップは入力を受け取り、自身の信号を減算し、残りのデータをチェーン内の次のモジュールに渡します。このプロセスは、単一のデータ ラインが数十、数百、さらには1,000個を超えるLEDを点灯するまで繰り返されます。
WS2812 LEDストリップ を Arduinoボード に接続する方法を学ぶのは簡単です。必要なもの:
1.1つのデータライン
2.電源
3.地面
ハードウェアを整理したら、いくつかのライブラリを利用して、マイクロコントローラで照明を制御できるようになります。しかし、これはどのように機能するのでしょうか?1本の小さなデータ ラインでこれほど多くのLEDを制御できるのでしょうか?
WS2812Bプロトコル
2つのWS2812Bを制御するための48ビットを含むマイクロコントローラからのCH1バイナリ信号。これらのビットのうち24ビットのみがCH2として渡されます。
これらのLEDを理解するために、このアドレス指定可能なLEDプロトコルがどのように機能するかを見ていきましょう。単一のWS2812Bユニット内の各赤、緑、青のLEDは、0から255に設定された8ビットのバイナリ シーケンスで示される256の明るさレベルで点灯するように設定されています。組み合わせると、各LEDユニットを完全に制御するには、8ビットの明るさの3セット、つまり24ビットの情報が必要になります。プロセスの簡単なガイドは次のとおりです。
1.マイクロコントローラ は、この8つの緑ビット、8つの赤ビット、および8つの青ビットのシーケンスをシリーズの最初のLEDに送信します。
2.複数の LED が存在する場合、2番目のLEDを制御するデータ シーケンスは、緑、赤、青のデータを含む最初のLEDの直後に開始されます。存在するすべてのLEDが点灯するまで、シーケンスはそのパターンで継続されます。
3.最初のLEDはLEDチェーン全体の情報を受け取り、次に、自身に適用したシーケンスなしで同じデータを渡し、2番目のLEDをリストの最初のコンポーネントに変換します (認識している限り)。
4.この「新しいナンバー1」LEDユニットは、バイナリLEDシーケンスがなくなるまで情報を渡し続けていきます。
上の画像は、WS2812Bユニットへのマイクロコントローラ入力信号をCH1として示しており、長いパルスは高信号を示し、短いパルスは低信号を示します (これについては後で詳しく説明します)。これは100101100000000000000000という24ビットのシーケンスになり、緑色の値は「10010110」となり、10進数に変換すると150になり、残りの16ビットはゼロになります。結果として得られる色は、上の画像に見られるように、赤や青が混ざっていない、中程度の明るさの純粋な緑の値です。
ここでは両方のWS2812 LEDユニットが同じ色なので、CH1シーケンスが繰り返され、同じデータがCH2に渡されます。2番目のシーケンス (および結果の色) は、ユーザーが望む効果に応じて異なる場合があります。以下のこのタイプの信号を拡大すると、次のカラー信号セットが転送されるまでのギャップが比較的長いことがわかります。
LED照明用マイクロコントローラ
各数字の値を1と0で表すのは理解しやすいですが、マイクロコントローラは実際にどのようにしてその情報を最初のLEDユニットに伝えるのでしょうか。このプロトコルでは、各1または0には独自のオン/オフ タイミング シーケンスがあります。1または0を表すために、LEDマイクロコントローラは次の処理を実行します。
1.指定された時間、ラインを高く保ちます
2. 対応する時間だけ低くなることを許可します。合計すると、その時間は1.25usになります。± 150ns(± .150us)。このデータシートによると最高/最低値は次のとおりです。
- 1は次のように示されます: 0.8us高、0.45us低
- ゼロは次のように示されます: 0.4us高い、0.85us低い
したがって、「101」で始まるバイナリ信号を送信する場合は、次のように送信します。
- 0.8us高、0.45us低(1)
- 0.4us高、0.85us低(0)
- 0.8us高、0.45us低(1)。
このプロセスはさらに21ビット継続され、その後すぐに次のLEDユニットのシーケンスが続きます。最終的に、マイクロコントローラはリセット ロー信号 (300us以上) を送信して、やり直す必要があることを示します。最上位ビットが最初に表示され、各信号には先頭のゼロが含まれるため、GRBカラー要素ごとに合計8ビットになります。
WS2812B LEDをより直接的にプログラミングしたい場合は、このレベルの制御は「通常」の範囲をはるかに超えていることに注意してください。 Arduinoプログラミング。次のようなコマンドが必要になります:
1.遅れ()
2.遅延マイクロ秒()
3.ミリス()
4.マイクロ()
このレベルの制御を管理するには、アセンブリ プログラミングが不可欠になります。アセンブリ プログラミングは興味深いものですが、コーディング作業に新たなレベルの複雑さをもたらします。幸いなことに、これらのデバイスの使用を扱うライブラリが複数あるため、豊富な経験がなくてもLEDプログラミングを簡単に探索できます。
WS2812B LEDの概要: いくつかの注意事項
WoldSemiの人気は データシート エラーが含まれています。データシートには、高/低値は .9usと .35usであると記載されています。ここでの許容範囲は ±150ns (.150us) で、それぞれの組み合わせは合計12usになるので、どちらも動作するはずですが、覚えておく必要があります。
LEDは約1000usでコードをリセットします
もう一つの考えられる問題 2017年からの変更点。新しいWS2812B LEDが登場し始めましたが、これは先ほど説明した50usではなく300usのリセット時間を必要とします。ここで紹介した概念は、この時間変更後も適用されますが、非常に低いレベルで独自のインターフェースを構築する場合は、注意してください。上記のズームアウトされたシーケンスは、LEDに送信されるリセット時間が約1000マイクロ秒 (1ミリ秒) であることを示しています。
入力信号と出力信号の変動 上の画像からわかるように、白いCH1信号はマイクロコントローラからの入力であり、黄色のCH2はWS2812B LEDからの出力です。入力ハイ信号は .815usですが、対応する出力の持続時間は .620usです。これは、WS2812が単に信号を渡しているのではなく、実際に信号を特定のタイミング値に変換していることを示しています。仕様外のようです。 チェーン内の2番目のLEDが緑色に点灯したので、この低い値は正常に機能しているようです。しかし、3番目のライトにデータを渡すシーケンスをプログラムすると、LEDが点滅しました。確かに、これは私のはんだ付け設定の結果であった可能性もあれば、タイミング自体に直接関係のない別の要因であった可能性もあります。 プログラム可能なLEDライトは製造元や構造によって異なる場合がありますが、基本的なバイナリ シーケンスの概念は一貫しているようです。アプリケーションでライトがどのように機能するかを心配する必要はないかもしれませんが、検討してみる価値のある興味深い概念です。少しの背景知識があれば、ユニークで興味深い将来のデザインに対するインスピレーションを得られるかもしれません。