はじめに
車のOBD-II端子のCANについて調査する必要があり、試せるものが自宅のアルファードしかなかったので調査したのでまとめてみた。海外ではOBD-IIの通信を解析したサイトがいくつか出てくるし、デバイスも豊富なのに日本だとイマイチ情報がない。ただ、ECUや車両の通信の専門家ではないため、用語や使用方法は専門家とは異なる記述をしている可能性大と間違いはあるかもしれないので、情報の利用は自己責任で。
CANデータについてはSTMicroelectronics社のCPU(STM32L4など)がCANペリフェラル付きなので、これを利用してデータを取り込んだ。NUCLEOとCANトランシーバMCP2551を利用した簡単なもの、ここら辺は時間が別途まとめたいが検索すれば詳しいサイトが出てくると思う。
車両のCANについて
CANは基本的に8バイトのデータを複数のデバイス(ECU)間で通信を行う仕組み。物理層やデータリンク層の話は「ISO11898」や「ISO11519」で規格化されているが、低レベル層の通信の話は他のサイトにあるので、ここでは低レベル層の話は省いてTOYOTA CANで取得できる情報について書く。
まずは要求を行わなくてもCAN-BUSに大量にデータが流れており、そのうちわかっているデータについてまとめる。ISO-TP (ISO15765-2)を利用した要求/応答型のやり取りについても解析しているが、項目が膨大にあるのでまた後日。
ちなみに、今はやりのCANインベーダーについて調べる気はさらさらない。悪しからず。
表の見方
独特な表現をしているのでわかりにくいと思いますが、一応説明。。。
項目名 | 説明 |
CAN ID | データ内容や送信ノードを識別するための識別子。11bit形式と29bit形式がある。 |
プロトコル(Protocol) | Raw:正規な表現ではないですが、ISO 11898で定められたセッションレス型プロトコル ISO-TP:複数メッセージを1つのフレームにまとめるて最大4096バイトのデータが送れるフロー制御型プロトコル(ISO 15765-2)。J1979/KWP2000/UDSの通信で利用する SAE J1939:主に大型車両向けのプロトコル |
Endian (エンディアン) | 解析するデータのバイト配列の並び順。 Little:INTEL系のバイト配列の並び。データの下位バイトから先頭に並べる。 Big:MOTOROLA系のバイト配列の並び。データの上位バイトから先頭に並べる。 |
開始ビット (Start Bit) | 各プロトコルのデータ部からデータを抜き出すときのLSBの位置です。 Rawのデータ部は0~7バイトあり、先頭バイトを0バイト目とする。 ISO-TPの場合、SIDとPIDを飛ばした位置を0バイト目とする。 |
ビット数 (Bit Length) | LSBからMSBまでのビット数です。ビッグエンディアンとリトルエンディアンではバイト配列の進方向が変わります。 |
倍率 (Scale Factor) | 取得した値の計算方法。オフセットと合わせて以下のように計算 |
オフセット(Offset) | Value = (Data Value) * (Scale Factor) + (Offset) |
項目名 | 取得した値が該当する情報の名称と値の単位 |
取得できる車両情報
走行情報
CAN ID | プロトコル | Endian | 開始ビット | ビット数 | 倍率 | オフセット | 項目名(単位) |
610 | 11bit Raw | Big | 16 | 8 | 1 | 0 | 車速(km/h) |
611 | 11bit Raw | Big | 56 | 32 | 1 | 0 | 走行距離(km) |
63B | 11bit Raw | Big | 24 | 24 | 1 | 0 | エンジン始動回数 |
56 | 32 | 0.1 | 0 | エンジン始動時間(秒) | |||
1C4 | 11bit Raw | Big | 8 | 16 | 100/128 | 1/4 | エンジン回転数(rpm) |
25 | 11bit Raw | Big | 8 | 12 | 1 | 0 | ステアリング角度(℃) |
64B | 11bit Raw | Big | 56 | 32 | 1/10 | 0 | エンジン始動時間(秒) |
2C1 | 11bit Raw | Big | 48 | 8 | 1 | 0 | アクセルペダル(%) |
ドア開錠状態/ドア開状態
CAN ID | プロトコル | Endian | 開始ビット | ビット数 | 倍率 | オフセット | 項目名 |
4A5 | 11bit Raw | Big | 32 | 8 | 1 | 0 | ドア開錠状態 |
40 | 8 | 1 | 0 | ドア開閉状態 |
各項目に入る値は以下の値のORになる。
値 | 意味 |
0x80 | 運転席ドア開錠 |
0x40 | 助手席ドア開錠 |
0x20 | リア右ドア開錠 |
0x10 | リア左ドア開錠 |
0x08 | ハッチ開錠 |
値 | 意味 |
0x80 | 運転席ドア開 |
0x40 | 助手席ドア開 |
0x20 | リア右ドア開 |
0x10 | リア左ドア開 |
0x08 | ハッチ開 |
シフトポジション/表示灯
CAN ID | プロトコル | Endian | 開始ビット | ビット数 | 倍率 | オフセット | 項目名 |
3BC | 11bit Raw | Big | 8 | 8 | 1 | 0 | シフトポジション1 |
41 | 7 | 1 | 0 | シフトポジション2 | |||
40 | 1 | 1 | 0 | エコモード表示灯 | |||
3B7 | 11bit Raw | Big | 0 | 8 | 1 | 0 | ブレーキ警告灯 |
8 | 8 | 1 | 0 | スリップ表示灯 |
各項目の値は以下のようになる。
シフトポジション1
値 | 意味 |
0x08 | N(ニュートラル) |
0x10 | R(リバース) |
0x20 | P(パーキング) |
シフトポジション2
値 | 意味 |
0x01 | Bレンジ |
0x04 | Dレンジ |
エコモード表示灯
値 | 意味 |
0x0 | 消灯 |
0x01 | 点灯 |
ブレーキ警告灯
値 | 意味 |
0x00 | 消灯 |
0x02 | 電子ブレーキ警告灯 定速点滅 |
0x04 | 電子ブレーキ警告灯 高速点滅 |
0x07 | 電子ブレーキ警告灯 点灯 |
0x18 | ABS&ブレーキアシスト警告灯 高速点滅 |
0x10 | ABS&ブレーキアシスト警告灯 点灯 |
0x40 | ブレーキ警告灯 点灯 |
参考文献
- はじめてのCAN/CAN FD(Vector社)
https://assets.vector.com/cms/content/know-how/VJ/PDF/For_Beginners_CAN_CANFD.pdf
ベクターはカーエレクトロニクスの専門会社。「はじめてのCAN/CAN FD」「はじめての診断」などはじめてシリーズはとても参考になります。
- シミュレーションの世界に引きこもる部屋(この中の車両診断通信)https://www.simulationroom999.com/blog/category/mbd/diagnostic-communication/
車両診断の通信に関してものすごく詳しく書かれている。会話形式なのですべてを読むのには少し時間がかかるが、内容は濃くマニアック。
- OBD-II PIDs
https://en.wikipedia.org/wiki/OBD-II_PIDs
ベーシックな車両診断のPIDを説明したWikiページ。最初はここにある情報が取得できる情報のすべてだと勘違いをしていた。ここはあくまで世界共通のPIDであって、これのどれをサポートするかはメーカー次第。
- ハッカーズ・ハンドブック
- 車載ネットワーク・システム徹底解説―CAN,LIN,FlexRayのプロトコルと実装
少し古いですが、CANについて調べだした頃は情報がなかったのでこれを読んで勉強してました。