見出し画像

自分の車の診断アプリ作ってみた

デジタルペンテストサービス部の宮崎です。
セキュリティ業界では「診断」という言葉がよく聞かれますが、実は自動車にも診断機能があるのをご存知でしょうか?
車が自分自身の状態をチェックして、異常があれば人間に知らせてくれるとても便利な機能です。
本来この機能は整備士向けのもので、診断情報を読み出すには数十万円する専用の機器が必要なのですが、今回は近所のビックカメラで買った中古のAndroid端末と、amazonで買った千円のドングルで診断アプリを自作してみたお話しをしたいと思います。


OBDとは

自動車の診断機能はOn-board diagnostics(OBD)と言われています。よほど古い車でない限り、現在ほとんどの車にこの機能が搭載されています。
私の乗っている車は数年前にヤフーオークションで購入した2002年式の軽自動車ですが、こんなに古い車でもちゃんとついています。
写真は運転席の足元を下から覗き込んで撮影したものです。台形の差込口が見えますね。これがOBDの機能を利用するためのコネクタです。DLC(Data Link Connectorと言います。

画像1


ELM327

写真はELM327と呼ばれるドングルです。こいつをDLCに差し込むことで自動車の診断情報がBluetoothで読み出せます。
Amazonで千円ほどで売っています。

画像2

通信確認

まずはELM327が正しく通信が行えるかをノートPCを使って確認します。
ELM327とペアリングするとCOMポートとして認識されます。ターミナルソフトを立ち上げて画像のようなデータが表示されていればOKです。
データが文字化けもせず表示されていることから、通信は正常に行われていることがわかります。

図1

メッセージフォーマット

宮崎さん図1

診断情報のメッセージフォーマットの一例を載せています。
なにやらわけのわからない16進数が並んでいるように見えますが、眺めていると規則性が分かってきます。
1行あたりのバイトサイズは5バイト、7バイト、8バイトであること。
バイトサイズに応じて行頭が81、83、84と変化していること。
などなど簡単な規則性があることがお分かりいただけるかと思います。

プロトコル

規則性があるということは。その通り、診断情報のメッセージフォーマットはプロトコルとして定義されています。
プロトコルにはいくつか種類があって、その車がどのプロトコルを採用しているかは車種やメーカーによりけりです。
画像はELM327がサポートしているプロトコルの一覧です。
現在はISO 15765-4 CANが主流ですが、わたしの車はISO 14230-4 KWPということがわかりました。
特定の仕方は、プロトコルは0からCの13種類しかないので総当たりで初期化を実行し、正しく応答が返ればOKというやり方です。

宮崎さん図2

勉強

どのプロトコルが採用さているかが判明したので、次はプロトコルそのものを勉強をします。
親切にもELM327のデータシートには、それぞれのプロトコルにおけるメッセージフォーマットの解説が記載されています。
KWP2000の場合、ヘッダが3バイト、データが7バイト以下、そしてチェックサムという形式です。
非常にシンプルですね。これなら勉強が嫌いなわたしでも真面目に調べようかなという気持ちになれます。

宮崎さん図3

Android

早速アプリを作ってみました。いきなり完成画像です。
開発日数1週間。
DIAGNOSISというボタンをタップすると診断情報を表示してくれます。
プログラムの詳しい説明や開発過程を記載すると紙面が足りないので割愛します。
ソースコードが欲しい方がいましたら宮崎まで連絡ください。

宮崎さん図4


DTC

宮崎さん図5

DIAGNOSISを実行すると、出ました。無事にDTCが取得できてしまいました。
DTCというのはDiagnostic Trouble Codeの略で、異常の内容に応じて割り当てられたトラブルコードのことです。
当然のことながら、どこにも不具合のない車両であればDTCは発生しません。
さすが、ヤフオクで買った中古車両。ばっちりDTCが発生していました。
私の車には、EFI/AT/ABS/AIRBAG/ROOFの5つのECUが搭載されているのですが、そのうちABSとROOFのECUで異常を検知しています。
ABSのECUからはC1238とC1239、ROOFのECUからはB2595というDTCが取得できました。
それぞれChassis系とBody系に異常があるということです。
ABSに異常となると人命に関わるので、もう少し暖かくなったら修理しようと思います。

ブースト圧

OBDはもともと自動車の異常を人間に知らせるために出来た規格ですが、実は診断情報だけではなく車のさまざまな情報を読み出せます。
たとえば、エンジンの回転数であったり速度であったり水温や走行距離、はては現在地の高度などなど、本当にさまざまな情報です。
もともとアプリを作ろうと思ったきっかけは、診断情報も読み出したいけどブースト圧を知りたいなと思ったからです。
専用のかっこいいブースト計も販売されているのですが、アプリで読み出せるならメーターを後付けする手間もないし便利だろうなと。
というわけで自作アプリに機能を追加し、水温・ブースト圧・エンジンの回転数・車速を取得できるようにしました。
左がアイドリング状態、右が少しだけアクセルを踏んだときの画像です。
回転数(Revs)に応じて、吸気管絶対圧力(Boost)の値が変化していることがわかります。
アイドリング状態からアクセルを踏んだだけなので負圧の状態ですが、実際に走行させてターボがかかれば正圧となり値が大きくなるはずです。

宮崎さん図6

おわりに

OBDの機能を使って自動車のさまざまな情報が取得できることがお伝えできましたでしょうか?私はダイハツ コペン(L880K)という車に乗っているのですが、この車種の診断情報を取得できるAndroidアプリは私の知る限り存在しません。アプリが欲しいという方は宮崎まで連絡ください。

この記事が気に入ったらサポートをしてみませんか?