OBD2リーダー-車の診断

アプリケーションを作成する際、多くの選択肢や問題などに直面していました。この記事では、それらについて詳しく説明します。 結局のところ、あなたは車と対話することができ、非常に生産的です。 当然のことながら、車とのコミュニケーションを整理するには、「連絡を確立する」、「正しい質問をする」、車から受け取った「答え」を正しく理解する必要があります。 したがって、この記事の目的は、対話の構成をアクセシブルな言語で説明し、途中で遭遇する可能性のある間違いとその対処方法を説明することです。



接続の選択



最初に、ELM327アダプターを使用して車に接続することを明確にする必要があります。 ELM327は、自動車の診断タイヤで使用されているプロトコルをRS232プロトコルに変換するためのマイクロサーキットであり、RS232プロトコルにデータを転送します。 RS232プロトコルを介したデータ送信が連続的に発生するという事実により、最初の問題が発生します。これは、次の段落のいずれかで回避しようとするデータ転送速度です。



ELM327アダプターにはいくつかのバリエーションがあり、データ転送の方法(Bluetooth、WIFI、USB)によって分類されています。 開発目標はAndroidを実行するモバイルデバイスであるという事実に基づいて、BluetoothとWIFIなど、ELM327の2つの最も適切なバージョンを選択できます。 データを受信して​​処理する方法は1つしかなく、アダプターへの接続オプションのみが異なるため、1つのみを選択してダイアログを整理し、残りの接続オプションを追加できます。



ELM327 1.5 vs ELM327 2.1







遭遇する可能性のある最初の問題の1つは、アダプター自体(この場合はBluetooth)の選択の問題でした。 すべての(少なくともほとんどの)車をサポートする必要がある場合、v2.1の代わりにバージョンv1.5を選択する必要があります。実際、なぜなら 特に違いはありません。 実際、バージョンv2.1では、J1850 PWMおよびJ1850 VPWプロトコルはサポートされていません。つまり、これらのプロトコルを使用する車に接続することはできません。



接続



アダプターへの接続は、いくつかの段階で行われます。





接続の組織ですべてが明確な場合。 操作の原理は、Bluetooth / WIFIチャットと同じです。 初期化文字列の送信方法を理解するには、どのコマンドが存在するか、またそれらが実行する機能を調べる必要があります。



AT Z [すべてリセット]

アダプターの設定を工場出荷時のデフォルトにリセットします。

AT L1-0

改行を有効/無効にします。

AT E1-0

エコーオン-オフ

AT H1-0

ヘッダーのオン-オフ

AT AT0-1-2

適応タイミングオフ-適応タイミングAuto1-適応タイミングAuto2

ST FF

タイムアウトを最大に設定します。

AT D [すべてをデフォルトに設定]

設定を元のユーザー設定状態にリセットします。

AT DP [現在のプロトコルの説明]

スキャナーは、接続先の車両のプロトコルを個別に決定できます。

AT IB10 [ISOボーレートを10400に設定]

このコマンドは、ISO 9141-2のボーレートを設定し、

ISO 14230-4 10400

AT IB96 [ISOボーレートを9600に設定]

このコマンドは、ISO 9141-2のボーレートを設定し、

プロトコル3、4、5のISO 14230-4 9600。

AT SP h [プロトコルhの設定]

プロトコル選択コマンドh、ここでh:



0-自動。

1-SAE J1850 PWM(41.6ボー);

2-SAE J1850 VPW(10.4 Kbaud);

3-ISO 9141-2(5ボーinit、10.4ボー);

4-ISO 14230-4 KWP(5ボーinit、10.4ボー);

5-ISO 14230-4 KWP(高速初期化、10.4 Kbaud);

6-ISO 15765-4 CAN(11ビットID、500ボー);

7-ISO 15765-4 CAN(29ビットID、500ボー);

8-ISO 15765-4 CAN(11ビットID、250ボー);

9-ISO 15765-4 CAN(29ビットID、250ボー);

AT SP Ah [自動でプロトコルhを設定]



このコマンドはデフォルトのプロトコルhを設定します。プロトコルhを使用した接続が失敗した場合、アダプターはプロトコルの自動選択を開始します。



上記のコマンドに基づいて、初期化文字列を作成します。



initializeCommands = Arrays.asList("ATZ", "ATL0", "ATE1", "ATH1", "ATAT1", "ATSTFF", "ATDP", "ATSP0");
      
      





一部の車の「キー」を選択するには、より適切なアダプター設定を選択する必要があるため、ユーザーが初期化コマンドを変更できるようにすることをお勧めします。 この場合、ほとんどの標準プロトコルに適した設定が使用されます。



また、APSP0コマンドに注意することをお勧めします。したがって、デフォルトで自動プロトコル選択を設定します。これには時間がかかる場合があります。



したがって、ユーザーが自分の自動プロトコルが何であるかを知っている場合、接続プロトコルを変更する機能を使用して、ユーザーはプロトコル番号に0を変更できます。



診断データを読み取る



