ブログ

Armadillo-IoT A6E:接点入出力機能を使用する アプリケーション開発(Node-RED)編

at_takuma.fukuda
2022年12月21日 12時55分

Armadillo-IoT A6Eには接点入出力のためのポートが備わっています。
下記の記事では、接点入出力を行うための配線方法などをご紹介しました。
Armadillo-IoT A6E:接点入出力機能を使用する(配線・動作確認編)
この記事では実際に接点入出力を行うアプリケーションを、Node-REDを使って実装します。

アプリケーションでの接点入出力処理

接点入出力を行うアプリケーションを実装します。今回はNode-REDを使って実装します。

アプリケーション概要

接点入力1の入力結果の表示と、接点出力1の制御を行います。
接点入力1の値の立ち上がり、立ち下がりを検出し、グラフに表示します。
接点出力1に対してはON/OFFボタンを押下することで制御出来るようにしています。
表示・制御画面は以下のようなものになります。

コンテナイメージ作成

まずNode-REDが動作するコンテナを作成します。
接点入出力を扱う上で、標準以外のNodeを使用する必要がありますので、
Dockerfileを使って、以下のNodeが予めインストールされたコンテナイメージをビルドしておきます。

  • node-red-contrib-libgpiod:GPIOの入出力に使用
  • node-red-dashboard:ボタン操作で接点出力を行うために使用
  • node-red-contrib-edge-trigger:接点信号の立ち上り立下りを検知するのに使用

コンテナイメージのビルドに使用するDockerfileは以下の通りです。

[armadillo ~]# vi Dockerfile
FROM docker.io/nodered/node-red
 
LABEL version="1.0.0"
USER root
RUN apk update && apk upgrade && apk add libgpiod libgpiod-dev && \
    npm install node-red-contrib-libgpiod && \
    npm install node-red-dashboard && \
    npm install node-red-contrib-edge-trigger

上記のDockerfileを使ってコンテナイメージをビルドします。
コンテナイメージ名はmynoderedとしています。

[armadillo ~]# podman build -t mynodered .

コンテナ起動

ビルドしたイメージファイルからコンテナを作成・起動します。
podman runコマンドでも作成・起動は可能ですが、よりスムーズに開発から運用に移行出来るよう、自動起動のためのconfファイルを作成します。
/dev/gpiochip5を使用出来るようにし、コンテナの1880番ポートをArmadillo Base OSの18880番ポートに転送するため、以下のように記述します。

[armadillo ~]# vi /etc/atmark/containers/mynodered.conf
set_image localhost/mynodered:latest
add_devices /dev/gpiochip5
add_ports 1880:1880
set_command node-red

下記のコマンドでconfファイルの内容を元にコンテナを作成・起動します。

[armadillo ~]# podman_start mynodered

フロー編集

コンテナ起動後、Armadillo-IoT A6Eと同じネットワークに接続したPCのWebブラウザでフロー編集画面にアクセスし、
以下のようなフローを作成します。 より詳細な内容を説明します。

接点入力

接点入力情報を取得するのには、まずGPIO inノードを使用します。
Deviceをgpiochip5、Pinを0とすると、接点入力1の値を取得できるようになります。
データ取得のトリガとしてinjectノードを使用します。
Node-RED起動後から一定間隔ごとに実行するよう設定しておきます。
このノードでは、起動後0.1秒後から0.1秒間隔で実行するよう設定しています。
GPIO inノードの結果をそのまま出力すると、現在の値が出力され続けるものとなりますが、
立ち上がり立下りのみを出力するために、node-red-contrib-edge-triggerの3種類のノードを使用します。
立ち上がりのみを検出したい場合はrising edgeノード、立ち下がりのみを検出したい場合はfalling edgeノード、立ち上がり立ち下がりを両方検出したい場合はhysteresisノードを使用します。
出力結果をグラフ化するため、hysteresisノードをchartノードに接続します。

接点出力

GPIO outノードも接点出力を制御するために使用出来るのですが、Node-REDでGPIO outノードを使用すると、
フロー起動時に対象のGPIOの値を0に初期化するため、不要なタイミングで接点出力が行われてしまいます。
そのためこのフローでは接点出力を制御するために、execノードを使ってgpiosetコマンドを実行します。
buttonノードのmsg.payloadでexecノードにgpiosetコマンドの引数を渡すようにして、
ボタン押下時にexecノードが実行されるようにしています。

このフローのJSONファイルをテキスト化したものを下記に公開しますので、こちらをインポートしてお試しください。
contact_flow.json_.txt