接続の選択
最初に、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)
- 初期化コマンドの送信(初期化文字列)
接続の組織ですべてが明確な場合。 操作の原理は、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つを使用して、車にどのセンサーが存在するかを判断する方法を示します。 例:
- 0100 \\リクエスト
- BB1E3211 \\車からの回答
車からの応答を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チームのみを使用します。 しかし、これはいわゆる最適化の制限ではありません。 データをさらに高速に更新するには、画面に表示されているセンサーに関するデータのみを要求することをお勧めします。 ただし、これにより一部のアプリケーション機能が制限されます。 たとえば、履歴レコード。
車のエラーの読み取りとデコード
車のエラーも異なる可能性があり、個別のコマンドも存在します。 例:
- 03-保存されたエラーコードを表示するには
- 0A-永続的なエラーコードを表示します。
他のコマンドと同様に、車のエラーはそれぞれエンコードされた形式で届きます。他のコマンドと同様に、必要な情報を取得するにはデコードする必要があります。 エラーデコードの仕組みの例を挙げましょう。 コード:
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の追加、アダプターに接続してグラフを作成する標準的かつ高度な方法など、多くの追加機能があります。
マトヴィエンコ・アレクサンダー、ホセイン・ファークル。