第14号(2024年05月20日)

【Node-RedでつくるIoTアプリ】デジタル入出力

はじめに

今回は、Raspberry Piにデジタル入出力拡張ボードを取り付け、Node-Redでデジタル入出力を実現します。

システム構成の全体図です。
設備からのデータをデジタル入出力拡張ボードを通じてRaspberry Piが受け取ります。
受け取ったデータをもとにダッシュボードに表示します。ダッシュボードについては次回紹介します。

今回はRaspberry PiとNode-Redでデジタル入出力を行う方法を紹介します。

デジタル入出力 Raspberry Pi 拡張ボード「CPI-DIO-0808L」

使用した拡張ボードはCONTECの「CPI-DIO-0808L」です。

Raspberry Piに拡張ボードを取り付けました。Raspberry Piの上に乗せてネジで止めるだけでOKです。拡張ボードを取り付けてもコンパクトです。
電源端子がある側が入力、電源ランプがある側が出力です。
Raspberry Piへのセットアップは、「CPI-DIO-0808L」の製品ページからダウンロードできるマニュアル通りに行います。
Node-Redで入力データを受け取る
Node-Redでデータを受け取ってみましょう。
Raspberry Piの入出力ノード「node-red-node-pi-gpio」を使用すると便利です。
「CPI-DIO-0808L」は割り込み通知信号を出力することができるので、「rpi-gpio in」を使用すれば、デジタル入出力拡張ボードからの値の変化を検知できます。


ノードの編集画面で割込み通知信号をGPIO04に設定してあります。
入力データに変化があれば、割込み通知信号に「0」が入ります。(通常は「1」)

拡張ボード側でも割込み通知信号の設定をする必要があります。
(写真の場合、1を上げているので割込み通知信号はGPIO04になります)

作成したフローです。割込み通知信号が「0」になったタイミングでコマンドを送信し、データを取得します。



[    {  "id": "66c0cb5b4ae33f3f",  "type": "rpi-gpio in",  "z": "684fb7090b793ba5",  "name": "",  "pin": "4",  "intype": "tri",  "debounce": "25",  "read": false,  "bcm": true,  "x": 150,  "y": 2920,  "wires": [[    "e818e93fd7803951"]  ]    },    {  "id": "e818e93fd7803951",  "type": "switch",  "z": "684fb7090b793ba5",  "name": "",  "property": "payload",  "propertyType": "msg",  "rules": [{    "t": "eq",    "v": "0",    "vt": "str"}  ],  "checkall": "true",  "repair": false,  "outputs": 1,  "x": 270,  "y": 2920,  "wires": [[    "6695f1f62ebedfac"]  ]    },    {  "id": "6695f1f62ebedfac",  "type": "exec",  "z": "684fb7090b793ba5",  "command": "i2cget -y 1 0x20 0x00",  "addpay": "",  "append": "",  "useSpawn": "false",  "timer": "",  "winHide": false,  "oldrc": false,  "name": "",  "x": 440,  "y": 2920,  "wires": [[    "ece426a4e8cdc922"],[],[]  ]    },    {  "id": "3a12c40f0b3e27e9",  "type": "comment",  "z": "684fb7090b793ba5",  "name": "変更を検知した場合に監視する方法",  "info": "",  "x": 220,  "y": 2880,  "wires": []    },    {  "id": "ece426a4e8cdc922",  "type": "debug",  "z": "684fb7090b793ba5",  "name": "debug 1",  "active": true,  "tosidebar": true,  "console": false,  "tostatus": false,  "complete": "false",  "statusVal": "",  "statusType": "auto",  "x": 640,  "y": 2920,  "wires": []    }]
フローを実行し入力データを変化させるとしっかりデータを取得できていることがわかります。


ただし、1秒間に何度も頻繁に入力データが変化する場合、上記ノードでは割込み通知信号の変化を検知できないケースがありました。
その場合は、定周期でコマンドを送信して監視することも可能です。
頻繁にデータが変化する場合、こちらの方が確実にデータを取得できます。

作成したフローです。0.3秒毎にコマンドを送信してデータを取得します。


[    {  "id": "0b6f51d9eee4ad7e",  "type": "inject",  "z": "684fb7090b793ba5",  "name": "",  "props": [],  "repeat": "0.3",  "crontab": "",  "once": true,  "onceDelay": "1",  "topic": "",  "x": 150,  "y": 3040,  "wires": [[    "be6ab804d69dcb60"]  ]    },    {  "id": "be6ab804d69dcb60",  "type": "exec",  "z": "684fb7090b793ba5",  "command": "i2cget -y 1 0x20 0x00",  "addpay": "",  "append": "",  "useSpawn": "false",  "timer": "",  "winHide": false,  "oldrc": false,  "name": "",  "x": 320,  "y": 3040,  "wires": [[    "a1a35009f7014895"],[],[]  ]    },    {  "id": "3e49b7732731c476",  "type": "comment",  "z": "684fb7090b793ba5",  "name": "定周期で監視する方法",  "info": "",  "x": 180,  "y": 3000,  "wires": []    },    {  "id": "a1a35009f7014895",  "type": "debug",  "z": "684fb7090b793ba5",  "name": "debug 2",  "active": true,  "tosidebar": true,  "console": false,  "tostatus": false,  "complete": "false",  "statusVal": "",  "statusType": "auto",  "x": 520,  "y": 3040,  "wires": []    }]
フローを実行し入力データを変化させるとしっかりデータを取得できていることがわかります。

Node-Redでデータを出力する
データ出力は、コマンドで送信します。
作成したフローです。execノードで引数にmsg.outputを設定し、コマンドの最後尾につけて送信します。



[    {  "id": "b4860432c5c61b10",  "type": "comment",  "z": "684fb7090b793ba5",  "name": "出力",  "info": "",  "x": 130,  "y": 3120,  "wires": []    },    {  "id": "86f56e6025887213",  "type": "exec",  "z": "684fb7090b793ba5",  "command": "i2cset -y 1 0x20 0x03 ",  "addpay": "output",  "append": "",  "useSpawn": "false",  "timer": "",  "winHide": false,  "oldrc": false,  "name": "",  "x": 320,  "y": 3160,  "wires": [[],[],[]  ]    },    {  "id": "513811f1eb12c759",  "type": "inject",  "z": "684fb7090b793ba5",  "name": "",  "props": [{    "p": "output",    "v": "0x01",    "vt": "str"}  ],  "repeat": "",  "crontab": "",  "once": false,  "onceDelay": 0.1,  "topic": "",  "x": 150,  "y": 3160,  "wires": [[    "86f56e6025887213"]  ]    }]
これでRaspberry Piから信号を送り、ランプを光らせたりすることができるようになります。

まとめ

Raspberry Piのデジタル入出力をNode-Redでも簡単に実現できました。
Node-RedはRaspberry Piとの相性が良く、ローコードでプログラムを作成することができるので、複雑なコードを記述する必要がないというところがメリットだと思います。
また、開発もブラウザ上のエディタ画面で行うため、個別のRaspberry Piを直接操作する必要はありません。
同じネットワーク上のどの端末からでも簡単に変更が可能です。※エディタ画面には任意のIDとパスワードを設定できます。
工場内に多数設置したとしてもメンテナンスが楽に行えるというのもメリットの一つです。
一覧へ戻る