Raspberry Pi + Node-REDでNeopixelを制御する

# はじめに
この記事ではNode-REDでNeoPixel互換LEDを制御します。

# NeoPixelとは
NeoPixelとは制御IC入りのRGBLEDです。最近は互換LEDがたくさんでているので、どれがNeoPixelでどれが互換か判別するのは困難ですが、基本的に同じ方法で制御できるます。（たまにハマることもあるようですが）

基本的な構造はすべて同じで、RGB各色のLEDと制御用ICがパッケージ化されています。入出力端子は、5V、GND、DI、DOの4端子で、IDが信号入力用、ODが出力用です。
電源の5V、GNDは共有で、一つ目のNeoPixelのDI端子に制御信号を入力したあとは、一つ目のDO⇒二つ目のDI、二つ目のDO⇒三つ目のDIへと数珠つなぎに接続できます。

良く販売されているのはテープ、リング、マトリクスなどの形状で複数のNeoPixelがモジュール化されているものですが、内部接続は数珠繋ぎになっており、モジュール同士もDO⇒DIへ接続可能です。

# NeoPixelを接続する
制御信号の出力にはデジタル出力可能なピンであればどのピンでも使用できますので任意のピンとNeoPixelのDIを接続します。今回は制御用信号の出力にGPIO18を使います。
5V、GNDもそれぞれRaspberry Piの5V、GNDと接続してください。

|Raspberry Pi|NeoPixel|
|-|-|
|5V|5V|
|GND|GND|
|GPIO18|DI|

# ノードのインストール
Node-REDにNeoPixelを制御するのノードをインストールします。
3本線のアイコンからメニューを開き、「パレットの管理」を選択します。の記事ではNode-REDでNeoPixel互換LEDを制御します。

# NeoPixelとは
NeoPixelとは制御IC入りのRGBLEDです。最近は互換LEDがたくさんでているので、どれがNeoPixelでどれが互換か判別するのは困難ですが、基本的に同じ方法で制御できるます。（たまにハマることもあるようですが）

基本的な構造はすべて同じで、RGB各色のLEDと制御用ICがパッケージ化されています。入出力端子は、5V、GND、DI、DOの4端子で、IDが信号入力用、ODが出力用です。
電源の5V、GNDは共有で、一つ目のNeoPixelのDI端子に制御信号を入力したあとは、一つ目のDO⇒二つ目のDI、二つ目のDO⇒三つ目のDIへと数珠つなぎに接続できます。

良く販売されているのはテープ、リング、マトリクスなどの形状で複数のNeoPixelがモジュール化されているものですが、内部接続は数珠繋ぎになっており、モジュール同士もDO⇒DIへ接続可能です。

# NeoPixelを接続する
制御信号の出力にはGPIO12、13、18、19の4本が使えます。今回はGPIO18を使います。
5V、GNDもそれぞれRaspberry Piの5V、GNDと接続してください。

|Raspberry Pi|NeoPixel|
|-|-|
|5V|5V|
|GND|GND|
|GPIO18|DI|

# ライブラリのインストール
Raspberry PiにNeoPixelを制御するためのライブラリをインストールします。
ターミナルから、次のコマンドを実行してください。
```shell
sudo pip3 install rpi-ws281x
```

# ノードのインストール
Node-REDにNeoPixelを制御するのノードをインストールします。
3本線のアイコンからメニューを開き、「パレットの管理」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496179/db4d3c33-b9fd-67b8-ddad-775349327943.png)

「ノードを追加」タブを選択し、検索窓に「neopixel」と入力、「node-red-node-pi-neopixel」というノードが見つかるので、「ノードを追加」をクリックしてインストールします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496179/67046800-5eea-62f0-ba03-0cf5f7f8f24e.png)

メッセージが出たら「追加」をクリックし、インストールが完了したら「閉じる」ボタンで設定画面を閉じます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496179/306344c6-cc31-c84e-e97b-cd4eb77e028a.png)

画面左のノードのパレットを探すと、下の方に「pi-neopixels」というノードが追加されています。

# フローを作る
NeoPixelを光らせるためのフローを作成します。
ワークスペースに「inject」「pi-neopixels」「debug」の三つのノードを引き出して接続す。「inject」ノードからは、フローラインを2本引き出して「pi-neopixels」「debug」の両ノードへ接続します。こうすることで、同じデータが両方のノードへ送信されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496179/58f554bf-7e84-4e67-7d9e-704d2c77be4c.png)

# pi-neopixel ノードを設定する
続いて、「pi-neopixels」ノードをダブルクリックしてプロパティを開き、「LEDs」に接続するLEDの数、「Pin Number」に信号用のPin番号「12」を設定、「Wipe time」を0にして「完了」します。
Pin Numberには12、32、33、35が選択できますが、GPIO番号とは異なることに注意してください。Raspberry PiのGPIOピンは、物理的なPinに振られたPin Numberと、GPIOの役割に応じて振られたGPIO番号の二つの呼び方があります。
今回はGPIO18番を使用し、その物理Pin Numberが12番であるため、12を選択しています。
LEDは24、16、12個のNeoPixelリングを繋いでいるため、52個としています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496179/5fe88eb6-c62e-2033-2e23-e1498893052a.png)


GPIO番号と物理Pin番号
|GPIO番号|物理Pin番号|
|-|-|
|GPIO12|32|
|GPIO13|33|
|GPIO18|12|
|GPIO19|35|

# 制御コマンドを作る
pi-neopixelノードは、光らせるLEDの番地と色情報を送ると任意の色に光らせることができます。また、injectノードはフローの起点となり、任意のメッセージを作成できるノードです。injectノードにpi-neopixelが受け取れる形のメッセージを作り、送信してみましょう。

injectionノードをダブルクリックしてプロパティを開き、送信するメッセージを「日時」から「文字列」に変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496179/5aee753e-fd91-88bd-eed5-96f09ffae2df.png)

続いて、「msg.payload」の値に、「0,9,100,100,100」と入力して「完了」します。
この値は 「LEDの最初の番地,最後の番地,Rの強度,Gの強度,Bの強度」を示しています。
番地は回路上、Raspberry Piに近い側を0番として連番になっています。RGBはそれぞれ0~255の強度で設定できます。
このメッセージでは、1~10番目のLEDのRGBをすべて強度100（＝白色）で光らす設定です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496179/b2e79fea-0588-44c0-53cd-49db202d0b6c.png)

# デプロイして実行する。
設定がすべて終わったら、「デプロイ」をクリックしてinjectノードの左にあるタブをクリックします。NeoPixelが設定通り光れば成功です。
画面右の虫型のアイコンをクリックしてデバッグタブを開くと、injdectノードから送信されたメッセージが表示されています。
※node-red:rpi-gpio status not-availableというエラーが出た場合は、一度raspberry piを再起動してみてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496179/3fb59f84-19ee-9b88-8171-30ee09378557.png)

RGBの値を0にして送信するとLEDが消灯しますが、数値の代わりに「black」という色指定をしても黒色に変化＝消灯します。番地を指定していないため、すべてのLEDに対して実行されます。他にも色名指定できる色がありますので試してみてさい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496179/667044a7-5a8c-d28e-405e-bc12e29795ed.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496179/f3c7bbad-36e1-ce09-26fa-5a4889be3ff1.png)

# まとめ
Node-REDでNeoPixelを制御してみました。