はじめに

車両のOBDでデータを取りたいと思っていますが、車両で開発は大変なのでArduinoで車両をシミュレートする環境を作りました。

参考

以下を参考にさせていただきました。ありがとうございます。

環境

  • windows
  • Arduino nano互換機
  • MCP_CAN_lib v1.5.1
  • ELM327 v2.1
  • MCP2515モジュール
  • Car Scanner(Androidアプリ)
  • OBDケーブル

Arduino nano互換機 について

久々に使ったので、最初書き込みができなくて困りました。 IDEでOld Bootloaderを選択します。 alt text

MCP2515モジュール について

Amazonで3個セット安いやつです。

KKHMF 3個 MCP2515 CAN バス モジュール TJA1050 SPI レシーバー Arduino AVR MCU ARM に対応

不良が混じっていることが多いみたいなのでモジュールを2つ使って動作確認をしました。
こちらは以下を参考にして動作確認をしました。ありがとうございます。

OBDケーブル について

以下を使用しました。

LoongGate OBD - II 16ピンオープンプラグワイヤを終了するには - OBD2 16ピンラウンド延長コネクタ診断ケーブル - 0.3メートル

レビューには商品袋に記載のピンアサインと実際のピンアサインは違うとあったのでテスターチェックしましたが、商品袋に記載の通りでした。なのでGreen - CAN-H,Green/White - CAN-Lで接続しています。

PinColorFunction
4OrangeChassis GND
5Light blueSignal GND
6GreenCAN high
14Green/whiteCAN low
16Red12V

alt text

alt text

alt text

alt text

変更点

参考のそのままでは動かなかったので、以下を変更しています。(参考での変更も含みます)
また、参考ではArduino Unoですが、私はnanoなのでnanoに合わせて接続しています。

PinFunction
D10SS
D11Mosi
D12Miso
D13sck

OBD_Sim.inoにて

  • CSピンを9ピン→10ピンに変更
// MCP_CAN CAN0(9);                                // Set CAN0 CS to pin 9
MCP_CAN CAN0(10);                                // Set CAN0 CS to pin 10
  • 20MHz→8MHzに変更
// if(CAN0.begin(MCP_STDEXT, CAN_500KBPS, MCP_20MHZ) == CAN_OK)
if(CAN0.begin(MCP_STDEXT, CAN_500KBPS, MCP_8MHZ) == CAN_OK)
  • OBDの5pin(Signal GND)は未接続

    • CANは差動信号なのでGNDは不要と考え繋ぎませんでした。動作しています。
  • MCP2515モジュールのintとArduinoのpin2をつなぐ(割り込み)

    • 参考では未接続ですが、動きませんでした。プログラムをみるとmainloopでintピンを見て割り込み待ちしていたので接続したところ動作しました。

その他

Car Scannerでプロトコルは自動認識されるため以下は1or0のどちらでも良いです。

  • 1ならISO 15765-4 CAN(11bit ID 500kbaud)
  • 0ならISO 15765-4 CAN(29bit ID 500kbaud)
#define standard 0