MCP2515を使ってArduinoでCAN通信
MCP2515のモジュールを使ってArduinoでCAN通信をさせる。
ライブラリはMPC_CAN_libを使う。
スケッチの書き方は、MPC_CANのgithubのサンプルプログラムとヘッダを見るとわかりやすい。
- 【RaspberryPi】 RaspberryPiとArduinoをCAN通信させた - Yoshichiの日記
- 【RaspberryPi】 RaspberryPiとArduinoをCAN通信させた 2回目 - Yoshichiの日記
- OBD2(CAN)で自動車と通信(回路編) | Make.
- OBD2(CAN)で自動車と通信(スケッチ編) | Make.
- ArduinoでCAN-Busモニタ
- GitHub - coryjfowler/MCP_CAN_lib: MCP_CAN Library
・ハマったところ1
MCP_CAN::begin() が変更されてて、引数にいろいろ指定しなければいけなくなっていた。
何を指定しなければいけないかはサンプルプログラムとヘッダを見て判断した。
第1引数:IDの種類
第2引数:canの通信速度
第3引数:モジュールとの通信レート(今回の場合はモジュールの水晶発振子の周波数)
・ハマったところ2
MCP_CAN::setMode() が抜けてた
簡単なArduinoスケッチ
以下のソースではif(!digitalRead(INT_PIN))の部分でモジュールからの割り込みをポーリングしているが、
モジュールの割り込み用ピンを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 *********************************************************************************************************/