raspberry pi でCAN通信 #２

Raspberry pi を使用して、CAN通信の治具を作りたいと思います。

第２回目　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)で自動車と通信(ソフト編)](http://make.bcde.jp/raspberry-pi/obd2can%E3%81%A7%E8%87%AA%E5%8B%95%E8%BB%8A%E3%81%A8%E9%80%9A%E4%BF%A1%E3%82%BD%E3%83%95%E3%83%88%E7%B7%A8/)
ここのリンクがとても参考になりました。

活用した箇所の抜粋

|内容　| 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でできますね・・・


```py
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306697/e8f148f4-8e78-e4e7-ab57-e0d8506295a2.jpeg)
ヒートシンクゴリゴリになってますが、左上が開発環境兼CAN通信ボードがボードに乗ったラズパイ４。
右下のボックスに収めているのがリファレンスにつかうArduino CAN治具。

それぞれのCANボードのH、Lを繋いで、
ラスバイ送信　→　Arduino受信（確認はIDEのシリアルモニター）
＜画像：Arduinoの受信シリアルモニタ＞
![2020-01-08-163841_974x371_scrot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306697/5949ddc8-b6af-de93-4d4b-01630e2c5819.png)

Arduino送信（IDEのシリアルモニタでCANの成立が確認可能）　→　ラズパイ受信（シェルコンソールにDump）
＜画像：Arduinoの送信シリアルモニタ＞
![2020-01-08-162411_974x371_scrot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306697/af604270-4161-13a0-a058-15d1c3005c83.png)

＜画像：ラズパイ側の受信Dump（Shellコンソール）＞
![2020-01-08-164059_1071x698_scrot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306697/7009e06b-15e2-a5b6-357f-71e4bd4aa3cf.png)

となる。

以上ここまで。

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