CAN通信

ESP8266でCANを使う


Arduino-UNOやArduino-DUEでCAN通信ができるようになりました。
そこで、CAN-BUSにESP8266を追加してみました。
使用したのはArduino-UNOの時に使ったCAN通信モジュールです。

このモジュールはトランシーバにTJA1050を使っているので、5V専用ですが、
ESP8266のGPIOは5Vトレラントなので、そのまま使うことができます。
J1ピンをショートすると終端抵抗(120Ω)が有効になります。


使用したライブラリはこちらの ライブラリで、ESP8266との接続は以下の通りです。
素のESP8266では5Vを供給できないので、別の電源から供給する必要が有ります。
CANモジュール ESP8266
INT
GPIO5
SCK
GPIO14
SI
GPIO13
SO
GPIO12
CS
GPIO4
GND
GND
VCC
5V

ライブラリに付属するCAN_recvは、 以下の部分を変更するだけで問題なく動きます。
//#define CAN0_INT 2                              // Set INT to pin 2
//MCP_CAN CAN0(10);                               // Set CS to pin 10
#define CAN0_INT 5                                // Set INT to pin 5 (D1 on WeMos)
MCP_CAN CAN0(4);                                // Set CS to pin 4 (D2 on WeMos)

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



ライブラリに付属するCAN_sendは、 以下の部分を変更するだけで問題なく動きます。
//MCP_CAN CAN0(10);                               // Set CS to pin 10
MCP_CAN CAN0(4);                                // Set CS to pin 4 (D2 on WeMos)

このライブラリは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モジュールのトランシーバーチップを5V仕様のTJA1050から、3.3V仕様のSN65HVD230に換装しました。
MCP2515は2.7〜5.5Vで使えるので、これで5Vを提供できない環境でも、3.3V給電で使えるようになります。


続く...