Linux で CAN通信するために EDGEPLANT CAN-USB Interface を利用する

f:id:aptpod_tech-writer:20210617183534j:plain

はじめに

こんにちは、ハードウェア/OT 製品開発グループ1 でソフトウェア開発を担当している矢部です。

aptpod では以前より、CAN-USB Interface という自社開発製品を取り扱っています。こちらは車載機器の通信規格であるCAN2 データの送受信に対応したものになりますが、今までは aptpod,Inc intdash Appliances に付属する形としてのみ提供していました。

今後は幅広いお客様にお使いいただけるよう、様々な対応を予定しています。その一つが、オープンソースのCANドライバである Socket CAN3 への対応です。これにより、Linux マシン上で簡単に CAN データを取り扱うことができるようになります4。aptpod で開発した EDGEPLANT T1 もその中に含まれていますので、今回はそちらでの利用方法をご紹介します。

これまでの使われ方

前述の通り、これまでは aptpod,Inc intdash Appliances という形で何らかの車載ターミナルとともに提供していました。これらの車載ターミナルには Yocto5 ベースのOSを搭載しており、CAN-USB Interface用のドライバや intdash Edge などが標準で組み込まれています。

こちらを用いたCANデータの可視化については、この記事などをご覧ください。 tech.aptpod.co.jp

EDGEPLANT T1 でCANデータを見る

続いて、EDGEPLANT T1 上で CAN-USB Interface を利用する方法についてご紹介します。 EDGEPLANT T1 は Ubuntu 18.04 ベースのOSで動作しているため、その他PCなどで Ubuntu がインストールできる環境であれば同様の手順で利用可能です。

CAN-USB Interface を準備する

EDGEPLANT T1 上で CAN-USB Interface を利用するための事前準備を説明します。

ドライバをインストールする

CAN-USB Interface を利用するためには、専用のドライバのインストールが必要になります。CAN-USB Interface のページで公開予定のドライバをダウンロードして、インストールしてください。

この記事を作成した時点では、上記ドライバは公開されていません。公開は 2021年10月を予定しています。

インターフェースを確認する

CAN-USB Interface はインターフェースが2つあるため、接続すると can0can1 として見えます。

$ ip link show type can
7: can0: <NOARP,ECHO> mtu 16 qdisc noop state DOWN mode DEFAULT group default qlen 10
    link/can 
8: can1: <NOARP,ECHO> mtu 16 qdisc noop state DOWN mode DEFAULT group default qlen 10
    link/can 
CAN の設定を行う

CANのビットレートを 500kbps に設定する場合、以下のように行います。

$ sudo ip link set can0 type can bitrate 500000
$ sudo ip link set can0 up

up することで ifconfig でも確認できるようになります。

$ ifconfig can0
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  (UNSPEC)
        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

can-utils を利用する

EDGEPLANT T1 にはデフォルトで can-utils がインストールされているため、これを使用してCANデータを見ることが出来ます。

CAN-USB Interface は使用していないですが、Raspberry Pi 上で can-utils を利用した記事もありますので、興味のある方はご覧ください。 tech.aptpod.co.jp

CANデータを受信する

candump コマンドで受信したCANデータを見ることができます。

$ candump can0
  can0  000   [8]  00 00 00 00 00 00 00 01
  can0  000   [8]  00 00 00 00 00 00 00 02
  can0  000   [8]  00 00 00 00 00 00 00 03
  can0  000   [8]  00 00 00 00 00 00 00 04
  can0  000   [8]  00 00 00 00 00 00 00 05
  can0  000   [8]  00 00 00 00 00 00 00 06
CANデータを送信する

cansend コマンドでCANデータを送信することができます。例として、can0can1 を接続して、データをループバックさせてみます。

can1 も 500kbps で設定して立ち上げます。

$ sudo ip link set can1 type can bitrate 500000
$ sudo ip link set can1 up

can0 からCANパケットを送信して、candump を実行した can1 でデータを受信することを確認できました。

$ candump can1 &
$ cansend can0 001#11.22.33.44.55.66.77.88
$   can1  001   [8]  11 22 33 44 55 66 77 88  // can1 の受信データ

SavvyCAN を利用する

Socket CANに対応した製品は有償無償含め多数存在していますが、ここではオープンソースの Savvy CAN を利用します。EDGEPLANT T1 は ARM アーキテクチャ の Jetson TX2 モジュールで動作していますが、Savvy CANのARM用イメージは配布されていません。自前でビルド、インストールする必要があります。

事前準備

ビルドには、Qt5 と Qt Serial Bus が必要になるので、それらをまずインストールします。

  • Qt5 のインストール
$ sudo apt install qt5-default qtdeclarative5-dev libqt5serialport5-dev qttools5-dev -y
  • Qt Serial Bus のビルド、インストール
