HONDA FIT(DBA-GE6) CAN

ここはHONDA FIT(DBA-GE6)のCANやOBDUデータに関する情報について記述しています
販売台数的にFITオーナーは多いはずなのですが、CAN系の解析やツール作成をしている方をほとんど見かけないですねぇ…
ちょっとさみしい

※この文書中の「FIT」とは、断りがない限り「DBA-GE6」を示しています※
CANってなに?
様々なサイトで説明されているためここでは簡単に。

CANはController Area Networkの略で、データ通信の規格です。
イーサネットのように普段目に触れることは少なく、車や制御機器等でコンピュータ間通信等の用途に使われています。
データ転送量は「1回の通信で8byte迄」と少ないですが、耐ノイズ性に優れています。
通信速度は125k/250k/500k/1Mbps等があります。
以下のサイトで詳しく解説されています。
ダメダメおやじの部屋
OBDUってなに?
これも様々なサイトで説明されているためここでは簡単に。

OBDUはOn Board Diagnostic Systemの略で、CANなどの通信規格の上に乗っかっているフォーマットだと思ってください。
このOBDUは、車に搭載されているコンピュータから車のコンディション・データを受信し、車の状態を把握するものです。
これに関しても先のサイトに書かれています。
何をするのか?何が出来るのか?
最近、車のパーツメーカーからOBDU対応を謳った「燃費計」や「水温計」といった後付パーツが沢山出ていますね。
これまで(の車)は水温等のデータは共通規格ではなく、メーカーや車種によってバラバラな状態でしたので、車を買い換えるとそれらのツールも使えなくなるのが常識でした。
しかし日本車にもOBDUがだんだんと搭載されるようになってきたため、今までよりも広範囲の車種に対応できるようになってきています。
しかも昔のように「車速パルス」「回転パルス」「水温センサ」etc..のケーブルを見つけて専用の分岐コネクタ等を使って配線しなくても、OBDUコネクタを挿すだけで済むという手軽さ。
これがOBDUの魅力であり、対応パーツが増えている理由です。

しかし問題もあります。
OBDUで取得可能なデータの種類は沢山あるのですが、「絶対にサポートしなくてはならない」という訳ではないため、未だに車種によって水温が取れたり取れなかったりします。
そのため各パーツメーカーは車種毎にサポートしている項目を公開しています。

OBDUがサポートしている項目数についてはwikiを参照してください。
※↑英語に不自由な私としては、この日本語版が欲しい ^^;

また最近はCANをサポートするマイコンやICが増えてきたので、趣味・アマチュアのレベルでも気軽に手を出せるようになってきています。
これまで自作メータを作ってきた方なら分かると思います。汗だくになりながらセンサの種類毎に配線したくはないですよね?
FITではどうよ?
一概にFITといっても、初代FITからFIT/HYBRID、シャトルまで様々です。
少なくともDBA-GE6以上はサポートしている感じです。
他のサイトを参考にしてOBDUデータをリクエストしても反応がないんだけど?
ここからはFIT的な話も加わってきます。
他のサイトにあるように、CAN-IDに0x7E0や0x7D0を指定してもFITのECUからレスポンスは返ってきません。FITのOBDUは29bitIDだからです。
これのせいで、はまったりあきらめたりしている方は意外と多いかも? ^^;
私が成功した通信パラメータは「500kbpsの29bitID」で、リクエスト用CAN-IDは0x18DB33F1でした。
リクエストに対して返ってくるCAN-IDは0x18DAF111と0x18DAF11Dの2つがあります。
これもポイントです。
PIDの多くは両方のIDでサポートしていますが、片方のIDでしかサポートしていない項目もあります。
とりあえずは0x18DB33F1でリクエストしていればどちらか一方、もしくは両方からレスポンスが返ってくるので気にしなくて良いはずです。

●Mode-0x1,PID-0x0C(エンジン回転数)のデータをリクエストする場合
※ModeとPIDについてはhttp://en.wikipedia.org/wiki/OBD-II_PIDsを参照
CAN-ID DLC DATA1 2 3 4 5 6 7 8
0x18DB33F1 0x08
CAN送信データ数
(常に0x08)
0x02
以降に続くOBDU送信データ数
(常に0x02)
0x01
Mode
0x0C
PID
0x00
8バイトを埋めるためのダミー
(DATA8まで同じ)
0x00 0x00 0x00 0x00

●リクエストに対して返ってくるデータ
CAN-ID DLC DATA1 2 3 4 5 6 7 8
0x18DAF111 0x08 0x04 0x41 0x0C 0x15 0xC4 0x55 0x55 0x55
0x18DAF11D 0x08
CAN送信データ数
0x04
以降に続くOBDU送信データ数
PIDによって変動する
0x41
0x01への返信であることを表す値
0x0C
PID
0x15
回転数1バイト目
0xC0
回転数2バイト目
0x55
8バイトを埋めるためのダミー
(DATA8まで同じ)
0x55 0x55
PID-0x0Cで得られるデータの値はrpmで、変換は「((A*256)+B)/4」であるため、
0x18DAF111では、A=0x15,B=0xC4
0x15C4 / 4 = 5572 / 4 = 1393rpm

