Raspberry piでCAN通信をする方法

使用機材

Amazonでも売っているこのCAN通信モジュールを使用して、2台のラズパイ間でCAN通信を行う方法についてのメモ

www.amazon.co.jp

配線

片側のラズパイの配線はこのようにした。もう片方も同じように配線し、CANHとCANLをそれぞれ接続する。また、終端抵抗用のジャンパーピンは接続しておく。

f:id:takchs:20210124133953p:plain
スケマ図

ラズパイでのCAN通信セットアップ

主にこちらの記事を参考にソフトウェアとしてのCAN通信のセットアップを行った。他の記事やブログなども参考にしたが、おそらくラズパイのOSのバージョンによって設定すべき内容が異なるためだいぶハマった、、、 https://tech.aptpod.co.jp/entry/2019/12/24/070000#fnref:2 以下の設定を両方のラズパイで行う。

can-utilsのインストール

sudo apt-get install can-utils

CAN Interface有効化

/boot/config.txtに以下の設定を追記する。ここでは、使用しているCANモジュールのOscillatorの周波数が8MHzのためとりあえずそれに合わせた設定にしているが、適切な設定方法は未調査。

# Enable MCP2515 
dtoverlay=spi-bcm2835 
dtoverlay=mcp2515-can0,oscillator=8000000,interrupt=25 
dtoverlay=spi-dma

ラズパイを再起動後に以下のようにcan0インターフェースが見えるか確認する。

$ ip link
4: can0: <NOARP,UP,LOWER_UP,ECHO> mtu 16 qdisc pfifo_fast state UP mode DEFAULT group default qlen 10 
    link/can

SocketCAN interfaceの設定

$ ip link set can0 type can bitrate 500000
$ ip link set can0 up
$ ifconfig
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

~/.bash_profileなどに以下の行を追記しておけば、起動時に毎回設定しなくて済む。

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

通信テスト

受信側のラズパイRxから送信側のラズパイTxにメッセージを送ってみる。 まず、受信側のラズパイRxで以下のコマンドを実行し、CANのメッセージを待ち受ける。

$ candump can0

次に送信側のラズパイTxでCANメッセージを送信する。

$ cansend can0 123#0123456789abcdef

成功すればラズパイRxで以下のように受信できる。

can0  123   [8]  01 23 45 67 89 AB CD EF

疑問

今回使用したCANモジュールはCAN TransceiverにTJA1051を使用しているが、このICはVCCが5Vである。しかし、今回はラズパイの3.3V電源を使用して、普通に動作しているようである。 - TJA1051 High-speed CAN transceiver

参考リンク