ブログ

Armadillo-IoT G4:RS-485でセンサと通信させてみた

at_takuma.fukuda
2022年9月19日 17時38分

下記の記事を参考に、Armadillo-IoT G4と温湿度センサをRs-485通信させてみました。
Howto:Armadillo-IoT ゲートウェイ G4 で RS-485 通信する方法

機器構成

  • Armadillo-IoT G4 LANモデル
    LTEモデルでは拡張インタフェースがCON11が使えず、UART通信の拡張が出来ないのでお気を付け下さい。
  • Modbus通信でデータ読出し可能な機器
    今回は市販の温湿度センサを使用しています。
    KKmoonRS485温度湿度 トランスミッタ
    また、このセンサへの電源供給のためDC12V出力の電源装置を接続しています。
    AK20W-DL-B (DC5V/1.6A、DC12V/1.0A)
  • UART接続可能なRS-485トランシーバー
    TTLレベルのRS-485信号をRS-485信号に変換するシリアル通信モジュール。RS-485トランシーバーとしてMAX485CSAを搭載しています。
    LC-Electronics RS-485 TTL to RS-485 converter module
  • その他ブレッドボード・ジャンパケーブル
    モジュールとArmadillo-IoT G4のCON11ピンヘッダとを接続するのに使用します。

機器配線

Armadillo-IoT G4・モジュール・センサ・電源の接続構成は以下の通りです。
活線挿抜を行うと故障や事故の原因となりますので、必ずすべての機器の電源を落とした状態で接続してください。

Linuxカーネル

UART通信機能を有効にするためにはLinuxカーネルを改造する必要があります。
Linuxカーネルの改造と書きこみ方についてはこの記事を参考にしてください。
Howto:Armadillo-IoT ゲートウェイ G4 で RS-485 通信する方法
改造したLinuxカーネルとDTBを書きこむと、UART通信機能が有効になっています。
UART3を有効にしたので、/devの下にデバイスファイルttymxc2があるかを確認します。

armadillo:~# ls /dev/ttymxc2
/dev/ttymxc2

アプリケーション構築

改造したカーネルとDTBをArmadillo-IoT G4に反映したら、センサとModbusで通信してデータを収集するアプリケーションをコンテナ上で構築します。
先日Node-REDを使って、Armadillo-640とこのセンサーとの通信プログラムを作ったのでそれを流用します。
Armadillo-640:Node-REDを使ってModbus通信でデータを収集しグラフ化する
この記事で公開している設定ファイルを活用して、最初からNode-REDアプリケーションが動作するようなコンテナを作成します。
まずはコンテナイメージ構築のためのDockerfileを作成します。

Dockerfileを格納するための任意のディレクトリを作成します。
[armadillo ~]# mkdir nodered

このディレクトリの中に、スクリプトや設定ファイルを格納しておくディレクトリを作成します。
[armadillo ~]# cd nodered
[armadillo ~]# mkdir resources

設定ファイル等をダウンロードします。
スクリプトファイルダウンロード
[armadillo ~]# wget https://armadillo.atmark-techno.com/system/files/blog/set_node_red_serial.sh
フロー設定ファイルダウンロード
[armadillo ~]# wget https://armadillo.atmark-techno.com/system/files/blog/flows.zip

スクリプトファイルを編集します。(node-redの自動起動に関する部分を削除しておきます)
[armadillo ~]# vi set_node_red_serial.sh
#/bin/bash

apt-get update --allow-releaseinfo-change
apt-get -y upgrade
apt-get install -y curl unzip
update-ca-certificates --fresh
curl -fsSL https://deb.nodesource.com/setup_lts.x | bash -
apt-get install -y gcc g++ make
curl -sL https://dl.yarnpkg.com/debian/pubkey.gpg | gpg --dearmor | tee /usr/share/keyrings/yarnkey.gpg >/dev/null
echo "deb [signed-by=/usr/share/keyrings/yarnkey.gpg] https://dl.yarnpkg.com/debian stable main" | tee /etc/apt/sources.list.d/yarn.list
apt-get install -y nodejs
apt-get update && apt-get install -y yarn
npm install -g --unsafe-perm node-red
npm install -g --unsafe-perm node-red-contrib-modbus
npm install -g --unsafe-perm node-red-dashboard
npm install -g --unsafe-perm pm2
unzip flows.zip
mkdir /root/.node-red/
cp flows.json /root/.node-red/

Dockerfileを作成します。
[armadillo ~]# cd ..
[armadillo ~]# vi Dockerfile
FROM docker.io/debian:latest

LABEL version="1.0.0"

COPY resources /

ARG USERNAME=atmark
ARG UID=1000
RUN apt-get update && apt-get upgrade -y \
    && /set_node_red_serial.sh \
    && apt-get clean \
    && useradd -m -u ${UID} ${USERNAME} \
    && rm /set_node_red_serial.sh \
    && rm /flows.zip

パーミッションを設定しておきます
[armadillo ~]# chmod +x resources/set_node_red_serial.sh

コンテナイメージをビルドします
[armadillo ~]# podman build -t noderedtest .

ビルドしたイメージからコンテナを作成します。
[armadillo ~]# podman run -it --name=noderedtest --publish=1880:1880 --device=/dev/ttymxc2 localhost/noderedtest:latest node-red

設定変更

コンテナが起動してNode-REDが自動実行されますが、シリアルポートの設定がUSBデバイスのままになっているので、そのままでは通信できません。
フロー画面を表示し、 Modbus Readノードの設定ウインドウを開きます。 Serial portのデバイスファイル名をttymxc2に変更します。 設定を適用すると、通信が開始されてデータがグラフ化されます。
設定変更後、コンテナイメージを更新しておきましょう。

[armadillo ~]# podman commit noderedtest localhost/noderedhost:latest

confファイルを作成して保存しておくと、Armadillo-IoT G4の起動時に自動的にコンテナが起動するようになります。

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

confファイル保存
[armadillo ~]# persist_file /etc/atmark/containers/noderedtest.conf

こちらを参考に様々な機器とのシリアル通信をお試しください。