🚶
車載開発:CAN送信ツール
Arduino+MCP2515でカスタマイズしたCAN送信でPoCとか、デバッグ用に送信したりしてますので、書いてみます。(すごく基礎的ですが、、、実はできない人が多々いたり、、、)

背景:送信について
自動車メーカーでの開発だと、基本的には**「車単位」でデバッグする場面が多く**、CANの送信ツールを個別に使う機会が意外と少なかったです。
特定ECUだけに特定CANメッセージを投げたいといった場面や、起動条件の再現、条件付きエラー再現など時々送りたい時はあります。
この前のCANableでGUI使うと、OEM固有のチェックサムが含まれていたりするので。(一応python経由でいけると思いますが、まあ紹介ということで。)
通常の手段:CANoe / CANalyzer + CAPL
Vector製品が手元にあれば、CAPL(CANoe / CANalyzer Script)を使って送信するのが一般的かなと。
- シグナル定義を使った送信も簡単
- GUIとの連携もスムーズ
- トリガ付き送信など高機能
ただ手元に常にないと不便だったり、CAPLも慣れてないと準備に時間を要します。
Arduino + MCP2515
- Arduino UNO (互換品で十分) https://amzn.asia/d/5HfH1Yk
- MCP2515 CANモジュール(SPI通信)https://amzn.asia/d/fH4T8h3
これで送れます。
使い方イメージ
- Arduino IDE +
mcp_canライブラリ(既製) -
sendMsgBuf()などのAPIで送信 - シリアルモニタなどからトリガ送信もOK
実際のソフト
ArduinoとMCP2515はSPI通信ですが、ライブラリあるので以下で十分です。
#include <mcp_can.h>
#include <SPI.h>
const int SPI_CS_PIN = 10;
MCP_CAN CAN(SPI_CS_PIN);
int _cnt = 0;
void setup() {
Serial.begin(115200);
while (CAN_OK != CAN.begin(CAN_500KBPS)) {
Serial.println("CAN init fail, retrying...");
delay(100);
}
Serial.println("CAN init OK!");
}
void loop() {
byte data[] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08};
if (_cnt < 15){
_cnt = _cnt + 1;
}
else{
_cnt = 0;
}
data[7] = _cnt;
CAN.sendMsgBuf(0x123, 0, 8, data); // 標準IDで送信
delay(100);
}
OEMごとにチェックサムやカウンタもあると思うので、実装しておくとよいです。
まとめ
1回 自前で作っておくと、CANプロトコルの理解になって、いつでも送信できるので。
「送る」だけでも案外できそうでできない人が多いのでぜひ。
※注意事項で、ノーブランドのArduino互換品だと10個に1個とか初期不良品あります。私はそれ込みでもそっちのがトータル安いので、そちらを選びますがご注意を...
Discussion