OBDIIで車両情報をモニタすることにした話
ちょっといいレーダー探知機とかだとにはOBDII対応を謳ったモノがあり、別売のコネクタとセットで使えば車速、HVバッテリ残量等々が読めますよね。 でもその探知機も結構お値段する。別にレーダー探知機機能は無しでもよいので、マイコン(Arduino)を使って自分で読むことにした話。
ハードウェア
マイコン
MEGA328を利用した。Arduinoを使うが、標準のFWでは外部クリスタルが必要で面倒なので、内蔵発振器で動作するFWを使用する。 詳細は Arduino - ArduinoToBreadboard 後半にある「Minimal Circuit (Eliminating the External Clock)」を参考に。
CAN-BUS
情報読み出しにはCANバスプロトコルをしゃべる必要がある。 このCANバスのプロトコルはArduino(MEGA328)は直接対応していないので、シールドを利用する。 意外とこれが結構広く出回っており、Amazon等でMCP2515等で検索すると出てくるのがそれで、およそ800円弱。コンパクトなものを購入した。
また、車両のOBDIIポートに接続することになるが、このコネクタは格安で購入したELM327モジュールからばらして利用することにした。
ライブラリは MCP_CAN_libを使用。
ディスプレイ
0.91インチ、128x32のI2C接続有機ELモジュールを使用。このモジュールは比較的フチも狭く、ケースに入れなくても見栄えがするので利用しやすい。またAdafruitのライブラリも利用できるので、一般的なキャラクタ液晶のように利用することができる。
ライブラリはAdafruit_SSD1306と Adafruit-GFX-Libraryを使用。
車両
車両はホンダ・ヴェゼルハイブリッド。ヴェゼルは運転席左足の上のあたりにOBDIIコネクタが出ており、ここに接続する。 また、メーカーによってCANバスで指定するID番号が異なったりするのがくせ者で、今回のホンダの場合は0x18DB33F1に対して送ればよい。 こちらのサイトさんとWikipediaが非常に参考になる。
回路図はこんな感じ。
実装してこんな感じ。青い基板がCANBUSシールド、上の黒いコネクタがOBDIIコネクタ(裏側)、右側に電源コネクタと、プログラム書き換え用のピンヘッダ。写真では見えないが、MCP2515基板に隠れるようにATMEGA328が実装されている。 ケーブルの先にはディスプレイ。スモークのアクリルで適当にケースを作って、メーターの近くに配置。車のメータと色味が似ているのでいい感じ。
ソフトウェア
setup関数内でCANバス、ディスプレイの初期化と割込みの設定。loop関数内でディスプレイの更新と車両へのリクエスト信号の送信。ピン変化割込みでデータ受信を検知し取得するようにしている。
今後の発展
今回は速度、回転数、冷却水温度、バッテリ残量のみをモニタしているが、欲を言うとバッテリ/ジェネレータ電流あたりをモニタしたいと思っていた。しかしホンダ車情報はネットを探してみても情報がなく、残念ながら断念した。トヨタのハイブリッドはこの辺りがよく解析されており、ネットを探すとそれらしい情報がありうらやましい限りである。
車のCANバス上を流れている情報を見ればそれらしい情報を見つけられるはずだが、ヴェゼルの場合はCANゲートウェイと呼ばれるものが挟まれているせいか、OBDIIコネクタのような末端まで信号は流れていないようだ。メーターを外し裏のどこかのケーブルを読めば…何かが見えたりするのだろうか‥‥?