0x18DAF11Dでは、A=0x15,B=0xC0
0x15C0 / 4 = 5568 / 4 = 1392rpm
となります。
エンジン回転数や車速のように、常に変動している値では0x18DAF111と0x18DAF11Dのデータが一致しませんが、どちらも正解なので好きな方の値を使います。
リクエスト可能なPIDが毎回違う?
PID-0x00,0x20,0x40をリクエストすると利用可能なPIDを示すデータが返ってきます。
この利用可能PIDを取得せず「一度取れたデータはいつでも取れるだろう」的なコーディングをすると、リクエストしてもデータが返ってこない現象に遭遇します。
わたしもこれにはまりました。
調査した結果、エンジン始動から一定時間が経過するまでは、PID-0x00,0x20,0x40に対するデータ(利用可能PID)が安定せず、徐々に利用可能PIDが増えていきます。
つまり、最初のリクエストでは使えないと言われたPIDが、次のリクエストではビットが立って「使える」状態になったりします。
ブログ参照
そのため、PID-0x00,0x20,0x40は常にリクエストしてその情報をメモリに保存し、利用可能なPIDのみに対してリクエストすることをオススメします。
※一定時間返答がない場合は無視して次のPIDへ…とは思いますが、対応できないPIDをリクエストされたEUCがどのような挙動をするのか分からないため、使えないと言われたPIDは使わない方が無難だと思います。
OBDU以外のデータも流れてるんだけど
流れてます。すごい数のデータがすごい勢いで流れています。
これを解析したデータがこのサイトにあります。
OBDUでは取得できない「4輪それぞれの車速」や「灯火状態」、「シフトレバー位置」等の超有益な情報がそのデータの中に含まれているので、これを活用しない手はありません!
もしも「謎のデータ」の意味が分かった場合は連絡して、解析データをより完璧に近づけていきましょう。
私も少しですが協力させて頂きました。
自作したいんだけど手段は?
一つは、OBDUのデータを受信するためのチップとコネクタが一緒になったものをゲットすることです。
マイコン等と接続してシリアル通信すればデータが取得できるようです。
ただし、OBDU以外のデータは受信できないかもしれませんし、拡張性は乏しいかと。
専用のチップと通信する手前、データの更新周期は遅めです。
「ELM OBD」等で検索すると沢山ヒットします。

もう一つは「ブラックボックスが嫌いだから全部自分でヤル」という手です。
普段使っているマイコンでやりたいのなら、MCP2515(CANコントローラ)とMCP2551(CANドライバ)という2つのICを使えばCAN通信できるようになります。
CANの知識やMCP2515を制御する知識とコードが必要になりますが応用範囲が広く、OBDUもFIT固有のデータも好きなだけ受信できます。
私が使った雑誌付録のRX62NマイコンはCANコントローラが実装されているため、MCP2551のみを外付けすればOKでした。
良いところ良くないところ
MCP2515を使う ・CANコントローラを内蔵していないマイコンでも通信できるようになる
・MCP2515用に書いたコードならマイコンが変わっても大方流用できる
・マイコンとMCP2515間の通信がSPIなので、その分マイコンのピンを消費する
・CANの通信速度にあわせてマイコン-MCP2515間の通信もそれ以上に速くしておかないとデータをロストしかねない
ただし、OBDUではコチラがリクエストしない限りはデータが来ないので、フィルタ機能を使って0x18DAF111と0x18DAF11Dのみを受信するのであればそれほど速度は心配せずに済みます。
・水晶発振器とそれに付随する電子部品が必要
・基板に実装用の面積が必要
CANコントローラ内蔵のマイコンを使う ・受信したCANデータへのアクセスはメモリへのアクセスと同じなので、プログラムが楽で実行速度も速い
・基板にMCP2515分の面積が不要
・マイコンが違うとCANコントローラの制御も変わるため、コードが流用できない

MCP2551(やその他のCANドライバ)と車の接続には当然OBDコネクタを使うことになります。
これは ガレージインテークtoFITで手に入ります。
コネクタカバーは付いていませんが、toFIT製はamazonで手に入りますし、なにより配線済みなところがポイント高いです。
線もバラバラだけど…
なににせよ、特に配線済みの製品の購入前には「配線が実際に使う車種と合致していることを絶対に確認」してください。

←アフィリエイトなので注意w


RX62N基板でのパラメータを…
RX62N基板R8C/23MCP2515
PCLK=24MHzでの500kbpsは
// CANビットレート設定
CAN0.BCR.BIT.BRP   = 3-1;
CAN0.BCR.BIT.TSEG1 = 12-1;
CAN0.BCR.BIT.TSEG2 = 3-1;
CAN0.BCR.BIT.SJW   = 1-1;
でいけました。
尚、PCLKが違う場合は変更が必要です。

