当サイトは広告が表示されます。

WRX OBD2で車両情報を取得する その16 複数PIDの取得の様子

OBD2,社外部品・DIY

久しぶりのOBD2関連記事です。前回はアクセル開度によるDCCDの自動変更を行いましたが、今回はそれ以前まで行っていた複数PIDの取得による、実際の数値表示までを行ってみます。またギア位置(シフトポジション)の表示に関して、OBD2からのデータを利用する場合についても検討してみます。

スポンサーリンク

複数PIDの取得(復習)

前々回の記事で行っていた複数PIDの取得テストでは、ELM327からの返信内容(アスキーコード)内に、答えとなるバイト数や改行による行数の情報も含まれていて、非常に長く分かり難い内容になっていました。

複数のPIDをELM327に要求すると、初回は送信した文字列がそのまま返された後、答えとなるバイト数を表す文字に続き、さらに答えが複数行になる場合は行の先頭に行番号が付加されています。PCからターミナル上で扱う(見る)場合は分かり易いのですが、答えをデータとして扱いたい場合は邪魔だと感じます。そもそもELM327から返信されるデータはアスキーコード(16進数)で来るので、アスキーコードから数値への変換が必要です。これらの内容はこれまでの記事内で書いています。

同じPIDを繰り返し取得する場合、初回に文字列を送信した後は「CR(キャリッジリターン)」のみを送信する事で、ELM327は初回に要求されたPIDと同じ答えを返信します。またこの場合は初回に送信した文字列は返されず、答えとなるバイト数から返信されます。

上記は初回に文字列を送信した後、「CR」で同じPIDを要求した場合です。「00D」は16進数で10進数にすると「13」。その後の答えとなるバイト数が13個である事を示しています。

私はFA用PLCを利用しているので、PCのターミナルの様には表示出来ず、PLCの文字表示器を使って偶然に表示出来ている形です。従って表示出来る文字数や改行に難があります。またELM327から返信される内容はアスキーコードですが、PLCの文字表示器で自動的に文字にしてくれています。

複数PIDの返信から答えを得る

DMの確保

ELM327からの返信は先の通りアスキーコードです。例えば「00D」と表示されている場合、ELM327から返信されているアスキーコードは「30 30 44」(16進数)です。またスペースや改行も全てアスキーコードとして含まれているので、実際に文字表示器で表示されている文字よりも多くのアスキーコードがELM327から返信されています。

PLCでは1つのDM(データメモリ)に対し1バイトもしくは2バイト取り込む事が出来るのですが、分かり易い様に1バイトずつにしています。また複数PIDを扱うとその答え(アスキーコード)も大量なので、今回は100個のDMを割り当てています。ELM327では同時に6個までPIDを要求する事が可能で、その答えの最大数をみています。上記ではDMの先頭から40個分を表示していますが、この画面を作るだけでも非常に面倒でした。さらに2ページ分あります。

OBD2から得られる車両情報は様々あるので本来はその都度自由に選択したい所ですが、要求するPIDの順番や数によってELM327から返信される答えの内容も異なってしまいます。こうなると要求したPIDの答えとなるDMの位置を判断する事は非常に面倒です。今回は要求するPIDを「エンジン回転数(0C)」「車速(0D)」「相対アクセルペダル位置(5A)」の3つと決め、ELM327からの返信はとりあえずDMに全て取込み、その中から狙い撃ちで必要なデータのみを扱う形にしています。

スポンサーリンク

複数PIDを要求とその答え

1つのPIDを要求する場合はサービスコード「01」の後にPIDを付けて送信しますが(エンジン回転数であれば「010C」)、複数のPIDを同時に要求する場合も単純に「01」の後にPIDを続けるだけです。従って今回の場合は「010C0D5A」になっています。ELM327に「010C0D05A」を送信すると、ELM327からはその順番で答えが返信されます。繰り返し(CR)で要求してもDMに取り込まれる内容は順番(位置)が同じなので、各PIDの答えを表すDMを固定する事が出来ます。

