Raspberry pi を使用して、CAN通信の治具を作りたいと思います。
第2回目 Intrduction
#Raspberry piのCAN準備
raspberry pi(rasbian)ではCAN通信をOSでサポートしてくれるので、通信しながらいろいろやるという、マルチタスクなことができます。
そのためにはまず、raspbianの設定を行います。
参考:RS485-CAN-HATのUser MANUAL https://www.waveshare.com/w/upload/2/29/RS485-CAN-HAT-user-manuakl-en.pdf
##ラズパイのコンフィグ
$ sudo raspi-config
でコンフィグツールが立ち上がるので、
5 Interfacing Options
を選択し、
P4 SPI
を選んでkernel moludeをEnableにします。
##ライブラリのインストール
$ sudo apt-get install python-pip
$ sudo pip install python-can
これでライブラリインストール完了
##次にライブラリを有効にするために
$ sudo nano /boot/config.txt
で設定ファイルを編集します。
最終行に
dtparam=spi=on
dtoverlay=mcp2515-can0,oscillator=12000000,interrupt=25,spimaxfrequency=1000000
を追加して保存。
注意点として、この中のoscillatorはRS485-CAN-HATのボード上に実装されている水晶の周波数を入れます。
今回は12MHz。(どういうわけか出回っているものが8〜16MHzまでマチマチ。)
$ sudo reboot
でOSを再起動すると有効になります。
##ライブラリチェック
コンソールshellを立ち上げ、
$ dmesg
または
$ dmesg | grep -i '\(can\|spi\)'
で
[ *.******]CAN device driver interface
[ *.******]mcp251x spi0.0 can0: MCP2515 sucessfully initialized.
があればOK
逆に
mcp251x spi0.0: Cannot initialize MCP2515. Wrong wring?
や
mcp251x spi0.0: Probe failed. err=**
などがあればうまくインストールできていないので見直す。
##CANユーティリティのインストール
can-utils
https://github.com/linux-can/can-utils
から一式ダウンロードし、展開し、コンパイルしてインストール。
$ ./autogen.sh
$ ./configure
$ make
$ sudo make install
参考サイト
https://qiita.com/suzutsuki0220/items/8642b1c3ea51859a95ad
##サンプルコード
サンプルコードはボード提供のサイト
https://www.waveshare.com/wiki/RS485_CAN_HAT
から、Demo codeをダウンロードして実行する。
###送信テスト
送信テストはコードを使わなくても、
$ sudo ip link set can0 up type can bitrate 500000
(bitrateはこのあと接続するArduinoボードと同じ500kBps)
でCANモジュールをOpenにして、
$ sudo cansend vcan0 123#1122334455667788
(cansendのフォーマットは <device> <can_frame>)
(can_frameのフォーマットは <ID>#<DATA(byte)>)
で送信可能。
参考URL:OBD2(CAN)で自動車と通信(ソフト編)
ここのリンクがとても参考になりました。
活用した箇所の抜粋
内容 | command |
---|---|
CAN通信設定 | sudo ip link set can0 type can bitrate 500000 |
CANモジュール無効 | sudo ifconfig can0 down |
CANモジュール有効 | sudo ifconfig can0 up |
CAN Dump | candump can0 |
通信設定は一旦downしてからでないとできないようです。 |
###受信コード
例のごとく、サンプルコードを少しカスタマイズしてDumpするようにする。
このあとのアプリケーション作成にむけpythonコード使うべくカスタマイズしましたが、Dumpは上に記載しているcandump can0でできますね・・・
import os
import can
os.system('sudo ip link set can0 type can bitrate 500000')
os.system('sudo ifconfig can0 up')
can0 = can.interface.Bus(channel = 'can0', bustype = 'socketcan_ctypes')# socketcan_native
#original dump
while 1:
msg = can0.recv(10.0) #タイムアウト時間
print (msg)
if msg is None:
print('Time out')
##送受信確認
<画像:各ボードの接続>
ヒートシンクゴリゴリになってますが、左上が開発環境兼CAN通信ボードがボードに乗ったラズパイ4。
右下のボックスに収めているのがリファレンスにつかうArduino CAN治具。
それぞれのCANボードのH、Lを繋いで、
ラスバイ送信 → Arduino受信(確認はIDEのシリアルモニター)
<画像:Arduinoの受信シリアルモニタ>
Arduino送信(IDEのシリアルモニタでCANの成立が確認可能) → ラズパイ受信(シェルコンソールにDump)
<画像:Arduinoの送信シリアルモニタ>
となる。
以上ここまで。
次回予定は、GUIアプリ計画