久しぶりに時間が取れたのでまとめて OBD-II周りをまとめて作業した。
OBD-IIからのデータ抜き取りに苦戦している。
前回書いた「割と高い確率でELM327とECU間の通信が確立できない」件で、通信確立してないときは query()で得られたレスポンスが正しくないらしく、resp.value.magnitude で値引こうとすると メンバが存在しないと怒られてしまう。
あるいは、query( obd.commands.RPM ) すると サポート外のコマンドと怒られるなどという、ガソリン車ではありえない挙動が発生することもある。これは恐らく Python-OBDの初期化シーケンス中に PIDs supportedを上手く引けていないんだろうと思うが、これはこれで正しく通信できてないでしょ、、、、という。
大抵のサンプルだと obd.OBD()した後にすぐ query()してるんだが、どうにも怪しいので力業で何とかした。
while True: connection = obd.OBD('/dev/rfcomm1', 115200, None, True ) time.sleep(0.5) # ECUに接続できたならばループ脱出 if ( connection.is_connected() ) and ( connection.supports( obd.commands.RPM )) : break # そうでないならば (ELM_CONNECTED あるいは OBD_CONNECTED) 再接続 else : connection.close()
cmd = obd.commands.**** res = connection.query( cmd ) val = res.value.magnitude
PIDS_Aを正しく引けていれば RPMはほぼサポートされているはずなので、逆に RPMをサポートしていないということは 正しく読み出せていない、と割り切った。EV, HV車はどうなるか知らん。
ひとまずこれで動きが落ち着いたみたいなのでしばらく様子見する。
それはそうと、OBD-IIから車速を読み出して表示させてみたが、妙にドンくさい。「ジワっと加速しても表示値が +2km/hずつ増える」みたいな感じ。
↑のコードのように通信速度を上限まで上げても挙動が変わらないし、SPI接続とはいえ液晶モジュールのフレームレートもそこそこあるので、"ELM327で引っこ抜ける車速の精度がカス"という結論なのではないかと推測。
以前 Arduinoで車速パルスから直に計算したときは 期待通りの表示レートを取得できてたので、どうにも我慢できなくなったら車速パルスから直接求める方法も検討してみることにして、とりあえずは置いておく。
次に 燃費の計算。
どうも OBD-IIのPIDマップを見ると01-5Eに"Engine fuel rate[L/h]"というマンマなパラメータがあるが、これは 50エスティマではサポートしてないっぽいので、このページを
瞬間燃費と平均燃費を両方持ちたいので、
- [km/h] / [L/h] → 瞬間燃費[km/L]
- [L/h] x 前回取得からの経過時間 → 今回取得までの燃料消費量[L]
[km/h] x 前回取得からの経過時間 → 同 走行距離[km]
それぞれを累積して、Σ[km] / Σ[L] → 平均燃費[km/L]
と求めてみた。
走行距離はほぼトリップメーターと一致した(というか、トリップメーターも同じ方法で距離を出しているんだろう、車速パルスを数えているのかと思ったんだがな)が、得られた燃費はメーターの燃費表示よりも 1割ぐらい良い値が出ているので、おそらく↑のサイトで使用している 820g/Lという値は多分重すぎ。このページによれば 0.72~0.76[g/cm^3]なので、820g/Lの1割減=745g/Lということからも、真ん中取って 740g/Lぐらいでよいのかもしれない。
で、表示すべき情報が一通り求まったので、pygameで表示するコードを書いた。
せっかくPythonで作ってるので、Windowsだけで確認しながら作業するために、Windowsで動かしているときはダミーのOBD-IIデータを吐くように加工してある。
上から順に タコメータ、速度、平均燃費、瞬間燃費、トリップ。
瞬間燃費の右隣のバーは 色付きのものが瞬間、白い線が平均を示してる。瞬間>平均ならば青、瞬間<平均ならば 赤で描画させるようにしてみた。
大体の形が出来上がったので、serviceファイル書いて自動で起動するように設定して車に設置してみたが、これがまた面白いように動かないんだなぁ。。。
車にキーボードとモニタを持ち込んで車内でデバッグしてみたが、どうにも原因がはっきりしない。
Python-OBDで obd.OBD()がエラー吐いて落ちる。何これバグ持ちなの??みたいな感じ。ひとつ分かったことは、「OBD-IIドングルとラズパイの距離が遠かったら」このエラーで落ちる。といってもダッシュボード下にドングル、メーター前にラズパイ、という距離でしかないので、電波の強度が、とかそういう理由ではなさそうな気はするのだが、車体のノイズが原因とか、ナビやらスマホやらの 通信で妨害されてるとか その辺りなのかも知れない。
ということで、今回はここまで。
0 件のコメント:
コメントを投稿