PIDの特別なコマンドは、診断データの読み取りに使用されます。

PID(パラメーターID-オンボード診断パラメーターID)-特定の車両センサーのパフォーマンスを照会するために使用されるコード。



メインpidはWikipediaにあります。すべての車がサポートする必要がある基本的なコマンドの完全なセットがあります。 特定のメーカーや車のタイプ用のコマンドセットもありますが、これらのセットは有料で提供されます。 私たちの場合、アプリケーションはそれぞれ自動車の基本的な診断に焦点を合わせており、コマンドの基本セットを使用しています。



車から現在のデータを受信することもできますが、車からデータを受信するコマンドの先頭には01が付いており、実際のデータを取得することを示しています。 車の保存データを取得する場合は、コマンドの先頭で02を指定する必要があります。 たとえば、車の現在の速度を取得するコマンドは010Dで、保存された速度-020Dを取得します。



オープンリソースによって提供されるコマンドの数を注意深く見ると、最初に書いた問題、つまりアダプターの応答速度の問題に気付くことができます。 コマンドの送信と受信は連続しているため、現在の時点でセンサーの読み取り値を取得するには、以前のすべてのコマンドに対する応答を待つ必要があります。 したがって、すべてのコマンドを受信するように要求すると、実際のデータの更新が非常にゆっくりと発生する可能性が高くなります。 ただし、車に存在するチームのみを表示するコマンドを使用すると、この問題を解決できます。 例:



0100-サポートされるPID [01-20]

0120-PIDのサポート[21-40]

0140-サポートされているPID [41-60]

0160-PIDのサポート[61-80]

0180-サポートされているPID [81-A0]

01A0-サポートされるPID [A1-C0]



PIDの1つを使用して、車にどのセンサーが存在するかを判断する方法を示します。 例:





車からの応答を2進数システムに変換します



 BB1E3211(16) > 10111011000111100011001000010001(2)
      
      





次のプレートを使用して、01から20までの、どのpidが車でサポートされているかを判断できます。







取得したデータに基づいて、私たちの車が次のPIDをサポートしていると判断できます。



  01, 03, 04, 05, 07, 08, 0C, 0D, 0E, 0F, 13, 14, 17, 1C, 20
      
      





現在、32チームすべてを送信し、それらに対する回答を待つのではなく、一部のチームが欠席する可能性があるにもかかわらず、15チームのみを使用します。 しかし、これはいわゆる最適化の制限ではありません。 データをさらに高速に更新するには、画面に表示されているセンサーに関するデータのみを要求することをお勧めします。 ただし、これにより一部のアプリケーション機能が制限されます。 たとえば、履歴レコード。



車のエラーの読み取りとデコード



車のエラーも異なる可能性があり、個別のコマンドも存在します。 例:





他のコマンドと同様に、車のエラーはそれぞれエンコードされた形式で届きます。他のコマンドと同様に、必要な情報を取得するにはデコードする必要があります。 エラーデコードの仕組みの例を挙げましょう。 コード:



 private final static char[] dtcLetters = {'P', 'C', 'B', 'U'}; private final static char[] hexArray = "0123456789ABCDEF".toCharArray(); private void performCalculations(String fault) { final String result = fault; String workingData = ""; int startIndex = 0; troubleCodesArray.clear(); try { if (result.contains("43")) { workingData = result.replaceAll("^43|[\r\n]43|[\r\n]", ""); } else if (result.contains("47")) { workingData = result.replaceAll("^47|[\r\n]47|[\r\n]", ""); } for(int begin=startIndex; begin < workingData.length(); begin += 4) { String dtc = ""; byte b1 = Utility.hexStringToByteArray(workingData.charAt(begin)); int ch1 = ((b1 & 0xC0) >> 6); int ch2 = ((b1 & 0x30) >> 4); dtc += dtcLetters[ch1]; dtc += hexArray[ch2]; dtc += workingData.substring(begin + 1, begin + 4); if (dtc.equals("P0000")) { continue; } troubleCodesArray.add(dtc); } } catch (Exception e) { Log.e(TAG, "Error: " + e.getMessage()); } }
      
      





そして今、説明のために。



受信した応答に基づいて、エラーコードを取得できます。このため、次のプレートを使用して受信したメッセージをデコードします。



最初のキャラクター:







2番目の文字:







次の表に従って、3、4、5文字が形成されます。







これに基づいて、次の回答を解析しようとすることができます0001000000111110







エラーコード:P103E



エピローグ



この段階で、アダプターとの対話を整理し、コマンドを送信し、その回答を受信して​​解読する方法を見つけました。 素材を研究するのにどれくらいの時間を要するかを考えると、これは作業の大部分ですが、同時に非常に興味深いものです。 この記事以外にも、ビジュアルインターフェイスに関連する多くの問題と、ファイルからの新しいpidの追加、アダプターに接続してグラフを作成する標準的かつ高度な方法など、多くの追加機能があります。



マトヴィエンコ・アレクサンダー、ホセイン・ファークル。



All Articles