🚶

車載開発:CAN送信ツール

に公開

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


背景:送信について

自動車メーカーでの開発だと、基本的には**「車単位」でデバッグする場面が多く**、CANの送信ツールを個別に使う機会が意外と少なかったです。

特定ECUだけに特定CANメッセージを投げたいといった場面や、起動条件の再現、条件付きエラー再現など時々送りたい時はあります。
この前のCANableでGUI使うと、OEM固有のチェックサムが含まれていたりするので。(一応python経由でいけると思いますが、まあ紹介ということで。)


通常の手段:CANoe / CANalyzer + CAPL

Vector製品が手元にあれば、CAPL(CANoe / CANalyzer Script)を使って送信するのが一般的かなと。

  • シグナル定義を使った送信も簡単
  • GUIとの連携もスムーズ
  • トリガ付き送信など高機能

ただ手元に常にないと不便だったり、CAPLも慣れてないと準備に時間を要します。


Arduino + MCP2515

これで送れます。

使い方イメージ

  1. Arduino IDE + mcp_canライブラリ(既製)
  2. sendMsgBuf() などのAPIで送信
  3. シリアルモニタなどからトリガ送信も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個とか初期不良品あります。私はそれ込みでもそっちのがトータル安いので、そちらを選びますがご注意を...

個人:nnnwa4create@gmail.com

Discussion