別シリーズでラズパイにMCP23017 IO Expanderを取り付け、8ビットのDIPスイッチの値を読み取るPythonスクリプトを作りました。しかし、暑さにかまけてPython書いて中断、Node-REDダッシュボードから制御する部分を後回しっと。残り作業は純然たるNode-REDの作業なのでこちらでやります。
※「ブロックを積みながら」投稿順 index はこちら
※Node-REDは Raspberry Pi 3 model B+ (Raspberry Pi OS, 32bit)上で動作させています。
やっつけなPythonスクリプトの件
Pythonスクリプトを書いただけで投げてあった件の記事は以下です。こちらにMCP23017の接続回路図と、8ビットポート毎に入出力可能な実験用のPythonスクリプトの全文があります。
やっつけな日常(22) ラズパイ、IO Expander制御、入力モード追加
また、出力側8ビット分については、すでにNode-REDとの接続まで作ってあります。そちらは以下に。
やっつけな日常(21) NodeRedダッシュボードからIO Expander制御
今回は(21)で作ってあった「出力パネル」の横に「入力パネル」を追加して、(22)で作ってあったPythonスクリプトを呼び出して入力パネルにDIPスイッチの様子を表示する、と。部品は出来とるし、ちょろい?でもメンドイです。
作製したNodeRedフローとノードの設定
フローは単純です。左から
-
- ダッシュボードの Button ノードで「読み取り(Get Port B)」ボタンを押すと
- Port Bからの入力を行うPythonスクリプトをExecノードで起動する
- Execノードの出力をFunctionノードで処理して
- ダッシュボードのChart ノードに棒グラフとして表示する
という塩梅。下の方にDebugノードが2個並んでいるのはExecノードでError発生したときに「原因を捕まえる」ため。Chartノードに灰色のInjectノードも接続しているのは空リストを送ってグラフをクリアするためです(デバッグ時に使うため。)
まずは肝心のPythonスクリプトを実行させるEXECノードの設定が以下に。ミソはたった一か所、コマンドライン引数の -INBフラグだけです。これでMCP23017のPort Bの8ビットの値が読み取られ、標準出力に
B= xxx
xxxは0から255の整数、ってな感じで結果が返ってきます。なお、DIPスイッチにはプルアップ抵抗ついていて、OFFだと1、ONだと0が読み取れます。
注意点は+引数という設定。以前のOUT側ではコマンドライン引数の末尾に出力値を付加するのに上流から来たmsg.payloadを載せていましたが、今回は不要であります。
つづいては、読み取ったPort Bの値(8ビット整数)をビット毎にバラシて表示用に加工するFunctionノードです。
Pythonスクリプトは Port Bなら B= xxxとか、Aなら A= yyy とかソースを告げてくれるですが、受け取るJavaScript側では頭の3文字は無視して、8ビット整数値部分のみをバラシて表示しています。手抜きだな。
表示する値は msg.payload に載せますが、異なる系列(今回は各ビットを「系列」として扱ってます)については msg.topic に系列名を載せるとさばいてくれるので、そちらに “Bit 0″などの文字列を載せて送り出します。
結果表示は、右端のダッシュボードのChartノードです。特に言えば横棒グラフ指定くらいですかね。配色はデフォルトのままにしたので、topic毎(ここでは各Bit毎)に色変します。渋い見た目にするには「最初の色を全グラフで使用」にした方がよかったかな。まあ、見た目はいいか。また手抜きだな。
動作確認
さて、手抜きの結果が以下に。DIPスイッチのBIT 7, 5, 3, 1 をOFF、6, 4, 2, 0をONにしてから、「GET PORT B」ボタンを押したときの読み取り結果です。先ほど述べたようにOFFで1が読み取れる回路そのままの値です。
まあ、NodeRedもからIO Expander MCP23017の入出力双方できた、と。これまた手抜きのやっつけ仕事だな。