アルテッツァの OBD2 診断情報から瞬間燃費を推定する

今回のネタは上級編です.いわゆる読者置き去り系.

概要

賢明なるみなさまはご存じだと思いますが,昨今の車には OBD2 という車両診断情報を吸い出す装置がついています.運転席に潜り込むと,台形で4cm程度の大きさのコネクタが見つかるはずです.これがOBD2コネクタです.
こいつに診断機を接続すると,診断機の求めに応じてエンジンなどの挙動を教えてくれるという画期的な装置なのです.

もともとはメンテナンスのための口なのですが,エンジン回転数だとかバキューム負圧だとかいろいろなエンジン周りの情報,車速情報などがとれるということで,OBD2コネクタに Bluetooth で情報を引き出すデバイス(ELM327デバイスとかいいます)を取り付けて,なんちゃって追加メーターをスマートフォンに表示したりと,なかなか面白いものなのです.*1

で,ぼくがほしかったのは瞬間燃費なのですが…なんと,アルテッツァは瞬間燃費メーターがあるくせに,OBD2 としては瞬間燃費情報を出していないのでした.
というわけで,OBD2 で瞬間燃費を算出する方法をいろいろと調べたのでメモ.

ELM327 デバイスなどでアルテッツァの OBD2 情報を読みたいって人は,こちらをご参考に!*2
今回の日記は,すでに ELM327 で情報がとれているという状況を前提としてます.もしも,ELM327 を差し込んでエンジン始動すると ABS 警告灯が点滅するようなら,my.isの情報を参考に,ABS に対応する 2pin をへし折ってください.

瞬間燃費を計算する方法はいろいろある

その1

一番簡単なのは,車両が計算した燃費情報がダイレクトにOBD2に出てくるパターンです.
車はもちろんインジェクターから秒間何グラムガソリンを拭きだしたかがわかっているので,その情報を把握しています.この情報をOBD2ではき出してくれたら一番いいのですが….

OBD2 PID 0x015E ENGINE FUEL RATE を車両に投げかけ,返事が返ってきたあなたは幸せ者.あなたの車は瞬間燃費(L/h)をOBD2で出力してくれています.

その2

実際,0x015E 瞬間燃費をはき出してくれている車はほとんどないです….
そんな場合は, 0x0110 MAF Air Flow から燃費を推定します.
MAF Air Flow はエアーフローセンサがキャッチした,エンジンへの空気の流入量(質量)の測定値です.
一般的にガソリン 1g を燃やすのに,空気が 14.7g 必要です.この関係から,秒間にエンジンが吸い込んだ空気の質量である MAF Air Flow 値から理想的に燃焼したガソリングラム数が推定できるわけです.

この算出法は,
FuelFlow\[L/h\] = 3600 \times \frac{MAF Air Flow\[gram/s\]}{14.7 * 820\[gram/L\]}
です.

14.7は空気とガソリンの理想的な燃焼比,820はガソリン1Lあたりの重さグラムです*3

その3

信じられないことに,アルテッツァは 0x0110 MAF Air Flow が出ていませんw
そんな場合は,0x0143 Absolute Load とエンジン回転数 RPM 0x010C と,エンジンの緒言値から MAF Air Flow 推定してなんとかします.
その2で使った MAF Air Flow が出てこないから,その値も推定しようってわけです.

MAF Air Flow \[gram/s\] = 1.184 \[gram/L\] \times EngineDisplay \times \frac{LoadAbs}{100}\times \frac{RPM \[rpm\]}{2 * 60}

EngineDisplay は排気量です.2Lなら,2です.
この MAF Air Flow 値をその2の式に放り込むと,瞬間燃費L/hが出てきます.

その4

その4…だと…?
そう,そのまさか.アルテッツァは 0x0143 Absolute Load が出ていないのでしたw
そんな我らがアルテッツァでは,吸入時のバキューム圧(インテークマニフォールド圧) Manifold Pressure (MAP) 0x010B と吸気温 Intake Air Temperature (IAT) 0x010F,エンジン回転数 RPM 0x010C ,そしてエンジンの緒言から MAF Air Flow を推定することになります.

 MAF Air Flow \[gram/s\] = \frac{IMAP}{60}\times\frac{VolEff}{100}\times EngineDisplay\times\frac{MM_{Air}[gram/mol]}{R[J/K/mol]}
where  IMAP = RPM\[rpm\]\times \frac{MAP[kPa]}{IAT[K]\times 2}

MM_{Air}は地上における大気の平均分子量で,28.97gram/mol,Rは気体定数で,8.314 J/K/molです.インテークマニフォールド圧 MAPの単位 は kPa*4,吸気温 IAT の単位は K(ケルビン)なので注意*5
VolEffはエンジンの体積効率\eta_{v}で,エンジンのスペックから決定*6

こんなかんじで,MAF Air Flow を推定すれば,同様にその2の方法で,L/h を算出できます.

わかりやすい瞬間燃費へ

L/h ってわかりにくいですよね?
このコンディションで燃料を使うと,一時間後には何リッター使ってます,という指標ですが,日本では KPL (km/L)をよく使います.

これを算出する場合は,自車速度 K/h を L/h で割り込むだけです.つまり,
Instant Fuel Consumption\[KPL\] = \frac{Vehicle Speed \[km/h\]}{Engine Fuel Rate\[L/h\]}
こうです.

まとめ

車種によっては,燃費情報はでないため,Torque や Info-san などの有名どころアプリでは瞬間燃費を推定するアルゴリズムを持っています.
その実態についてメモを残しました.

参考文献

残念ながら一部式に typo があります.燃料密度の割り込みのところとか,式が雑です.
また,一部 CNST 値が記載されていませんが,この日記に書いたとおりのもので大丈夫だとおもいます.

え,PDF 読めないよ? IEEE の会員になるか,文献購入してちょ.

*1:もっとも,OBD2データの更新頻度はあまり高くないので,アナログメーターとかに比べると反応はかなりわるい.はっきり言って非実用的.役に立つのは温度とかの情報くらいかしら?

*2:TORQUE の ELM327 に与えるオプションで,最後に 0x0100 を与えていますが,これはいらないかも.0x0100 は 0x0101〜0x011F までの PID の対応状況を確認するためのリクエストだからです.もう少し補足しておくと,ATIB 96 で Baudrate を 9.6kに, ATIIA 13 で初期アドレスを13番地に, ATSH8213F0 でヘッダを定義, ATSP4 で OBDプロトコルを ISO-14230-4 KWP2000 に設定しています.正直ATIIA と ATSH は何やってるのかよくわかってません(笑)

*3:日本ではガソリンのリッターあたりの重さが820gなのか?といわれると違う気もしますが,海外ではこの式をよく見かけます.

*4:ODB2 の信号単位は kPa なのでそのまま使ってOK.アプリでとると,bar とか PSI とかほかの単位系になっていることがあるので注意.

*5:OBD2 では セルシウス度℃なので,273.15 を足し込みます.

*6:って,わかるわけないので,とりあえず100でいいです.Torque も 100 にしているもよう.100 にすると,Torque の瞬間燃費推定とぴったりになるので…