LoginSignup
11
12

More than 3 years have passed since last update.

raspberry pi でCAN通信 #2

Last updated at Posted at 2020-06-23

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')

送受信確認

<画像:各ボードの接続>
IMG_20200108_161239.jpg
ヒートシンクゴリゴリになってますが、左上が開発環境兼CAN通信ボードがボードに乗ったラズパイ4。
右下のボックスに収めているのがリファレンスにつかうArduino CAN治具。

それぞれのCANボードのH、Lを繋いで、
ラスバイ送信 → Arduino受信(確認はIDEのシリアルモニター)
<画像:Arduinoの受信シリアルモニタ>
2020-01-08-163841_974x371_scrot.png

Arduino送信(IDEのシリアルモニタでCANの成立が確認可能) → ラズパイ受信(シェルコンソールにDump)
<画像:Arduinoの送信シリアルモニタ>
2020-01-08-162411_974x371_scrot.png

<画像:ラズパイ側の受信Dump(Shellコンソール)>
2020-01-08-164059_1071x698_scrot.png

となる。

以上ここまで。

次回予定は、GUIアプリ計画

11
12
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
12