車両の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データを取得できます。
あとは、数秒分取得すれば全CAN idが1度は送信されているはずなので、
あとはこれをコピーしてエクセルに張り付け、
関数でCAN idの部分だけを抽出してやれば、CAN idのリストを作ることができます。
これで車両から取得したCANデータをある程度処理できる状態になりました。
次回は、取得したCANデータの分析方法について説明します。