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

WRX OBD2で車両情報を取得する その12 正しいエンジン回転数取得の様子

2018年11月26日OBD2,社外部品・DIY

前回はELM327から返信されるアスキーコードの扱いに苦労しましたが、なんとか最終的に正しいエンジン回転数の取得が出来そうな感じにまで修正しました。あとは繰り返しの「CR」送信で、毎回同じデータデバイスに同じデータ(アスキーコード)が格納されるかどうかです。今回は実際に車両での確認を行います。

スポンサーリンク

開始コードと終了コード

繰り返しのデータ取得の為に「CR」を一定時間間隔で送信していますが、現状のPLCでは「CR」送信とELM327からの返信に関連(ハンドシェイク)を持たせていません。ELM327から返信されるデータは特に制限なくPLCのデータデバイスに格納していましたが、都度返信されるデータの時間間隔が短くなるとデータの切れ目が無くなってしまい、PLC側でデータデバイスに格納される内容が一定にならなくなってしまいます。

本来は1回の「CR」送信毎にデータデバイスを監視し、ELM327から返信された事を確認して、一旦データデバイスを空(0000)にしてから次の「CR」を送信する方が確実かと思いますが、PLCの通信設定で受信の際の開始コードと終了コードの機能を用いてデータの切れ目を認識し、データデバイスに格納される内容が一定になるか試してみます。

利用しているPLCでは、受信設定で「定数」を設定すると開始・終了コードとして機能します。上記の左は開始コード、右が終了コードとした内容です。「CR」による繰り返しのエンジン回転数の取得でELM327から返信される内容は、前回記事のアスキーコードで「0D 34 31 20 30 43 20 30 41 20 43 42 20 0D 0D 3E」でした。開始コードを16進数で「0D」、終了コードを文字で「>」(16進数で3Eでも可)としますが、開始・終了コードともに複数の内容が設定可能で、取説では開始・終了コードとした内容はデータデバイスには格納されないとなっています。

アスキーコードの内、エンジン回転数を示す部分は「30 41」と「43 42」なので、そこまでの「0D 34 31 20 30 43 20」は必要ありません。そこで今回はこの必要の無い部分を全て指定してみました。

上記はデータ受信の全体設定です。開始・終了コードは先頭と最終の16進数のみになっています。

車両での確認

実際に車両のOBD2コネクターにELM327を接続して、車両からエンジン回転数が正しく取得出来るか確認してみました。今回も結果を先に書くと正しいエンジン回転数が取得出来たと思います。

上記(動画からのgifアニメ)は車のエンジンを掛けてアイドリング状態の時のエンジン回転数です。以前はエンジン回転数の表示が「845~4200」の間の数パターンで不規則に変化していましたが(そもそもアスキーコードのまま計算していましたが)、今回は「700」前後で安定しています。また画面下にD20、D21、D23、D24と表示しているのはデータデバイスで、D20を先頭にして格納したELM327から返信されたアスキーコードを表示しています。「0D 34 31 20 30 43 20」を開始コードとして設定したので、D20にはエンジン回転数を表すアスキーコードから格納されています。D22が無いのは前回のアスキーコードで「30 41」と「43 42」の間に「20(スペース)」が含まれる為です。

またD24以降には「20 0D 0D 3E」の内、「20 0D 0D」も格納されていますが「3E」は終了コードとしたので格納されていません。終了コードも「20 0D 0D 3E」としても良かったのかもしれません。

念の為、動画中から画像を抜き出して確認してみます。上記の上側は回転数を表すアスキーコードは「30 41 44 43」で文字にすると「0A DC」、4桁の16進数として計算すると「0ADC/4=2B7」で10進数では「695」、下側は同様にアスキーコード「30 42 31 33」、文字で「0B 13」、「0B13/4=2C4」で10進数「708」です。

上記はその時の車両タコメーターと通常OBD2コネクターに接続しているトラストのインフォメータータッチです。PLCで表示されるエンジン回転数とほぼ同じ位なので、PLCでの表示も正しいとみて良さそうです。

ELM327を接続している時はインフォメータータッチは外しているのですが、アフターパーツとして販売されている分岐ケーブルを使えば同時に使えるのでしょうか?いずれ分岐ケーブルも購入してみたいとは思っています。

スポンサーリンク

スキャンタイムについて

PLCからの繰り返しの「CR」送信について、以前は「0.5S」「0.2S」「0.05S」「0.02S」の4種類の時間間隔を用意していました。さすがに0.02では早すぎると思い、今回は「3S」「1S」「0.2S」「0.05S」と全体的に遅くしましたが、0.05秒でも先の通りエンジン回転数の取得が出来ています。ただし全ての「CR」送信に対して漏れなくELM327からの返信があり、データデバイスに格納されているかはディスプレイ上では早過ぎて分かりません。

OBD2はCAN通信なのでELM327に要求するコマンドの時間間隔によって、車両側に何か影響が出るとは思っていませんが、ELM327のデータシート(リンク先はpdf、53ページ目)では時間に関しての記載もあります。まだあまり深く読んでいませんが、実際の車両でどのくらいのスキャンタイムで情報取得が可能なのかはやはり分かりません。むしろRS232Cの通信速度の限界やELM327のバッファオーバーが先に来そうです(データシート75ページ目に記載)。私の場合はRS232C通信速度はデフォルトの9.6kbpsから変えていませんが、今回はエンジン回転数のみなので間に合っている、という所でしょうか。

複数項目(PID)の同時取得

次のステップとしては複数の情報を同時に取得することになります。今回の様にエンジン回転数のみの取得であれば、ELM327からの返信も一定なので利用するデータ(回転数を表すアスキーコードの位置)に悩む事はないのですが、複数の場合はこれがどうなるのか不明です。ただしデータシート(46ページ目)には複数項目(PID)の取得についての例も記載されています(こちらもまだあまり読んでいませんが)。またエンジン回転数の場合は「0A DC」や「0B 13」といったアスキーコードから文字に変換後の「2バイト」が答えですが、車速や水温は値の範囲が狭いのでその答えは「1バイト」になっています(Wikiに記載)。

項目が増えれば通信速度にも影響してくるので、そう考えると繰り返しの「CR」送信は最初に書いた様にELM327からの返信を確認してから(+待機時間?)の方が良いのかとも思っています。さらに複数項目は任意に選択出来た方が良いのですが、その場合のコマンド送受信の効率的な方法など色々考えなければなりません。

今回はPLCのデバック用に車にノートPCを持ち込んだのですが、こういう時に限ってすんなりいってしまって、結局使わずじまいです。

「OBD2」関連記事

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

その他

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

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

注記

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