第32回 NeoPixelノード

今回の記事では、マイコン内蔵フルカラーLEDの制御フローを作成します。

目次

今回の説明内容

デフォルトのNode-REDでは、WS2811/WS2812制御用のノードはインストールされていません。

今回の記事では、最初にノードの追加を行います。そのあと、ノードの使い方を説明し、実際に制御フローを作成していきます。

NeoPixelノード

このシリーズで使用しているマイコン内蔵フルカラーLEDは、型番は「PL9823」という製品ですが、一般的には、WS2811・WS2812B・NeoPixelなどと呼ばれていることを説明しました。

Node-REDではこれらの製品用に「NeoPixel」という名前のノードが用意されています。このノードを使用すれば、WS2811・WS2811B・NeoPixelを使用している製品はすべて制御できます。

これから「NeoPixel」ノードを追加しますが、このノードを使用するにはWS2811/WS2812用のドライバ(制御ソフト)が必要になります。

そこで、最初にWS2811/WS2812のドライバをインストールしたあと、Node-REDでNeoPixelノードの追加を行います。

WS2811/WS2812ドライバインストール

WS2811/WS2812ドライバのインストールはターミナルアプリで行います。

最初にデスクトップ環境でターミナルを起動するか、リモートでターミナル接続してください。準備ができたらドライバをインストールしましょう。

ターミナルを起動したら、以下のコマンドを入力します。(「$」はプロンプトです)

$ sudo pip3 install rpi-ws281x

以下のように最後に「Successfully installed rpi-ws281x-…」と表示されればドライバのインストールは完了です。

NeoPixelノードインストール1

NeoPixelノード追加

続いて、NeoPixelノードを追加します。

最初にいつものように右上のメニューから「パレットの管理」を選択します。

NeoPixelノードインストール2

パレット管理の画面が表示されたら、(1)ノードの追加を表示して、(2)検索欄に「neopixel」と入力します。NeoPixelに関連するノードが表示されますので、(3)その中から「node-red-node-pi-neopixel」を探してください。近くに「node-red-contrib-neopixel-display」がありますので、間違えないように注意してください。最後に(4)ノードの追加ボタンをクリックします。

NeoPixelノードインストール3

追加してもよいか確認がありますので、追加ボタンをクリックします。

NeoPixelノードインストール4

追加されると以下のようにメッセージが表示されます。

NeoPixelノードインストール5

NeoPixelノードはパレットのRaspberry Piグループにありますので、追加されている確認します。

NeoPixelノードインストール6

これでNeoPixelノードの追加は完了です。

ノードの使い方

NeoPixelノードには機能がいくつかあり、使い方も独特です。このシリーズ記事ではこのうち一部の機能を使用しますが、ここではこのノードが持っている機能を一通り説明します。

NeoPixelノードは3つのモードを持っています。なお以下で説明している3つのモードの名前は、私が説明のために勝手につけたものです。このサイト以外通用しませんのでご注意ください。

それでは、3つのモードについてそれぞれ説明します。

レベル表示モード

このモードは、NeoPixelを複数個使い、音量メータなどのレベル表示をするモードです。

例えば、以下のようにNeoPixelを一直線に並べて、音量や気温などに応じて点灯色を変えて表示するメーターのようなものです。

NeoPixelノード機能1

「レベル表示モード」とは、NeoPixelノードに数値、またはパーセント値を送ると、その数値やパーセント値に応じたレベル表示をするモードです。

NeoPixelノード機能2

オーディオの音量レベルや気温、湿度など、何かの数値を表示する用途を想定している感じですね。

シフト表示モード

このモードは、NeoPixelを複数個接続している場合、色データを送ると順番にずらしなが点灯するモードです… って言葉で説明してもさっぱり分かりませんね。

シフト表示モードにすると、NeoPixelノードに色データを送るたびに、以下のようにLEDを点灯してくれます。

NeoPixelノード機能3

これはイルミネーションなどに使えそうですが、他にも用途ありそうですね。って言ったものの具体例が思いつきません… いろいろご自身で発想してみてください。

直接制御モード

上の2つは制御は簡単ですが、表示パターンというかルールは固定されていますので自由度がそれほど高くないモードです。

最後の外部制御モードは、以下のように「何番目のLEDをこの色で点灯」というようなデータをNeoPixelノードに送るモードです。

NeoPixelノード機能4

また、「何番目から何番目をこの色で点灯」というようにまとめて点灯を指定方法もあります。

NeoPixelノード機能5

これらの制御では、LEDの位置、色を自由に指定できますのでかなり自由度が高くなります。(その分フローが面倒になりますが…)

このシリーズでは、このモードを使ってLEDの点灯制御をします。

