CAN通信

Arduino-UNOでCANを使う


Raspberry PiとOrangePi PCでCAN通信ができるようになりました。(インストールはこちら)
そこで、CAN-BUSにArduino-UNOを追加してみました。
この様なCAN通信モジュールが安価($2以下)に入手できます。
J1ピンをショートすると終端抵抗(R2=120Ω)が有効になります。
J2コネクターとJ3コネクターは並列で、どちらにもCAN-BUSを接続することができます。


回路はこのように簡単なものなので、部品が有れば自作することもできますが、自作するよりも買った方が安いです。


このモジュールに使われているCANトランシーバー(TJA1050)は5V専用なので、
Raspberryなど、3.3V系のマシンでは(そのままでは)使うことができません。
3.3V系のマシンで使うためには、こ ちらで紹介されているように基盤の細工が必要になりますが、
基盤を細工するよりも、TJA1050を3.3V駆動が可能なSN65HVD23xに変更して、ブレッドボード上で組んだ方が安定して 動きます。

CANトランシーバーとしてMCP2551がよく使われます。
MCP2551(CAN Transceiver)とMCP2515(CAN Controller)は同時に使われることが多いICですが、滅茶苦茶紛らわしいです。

AmazonなどでTJA1050をCAN Controllerとして売っている場合が有りますが、全くの間違いです。
容易に入手できるCAN ControlleはMCP2515ぐらいしか見当たりません。



Arduino-UNOとの接続、ライブラリのインストールはこちらを 参考にしています。

exampleに送信(CAN_send)、受信(CAN_receive)が有ります。
今回、入手したモジュールは8MHzのクリスタルが実装されていました。
以下の部分で転送速度を指定しますが、同時にクリスタルの周波数を合わせる必要が有ります。
  // Initialize MCP2515 running at 8MHz with a baudrate of 500kb/s and the masks and filters disabled.
  if(CAN0.begin(MCP_ANY, CAN_500KBPS, MCP_8MHZ) == CAN_OK)

RaspberryPiから送信した8バイトを受けとれました。




このライブラリはCAN 2.0B(CAN拡張フレーム)に対応しています。
CAN標準フレームでのCAN-IDは11Bit(0から7FF)ですが、CAN拡張フレームではCAN-IDが29Bit(0から 1FFFFFFF)に拡張されています。
以下の様にするとCAN標準フレームと、CAN拡張フレームを交互に送信します。
  byte sndStat;
  if ( (header % 2) == 0 ) {
    sndStat = CAN0.sendMsgBuf(0x123, 0, 8, data);
  } else {
    sndStat = CAN0.sendMsgBuf(0x12345678, 1, 8, data);
  }

CAN拡張フレームの受信も正しく動きます。




CANモジュールをいくつか買い増ししました。
以下の2つ、同じ製品に見えますが左の製品は正しく動きませんでした。
どちらもMCP2515+TJA1050で、クリスタルも8MHzの製品です。
終端抵抗はどちらも120Ωが実装されていますが、C1の形状が明らかに違っています。
良く分からないので左の製品は捨てました。




こ ちらにCANフレームをモニターするためのWindowsアプリケーションが公開されています。


そもそも、このアプリケーションはこちらのモジュールのために設計・公開されています。


上の製品はSTM32F103を使っていますが、Windowsアプリが送信するUSB通信データを調べたら、
Arduinoで作れそうだったので、こちらで 公開しています。

続く...