Grove Base HATをNode-RED execノードで連携するメモ
Grove Base HATをNode-RED execノードで連携するメモです。
Grove Base HATはこちらで購入
スイッチサイエンスさんで購入しました。
GROVE - ベースHAT for Raspberry Pi - スイッチサイエンス

今回は Raspberry Pi 3B+ につなぎます。
インストール
2019/07/30現在の情報で進めます。Raspbianのイメージはフルバージョンのものを使いました。

このようにしっかり差し込んでインストールを始めます。
Grove Base Hat for Raspberry Pi - Seeed Wiki
このWikiを参考に、Online one-click installationの
curl -sL https://github.com/Seeed-Studio/grove.py/raw/master/install.sh | sudo bash -s -
を実行してしばらくインストールを待ちます。



Grove Base HAT for Raspberry Piを使ってみた - Qiita
matsujirushiさんの記事を見ていると、Raspbian Lite版だと追加インストールの必要があるようですね。
余談:しっかり差し込みましょう
I2Cやデジタル入力を動かそうとしたら、
Check whether I2C enabled and Grove Base Hat RPi or Grove Base Hat RPi Zero inserted
といったエラーが出て、
sudo i2cdetect -y 1
で調べても、

I2C反応なし。

原因はちゃんと差し込まなかったから。すぐHATが抜けるように半刺しにしたのが行けなかったようです。

差し込み直したら上手くいきました。

しっかり差し込みましょう!
インストールされた場所
インストールされた場所はこちらです。

どこからでも実行できます。
sudo grove_pwm_buzzer
たとえば、これはGroveのPWMブザーを鳴らすものです。PWMのポートに差し込んでこのコマンドを実行すると音がなります。
コマンドの中身
コマンド中身はたとえばGroveのPWMブザーの場合、以下です。
nano /usr/local/bin/grove_pwm_buzzer
nanoで開いてみます。
#!/usr/bin/python3
# EASY-INSTALL-ENTRY-SCRIPT: 'grove.py==0.6','console_scripts','grove_pwm_buzzer'
__requires__ = 'grove.py==0.6'
import re
import sys
from pkg_resources import load_entry_point
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
sys.exit(
load_entry_point('grove.py==0.6', 'console_scripts', 'grove_pwm_buzzer')()
)
他のフォルダ階層にアクセスしているようです。検索してみたら以下にありました。
/usr/local/bin $ sudo find / -name "grove_pwm_buzzer.py"
/usr/local/lib/python2.7/dist-packages/grove/grove_pwm_buzzer.py
/usr/local/lib/python3.5/dist-packages/grove/grove_pwm_buzzer.py
ここは以下のGitHubの構造と同じように配置されています。
grove.py/grove at master · Seeed-Studio/grove.py
私はソースはGitHubを参考にしています。
Pythonで動かしてみる
Node-REDのexecで動かすコマンドを把握するため以下のように叩いてみます。

超音波センサーでやってみます。D5に差し込みました。

いざコマンドを打ってみます!
python /usr/local/lib/python2.7/dist-packages/grove/grove_ultrasonic_ranger.py 5 6
引数の 5 6 は、Dなので、5番ポート 6番ポートを指定しています。
ということで、このように動きます!

Node-REDで動かしてみる
コマンドの叩き方がわかったので、Node-REDでexecノードでやってみます。

このようなフローを組みます。真ん中の長い赤いノードが exec です。

execの設定です。
python -u /usr/local/lib/python2.7/dist-packages/grove/grove_ultrasonic_ranger.py 5 6
python 実行では、 -u の引数を加えています。
1. コマンドラインと環境 — Python 3.7.4 ドキュメント
Force the stdout and stderr streams to be unbuffered. This option has no effect on the stdin stream.
標準出力と標準エラーストリームをバッファリングしないように強制します。このオプションは標準入力ストリームには影響しません。
とのこと。Node-RED側のexecの説明でも -u を入れようと書かれているので、そうします。

injectノードを押してコマンドが動きます。

ちなみに止めるときは、こちらを動作させてます。msg.killで exec ノードへ流し込むと止められます。
いいかんじ。
ただ、サンプルコードそのままの文字列できちゃうのでJSONで扱いやすくしてあげると良いかなと思ってます。このあたり、JSONを返答するpythonを作って、近々整えようと思います。
Seeed公式から提供されてるハードウェアとソフトウェア(サンプルコード)で動くので安心。Node-REDでも開発する部分が住み分けしやすそうです。