【RaspberryPi】 RaspberryPiとArduinoをCAN通信させた

RaspberryPiとArduinoをCAN通信させたいと思いやってみた。
ので、とりあえずメモ。

CANとは

Controller Area Networkの略で
主に自動車で使用されている通信規格。

Controller Area Network - Wikipedia

準備

  • RaspberryPi2
  • Arduino Uno
  • Rasbee オリジナル MCP2515 CAN バス モジュール TJA1050 レシーバーSPIモジュール Arduinoのための AVR (2個)

f:id:Yoshichi:20170831232852j:plain

MCP2515 TJA1050

本来は、MCP2551、MCP2515を単品買いたいところだったのですが
MCP2551がAmazonや秋月になかったので
諦めてMCP2551ではありませんがMCP2515がくっ付いていて
セットになっているものを買いました。
(安いです。。。)

CANコントローラのMCP2515は、3V,5Vどちらでも動作可能ですが
CANトランシーバのTJA1050は、5Vで動作します。
また、RaspberryPiのGPIO端子は3Vであるため
5Vを突っ込んでも動作しないか壊す可能性があります。
そのため、RaspberryPiで使用するCANモジュールでは
MCP2515のVCCを3Vにして、他の部品は電圧5Vで動作するようにします。
f:id:Yoshichi:20170905000423j:plain

写真では見にくいですが、MCP2515のVCCは基盤に触れないよう切ってあります。
で、ジャンパワイヤーで3Vの電圧をかけています。

Arduinoで使用する方はそのままでOK。

参考

こちらの方を参考にしました。
Raspberry Pi CAN通信 (MCP2515 TJA1050 CAN Bus Module) - Qiita

また基盤の裏を改造するのも手のようだ。。。
[quick-guide] CAN bus on raspberry pi with MCP2515

RaspberryPi側の設定

SPIの設定

SPIを使用して、通信をやりとりするためSPIを有効にします。

$ raspi-config

SPIを有効にする。

/boot/config.txt

# Added for SPI-mcp2515
dtparam=spi=on
dtoverlay=spi-bcm2835-overlay
dtoverlay=mcp2515-can0-overlay,oscillator=1600000,interrupt=25

に設定して再起動。

CAN通信確認用ソフトのインストール

CAN Utils

$ sudo apt-get install autoconf git libtool
$ git clone https://github.com/linux-can/can-utils.git
$ cd can-utils
$ ./autogen.sh
$ ./configure
$ make
$ sudo make install

確認方法などは下記がとても参考なる。
OBD2(CAN)で自動車と通信(ソフト編) | Make.

補足

oscillatorは発振子の周波数を設定するっぽい。
今回買った、CAN バス モジュールについてる発振子の周波数は8MHZなので
最初、8MHZ設定してみたんだけどArduino側でCAN送信する際に、
16MHZ設定しないと送信できなかったため16MHZ設定。
なぜ8MHZで通信できなくて、16MHZなら可能なのかわからない。
この辺勉強不足orz

Arduino側の設定

ライブラリのインストール

mcp_can.hをインストール
※ライブラリにコピーすればよい。

CAN バス モジュールとの接続

INT - Pin2
SCK - Pin13
Si - Pin11
So - Pin12
Cs - Pin10
GND - GND
VCC - 5V

送信コードは
exampleに入っている"CAN_send.ino"を書き込む。
ちなみに、内容は
CAN0.begin(MCP_ANY, CAN_500KBPS, MCP_16MHZ)はそのままで
ID123の8バイトデータ
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
を送信しているだけです。

実行

RaspberryPiで

$ sudo ip link set can0 type can bitrate 500000
$ candump can0

Arduinoに電源投入する。

f:id:Yoshichi:20170901024537j:plain

無事に、Arduinoから送信したデータを
RaspberryPi上で受信することができました。

f:id:Yoshichi:20170905013403j:plain

次やりたいこと