Howto

Armadillo-IoT ゲートウェイ G4 で CAN 通信する方法

Armadillo-IoTゲートウェイ G4はCANコントローラを内蔵しており、CANトランシーバを追加することで、CAN通信することができます。

本Howtoでは、Armadillo-IoTゲートウェイ G4においてCAN通信する方法を紹介します。

必要なもの

本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

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-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となっているのが確認できます。