DPF関連表示システムの車載(M5Stack + RaspberryPi + OBDLink EX)
目的 |
チューニング・カスタム |
作業 |
DIY |
難易度 |
  中級 |
作業時間 |
12時間以上 |
1
これまではTorqueProスマホを車載してDPF関連の情報を表示させていました。いつ頃DPF再生されそうか、タイミングを見るのに重宝していました。
一方でバッテリーを搭載しているので万が一発火したりするのではないかと最悪の事態を想定して心配していました。車に載せっぱなしでも問題ないシステムを検討していましたが、この度M5Stackとラズパイ、OBDLink EXを使ったシステムが構築できましたので、車載しました。
かなり時間がかかってしまいましたが、画像のようなシステムを作ることができました。
2
従来のTorqueProスマホになります。今回のシステムを作ってみて、TorqueProは素晴らしいアプリだなと改めて感じました。
3
システムを作るにあたって、TorqueProアプリ内で見られるPIDのリストと計算式などの情報を記録し、欲しい情報を厳選しました。
RaspberryPi内のPythonプログラムで利用したいので、dict形式で定義しておきました。
以下は現行システムより古い情報かもしれませんが、Excelシートで作成したものになります。
can_data = {
"Coupling Solenoid Duty Cycle":{ "command_arbitration_id":"761","response_arbitration_id":"769","response_match_pattern":"04621E7A","command_data":"03221E7A00000000","unit":"%","formula":"A*100/255","label":"COUP_SOL"},
"Battery Estimated State of Charge":{ "command_arbitration_id":"7E0","response_arbitration_id":"7E8","response_match_pattern":"04624028","command_data":"0322402800000000","unit":"%","formula":"A","label":"BATT_SOC"},
"Battery Fluid Temperature":{ "command_arbitration_id":"7E0","response_arbitration_id":"7E8","response_match_pattern":"04624029","command_data":"0322402900000000","unit":"℃","formula":"A-40","label":"-"},
"DPF Lamp Count":{ "command_arbitration_id":"7E0","response_arbitration_id":"7E8","response_match_pattern":"05620433","command_data":"0322043300000000","unit":"-","formula":"A*256+B","label":"-"},
"DPF PM Accumulation":{ "command_arbitration_id":"7E0","response_arbitration_id":"7E8","response_match_pattern":"0562042C","command_data":"0322042C00000000","unit":"g/l","formula":"(A*256+B)*100/65536","label":"DPF_PM_ACC"},
"DPF PM Accumulation Desired":{ "command_arbitration_id":"7E0","response_arbitration_id":"7E8","response_match_pattern":"0562044B","command_data":"0322044B00000000","unit":"g/l","formula":"(A*256+B)*100/65536","label":"-"},
"DPF PM Generation":{ "command_arbitration_id":"7E0","response_arbitration_id":"7E8","response_match_pattern":"0562042D","command_data":"0322042D00000000","unit":"g/l","formula":"(A*256+B)*100/65536","label":"DPF_PM_GEN"},
"DPF Regeneration Count":{ "command_arbitration_id":"7E0","response_arbitration_id":"7E8","response_match_pattern":"05620432","command_data":"0322043200000000","unit":"-","formula":"A*256+B","label":"DPF_REG_CNT"},
"DPF Regeneration Distance":{ "command_arbitration_id":"7E0","response_arbitration_id":"7E8","response_match_pattern":"07620434","command_data":"0322043400000000","unit":"km","formula":"(B*65536+C*256+D)*100/65535","label":"DPF_REG_DIST"},
"DPF Regeneration Status":{ "command_arbitration_id":"7E0","response_arbitration_id":"7E8","response_match_pattern":"07620380","command_data":"0322038000000000","unit":"ON/OFF","formula":"DPF Regeneration Status","label":"DPF_REG_STAT"},
"Oil Change Distance":{ "command_arbitration_id":"7E0","response_arbitration_id":"7E8","response_match_pattern":"05620519","command_data":"0322051900000000","unit":"km","formula":"(A*256+B)*4","label":"-"},
"Total Distance":{ "command_arbitration_id":"7E0","response_arbitration_id":"7E8","response_match_pattern":"0662DD01","command_data":"0322DD0100000000","unit":"km","formula":"A*65536+B*256+C","label":"-"},
"Fuel Level (From Engine ECU)":{ "command_arbitration_id":"7E0","response_arbitration_id":"7E8","response_match_pattern":"03412F","command_data":"02012F0000000000","unit":"%","formula":"A*100/255","label":"FUEL"},
"Intake Air Temperature":{ "command_arbitration_id":"7E0","response_arbitration_id":"7E8","response_match_pattern":"03410F","command_data":"02010F0000000000","unit":"℃","formula":"A-40","label":"-"},
"Engine Oil Temperature":{ "command_arbitration_id":"7E0","response_arbitration_id":"7E8","response_match_pattern":"03415C","command_data":"02015C0000000000","unit":"℃","formula":"A-40","label":"-"},
"Engine RPM":{ "command_arbitration_id":"7E0","response_arbitration_id":"7E8","response_match_pattern":"04410C","command_data":"02010C0000000000","unit":"rpm","formula":"(A*256+B)/4","label":"-"},
"Ambient air temp":{ "command_arbitration_id":"7E0","response_arbitration_id":"7E8","response_match_pattern":"034146","command_data":"0201460000000000","unit":"℃","formula":"A-40","label":"-"},
"Speed (OBD)":{ "command_arbitration_id":"7E0","response_arbitration_id":"7E8","response_match_pattern":"03410D","command_data":"02010D0000000000","unit":"km/h","formula":"A","label":"-"},
"Voltage (Control Module)":{ "command_arbitration_id":"7E0","response_arbitration_id":"7E8","response_match_pattern":"044142","command_data":"0201420000000000","unit":"V","formula":"(A*256+B)/1000","label":"VOLTS"},
"Lock Up":{ "command_arbitration_id":"7E1","response_arbitration_id":"7E9","response_match_pattern":"04621E24","command_data":"03221E2400000000","unit":"ON/OFF","formula":"Lock Up","label":"-"},
"Torque Actual":{ "command_arbitration_id":"7E1","response_arbitration_id":"7E9","response_match_pattern":"05621EE4","command_data":"03221EE400000000","unit":"N・m","formula":"(SIGNED(A)*256+B)/50","label":"-"},
"Torque Desired":{ "command_arbitration_id":"7E1","response_arbitration_id":"7E9","response_match_pattern":"05621EC7","command_data":"03221EC700000000","unit":"N・m","formula":"(SIGNED(A)*256+B)/50","label":"-"},
"Transmission Fluid Temperature":{ "command_arbitration_id":"7E1","response_arbitration_id":"7E9","response_match_pattern":"05621E1C","command_data":"03221E1C00000000","unit":"℃","formula":"(SIGNED(A)*256+B)/16","label":"-"},
"Run time since engine start":{ "command_arbitration_id":"7E1","response_arbitration_id":"7E9","response_match_pattern":"04411F","command_data":"02011F0000000000","unit":"s","formula":"A*256+B","label":"-"},
"Engine Coolant Temperature":{ "command_arbitration_id":"7E1","response_arbitration_id":"7E9","response_match_pattern":"034105","command_data":"0201050000000000","unit":"℃","formula":"A-40","label":"-"},
"Engine Load":{ "command_arbitration_id":"7E1","response_arbitration_id":"7E9","response_match_pattern":"034104","command_data":"0201040000000000","unit":"%","formula":"A*100/255","label":"-"},
"Gear":{ "command_arbitration_id":"7E1","response_arbitration_id":"7E9","response_match_pattern":"04621E12","command_data":"03221E1200000000","unit":"-","formula":"Gear","label":"Gear"},
}
4
ELM327とどのような通信をすればよいのかわからなかったので、Android上で開発者オプションを有効にして、Bluetoothスニファを有効にし、ELM327ドングルとの通信をキャプチャ、Wiresharkで解析しました。
最初はよくわからなかったのですが、Bluetooth経由でシリアル通信をしており、これがPythonプログラムを作る上で役に立ちました。
シリアル通信ならばと、有線接続のOBDLink EXを購入しました。
Bluetooth経由でELM327と通信しているようなネットの記事もあり、無線でもできそうですね。
5
RaspberryPiは好きで結構持っていたので、3Bを使うことにしました。基板用の防錆スプレーを吹いて、車載環境に耐えられるようにしました。
RaspberryPiとM5Stackは無線で接続することにします。ラズパイにはアクセスポイントになってもらいたいので、hostapdなど関係するアプリをapt経由で導入しました。ググって必要な情報を入手しました。
さらにデータの記録も行いたいので、USBメモリ内にEXT4領域を設けて、そこに保存するようにしました。EXT4であれば、ぶつ切りでも問題ないと判断しています。
きっちり動作することを確認したら、Overlayfsを有効にしてmicroSD側のシステムドライブもぶつ切りに耐えられるようにしました。
6
M5StackにはディスプレイとWiFiが付いていて、MQTTが使えそうだったので選びました。と言いますか、以前からM5Stackは知っていたので、今回のシステムの表示機能オンリーだったらできそうだなと思っていました。
Arduino IDEでコードを作成しました。データが更新されたら、画面外枠を緑に光らせて更新していることを知らせます。10秒間更新がなければ画面をブランクにして、RaspberryPiなどのシステムに問題が生じていることがわかるように作りました。
なお、車載のM5Stackはバッテリーを外しています。また、ラズパイと同様に防錆スプレーを吹いておきました。
7
最後に、Chatgptがなければ望むシステムがつくれませんでした。主にコードの生成で使いました。
この場を借りて御礼を申し上げます。そして、これからもお世話になります。
[PR]Yahoo!ショッピング
タグ
関連コンテンツ( RaspberryPi の関連コンテンツ )
関連整備ピックアップ
関連リンク