Armadillo-IoTゲートウェイ G4とArmadillo-X2はCANコントローラを内蔵しており、CANトランシーバを追加することで、CAN通信することができます。
本Howtoでは、Armadillo-IoTゲートウェイ G4においてCAN通信する方法を紹介します。
Armadillo-IoT ゲートウェイ G4をベースにした内容になっていますが、Armadillo-X2でも動作確認しています。 Armadillo-X2はArmadillo-IoTゲートウェイ G4の機能を一部減らして小型にした製品で、基本的には同じソフトウェアで動作します。 また、拡張インターフェース(CON11)の仕様も同じですので、CON11用に作った拡張ボードは両方の製品で動作します。
必要なもの
本Howtoでは以下のものが必要となります。
機材 | 説明 |
---|---|
Armadillo-IoTゲートウェイ G4一式 | Armadillo-IoTゲートウェイ G4本体、ACアダプタ、USBケーブル、LANケーブルが必要です。 |
CANボード | 本Howtoに掲載している回路図を参考に作成する必要があります。 |
作業用PC | VMwareが動作可能なスペックのPCが必要です。 |
ネットワーク環境 | Armadillo-IoTゲートウェイ G4と作業用PCはネットワーク通信ができるようにしてください。 |
CAN対向機 | 本HowtoではArmadillo-IoTゲートウェイ G4 にCANボードを接続したものを、もう一式用意して対向機としました。 |
CAN通信ケーブル | 本HowtoではD-Sub9ピンコネクタ(オスーオス、ストレート結線)を用意しました。 |
使用するCANトランシーバ
CANトランシーバは以下を使用します。
NCV7357/ON Semiconductor
デバイスの詳しい情報については、メーカーのホームページを参照してください。
CANトランシーバの採用ポイント
下記観点で本HowtoではNCV7357を採用しました。
- CAN FD 対応 (通信速度 : 最大5Mbps)
- 2022年8月現在入手可能(EOLでない)
Armadillo-IoTゲートウェイ G4のCANモジュールはCAN FDおよびCAN2.0Bプロトコルに対応しているため、CAN FDまで対応可能なデバイスを採用しました。
NCV7357は、Armadillo-IoTゲートウェイ G4のIO電圧 1.8Vに対応しておらず、レベル変換が必要となります。Texas InstrumentsやMicrochip等にはVIO電圧が1.8Vに対応可能なデバイスもラインアップされており、入手できるのであれば、そちらのほうが使い勝手が良いかと思います。
ハードウェア
参考回路図
本Howtoで作成したCANボードの回路図は以下からダウンロードすることができます。
項目 | ファイル |
---|---|
参考回路図 | armadillo-iot-g4_can-demo_schematic.pdf |
参考回路は動作を保証するものではありません。回路設計の際にはデバイスのデータシートやアプリケーションノートをご確認の上、十分な評価をお願いいたします。
ピンアサイン
CANボードはArmadillo-IoT ゲートウェイ G4のCON11に接続します。 Armadillo-IoT ゲートウェイG4のCON11にはCANが2ポートありますが、 今回はCAN2側を使用します。CAN1、CAN2のどちらを選択しても、特に仕様に違いはありません。
CON11ピン番号 | i.MX8MP 信号名 |
---|---|
25 | FLEXCAN2_TX |
27 | FLEXCAN2_RX |
30 | VDD_1V8 |
31 | VDD_5V |
33 | GND |
ソフトウェア
使用ソフトウェア
本Howtoで使用したソフトウェアは次のとおりです。
項目 | ファイル |
---|---|
開発環境 | ATDE9 (v20220624) |
Linuxカーネル | linux-at-5.10.126-r0.tar |
at-dtweb | バージョン 2.6.2 |
Armadillo-X2は下記ソフトウェアで動作確認しています。
項目 | ファイル |
---|---|
Linuxカーネル | linux-at-x2-5.10.161-r0.tar |
at-dtweb | バージョン 2.8.0 |
Device Treeのカスタマイズ
Device TreeをDTS overlayでカスタマイズします。
作業用PC上でATDEを立ち上げ、Linuxカーネルのソースアーカイブを展開し、デフォルトカーネルコンフィギュレーションを適用します。
[ATDE ~]$ ls
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]$ 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]$ cd ../
[ATDE ~]$
at-dtwebを起動します。
[ATDE ~]$ at-dtweb
Armadillo-IoT_G4を選択して[OK]をクリックします。
Linuxカーネルディレクトリを選択して[OK]をクリックします。
CON11の25、27ピンをCAN2に設定して[Save]をクリックします。
at-dtwebを終了し、DTS overlay(dtbo)ファイルを確認します。
[ATDE ~]$ ls ~/mkswu/at-dtweb
armadillo_iotg_g4-at-dtweb.dtbo update_overlays.sh
at-dtweb.desc update_preserve_files.sh
動作確認
動作確認環境
Armadillo-IoTゲートウェイ G4の動作確認環境は次のとおりです。
項目 | ファイル |
---|---|
Armadillo Base OS | Armadillo-Base OS(3.16.0-at.1) |
Armadillo-X2は下記で動作確認しています。
項目 | ファイル |
---|---|
Armadillo Base OS | Armadillo-Base OS(v3.17.1-at.2) |
Armadillo-IoT ゲートウェイG4は2台共、同じ動作環境、設定にします。
DTS overlayによるカスタマイズ
Device TreeをDTS overlays によるカスタマイズの手順で変更します。
/boot/overlays.txt ファイルに armadillo_iotg_g4-at-dtweb.dtbo を追加します。ファイルが存在しない場合は新規に作成します。
作業後、overlayの実行のため、再起動をしてください。
[armadillo ~/]# ls
armadillo_iotg_g4-at-dtweb.dtbo
[armadillo ~/]# cp armadillo_iotg_g4-at-dtweb.dtbo /boot/
[armadillo ~/]# vi /boot/overlays.txt
fdt_overlays=armadillo_iotg_g4-at-dtweb.dtbo
[armadillo ~/]# persist_file -vp overlays.txt armadillo_iotg_g4-at-dtweb.dtbo
'/boot/overlays.txt' -> '/mnt/boot/overlays.txt'
'/boot/armadillo_iotg_g4-at-dtweb.dtbo' -> '/mnt/boot/armadillo_iotg_g4-at-dtweb.dtbo'
Added "/boot/armadillo_iotg_g4-at-dtweb.dtbo" to /etc/swupdate_preserve_files
[armadillo ~/]# reboot
: (省略)
Applying fdt overlay: armadillo_iotg_g4-at-dtweb.dtbo
コンテナの作成
Armadillo Base OSでは基本的にユーザーアプリケーションをpodmanコンテナ上で実行します。
コンテナ内で動作するアプリケーションから CAN 通信するためには、コンテナを作成する際に、コンテナを実行するネットワークとしてhost、権限としてNET_ADMINを指定します。
alpineイメージからcan_exampleという名前でコンテナを作成し、起動します。 (インターネットに繋がっている必要があります。)
[armadillo ~]# podman run -it --name=can_example --net=host --cap-add=NET_ADMIN docker.io/alpine /bin/sh
CAN通信準備
CAN通信設定のためにiproute2、送受信確認のためにcan-utilsをインストールします。
[container /]# apk update && apk upgrade
fetch https://dl-cdn.alpinelinux.org/alpine/v3.16/main/aarch64/APKINDEX.tar.gz
fetch https://dl-cdn.alpinelinux.org/alpine/v3.16/community/aarch64/APKINDEX.tar.gz
v3.16.1-5-ge692d8f074 [https://dl-cdn.alpinelinux.org/alpine/v3.16/main]
v3.16.1-30-ge814620a52 [https://dl-cdn.alpinelinux.org/alpine/v3.16/community]
OK: 16880 distinct packages available
OK: 5 MiB in 14 packages
[container /]# apk add iproute2
(1/12) Installing libcap (2.64-r0)
(2/12) Installing libbz2 (1.0.8-r1)
(3/12) Installing fts (1.2.7-r1)
(4/12) Installing xz-libs (5.2.5-r1)
(5/12) Installing libelf (0.186-r0)
(6/12) Installing libmnl (1.0.5-r0)
(7/12) Installing iproute2-minimal (5.17.0-r0)
(8/12) Installing libnftnl (1.2.1-r0)
(9/12) Installing iptables (1.8.8-r1)
(10/12) Installing iproute2-tc (5.17.0-r0)
(11/12) Installing iproute2-ss (5.17.0-r0)
(12/12) Installing iproute2 (5.17.0-r0)
Executing iproute2-5.17.0-r0.post-install
Executing busybox-1.35.0-r15.trigger
OK: 10 MiB in 26 packages
[container /]# apk add can-utils
(1/1) Installing can-utils (2021.08.0-r0)
Executing busybox-1.35.0-r15.trigger
OK: 11 MiB in 27 packages
[container /]#
CAN通信設定
CANの通信設定をします。
以下は、CAN FD、転送速度 500kbps、データ転送速度1Mbpsに設定する例です。
設定ができたら、can0インターフェースを起動します。
[container /]# ip link set can0 type can bitrate 500000 dbitrate 1000000 fd on
[container /]# ip link set can0 up
[container /]# ip -details link show can0
2: can0: <NOARP,UP,LOWER_UP,ECHO> mtu 72 qdisc pfifo_fast state UP mode DEFAULT group default qlen 10
link/can promiscuity 0 minmtu 0 maxmtu 0
can <FD> state ERROR-ACTIVE (berr-counter tx 0 rx 0) restart-ms 0
bitrate 500000 sample-point 0.875
tq 25 prop-seg 37 phase-seg1 32 phase-seg2 10 sjw 1 brp 1
flexcan: tseg1 2..96 tseg2 2..32 sjw 1..16 brp 1..1024 brp_inc 1
dbitrate 1000000 dsample-point 0.750
dtq 50 dprop-seg 7 dphase-seg1 7 dphase-seg2 5 dsjw 1 dbrp 2
flexcan: dtseg1 2..39 dtseg2 2..8 dsjw 1..4 dbrp 1..1024 dbrp_inc 1
clock 40000000 numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535
CAN送受信
受信側のArmadillo-IoTゲートウェイ G4はcandumpを実行して、メッセージが受信できる状態にします。
[container /]# candump can0
送信側のArmadillo-IoTゲートウェイG4はcansendを実行して、メッセージを送信します。
CAN FDの例
CAN FDでID=123、データ=55を送信する例です。
[container /]# cansend can0 123##155
受信側は以下のような受信結果が得られます。
[container /]# can0 123 [01] 55
以下は、CAN FD通信時のオシロスコープとロジックアナライザの測定波形です。
データ部分が1Mbps、それ以外が500kbpsとなっているのが確認できます。
CANの例
CANでID=123、データ=55を送信する例です。
[container /]# cansend can0 123#55
受信側は以下のような受信結果が得られます。
[container /]# can0 123 [1] 55
以下は、CAN通信時のオシロスコープとロジックアナライザの測定波形です。
データ部分、それ以外もすべて500kbpsとなっているのが確認できます。