LinuxによるABH3とのCAN通信について
Linux系のOSによるCAN通信では、ハードウェア・メーカが独自に開発しているドライバソフトと、Volkswagen Research社がLinuxカーネルに提供しているオープンソースのCANドライバとネットワークスタックのセットがありますが、本稿では後者のソフトウェアであるSocketCANによるインストール手順について解説します。
SocketCANでは、複数のアプリケーションが1つのCANデバイスに同時にアクセスすることができ、また、1つのアプリケーションが複数のCANネットワークに並行してアクセスすることも可能です。SocketCANのコンセプトは、Linux系OSにあるインターネット・プロトコルへのアクセス用APIであるのバークレー・ソケットAPIを拡張したものになっています。そのため、CANバスとの通信は、ソケットを用い、インターネット・プロトコルのプログラミングと同様に行います。
CANインターフェースが正常に認識されると、ifconfig命令やip命令により以下のようにイーサネットポートと同様に確認を行う事ができます。
ifconfigの例(can0がCANインターフェース)
❘ can0: flags=193<UP,RUNNING,NOARP> mtu 16
❘ unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 txqueuelen 10 (不明なネット)
❘ RX packets 0 bytes 0 (0.0 B)
❘ RX errors 0 dropped 0 overruns 0 frame 0
❘ TX packets 0 bytes 0 (0.0 B)
❘ TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
❘ eno1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
❘ inet 192.168.xx.xxx netmask 255.255.255.0 broadcast 192.168.xx.xxx
❘ inet6 xxxx::xxxx:xxxx:xxxx:xxxx prefixlen 64 scopeid 0x20<link>
❘ ether xx:xx:xx:xx:xx:xx txqueuelen 1000 (イーサネット)
❘ RX packets 11397 bytes 13943551 (13.9 MB)
❘ RX errors 0 dropped 5 overruns 0 frame 0
❘ TX packets 6351 bytes 517830 (517.8 KB)
❘ TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
❘ device interrupt 20 memory 0xf7c00000-f7c20000
❘ lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
❘ inet 127.0.0.1 netmask 255.0.0.0
❘ inet6 ::1 prefixlen 128 scopeid 0x10<host>
❘ loop txqueuelen 1000 (ローカルループバック)
❘ RX packets 410 bytes 39194 (39.1 KB)
❘ RX errors 0 dropped 0 overruns 0 frame 0
❘ TX packets 410 bytes 39194 (39.1 KB)
❘ TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
※ SocketCANの対応については、各メーカのCANインターフェース仕様を参照ください。
SocketCANドライバを使用し、CAN-Bus通信に対し送信・受信等の動作確認を行うための便利なオープンソースのユーティリティ・ソフトウェアとしてcan-utilsがあります。このソフトウェアは以下のGitHubよりダウンロード(あるいはクローン)し、コンパイルすることで使用できます。
https://github.com/linux-can/can-utils
https://github.com/linux-can/can-utils.git
弊社では、ABH3とのCAN通信用サンプルソフトを用意していますが、上記SocketCANドライバを使用したものになっており、can-utilsの一部ソースを使用しています。ソフトウェアは弊社ホームページ、あるいは以下のGitHubよりダウンロードできます。
https://github.com/wacogiken/abh3_CAN-Bus_Linux
https://github.com/wacogiken/abh3_CAN-Bus_Linux.git
ダウンロードしたフォルダに、can-utilsから以下の2個のファイルと1個のフォルダをコピーしてコンパイルしてください。
lib.c / lib.h / include(フォルダ以下全て)
インストール例(太字はコマンド)
❘ $ git clone https://github.com/linux-can/can-utils.git
❘ Cloning into ‘can-utils’…
❘ remote: Enumerating objects: 2768, done.
❘ remote: Counting objects: 100% (121/121), done.
❘ remote: Compressing objects: 100% (79/79), done.
❘ remote: Total 2768 (delta 56), reused 83 (delta 40), pack-reused 2647
❘ Receiving objects: 100% (2768/2768), 864.64 KiB | 5.73 MiB/s, done.
❘ Resolving deltas: 100% (1774/1774), done.
❘ $ cd can-utils/
❘ $ make
❘ cc -O2 -Wall -Wno-parentheses -Iinclude -DAF_CAN=PF_CAN -DPF_CAN=29 -DSO_RXQ_OVFL=40 -DSCM_TIMESTAMPING_OPT_STATS=54 -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE cangw.c -o cangw
❘
❘ (中略)
❘
❘ $ sudo make install
❘ [sudo] xxx のパスワード:
❘ mkdir -p /usr/local/bin
❘ cp -f cangw isotpdump isotpperf isotprecv isotpsend isotpserver isotpsniffer isotptun j1939acd j1939cat j1939spy j1939sr testj1939 slcan_attach slcand asc2log bcmserver can-calc-bit-timing canbusload candump canfdtest cangen cansequence canlogserver canplayer cansend cansniffer log2asc log2long mcp251xfd-dump slcanpty /usr/local/bin
❘ $ cd ..
❘
❘ (中略)
❘
❘ $ git clone https://github.com/wacogiken/abh3_CAN-Bus_Linux.git
❘ Cloning into ‘abh3_CAN-Bus_Linux’…
❘ remote: Enumerating objects: 58, done.
❘ remote: Counting objects: 100% (58/58), done.
❘ remote: Compressing objects: 100% (41/41), done.
❘ remote: Total 58 (delta 24), reused 48 (delta 16), pack-reused 0
❘ Unpacking objects: 100% (58/58), 4.85 MiB | 5.66 MiB/s, done.
❘ $ cd abh3_CAN-Bus_Linux/
❘ $ cp ../can-utils/lib.* .
❘ $ cp -R ../can-utils/include .
❘ $ make
❘ cc -Wl,–no-as-needed -Iinclude -Wno-psabi -c -o canABH3.o canABH3.c
❘ cc -Wl,–no-as-needed -Iinclude -Wno-psabi -lm single_canABH3.c canABH3.o lib.o -o single_canABH3
❘ cc -Wl,–no-as-needed -Iinclude -Wno-psabi -lm bcast_canABH3.c canABH3.o lib.o -o bcast_canABH3
❘ g++ -c -o canABH3++.o canABH3++.cpp
❘ g++ -lm single_canABH3++.cpp canABH3++.o canABH3.o lib.o -o single_canABH3++
❘ g++ -lm bcast_canABH3++.cpp canABH3++.o canABH3.o lib.o -o bcast_canABH3++
以上で、can-utilsとサンプルソフトのインストールは終わりです。
サンプルソフトではラズベリーパイ財団のRaspberryPi、および、エヌビディア社のJetson Xavier NXで実行確認していますが、前述したSocketCANドライバおよびcan-utilsがコンパイル可能であれば同様に接続できると考えます。
今回はここまで
次回、ABH3をCANで動かそう!③
『PC、ラズパイとWiresharkによるCAN通信のパケット解析』