Howto

RS-485 通信する方法 (Armadillo-IoT ゲートウェイ G4/X2)

Armadillo-IoTゲートウェイ G4においてRS-485通信する方法を紹介します。

Armadillo-IoTゲートウェイ G4をベースにした内容になっていますが、Armadillo-X2でも動作確認しています。 Armadillo-X2はArmadillo-IoTゲートウェイ G4の機能を一部減らして小型にした製品で、基本的には同じソフトウェアで動作します。 また、拡張インターフェース(CON11)の仕様も同じですので、CON11用に作った拡張ボードは両方の製品で動作します。

必要なもの

本Howtoでは以下のものが必要となります。

機材 説明
Armadillo-IoTゲートウェイ G4一式 Armadillo-IoTゲートウェイ G4本体、ACアダプタ、USBケーブル、LANケーブルが必要です。
RS-485ボード 本Howtoに掲載している回路図を参考に作成する必要があります。
作業用PC VMwareが動作可能なスペックのPCが必要です。
ネットワーク環境 Armadillo-IoTゲートウェイ G4と作業用PCはネットワーク通信ができるようにしてください。
RS-485対向機 本Howtoでは作業用PCにUSB-RS485変換(USB-RS485-PCBA/FTDI Chip)を接続したものを対向機としました。

使用するRS-485トランシーバ

RS-485トランシーバは以下を使用します。

XR33202/MaxLinear

  • 電源電圧 : 3.0V ~ 5.5V
  • ロジック電源 : 1.65V ~ 5.5V
  • ESD保護 : 15kV
  • ホットスワップ機能あり
  • フェイルセーフ保護(オープン、短絡、終端処理)
  • 最大転送速度 : 20Mbps (Armadillo-IoT ゲートウェイ G4は 最大4Mbps)

デバイスの詳しい情報については、メーカーのホームページを参照してください。

RS-485トランシーバの選定ポイント

半二重のみ、絶縁なし、外付けでレベル変換回路と電源回路が不要なものを選定しました。

RS-485トランシーバは3.3V/5V単電源で動作するものが多く、Armadillo-IoT ゲートウェイ G4の IO 電圧 1.8V にレベル変換なしで対応できるものは、あまり種類がないようでした。 ご使用予定の環境により、ノイズ耐性、ESD保護、転送速度等、様々な要求仕様があると思うので、選択肢の幅を広げるという点では、外付けにレベル変換回路を搭載する構成のほうが良いかもしれません。

絶縁型をご検討の場合、Analog Devices社のADM2565E、LTM2881等は絶縁型DC/DCコンバータが内蔵でかつIO 電圧 1.8V に対応しており、シンプルなハードウェア構成が可能です。

ハードウェア

参考回路図

本Howtoで作成したRS-485ボードの回路図は以下からダウンロードすることができます。

項目 ファイル
参考回路図 armadillo-iot-g4_rs485-demo_schematic.pdf

参考回路は動作を保証するものではありません。回路設計の際にはデバイスのデータシートやアプリケーションノートをご確認の上、十分な評価をお願いいたします。

ピンアサイン

Armadillo-IoT ゲートウェイ G4のCON11に接続します。

使用するピンは以下のとおりです。

CON11ピン番号 i.MX8MP 信号名 RS-485 信号名
6 GPIO5_IO08 DE、nRE
8 UART3_TX DI
10 UART3_RX RO
30 VDD_1V8 1.8V
32 VDD_5V 5V
34 GND GND

DE、nREの制御はGPIOで行います。GPIOとして使用できるピンは多数ありますが、他の機能を拡張する際にかぶる事が少なくなるよう、UART3_CTS_Bとして使用できるピンを選択しています。 また、UARTはDCEモードに設定して使用します。

DEとnREについて

本Howtoでは、DEとnREを接続して1本のGPIOで方向制御します。

省電力のためにShutdownモードを実装する場合は、nREをHigh (1)、DEをLow (0)にする必要があるため、 個別にGPIOを割り当てる必要があります。下記真理値表をご確認ください。

DEとnREに割り当てるGPIOは、自動方向制御回路を実装したり、自動方向制御機能をもったデバイスを採用することで節約することも可能です。

送信

InputOUTPUTS
nREDEDIAB
x 1 110
x 1 001
0 0 xHi-Z
1 0 xShutdown

受信

InputOUTPUTS
nREDEA-BRO
0 x ≥-50mV1
0 x -200mV < A-B < -50mV不定
0 x ≤-200mV0
0 x Open/Short1
1 1 xHi-Z
1 0 xShutdown

x : Don't care

終端抵抗

終端抵抗は120Ωにしていますが、対向機器や接続箇所により適切な値を選択して実装/非実装してください。 本Howtoでは、対向機と1対1で通信するため120Ωを実装します。

ソフトウェア

使用ソフトウェア

本Howtoで使用したソフトウェアは次のとおりです。

項目 ファイル
開発環境 ATDE9 (v20220624)
Linuxカーネル linux-at-5.10.126-r0.tar
Linuxカーネルパッチ 0001-rs485-support.patch

※RS-485関連の修正がはいったため、Linuxカーネルはlinux-at-5.10.126-r0以降をご使用ください。

Armadillo-X2は下記ソフトウェアで動作確認しています。

項目 ファイル
Linuxカーネル linux-at-x2-5.10.161-r0.tar
at-dtweb バージョン 2.8.0

LinuxカーネルイメージとDTBファイルの作成

RS-485に対応したLinuxカーネルイメージとDTBファイルを作成します。

作業用PC上でATDEを立ち上げ、ソースコードの準備を行います。 Linuxカーネルのソースアーカイブを展開し、パッチを適用します。

