●CAN通信をしてみる

ArduinoとCAN通信モジュールを2個使って2台でCAN通信をしてみます。
使ったモジュールはこちらの物です。 KKHMF MCP2515 CAN バス モジュール

モジュール自体の接続にはSPIが使われているようで、次のようにArduinoと接続しました。

CANモジュールのINT→ 使用しない
CANモジュールのSCK→ デジタルピン13 (SCLK)
CANモジュールのSI → デジタルピン11 (MOSI)
CANモジュールのSO → デジタルピン12 (MISO)
CANモジュールのCS → デジタルピンD10 (SS) もしくはお好きなデジタルピン

後は、GNDはGNDと接続し、VCCは5Vと接続します。

モジュールとモジュールを通信するために2台のモジュール間の、LとLHとHを接続します。
机の上で行うような近距離ならばなくても通信できると思いますが、2台のみで通信するためにはモジュールの終端抵抗を有効にしたほうが良いので 両方の個々のモジュールの J1 のジャンパを短絡させます。


2台のArduinoにモジュールを接続するとこのようになりました。


▼ライブラリの準備

MCP_CAN Libraryを使用したいと思います。
https://github.com/coryjfowler/MCP_CAN_lib

まずMCP_CAN Libraryのホームページを開きます。


次に画面上の緑色のボタンを押して、Download ZIPを選択してファイルをダウンロードします。


ファイルがダウンロードされたら、ファイルを開いて、パソコンの ( ドキュメント → Arduino → libraries ) にコピーします。


このフォルダの中には色々なサンプルも含まれていますので、参考になると思います。
Arduino IDEを開いているなら閉じてもう一度開くとライブラリの準備が完了です。


▼CAN通信で送信するプログラム

送信側とするArduinoに次のプログラムを書き込みます。
1秒に1回づつ情報を送信しています。

#include <mcp_can.h>
#include <SPI.h>

MCP_CAN CAN(10);

void setup()
{
  Serial.begin(9600);
  if (CAN.begin(MCP_ANY, CAN_250KBPS, MCP_8MHZ) == CAN_OK) {
    CAN.setMode(MCP_NORMAL);
  } else {
    Serial.println("Can init fail");
  }
}

void loop()
{
  static byte buf[] = {0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F};
  CAN.sendMsgBuf(0x02, 0, 8, buf);//ID:0x02, 標準フレーム:0, データ長:8
  delay(1000);
}


▼CAN通信を受信するプログラム

受信側とするArduinoに次のプログラムを書き込みます。

#include <mcp_can.h>
#include <SPI.h>

MCP_CAN CAN(10);

void setup()
{
  Serial.begin(9800);
  if (CAN.begin(MCP_ANY, CAN_250KBPS, MCP_8MHZ) == CAN_OK) {
    CAN.setMode(MCP_NORMAL);
  } else {
    Serial.println("Can init fail");
  }
}

void loop() {
  unsigned long id;
  byte len;
  byte buf[8];

  if (CAN.checkReceive() == CAN_MSGAVAIL) {
    CAN.readMsgBuf(&id, &len, buf);
    Serial.print("ID:");
    Serial.print(id);
    Serial.print(" DATA");
    for (byte i = 0; i < len; i++) {
      Serial.print(":");
      Serial.print(buf[i], HEX);
    }
    Serial.println();
  }
}

送信側を動作させた状態で、受信側のArduino IDEのシリアルモニタを開くと、受信した値が表示されます。



▲トップページ > マイコンなど