可変ブログ

色々メモとか。とりあえず自分が分かるように。その後、なるべく人が見て分かるように。可変。

MCP2515を使ってArduinoでCAN通信

MCP2515のモジュールを使ってArduinoでCAN通信をさせる。
ライブラリはMPC_CAN_libを使う。
スケッチの書き方は、MPC_CANのgithubのサンプルプログラムとヘッダを見るとわかりやすい。




・ハマったところ1
MCP_CAN::begin() が変更されてて、引数にいろいろ指定しなければいけなくなっていた。
何を指定しなければいけないかはサンプルプログラムとヘッダを見て判断した。
第1引数:IDの種類
第2引数:canの通信速度
第3引数:モジュールとの通信レート(今回の場合はモジュールの水晶発振子の周波数)


・ハマったところ2
MCP_CAN::setMode() が抜けてた



簡単なArduinoスケッチ
実際に受信に関しては、モジュールの割り込み用ピンをArduinoの外部割込みに割り当てて、
割り込み処理したほうがいいと思う。

// ライブラリヘッダのインクルード
#include <mcp_can.h>
#include <SPI.h>
 
//設定値
#define CS_PIN  (10) // CSを10ピンとする(変更可能)
#define INT_PIN (9)  // INTを9ピンとする(変更可能)
 
long unsigned int rxId;
unsigned char len = 0;
unsigned char rxBuf[8];

MCP_CAN CAN0(CS_PIN);      
 
void setup() {
    Serial.begin(115200);
    CAN0.begin(CAN_STDID, CAN_500KBPS, MCP_8MHZ); // CANの通信速度を500kbpsにする 
    pinMode(INT_PIN, INPUT); // 割り込みのためのピンを設定
    CAN0.setMode(MCP_NORMAL);
    Serial.println("MCP2515 Library Receive Example...");
}

byte data[8] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07};

void loop(){
    //受信
    if(!digitalRead(INT_PIN)) {  // 受信割り込みが発生したら、CANデータをReadする
        CAN0.readMsgBuf(&rxId, &len, rxBuf);
        Serial.print("ID: ");
        Serial.print(rxId, HEX);
        Serial.print("  Data: ");
        for(int i = 0; i<len; i++) {
            if(rxBuf[i] < 0x10) {
                Serial.print("0");
            }
            Serial.print(rxBuf[i], HEX);
            Serial.print(" ");
        }
        Serial.println();
    }


    //送信
    byte sndStat = CAN0.sendMsgBuf(0x122, 0, 8, data);
    if (sndStat != CAN_OK) {
        Serial.println("Error Sending Message...");
    }
    delay(100);   // send data per 100ms
}
 
/*********************************************************************************************************
  END FILE
*********************************************************************************************************/