WRX OBD2で車両情報を取得する その9 OBD2のPIDを調べる
前回、ELM327を車両のOBD2コネクターに接続して通信が行える事を確認しました。同時に車両側でサポートされているPID(水温や回転数などの項目)を調べる為の「0100」コマンドを使って、その内容も取得する事が出来ました。取得した内容はそのままでは意味不明なので、今回はその内容の解読を行います。
OBD2のサービスとPID
PIDとはELM327などの診断ツールから車両にデータを要求する為に定義されたコードとなっています。詳しくはWikiに記載されていますが、まずはOBD2には大きく分けて10の「サービス(01~0A:16進数)」が存在し、各サービス内には車両のリアルタイムな情報や診断コード(DTC)といった項目が複数あります。各サービスに対してさらに項目を表すコードが「PID」です。
追加メーターの様に車両の現在の水温やエンジン回転数などを表示する為の情報は、サービス「01(Show current data)」に含まれています。さらにPIDで「05」が水温、「0C」が回転数、「0D」が速度などです。サービス01には数多くのPIDがありますが(Wiki上では196項目、途中抜け有り)全ての車両がその全てのPIDをサポートしている訳では無く、また車両あるいはメーカーによって定義されていないPIDが存在する可能性もWikiに書かれています。
サービス01の中で車両がサポートしているPIDを調べるには、PIDの「00」「20」・・・「A0」「C0」で196項目のそれぞれの範囲で用意されたPIDを使います。PIDが「00」の場合は以降の「01~20」までの範囲のサポート状況を知る事が出来る形です。実際に車両へデータを要求する場合は「サービス+PID」を送信します。
前回使用した「0100」コマンドはサービス「01」のPID「01~20」のサポート状況を調べる為のコマンドになります。サービス01の01~20内には先の水温や回転数などの一般的な項目が多く含まれているからですが、どうせならPIDの「20」以降も用意すれば良かったと思っています。
取得した内容
前回「0100」コマンドによって取得できた内容は「41 00 BE 3F E8 13」です。Wikiによると車両からは4バイトのデータが返されるとあります。またElm Electronics社のELM327のデータシート(リンク先はpdf、32ページに記載)では最初の41はレスポンスコード(01に40を足す)、次の00は要求したPIDとなっています。肝心のサポート結果は以降の「BE 3F E8 13」です。
PID「00」で調べる事の出来る範囲は以降の01~20までと書きましたが、これは16進数で01~0F、10~1Fに加えて20までの合計32項目です。結果の「BE 3F E8 13」の各文字をバイナリの2進数に変換すると、B「1011」、E「1110」、3「0011」、F「1111」、E「1110」、8「1000」、1「0001」、3「0011」になります。各文字で変換された「1」または「0」の数は合計で32個です(8文字×4桁)。これは先頭から順番にPID「01~20」の32項目をそれぞれサポートする「1」、サポートしない「0」を表しています。
上記がバイナリに変換後の値とPIDを比べた結果です。この結果から車両でサポートされているPIDが分かります。
なお前回の記事で最近のスバル車では、以前からの「SUBARU」通信規格に加えて「ISO」の通信規格にも対応している事を書きましたが、私が使用しているトラストのインフォメータータッチの適合表では、通信規格によってサポートしているPIDの内容も異なっています。
今後の予定
ELM327とOBD2の仕様については、Elm Electronics社のデータシートと先のWikiのみでおおよその事は理解出来ます。特にデータシートはATコマンドやOBD2への通信について、Wikiでは得られたデータの変換や計算方法も記載されているので、両方を見比べながら調べると分かりやすいです。どちらも英語ですがGoogle翻訳で分かります。当初はELM327との通信、その先のOBD2に関しては「難解」というイメージでしたが、分かると意外に単純です。ここまで深く悩む事なく進められた事もその理由になっています。
この先はPLCでレベルゲージなどを使って、追加メーターの様にリアルタイムな表示が可能か探ってみるつもりです。ただし今度は車両から送られて来る情報の変換や計算が必要なので、ラダープログラムをかなり組む必要があります。またどの程度のスキャンタイムで繰り返しの情報取得が可能なのか、複数項目を同時に扱う場合の方法などもまだまだ不明な部分が多くあります。まずはエンジン回転数辺りで1つずつ試してみるつもりです。PIDの20以降のサポート状況も調べてみたいと思っています。
余談
現在は車両のIoT化が進んでいますが、OBD2ポートを利用したセキュリティ対策も懸念事項としてあり、単なる盗難ではなく通信を利用した外部からのハッキングの可能性も指摘されています。ELM327機器のWiFiやBluetooth版を利用した「車載の社外品ドングルに対する近接攻撃の検証」という論文も出されています。
ELM327ではECUに対する書き込みなどは行えない様ですが、私はあくまで自車での車両情報の取得のみを行う事としています。余計な事をしてエンジンチェックランプなどが点灯してしまっても面倒です。
「OBD2」関連記事
以下は「OBD2」タグの記事一覧です(投稿順)。現在の記事とこれ以降に投稿した記事も含みます。
- 「セカイモン」でドイツから商品を購入
- WRX OBD2で車両情報を取得する その1 OBD2とは
- WRX OBD2で車両情報を取得する その2 ELM327の電源とRS232Cの配線
- WRX OBD2で車両情報を取得する その3 ELM327と「とある機器」の接続
- WRX OBD2で車両情報を取得する その4 通信テスト用のプログラムと画面
- WRX OBD2で車両情報を取得する その5 ELM327からの応答
- WRX OBD2で車両情報を取得する その6 ELM327との通信テスト完了
- WRX OBD2で車両情報を取得する その7 その他のATコマンドと調査用コマンド
- WRX OBD2で車両情報を取得する その8 ELM327を車両OBD2に接続する
- WRX OBD2で車両情報を取得する その9 OBD2のPIDを調べる
- WRX OBD2で車両情報を取得する その10 その他のPIDとエンジン回転数の取得
- WRX OBD2で車両情報を取得する その11 アスキーコードを数値に変換
- WRX OBD2で車両情報を取得する その12 正しいエンジン回転数取得の様子
- WRX OBD2で車両情報を取得する その13 エンジン回転数以外の項目とメーター表示
- WRX OBD2で車両情報を取得する その14 エンジン回転数以外の項目の返信内容
- WRX OBD2で車両情報を取得する その15 複数PIDの取得テスト
- WRX OBD2のアクセル開度によるSIドライブ自動変更機能の自作
- WRX OBD2で車両情報を取得する その16 複数PIDの取得の様子
- WRX OBD2で車両情報を取得する その17 エンジン回転数と車速からギア位置を判定する
- WRX OBD2ポート(OBD2コネクター)からの電源について
- WRX OBD2で車両情報を取得する その18 OBD2の分岐ケーブルについて
その他
ブロック形式でプログラミングが行える、教育用「micro:bit」も始めてみました。micro:bitでもELM327と接続して車両OBD2ポートからの情報取得を試しています。
- WRX micro:bitを車両で使う その16 シリアル通信(RS232C)を行う
- WRX micro:bitを車両で使う その19 ELM327の車両との通信を確認する
- WRX micro:bitを車両で使う その20 アスキーコード16進数から数値10進数への変換
- WRX micro:bitを車両で使う その21 車両からエンジン回転数を得る
- WRX micro:bitを車両で使う その40 フルカラーLED(WS2812B)でメーターを作る
micro:bit全体の記事は以下から始まります。
注記
- OBD2の仕様は各メーカーや車両で異なる部分があります。メーカーや車両によってはアフターマーケット製品による利用を推奨していない場合や、利用した場合による不具合発生の可能性を示している事があります。
- このブログ内で書いている内容はあくまで私の車両、私の利用する製品や機器での場合です。他メーカーや他の車両をはじめ、同じメーカーの車両または製品、機器であっても記事内容の保証、責任を負う事は出来ません。
- 記事内で紹介している製品や、その他の類似製品を購入・利用する場合はそのメーカーや購入先で、利用する車両などへの適合を確認し、自己判断と自己責任の下で利用して下さい。
- OBD2やELM327、その他記事内容について個別の問合せや依頼を頂いても回答する事は出来ませんので、予め御了承下さい。
- ELM327はElm Electronics Inc.の登録商標です。その他のブランド名または製品名は各所有者の商標です。