Raspberry piでCAN通信をする方法
使用機材
Amazonでも売っているこのCAN通信モジュールを使用して、2台のラズパイ間でCAN通信を行う方法についてのメモ
- Raspberry pi 4 & Raspberry pi zero W
- CANバスモジュールx2
- OS version(Raspi4): Linux raspberrypi 5.4.51-v7l+ #1325 SMP Mon Jul 13 13:47:17 BST 2020 armv7l GNU/Linux
- OS version(RaspiZero): Linux raspberrypi 4.19.118+ #1311 Mon Apr 27 14:16:15 BST 2020 armv6l GNU/Linux
配線
片側のラズパイの配線はこのようにした。もう片方も同じように配線し、CANHとCANLをそれぞれ接続する。また、終端抵抗用のジャンパーピンは接続しておく。
ラズパイでの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