フロータブの作成

これからフローを作成しますので、新しくフロータブを作成しましょう。

このシリーズの残りの記事では、マイコン内蔵フルカラーLEDで天気予報情報を表示します。そのため、新規フロータブは「天気予報」にしました。他の名前でも構いません。

NeoPixelフロー1

新規フロータブを作成後、rpi – neopixelsノードを以下のように適当な場所に配置します。

NeoPixelフロー2

NeoPixelノード設定項目

フローを作成する前に、NeoPixelノードの設定項目を一通り確認しておきましょう。

なおこのシリーズ記事で使用する直接制御モードでは、以下の設定のうち「モード」「メーターの色」「デフォルトの色」「明るさ」の設定は無効になります。これらの設定項目は読み飛ばしていただいて構いません。

NeoPixelフロー3

LED接続個数

接続しているNeoPixelの個数を設定します。

信号線ピン番号

NeoPixelに接続しているラズベリーパイのGPIOピン番号を設定します。番号は物理ピン番号になります。

モード

ここでモードを設定します。各モードは以下の意味になります。

選択項目 意味
Bar – Percent of length 接続しているNeoPixelのうち、「何個分をメーター表示するか」をパーセントで指定します。例えばNeoPixelを10個接続している場合、「30」(30%の意味)をこのノードに送ると、3個のNeoPixelをメーター点灯します。
Bar – Percent of pixels 接続しているNeoPixelのうち、「何個分をメーター表示するか」を個数で指定します。
Needle – Percent of length 接続しているNeoPixelのうち、「何個目を点灯するか」をパーセントで指定します。例えばNeoPixelを10個接続している場合、「30」(30%の意味)をこのノードに送ると、3個目のNeoPixelをメーター点灯します。(1個目、2個目、4個目以降は消灯)
Needle – Number of pixels 接続しているNeoPixelのうち、「何個目を点灯するか」を数字で指定します。
Add pixel to start シフト表示モードです。指定した色は、1番目のLEDに反映されて、1個目以降の点灯色は1個ずつずれて点灯します。
Add pixel to end シフト表示モードです。指定した色は、最後のLEDに反映されて、最後より前の点灯色は1個ずつずれて点灯します。

メーターの色

メーターとして点灯する色を指定します。直接制御モードの場合は無効になります。

デフォルトの色

デフォルトで点灯する色を指定します。メーター以外のLEDを点灯しない場合は「black」を指定します。直接制御モードの場合は無効になります。

データ転送時間間隔

複数のLEDの色を変更する場合、データを個別に連続して送るようになっているため、データを送る時間間隔を設定します。長く設定すると、光が流れるように制御できます。

RGB色順序

製品によって色データの順序が異なることがあります。ここで色データの順序を指定します。

明るさ

LEDの明るさを指定します。0から100の数値で指定します。直接制御モードの場合は無効になります。

ガンマ調整

ガンマ調整を行うかを設定します。長くなりますのでガンマ調整自体の説明はしませんが、この設定は暗く光らせる場合にOffにすると色が改善することがあります。

ノード名

ノードの名前を指定します。

NeoPixelノード設定

それでは、NeoPixelノードを設定していきます。

今回は直接制御モードで制御しますので、このモードで有効な項目のみ設定します。

以下のように、LED接続個数を「2」、信号線ピン番号を「12」、データ転送時間間隔を「1」、RGB色順序を「GRB」、ノード名は「マイコン内蔵LED」に設定します。ノード名は他の名前でも構いません。(LED接続個数は設定しても意味はありませんが、念のため設定します)

NeoPixelフロー4

外部制御モードのデータフォーマット

外部制御モードでNeoPixelノードを使用するとき、送るデータのフォーマットを確認しておきましょう。

最初はLED1個に対して、位置と色を指定するフォーマットです。

この場合、payloadキーに文字データとして以下のフォーマットのデータをNeoPixelノードに送ればOKです。

位置,r,g,b

「位置」は一番近いLEDが0、次に近いLEDが1、というような番号で指定します。

「r」「g」「b」はそれぞれ赤、緑、青の光の強さで0〜255で指定します。

なお上の指定文字列は、途中にスペースがあると認識されませんので注意してください。意外に忘れてしまうので、ノードを設定するときにまた注意点として書きます。

次にLEDを何個かまとめて、位置と色を指定するフォーマットです。

この場合、payloadキーに文字データとして以下のフォーマットのデータをNeoPixelノードに送ればOKです。

開始位置,終了位置r,g,b

「開始位置」から「終了位置」までのLEDを「r,g,b」で指定した色で点灯します。位置指定とrgbの数値の意味は先ほどと同じです。

テスト点灯

