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は、自動方向制御回路を実装したり、自動方向制御機能をもったデバイスを採用することで節約することも可能です。
送信
Input | OUTPUTS | |||
---|---|---|---|---|
nRE | DE | DI | A | B |
x | 1 | 1 | 1 | 0 |
x | 1 | 0 | 0 | 1 |
0 | 0 | x | Hi-Z | |
1 | 0 | x | Shutdown |
受信
Input | OUTPUTS | ||
---|---|---|---|
nRE | DE | A-B | RO |
0 | x | ≥-50mV | 1 |
0 | x | -200mV < A-B < -50mV | 不定 |
0 | x | ≤-200mV | 0 |
0 | x | Open/Short | 1 |
1 | 1 | x | Hi-Z |
1 | 0 | x | Shutdown |
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