車両のCAN通信のIDを特定する方法

車両のコントローラ間でやり取りされているCAN通信は、MAX 8バイト分のデータを一纏めにして送受信されています。
それらのデータには"CAN id"が付与されており、車両のCAN通信を解析するには、まずこのCAN idを特定する必要があります。

CAN idを特定するためには、以前説明した通信装置を車両に接続し、ARDUINOのシリアルモニタでCAN通信の生値をPCに出力します。

出力したデータをエクセル等でCAN idの部分だけ抽出します。


CANデータを読み出す通信装置は以下で説明しています。
sx99.hatenablog.com

ARDUINOで読み出したCANデータをシリアルモニタで出力するためには、以下のプログラムを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...");
}

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();
   }
}


ARDUINOの電源がONになっていれば、常時CANデータを読み出すようになっているので、
車のIGをONして、ARDUINOのシリアルモニタを開くと、このようにCANデータを取得できます。

Arduino シリアルモニタによるCANログ読み出し結果

あとは、数秒分取得すれば全CAN idが1度は送信されているはずなので、
あとはこれをコピーしてエクセルに張り付け、
関数でCAN idの部分だけを抽出してやれば、CAN idのリストを作ることができます。

エクセルの関数を使えば簡単にCAN idのみを抽出できる


これで車両から取得したCANデータをある程度処理できる状態になりました。
次回は、取得したCANデータの分析方法について説明します。