GrovePi用Private Nodeを作ってみた

今年も始まりましたアドベントカレンダー！
enebularウフル社員版の初日のネタということで、最近ウフルが運営したハッカソンに向けて開発・提供したPrivate Nodeについて紹介します。
Private Nodeは、自作のノードを簡単に無料/有料で共有できるenebularの機能です。最近、無料のPrivate Nodeであれば、無料プランのプロジェクトでも使用できるようになっています。

# GrovePi用Private Node開発の経緯

11/27～28に福井で開催された[地方創生ハッカソン in 福井](https://uhuru.co.jp/news/topics/20211028/)に技術メンターとして参加してきました！コロナも落ち着いてきたということで、ひさびさのオフラインのイベントです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/57906a16-4add-34f8-a6db-c31e8aa28e6e.png)

今回のハッカソンでは、アイディアからすぐに動くものが作れるように、ウフルからRaspberryPiとセンサーやスイッチ、ブザーなどのGroveモジュールとアプリケーションの開発用に[enebular editor(Node-RED)](https://docs.enebular.com/ja/EnebularEditor/)を提供しています。

が・・。

準備している段階で、用意しているGroveモジュールを扱うためのノードがなかったことに気付きました。あると思っていたものは古くなっていてアップデートも行われておらず使用できないという状況に・・。

Groveモジュールと共に用意している[GrovePi+](https://jp.seeedstudio.com/GrovePi.html)は、単純にRasperryPiのI/OがGroveコネクタになっているわけではなく、マイコンが介してI2Cでやり取りしているので、RaspberryPiのI/Oノードでは対応できません。

このままでは、```すぐに動くものが作れる！```というわけにはいきませんので、専用のノードを作りました。

# 対応すべきGroveモジュール
ハッカソンで用意したのは、RaspberryPiと[GrovePi+ starter kit for Raspberry Pi](https://akizukidenshi.com/catalog/g/gK-11862/)、その他いくつかのGroveモジュールです。
Groveモジュールは以下のラインナップです。

* デジタル入力
    * [Grove-ボタン](https://www.seeedstudio.com/Grove-Button-P.html)
    * [Grove-磁気スイッチ](https://www.seeedstudio.com/Grove-Magnetic-Switch.html)
* デジタル出力
    * [Grove-赤LED](https://www.seeedstudio.com/Grove-Red-LED.html)
    * [Grove-緑LED](https://www.seeedstudio.com/Grove-Green-LED.html)
    * [Grove-青LED](https://www.seeedstudio.com/Grove-Blue-LED.html)
    * [Grove-リレー](https://www.seeedstudio.com/Grove-Relay.html)
    * [Grove-ブザー](https://www.seeedstudio.com/Grove-Buzzer.html)
    * [Grove-超音波距離センサー](https://www.seeedstudio.com/Grove-Ultrasonic-Distance-Sensor.html)
    * [GROVE-デジタル温度・湿度センサ](https://www.seeedstudio.com/Grove-Temperature-Humidity-Sensor-DHT11.html)
* アナログ入力
    * [Grove-音センサ](https://www.seeedstudio.com/Grove-Sound-Sensor-Based-on-LM358-amplifier-Arduino-Compatible.html)
    * [Grove-回転角センサ](https://www.seeedstudio.com/Grove-Rotary-Angle-Sensor.html)
    * [Grove-光センサ](https://www.seeedstudio.com/Grove-Light-Sensor-v1-2-LS06-S-phototransistor.html)
* I2C
    * [Grove-RGBバックライト液晶モジュール](https://www.seeedstudio.com/Grove-LCD-RGB-Backlight.html)
    * [Grove-3軸デジタル加速度センサー(±16g)](https://www.seeedstudio.com/Grove-3-Axis-Digital-Accelerometer-16g.html)

# GrovePi+について

GrovePi+にはArduinoなどにも使われているマイコンATmega328が搭載されていて、RaspberryPiには無いアナログ入力を補っています。デジタル入出力とアナログ入力の信号はATmega328を介してI2Cでやりとりする様になっています。
詳しくは[GrovePi+のブロック図](https://qiita.com/matsujirushi/items/c4eb769409703d9be956)が参考なると思います。
このGrovePi用のノードとして、接続されるGroveモジュールごとに扱えるノードを開発しました。

# 開発したGrovePi用ノード
GrovePi用ノードはenebularのPrivate Nodeとして作りました。Private Nodeであれば、enebularのプロジェクトに入れていれば自動的にenebular editorのノードパレットに追加されます。

作ったノードは、enebularのDiscoverに登録しましたので、インポートすれば誰でもRasperryPi上のenebular editorもしくはenebular-agentのフローで使用できますので、ぜひ使ってみて下さい。

[enebular Discover grovepi-nodes](https://enebular.com/discover/privatenode/e8162ce1-6e65-4141-8b4e-d593e580a12d)

# 使用方法
ノードごとに使い方を説明します。

## GrovePi デジタル入力ノード
スイッチなどの単純なON/OFFのGroveモジュールで使用できるノードです。
入力が変化するとmsg.payloadに0または1が出力されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/17d189d0-f187-4fb1-9dff-54a4deff9c2f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/02d7b5e1-3d8f-cc55-73c9-f1f8927d5b6b.png)
プロパティではGrovePiボードをconfigノードとして指定します。configノードとしては名前を設定するぐらいで、フロー内で使用するノードですべて同じconfigノードを使用していればOKです。あとはGroveモジュールが繋がっているコネクタ番号を指定するだけです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/5679761c-d9a6-6a79-a5e2-d712032e9120.png)

## GrovePi LEDノード
Grove-LED用のノードです。単純にデジタル出力に対して、ON/OFFをコントロールできるので、Grove-リレーやGrove-ブザーでも使用できます。
入力のmsg.payloadが"off"、false、0、"reset"、"stop"のときはデジタル出力として0を出力、それ以外のときは1を出力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/f971bd8f-03e6-6564-1dda-667cb3135592.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/45ddc84e-90d5-4dac-3b83-d0c4d350a778.png)
プロパティではGrovePiボードconfigノードの指定とGroveモジュールが繋がっているコネクタ番号を指定するだけです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/9e236a92-87e8-1870-01bc-be15453d2568.png)

## GrovePi ブザーノード
Grove-ブザー用のノードです。ノードが呼ばれると設定した時間のあいだONになります。（msgの内容はなんでもOKです）こちらもGrove-ブザー以外でも使用できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/e644b556-71a7-8af8-de8b-1d3cf49d4e7a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/84415f5c-47c7-3756-fd58-bfeac1e7684c.png)
プロパティではGrovePiボードconfigノードの指定とONにする時間とGroveモジュールが繋がっているコネクタ番号を指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/e80f9423-97d1-1f01-ada9-3b4787245550.png)

## GrovePi アナログノード
アナログ出力のGroveモジュール用のノードです。0～1023の間で読み取った値がmsg.payloadに出力されます。Grove-音センサやGrove-回転角センサ、Grove-光センサで使用できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/d8503435-735c-66eb-1259-12711ce6d8cb.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/4a9c6df1-08b1-6df1-293f-323efbb44686.png)
プロパティではGrovePiボードconfigノードの指定とGroveモジュールが繋がっているコネクタ番号と読み込む周期を設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/be1b828a-b064-e9fe-6968-a13ffb0eccff.png)

## GrovePi 温湿度センサノード
GROVE-デジタル温度・湿度センサ用のノードです。温度、湿度、熱係数をmsg.payloadに出力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/2ecb6f72-dc05-aa78-6f87-85865337bca5.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/080a19b0-b4aa-903c-8c11-128fc2e5e323.png)
プロパティではGrovePiボードconfigノードの指定とGroveモジュールが繋がっているコネクタ番号と周期を設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/ab02037c-15dd-c370-39c3-211cf1edb3a1.png)

## GrovePi 超音波距離センサーノード
Grove-超音波距離センサー用のノードです。msg.payloadにcm単位の検出力を出力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/6f0228ba-9e1b-0cef-9895-0ba094f7d0b5.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/15d8c68f-804b-61e6-9803-7c6389768b0c.png)
プロパティではGrovePiボードconfigノードの指定とGroveモジュールが繋がっているコネクタ番号と周期を設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/7443171f-0b8d-4b96-3720-a96f8abd96e5.png)

## GrovePi ３軸デジタル加速度センサー(±16g)ノード
Grove-3軸デジタル加速度センサー(±16g)用のノードです。msg.payloadにX,Y,Z軸の加速度を出力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/e90c7674-647e-ff4f-8120-23eb4f0ed932.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/37fa1577-a108-666c-6b0d-a06b11d69627.png)
プロパティではGrovePiボードconfigノードの指定とGroveモジュールが繋がっているコネクタ番号と周期を設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/58dc33db-5b31-b182-53e8-7dd80c57a7e5.png)

## GrovePi RGBバックライト液晶モジュールノード
Grove-RGBバックライト液晶モジュール用のノードです。msg.payloadの内容を表示します。msg.colとmsg.rowで表示位置、msg.colorでバックライトの色を指定できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/ca14c066-f256-e352-d298-da3c9a52294d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/240e114e-6f12-57c9-28fc-5369edcb337a.png)
プロパティではGrovePiボードconfigノードの指定とGrovePiのボードをconfigノードとして登録するのみです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/197e34fe-8688-5df0-cffd-8004a0e03cd4.png)

# 最後に
開発したGrovePi用PPrivate Nodeはウフルオフィシャルとして公開しているものではありません。それなりにテストは行っていますが、あくまでプロトタイピングを簡単にする手段としてご使用下さい。
逆にバグの修正や対応を追加してほしいGroveモジュールなどの要望があれば手軽に対応したいと思っています。