先のDMの画面は「010C0D5A」を繰り返しで要求した時の、DMに取り込んだ内容です。アスキーコードの1つ1つがそれぞれ1つのDMに入っている形ですが、これを文字に変換すれば先の文字表示器に表示される内容となります。

上記では先の同じ写真に解説を加えています。アスキーコードを順番に文字として読むと改行から始まり、

008

0: 41 0C 〇〇 〇〇 0D 〇〇

1: 5A 〇〇 00 00 00 00 00

となります。〇〇は各PIDの答えとなっている部分です。写真では実際に走行していないので答えも「00」になっている箇所もありますが、5Aの後の○○までがELM327から返信として示されるバイト数(41~〇〇までの8個=最初の008)となっています。ただし複数行の場合、最初の「0:」行は6バイト、次の「1:」行以降は7バイトずつになっていて、さらに最終行で7バイトに満たない場合は代わりに「00」で埋められます(5Aの答え〇〇以降の「00」)。

従ってこの中からそれぞれエンジン回転数、車速、相対アクセルペダル位置の答えとなっているDMを探し、そのDMのみを利用すれば良い形ですが、あくまでELM327からの返信はアスキーコードなので、アスキーコードから文字、さらに10の位と1の位の文字を組み合わせた上で、数値化を行わなければなりません。

実際の様子

上記は見難いのですが、実際に走行した状態での様子でgifアニメになっています。エンジン回転数、車速、アクセルペダル位置の同時取得と表示は上手く出来ました。とりあえずELM327に対しては0.2秒間隔で要求しています。先のDMに取り込まれる内容を見てみても、内容が変化するDMは要求したPIDの答えとなっている部分のみです。

※動画での様子は次回の記事で掲載する予定です。

ギア位置(シフトポジション)の表示

今回の様子の中ではギア位置も表示出来ていますが、実際にはOBD2から直接ギア位置を示すデータを得る事は出来ていません。OBD2の仕様では「Transmission Actual Gear(PID:A4)」があるのですが、これは以前の記事で調べた時に、私の車両ではサポートされていないPIDだと分かりました。

ちなみに車両で通常使用しているTRUSTのインフォメータータッチでも、ギア位置はOBD2からのデータでは直接表示は出来ず、各ギア走行時のエンジン回転数(2500rpm時)に対し車速を設定する事で表示を実現しています。

今回のPLCでのギア位置表示もエンジン回転数と車速から計算して表示していますが、なかなか面倒な事になってしまいました。その様子は長くなりそうなので、ギア位置表示に関しては次回記事で扱います。

「OBD2」関連記事

以下は「OBD2」タグの記事一覧です(投稿順)。現在の記事とこれ以降に投稿した記事も含みます。

その他

ブロック形式でプログラミングが行える、教育用「micro:bit」も始めてみました。micro:bitでもELM327と接続して車両OBD2ポートからの情報取得を試しています。

micro:bit全体の記事は以下から始まります。

注記

  • OBD2の仕様は各メーカーや車両で異なる部分があります。メーカーや車両によってはアフターマーケット製品による利用を推奨していない場合や、利用した場合による不具合発生の可能性を示している事があります。
  • このブログ内で書いている内容はあくまで私の車両、私の利用する製品や機器での場合です。他メーカーや他の車両をはじめ、同じメーカーの車両または製品、機器であっても記事内容の保証、責任を負う事は出来ません。
  • 記事内で紹介している製品や、その他の類似製品を購入・利用する場合はそのメーカーや購入先で、利用する車両などへの適合を確認し、自己判断と自己責任の下で利用して下さい。
  • OBD2やELM327、その他記事内容について個別の問合せや依頼を頂いても回答する事は出来ませんので、予め御了承下さい。
  • ELM327はElm Electronics Inc.の登録商標です。その他のブランド名または製品名は各所有者の商標です。