2019年12月24日

HUD #7: 2代目 HUD制作中、「ラズパイ3で python-OBDが使えない」問題

ラズパイzeroWでHUDを作り始めて、ある程度形になったのでしばらく使った。
センターメーターに慣れてない身としては、正面に数字で速度が表示されるのが非常に便利ではあったのだが、いろいろと不満なところが見えてきた。
  • 画面小さい
  • 起動時間が遅い
  • 燃費と速度、あと走行距離しか出ないのは何か寂しい。もう少しゴチャゴチャ表示させたい
  • 表示のフレームレート上げたい

これらの不満を解消すべく、ただいま 2代目を制作中。



画面サイズ:
これはもう、見ての通り 先代(2.2インチ SPI接続 320x240)から大幅アップの 5インチ HDMI接続 800x480へ変更。標準サイズのラズパイにポン付けできるタイプなので本体もラズパイzeroWからラズパイ3へ変更。
タッチパネル要らんのだけどタッチパネル付しか出回ってないらしい。わざわざ剥がすのも面倒なのでそのまま放置。


起動時間:
ラズパイそのものの起動時間はラズパイ3に変更したことと、足りなければサービスの無効化とかのカスタマイズでもう少しは改善するだろうということで後回し。

これまでのソフトウェアは OBD接続確立を待ってから表示開始としており、その分で数秒待たされているのが非常にダルかったので、構造を大幅に見直してマルチプロセス化、OBD接続と 表示とを分離させてみた。
pygameのロード時間でちょっとだけ待たされるが、問題ないレベル。

表示寂しい:
燃費は表示していたけど、ガソリンの使用量も見たくなったので新たに表示させた。
とりあえず水温と電圧はOBDから引けそうなのでこれも表示させる。
油温は50エスティマではサポートしてないみたいなので吸気温度とかも付けとくつもり。
ゴチャゴチャさせてはみたけど、何かこう、ゲームっぽく洗練された表示にできないところは単純にセンスと腕の問題。


フレームレート上げたい:
マルチプロセス化で画面表示を一定レートで回しつつ、裏でOBD通信させることができるようになったので、フレームレート「だけは」確保できた。

数値の更新間隔をもう少し短くしたくて、特に速度は OBD経由の数値は明らかに遅れているので車速パルスから引っ張りたいとは思っている。しかしせっかく電源接続だけで運用できているのにわざわざ配線追加するか??というのも一理あり、実現するかは悩みどころ。
ちなみに、燃費の情報もOBD経由ではなくインジェクタ信号から引っ張れば、と考えていたが、50エスティマでは ECUがエンジンルーム内の狭い隙間、コネクタ~ケーブルがガチガチに防水加工してあるらしい、キャビン内への引き込みどうすんのよ、とか非常に面倒くさそうなので棚の最上段へ。





で、ここからが本題。
ラズパイzeroWで動いてたコードをまずラズパイ3に持ってきて動かそうとしたが、ELM327と全く通信できなかった。
ELM327のバージョンとか、あるいはpython-OBDのバージョンだとか、その辺を疑ってみたけどさっぱり原因がつかめず。
python-OBDの Loggerを有効にすると通信できるようになる、ただしpygameも有効だと通信できない、とか ワケわかめな挙動に悩まされまくったが、何とか原因がつかめた。


「ラズパイ3が速すぎ」


何のことはない、python-OBDの中で ELM327へコマンドを送った後、応答を読み出すのが早すぎて ELM327からの応答が来る前 or 来ている最中に バッファから読み出し終わってたらしい。それで、次のコマンド送信→応答を読み出すはずが、前コマンドの応答の破片を読み出してしまい通信エラーになっているようだ。
Loggerが有効だとデバッグ用のメッセージが標準出力へ流れるのでウェイト代わりになってた、とかその辺が理由なのかなと思ってる。pygameと併用すると~~の理由は不明だが。

暫定対策として、obd/elm327.py の __send() のデフォルト引数を Noneから変更してみた。0.03は ウチの環境で安定して取れた最小の値。
ファイルの場所は、pip3 show obd で表示された Location: 項を探してください。多分その辺にあります。

#def __send(self, cmd, delay=None):
def __send(self, cmd, delay=0.03):


0 件のコメント:

コメントを投稿