念のためCTX0をoutput、CRX0をinputにしておきましょう。
brp_c0conr = 1 - 1;
pts_c0conr = 7 - 1;
pbs1_c0conr = 8 - 1;
pbs2_c0conr = 4 - 1;
sjw_c0conr = 3 - 1;
でいけました。
クロックは水晶発振子20MHzです。
porten_c0ctlr = 1;として、ポートP6_1およびP6_2がCRX0/CTX0として機能するようにしておきます。
水晶発振子16MHzで500kbpsの場合は
SJW = 1 - 1;
BRP = 2 - 1;
BTLMODE = 1;
PRSEG = 1 - 1;
PHSEG1 = 3 - 1;
PHSEG2 = 3 - 1;
でいけました。

試していませんが、計算上では水晶発振子20MHzで500kbpsの場合は
SJW = 1 - 1;
BRP = 2 - 1;
BTLMODE = 1;
PRSEG = 1 - 1;
PHSEG1 = 4 - 1;
PHSEG2 = 4 - 1;
でいけると思われます。
ISO15765-4では、確かSEG1=1500ns、SEG2=400nsだったので、SEG1>SEG2にした方が良いと思われます。
やっぱり受信できないんだけど
  1. OBDUのリクエストCAN-IDが間違っていませんか?

  2. 送受信時に29bitIDに設定していますか?
    29bitIDが使えないCANコントローラはNGです。
    ※MCP2515,RX62N(トラ技付録),R8C/23は対応しています

  3. CANコントローラのフィルタ(名称はメーカによって異なる。例えばアクセプタンスフィルタ)で弾かれていませんか?
    CANコントローラによってはフィルタが2重になっているので、全フィルタを透過にしないとフィルタで排除されている可能性があります。
    最初はフィルタの設定を「全ID受信対象」にして、OBDUのレスポンスのみが受信できないのか、CANデータそのものが受信できていないのかを調査しましょう。
    ※OBDU以外のCANデータはリクエストせずとも流れてくる。ただしそれは11bitID

  4. RTRがONになっていませんか?DATA1〜8を使うのでRTRはOFFにする必要があります。

  5. 通信速度は500kに設定していますか?

  6. CAN-H/Lの接続が逆になっていませんか?
    もしも机上でマイコンを2つ使ってテストしている場合、CAN-H/Lのバス間にターミネータ(120Ωの抵抗)が接続されていますか?
    ※HI-SPEEDの場合は120Ω

    CAN-HとGND間の電圧を測れば、データが流れている(電圧が変動する)のか「いない(電圧が一定)」のかが判別できます。
    ※ただし実車ではECU発のCANデータが流れているためこの方法は使えません

  7. CANコントローラ(もしくはMCU)とCANドライバのTX/RX接続が逆になっていませんか?

  8. MCP2551を使っている場合、VDDには5Vを供給していますか?
    また、RSはちゃんと接続していますか?RSは宙ぶらりんにしてはイケマセン。

  9. CANコントローラ(もしくはMCU)には水晶発振子などの高精度なクロック源を使っていますか?
    レゾネータ(セラミック発振子)では500kの速度はちょっと無理です。
    ※MCP2515およびR8C/23で経験済み

  10. CANコントローラは送受信可能モードになっていますか?
    設定モードのままになっていませんか?

  11. TQの設定は大丈夫ですか?
    「TQの合計値が500k(2usec)になればOK」という訳でもありません。

  12. FITの場合、キーがIGNの位置にありますか?
    エンジンはOFFでかまいませんが、キーを回しておかないとOBDUが機能しません。

  13. GNDは共通になっていますか?
自作している人っているの?
確かにネットで公開されている方は少ないと思いますが、 先のダメダメおやじの部屋では自作ものを公開されてますし、こちらもFITではありませんがDSGインジケーターの製作なんてすばらしいと思います。

また、頑張ってデータが取って、頑張って動画を作れば↓なものも。


私もFIT用の時計をVer-UpしてCAN/OBDU対応にしてみました。
最後に。注意
CANデータを受信して使う。
OBDUの仕様に従ったリクエストをしている分には大丈夫だとは思いますが、通信の邪魔になるような独自データや量をバスに流したり、変な回路を組み入れることは安全面から止めておきましょう。
また、車独自のデータを調べるために29bit全てのCAN-IDをリクエストするようなことも止めておきましょう。
ブレーキやエアバッグの一部制御にもCANが使われていますので。

FIT DBA-GE6のOBDUサーポートID
2011/7/17 first by ZZO
2011/8/22 R8C/23のTQパラメータを追加
2011/9/6 DBA-GE6で取得可能なPIDの一覧へのリンクを追加