# Overkill: get all qt-stuff
$ sudo apt install qml-module-qt-labs-folderlistmodel qml-module-qtquick-extras qml-module-qtquick-controls2 qt5-default libqt5quickcontrols2-5 qtquickcontrols2-5-dev qtcreator qtcreator-doc libqt5serialport5-dev build-essential qml-module-qt3d qt3d5-dev qtdeclarative5-dev qtconnectivity5-dev qtmultimedia5-dev
# To get rid of the private/qobject_p.h error
$ sudo apt-get install qtbase5-private-dev
# Build and install qtserialbus
$ cd <work dir>
$ git clone git://code.qt.io/qt/qtserialbus.git
$ cd qtserialbus
$ git checkout 5.9.8
$ qmake
$ make -j6
$ sudo make install

Use qt serialbus in ubuntu 18.04 with qt 5.9 · GitHub

SavvyCAN をビルドする

SavvyCAN の 1.0.20 以降は Qt5.10(QRandomGenerator) に依存していますが、L4Tのデフォルトは Qt5.9 になっており、動作できません。 そのため、1.0.20 より前のバージョンを使う必要があります。ここでは V199.1 を使ってビルドします。

$ cd <work dir>
$ git clone -b V199.1 https://github.com/collin80/SavvyCAN.git
$ cd SavvyCAN
$ qmake
$ make -j6
SavvyCAN でデータを見る

ビルドした SavvyCAN を立ち上げます。

$ ./SavvyCAN

f:id:aptpod_tech-writer:20210609152705p:plain

ツールバーの Conecction → Open Connection Windowを選択します。

f:id:aptpod_tech-writer:20210609152740p:plain

Add New Device Connection-> QT SerialBus Device-> socketcan → can* を設定します。

f:id:aptpod_tech-writer:20210609152752p:plain

CANフレームを受信することが出来ました。

f:id:aptpod_tech-writer:20210609152801p:plain

Python で実装する

これだけではただのツール紹介なので、Pythonを用いてCANデータを扱う方法を簡単にご紹介します。

python-can をインストールする

python-can というライブラリが公開されており、こちらを利用すると簡単に実装することが出来ます。

$ sudo apt install python3-pip
$ pip3 install python-can
CANデータを送受信する

can-utils の例と同じく、can0can1 を接続して、データをループバックさせてみます。

import asyncio
import can


def print_message(msg):
    print(msg)


async def main():
    can0 = can.interface.Bus(bustype="socketcan", channel="can0", bitrate=500000)
    can1 = can.interface.Bus(bustype="socketcan", channel="can1", bitrate=500000)

    listeners = [
        print_message,  # Callback function
    ]

    # Create Notifier with an explicit loop to use for scheduling of callbacks
    loop = asyncio.get_event_loop()
    notifier = can.Notifier(can1, listeners, loop=loop)

    # Send messages
    for id in range(10):
        msg = can.Message(arbitration_id=id, data=[id, 0, 0, 0, 0, 0, 0, 0])
        await asyncio.sleep(0.5)
        can0.send(msg)

    notifier.stop()
    can0.shutdown()
    can1.shutdown()


loop = asyncio.get_event_loop()
loop.run_until_complete(main())
loop.close()

このコードを実行すると、以下のように can1 でデータが受信できます。

$ sudo python3 loopback_test.py
Timestamp: 1623221566.564898    ID: 00000000    X                DLC:  8    00 00 00 00 00 00 00 00     Channel: can1
Timestamp: 1623221567.066872    ID: 00000001    X                DLC:  8    01 00 00 00 00 00 00 00     Channel: can1
Timestamp: 1623221567.570862    ID: 00000002    X                DLC:  8    02 00 00 00 00 00 00 00     Channel: can1
Timestamp: 1623221568.072851    ID: 00000003    X                DLC:  8    03 00 00 00 00 00 00 00     Channel: can1
Timestamp: 1623221568.574905    ID: 00000004    X                DLC:  8    04 00 00 00 00 00 00 00     Channel: can1
Timestamp: 1623221569.078850    ID: 00000005    X                DLC:  8    05 00 00 00 00 00 00 00     Channel: can1
Timestamp: 1623221569.580852    ID: 00000006    X                DLC:  8    06 00 00 00 00 00 00 00     Channel: can1
Timestamp: 1623221570.082847    ID: 00000007    X                DLC:  8    07 00 00 00 00 00 00 00     Channel: can1
Timestamp: 1623221570.584880    ID: 00000008    X                DLC:  8    08 00 00 00 00 00 00 00     Channel: can1

おわりに

今回は CAN-USB Interface の紹介になりましたが、aptpodではその他にもアナログデータを扱うことができる ANALOG-USB Interface の販売を予定しています。また、自社以外の製品での計測事例も多数ありますので、ご興味のある方はこちらまでご連絡ください。


  1. OT : Operational Technology の略。ハードウェアおよび組込みソフトの製品開発をミッションとするグループ

  2. Controller Area Network の略。 https://ja.wikipedia.org/wiki/Controller_Area_Network

  3. https://en.wikipedia.org/wiki/SocketCAN

  4. 2021/06 時点では、CAN-USB Interface用のドライバは一般公開されていませんが、順次公開する予定になっています。

  5. Linuxをベースとして独自にカスタマイズしたシステムを構成できるもの。 Yocto Project – It's not an embedded Linux distribution – it creates a custom one for you