それでは外部制御モードを使用してLEDを点灯してみましょう。最初は1個の点灯、次に2個の点灯をしてみます。

1個点灯

1個点灯する場合は、Injectノードを使用して先ほどのデータフォーマットで位置と色のデータを送ればOKです。一例として、1個目のLEDを赤で点灯してみます。

最初に以下のようにinjectノードを配置します。

NeoPixelフロー5

このInjectノードを利用して、1個目のLEDを赤で点灯する文字データ「0,100,0,0」をNeoPixelノードに送るように設定します。「0,100,0,0」は、位置が「0」つまり1番目のLED、色は赤=100、緑=0、青=0という意味になります。先ほども説明しましたが、「0,100,0,0」の間にはスペースを入れないようにしてください。

NeoPixelフロー6

設定できたら、ノード間を接続してデプロイします。デプロイに問題なければInjectノードのボタンをクリックして1個目のLEDが赤で点灯するか確認しましょう。うまく光りましたか?

NeoPixelフロー7

次に2個目を緑色に点灯するInjectノードを追加します。以下のようにInjectノードを追加、設定して接続します。追加したInjectノードが送るデータは「1,0,100,0」です。

NeoPixelフロー8

フローができたらデプロイします。デプロイすると、一度LEDが消えますよね。これはNeoPixelノードが一度LEDを全消しするデータを送っているためです。

それでは追加したInjectノードのボタンをクリックしてみてください。2番目のLEDが緑に光りましたか?

続けて、最初に配置したInjectノードのボタンをクリックすると、1番目のLEDも赤色に光ります。

このように、外部制御モードを使用すると、任意の位置のLEDを好きな色で点灯することができます。

2個点灯(同じ色)

次に、2個のLEDを同じ色で点灯してみます。

同じ色で点灯する場合、◯個目〜◯個目までこの色で点灯する、というデータを送ればOKです。

以下のようにInjectノードを追加して、1個目から2個目のLEDを赤色で点灯する、というデータを送るように設定します。

NeoPixelフロー9

追加したInjectノードは以下のように「0,1,100,0,0」の文字データを送るように設定すればOKです。

NeoPixelフロー10

フローができたらデプロイしして、問題なければInjectノードのボタンをクリックします。

今度は一度に2個のLEDが赤に光りましたよね。

2個点灯(違う色)

最後に、2個のLEDを違う色で点灯するフローを作成しましょう。

実は、2個違う色で点灯するフローをいろいろ試したのですが、NeoPixelノードに複数個分のデータを送ることはできないようです。例えば1個目を赤、2個目を緑に点灯したい場合、「0,100,0,0,1,0,100,0,0」などのように続けて複数個のLEDを点灯するデータは受け付けないようです。

そこで、ちょっと力技という感じもしますが、1個目のLEDを点灯するInjectフローのメッセージを受けて、2個目のLEDを点灯するデータを生成するようなフローを作成することにします。

っていってもよくわからないですよね。フローを見ればすぐにわかると思いますので、フローを作りながら説明しますね。

わかりやすいように、Injectノードは一度削除しました。

最初に1個目のLEDを点灯するInjectノードを置きます。以下のように配置すれば1個目のLEDを緑色で点灯することができます。

NeoPixelフロー11

2個目のLEDはこのInjectノードのメッセージを受けて生成するように、changeノードを使用することにします。

以下のようにchangeノードを配置します。

NeoPixelフロー12

配置後、2個目のLEDのデータを送るように以下のように設定します。

NeoPixelフロー13

このように設定しておくと、Injectノードのボタンをクリックすると、(1)Injectノードから1個目のLEDの点灯データが送られてNeoPixelノードは1個目のLEDを点灯します。(2) (1)と同時にchangeノードにもデータが送られて、(3)changeノードは2個目のデータをNeoPixelノードに送ります。これにより、NeoPixelノードは2個目のLEDを点灯します。

NeoPixelフロー14

フローが作成できたら、デプロイします。デプロイに問題がなければ、Injectノードのボタンをクリックしてみてください。1個目のLEDが赤、2個目のLEDが緑で光ると思います。


以上が2個のLEDを違う色で点灯する方法ですが、他にもいいフローがあるかもしれません。

また、今回の回路はLEDが2個しかありませんが、ご自身でいろいろな色で点灯させてみてください。なおこのシリーズでは説明していませんが、乱数を発生するノードもありますので、乱数を使用してランダムな色でLEDを点灯するフローも作成してみてください。

次回以降の記事では、天気予報を2個のLEDで表現してみます。

更新履歴

日付 内容
2022.8.30 新規投稿
通知の設定
通知タイミング
guest
0 コメント
本文中にフィードバック
全てのコメントを見る
目次