[ATDE ~]$ ls
0001-rs485-support.patch linux-at-5.10.126-r0.tar
[ATDE ~]$ tar xf linux-at-5.10.126-r0.tar 
[ATDE ~]$ tar xf linux-at-5.10.126-r0/linux-5.10-5.10.126-r0.tar.gz 
[ATDE ~]$ cd linux-5.10-5.10.126-r0/
[ATDE ~/linux-5.10-5.10.126-r0]$ patch -p1 < ../0001-rs485-support.patch
patching file arch/arm64/boot/dts/freescale/armadillo_iotg_g4.dts
Hunk #1 succeeded at 348 (offset -10 lines).
Hunk #2 succeeded at 915 (offset -10 lines).

デフォルトカーネルコンフィギュレーションを適用します。

[ATDE ~/linux-5.10-5.10.126-r0]$ make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- x2_defconfig
  HOSTCC  scripts/basic/fixdep
  HOSTCC  scripts/kconfig/conf.o
  HOSTCC  scripts/kconfig/confdata.o
  HOSTCC  scripts/kconfig/expr.o
  LEX     scripts/kconfig/lexer.lex.c
  YACC    scripts/kconfig/parser.tab.[ch]
  HOSTCC  scripts/kconfig/lexer.lex.o
  HOSTCC  scripts/kconfig/parser.tab.o
  HOSTCC  scripts/kconfig/preprocess.o
  HOSTCC  scripts/kconfig/symbol.o
  HOSTCC  scripts/kconfig/util.o
  HOSTLD  scripts/kconfig/conf
#
# configuration written to .config
#

ビルドします。ビルドには数分かかります。

[ATDE ~/linux-5.10-5.10.126-r0]$ make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -j4

LinuxカーネルイメージとDTBファイルを確認します。

[ATDE ~/linux-5.10-5.10.126-r0]$ ls arch/arm64/boot/Image
arch/arm64/boot/Image
[ATDE ~/linux-5.10-5.10.126-r0]$ ls arch/arm64/boot/dts/freescale/armadillo_*.dtb
arch/arm64/boot/dts/freescale/armadillo_iotg_g4.dtb

動作確認

動作確認環境

Armadillo-IoTゲートウェイ G4の動作確認環境は次のとおりです。

項目 ファイル
Armadillo Base OS Armadillo-Base OS(3.15.4-at.7)

Armadillo-X2は下記で動作確認しています。

項目 ファイル
Armadillo Base OS Armadillo-Base OS(v3.17.1-at.2)

ハードウェアはブレッドボードで構成しました。

LinuxカーネルイメージとDTBファイルの変更

Armadillo-IoTゲートウェイ G4のLinuxカーネルイメージとDTBファイルを開発中のDTBファイルの書き換えの手順で変更します。

開発後に変更する場合は、DTB確定後の書き換えの手順を確認してください。

[armadillo ~/]# ls 
Image armadillo_iotg_g4.dtb 
[armadillo ~/]# rm -f /boot/armadillo_iotg_g4.dtb
[armadillo ~/]# rm -f /boot/Image
[armadillo ~/]# cp armadillo_iotg_g4.dtb /boot/armadillo_iotg_g4.dtb
[armadillo ~/]# cp Image /boot/Image
[armadillo ~/]# persist_file -rvp /boot/
'/boot/Image' -> '/mnt/boot/Image'
'/boot/armadillo_iotg_g4.dtb' -> '/mnt/boot/armadillo_iotg_g4.dtb'

書き換え後、再起動をしてください。 変更後のLinuxカーネルイメージとDTBファイルを使用して起動します。

コンテナの作成

Armadillo Base OSでは基本的にユーザーアプリケーションをpodmanコンテナ上で実行します。 コンテナ内からRS-485通信を行うため、ホストOS側のデバイスファイル /dev/ttymxc2 をコンテナに渡します。 alpineイメージからrs485_exampleという名前でコンテナを作成し、起動します。 (インターネットに繋がっている必要があります。)

[armadillo ~]# podman run -it --name=rs485_example --device=/dev/ttymxc2 docker.io/alpine /bin/sh

RS-485の設定

接続した対向機器に合わせてArmadillo-IoT ゲートウェイ G4のRS-485設定を行います。 今回、ボーレート: 9600bps、rawモード、エコーバックなしに設定しました。

[container ~]# stty -F /dev/ttymxc2 9600 raw -echo
[container ~]# stty -F /dev/ttymxc2 -a
speed 9600 baud; rows 0; columns 0; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>;
eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R;
werase = ^W; lnext = ^V; discard = ^O; min = 1; time = 0;
-parenb -parodd -cmspar cs8 hupcl -cstopb cread clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr -icrnl -ixon -ixoff
-iuclc -ixany -imaxbel -iutf8
-opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
-isig -icanon iexten -echo echoe echok -echonl -noflsh -xcase -tostop -echoprt
echoctl echoke -flusho -extproc

送信確認

TTYデバイスファイルに任意のデータを書き込むことで、データを送信することができます。 1(0x31)という文字列を送信する例です。

[container ~]# echo -n "1" > /dev/ttymxc2

Armadillo-IoTゲートウェイG4とRS-485デバイス間の送信時の波形

RS-485バスの送信時の波形

受信確認

対向機器からデータを受信するには、TTYデバイスファイルをcatコマンド等でオープンします。 受信したデータをrecvdataというファイルに出力する例です。 対向機からはa(0x61)を送信しています。

[container ~]# cat /dev/ttymxc2 > recvdata

RS-485バスの受信時の波形

Armadillo-IoTゲートウェイG4とRS-485デバイス間の受信時の波形