• 車種別
  • パーツ
  • 整備手帳
  • ブログ
  • みんカラ+
イイね!
2013年04月07日

OBD2(OBDII)で遊ぼう 其の二:ELM327をマイコン制御

OBD2(OBDII)で遊ぼう 其の二:ELM327をマイコン制御 天気予報では高い確率で雨.どーして、運悪く休日と重なっちゃうんだろう~.下回りをいじりたかったんだけど、こうも曇天だと作業始める気にもなれないし(ーoー;;

仕方ないので、前回のOBD2工作の続きをやってみることにしました! 前回は、机上でOBDアダプタとの通信まで構築することに成功しました. 今回はそれを一歩進めて、実車に接続して実験してみることにしました.ん~ドキドキ♪

今回はちょっぴりディープにご紹介(笑)
※【OBD2(OBDII)で遊ぼう 其の一】もご覧下さいませ/


CONTENTs
 
 0x00 (1) OBD2の予備知識
 0x01 (2) 対応するPIDコマンドの調査 (EVO9編)
 0x02 (3) PID値の取得
 0x03 (4) OBD2接続のおもちゃ製作
 0x04 (*) 実験風景動画
 0x05 (5) この先の課題
 

感想: ゴタゴタと能書きを書きましたが、PICでOBD2情報を得ることはあっけないほど簡単でした♪
      だってほとんどアダプタ(ELM327)がやってくれるので(ーoー;
      市販されているOBD対応機器の利益率はかなり良さそうですねw



     
 (1)OBD2の予備知識  △ (Top)


  可能ならばノートPCとマイコンシミュレータで車輌につながったアダプタと通信してデバッグする方が効率が良いのですが、今回ははじめからマイコンにプログラムしての実験.と言うのも、この先オモチャとして使えるかどうかはあるコマンドの結果によるので、PCを持ち出すといった手間をかけずにまずは手っ取り早く通信可否を調べたかったからです. それを、実現するのが即席マイコン基板と 0100,0120,0140 の3つのOBDリクエストコマンドになります.

OBD2で診断できる大枠の項目(Modeと呼ばれる)を簡単に紹介すると、下記で示した0x01~0x0Aまでの全10項目になります.主に使うのは、Mode0x01 の ”現在ステータス” や、Mode0x03, Mode0x07 といったトラブルコードの参照になるのかな.

MODE
   $01. Show current data
 $02. Show freeze frame data
 $03. Show stored Diagnostic Trouble Codes
 $04. Clear Diagnostic Trouble Codes and stored values
 $05. Test results, oxygen sensor monitoring (non CAN only)
 $06. Test results, other component/system monitoring (for CAN only)
 $07. Show pending Diagnostic Trouble Codes (detected during current or last driving cycle)
 $08. Control operation of on-board component/system
 $09. Request vehicle information
 $0A. Permanent DTC's (Cleared DTC's)


 さて、黒っ9が一番ほしーデータはもちろんMode0x01の現在ステータスになります(^ー^ ご存じのようにOBD2は国際規格なので多くの車輌に対応できるだけの項目があります.逆に言うとたくさんの項目から自動車メーカが必要なものを選ぶことができるようになっているようです.そのため、単にOBD2の規格に準拠していてもその車輌から得られる情報は、限定されていることがほとんどのようですね.

そこで、対象車輌がどの項目情報を送信してくれるかを調べる必要がありますが、それを簡単に行えるのが先に紹介した 0100,0120,0140 コマンドになります.これらは、2バイトで1組となっていて、1バイト目がMode番号、2バイト目がPID(Parameter ID)になります.



     
 (2)対応するPIDコマンドの調査 (EVO9編)   (Top)



  現在ステータス(Mode0x01)の項目は全196項目.エンジン回転数やクーラント温度などがこれらに含まれます.Evo9が一体どの項目をサポートしているか興味津々ですね♪ コマンドを投げると6バイトのデータが帰ってくるので、3バイト目以降を分析することで項目数を知ることができます.


Mode1 PID 0x00
 

Wikipediaを見ると↑のように受信した6バイトのうち後ろ4バイトをビット換算すると、1/0でPIDの対応状況が分かるようです.なるほどですね.例えば、次のよなレスポンスがあったとすると、

> 0100
   41 00 BE 1F B0 10


”41 00” はレスポンス接頭子とPIDを示していて、以降の ”BE 1F B0 10” をbitに分解します.分解例を示します. まず1バイト目の”BE”は、16進数で表されているので、Windows7の電卓で2進数に変換します.すると、”0b10111110”であることが分かります.人間ならばこの時点で目で追っていけば対応PIDが分かりますが、特定のPIDが対応しているか否かをマイコンで認識させるためにはもう少し工夫が必要になります.

例えば、PID0x05(Engine coolant temperature)が対応しているかを調べるには、レスポンス結果の1バイト目(8bitなのでPID1~8を示す)と任意PIDとをビット演算してあげます.



Bitwise operations
       0b1011 1110  ← ”0xBE”の2進数表示
   & 0b0000 0100  ← PID0x05は3bit目が1(=0b10000000(0x80)を右に5回シフトしたもの)
  -----------------
     0b0000 0100   ← ビット演算結果


この例では、結果が”1”として得られたので、投げた PID0x05 に対応していることが分かります.これを、16バイト分行うのはめんどくさいので、任意のバイト数データを処理する判定関数を作ってみました(C言語).任意の開始アドレスから処理を初めてNULLデータ('\0')がくるまでリピートします.


Function: Enabled PID detecter
 


引数は、データビットの開始アドレス/戻り値は32bit配列(4バイトデータ時)の先頭アドレスになります.メインからこのように呼び出して使います.dt はレスポンス値 ”41 00 BE 1F B0 10” が格納された配列になります. 使い方は至極簡単.ポインタ変数を定義して、結果配列のアドレスを格納するだけです.

   BYTE *p;
   p = SelEnblPID( &dt[2] );


それでは、Mitsubishi Lancer Evolution 9GT の対応PIDを列挙してみましょう.
まずは、Mode0x01-00 から.数行のプログラムを書いてリスト化したのが左下の対応表です.


Summary of Enabled PIDs
 

PIDは、下記の16項目.
※ポインタが示す値が1となっている項目です.


00 PIDs supported [01 - 20]
01 Monitor status since DTCs cleared.
03 Fuel system status
04 Calculated engine load value
05 Engine coolant temperature
06 Short term fuel % trim—Bank 1
07 Long term fuel % trim—Bank 1
0C Engine RPM
0D Vehicle speed
0E Ignition Timing advance
0F Intake air temperature
10 MAF air flow rate
11 Throttle position
13 Oxygen sensors present
14 Bank 1, Sensor 1:Oxygen sensor voltage,Short term fuel trim
1C OBD standards this vehicle conforms to




同様に、 Mode0x01-20,0x01-40, 0x01-60 と調べましたが、Evo9から得られる現在ステータス情報はこれだけでした.EvoXのCAN通信ならもっとたくさんの情報が得られるようですが、旧車規格では仕方ないようです.


もう少したくさんの取得可能な項目があることを期待したのですがちょっと寂しいですね.




     
 (3)PID値の取得   (Top)



さて、ここまできたらPIDを投げてその値を取得したくなってウズウズしちゃいますよね(^ー^o

 

 早速マイコンプログラムにコマンドを追加して、どんな値が帰ってくるのか調査してみました.抽出したPIDリストをプリントアウトしてレスポンスを記載していきます.

得られたリストは、wikipedisに載ってる変換式使って項目毎のUNITに変換していきます.

黒っ9が試した行程と同じように、市販のOBD2に対応した機器も同様にシリアル通信で車輌と会話しています.何も知らなかったつい先週までは、一見して難しそーだな~と思われた ”OBD2” も、こうやってひとつひとつ紐解くと単純なことの繰り返しなんですネッ♪

 
プログラムとか実験作業よりも、ブログにまとめる方のが時間かかってたりして・・・(笑)


一連の作業はたった2つの資料(+ちょっとしたC言語の知識)だけで、ものすごく複雑に見えるパズルを解くことができます.数々のサイトがありますがどれも深く追求していないので資料を見るのが一番でした.
 ・ ELM327データシート(PDF)
 ・ OBD-II PIDs(wikipedia)
 ※2つとも非常に濃い資料なので、他のサイトを読み漁るよりも近道でしょう.


   通信プロトコルの確認

※説明から漏れたのでちょいと補足.

  OBD2は12種類のプロトコルがありますが、Evo9がどのプロトコルを採用しているのか分からなかったので、ELM327の設定は ”AUTO=AT SP0” にしてます. アダプタをリセットして、MODEコマンドを投げた最初の1回はBUSの初期化が入るので、レスポンスは3~5秒かかりますが、2回目以降は体感的にすぐにレスポンスが得られる感じです♪

←アダプタがどのプロトコルで通信を確立したかは、”AT DP” コマンドで確認できます.

     
   DTC(トラブルコード)の確認
Mode0x03はトラブルコードの確認コマンドとされているので、何か保存されているか覗いてみたところ、”NO DATA” と帰ってきました.

ん~、ホントかな?問い合わせ方法が違うのか? 同じようなコマンドにMode0x07があります.これも同じような反応でした.
     
    OBD standards this vehicle conforms to what?

Mode1x1CはOBD規格の何に準拠しているかが読み出せます.
Evo9の場合、”0x01” って帰ってきたので、”OBD-II as defined by the CARB” であることが分かりました.

レスポンスは、 0x00~0x0D までの13種類.





     
 (4)OBD2接続のおもちゃ製作   (Top)



 今回は、マイコンを使って車輌と通信を確立できるかを確認するために市販のOBD2アダプタを使いましたが、計器などの自作おもちゃを作る場合には、アダプタ本体も含めて自作した方が全体的に小型にできます.ELM社のHPをみると、下記のようなDIP型から面実装タイプ(SMD)まで豊富に取り揃えているので、これを利用して作ってみよ~かなぁ. コンパクトに7segディスプレイで作るもよし、マイコンで制御するTFT液晶に表示するのもよし. SDカードをつないでログを取るのもよし. いろいろ妄想が膨らみますネッ!


 

 



ちなみに、市販されている多くのOBD2アダプタはクローン製です.こう聞くと聞こえがよいですが、いわゆるコピー商品ですね.コマンドでELMチップのファームウェアバージョンを読み出すと、”ELM327 v1.5” と帰ってきます. ハイ、ご多分に漏れずコピー品でした(ー_ー; ELM社のHPにも注意書きがあります.

Please note:
There is no ELM327 v1.4a, or v1.5, or v1.5a !

Some clone makers have introduced what they call a 'v1.4a', or
a 'v1.5', or a 'v1.5a' but Elm Electronics has never made one.


某国製がはびこりまくってますね(^^;;


ELM327 (Evo9 OBD2) connection experiment with PIC18   (Top)
こんな感じで実験してみました♪ 実際は、起動時に “ピポッ” ってなったり、レスポンスがあると、”ピピッ” って応答したりカッコイイんだけど、音がうまく取れなかった・・・(^^; せっかくプログラムしたのに残念.

動画は、任意のコマンドなげて受信したレスポンスを表示しているときのものです.レスポンスは文字列(str型)と16進数(unsigned char型)表記どちらでも表示できるように、翻訳機能も付けてます.



     
 (5)この先の課題 ▽  (Top)



おもちゃを作るにあたっての課題はたくさんありますが、さしあたってはこれらのことかな.

課題/検討項目
   ・項目の受信サンプリング時間の把握と可能な限りの高速化
 ・低レートサンプリングが予想されるので離散データの補間と、外挿による変化の推定
  さらに、リサンプリングしてなめらか挙動に.
   あるいは、 別の方法を考えるとか.
 ・エラー対応/タイムアウト対応
 ・ELM327との通信速度改善
   ELMチップでボーレートを変更できそうなので、なるべく高速に.
 ・カックイ~インジケート方法 

 まだまだ、楽しめそうかな?
 でも車輌から取得できるデータ内容をみると面白味に欠けるので一端終了かな.



※プログラムとか電気電子は素人なので、専門家の皆さんがみたら説明内容や表現が稚拙でへっぽこに見えるかもしれません. でも、そこは大目に見てください(笑)
ブログ一覧 | PIC+電子工作 | 日記
Posted at 2013/04/07 04:26:50

イイね!0件



タグ

今、あなたにおすすめ

ブログ人気記事

旧友の七回忌
zakiyama @ roadstinさん

みんカラ:モニターキャンペーン【キ ...
あぶチャン大魔王さん

みんカラ:モニターキャンペーン【キ ...
Hyruleさん

愛車と出会って5年!
MatsutakaZC33S_C7Z51さん

今日の昼飯は〜😋👍
一時停止100%さん

☔️雨上がりの朝☀️
mimori431さん

この記事へのコメント

コメントはありません。

プロフィール

「倉庫から色々出てきたでござる http://cvw.jp/b/194408/41272537/
何シテル?   03/27 20:35
黒っ9(クロック)といいます。 黒のエボ9オーナーだったので クロック(笑) 休日は主にドライブです♪ 旅先の露天風呂なんか最高だね! 手作...
みんカラ新規会員登録

ユーザー内検索

<< 2025/5 >>

    123
45678910
11121314151617
18192021222324
25262728293031

リンク・クリップ

自作♪パルスジェネレータ(車&バイク用) 
カテゴリ:その他(カテゴリ未設定)
2017/01/30 21:33:58
自作♪GPI++:ギアポジションインジケーターVer5(MT用) 
カテゴリ:≡ 電子工作にチャレンジ♪
2016/08/27 23:18:43
【PSI++】自作ドライビングモニター でけたぁ~♪ 
カテゴリ:≡ 電子工作にチャレンジ♪
2014/09/16 23:08:56

愛車一覧

三菱 ランサーエボリューションX 三菱 ランサーエボリューションX
セクシーなXにあこがれて9GTから乗り換えました♪ ファントムブラックの5MTです. ...
三菱 ランサーエボリューションIX 三菱 ランサーエボリューションIX
納車されました(^^ セクシーなエボⅨにあこがれて思い切って買い換えました。ん~黒のボで ...
三菱 パジェロ 三菱 パジェロ
幼少の頃からパリダカで活躍するパジェロに興味があり、初めての車にパジェロを物色していると ...
三菱 ランサーエボリューションVII 三菱 ランサーエボリューションVII
頭文字D見てマニュアルの車にあこがれ、ワイルドスピード×2見て刺激され買ってしまいました。

過去のブログ

2018年
01月02月03月04月05月06月
07月08月09月10月11月12月
2016年
01月02月03月04月05月06月
07月08月09月10月11月12月
2015年
01月02月03月04月05月06月
07月08月09月10月11月12月
2014年
01月02月03月04月05月06月
07月08月09月10月11月12月
2013年
01月02月03月04月05月06月
07月08月09月10月11月12月
2012年
01月02月03月04月05月06月
07月08月09月10月11月12月
2011年
01月02月03月04月05月06月
07月08月09月10月11月12月
2010年
01月02月03月04月05月06月
07月08月09月10月11月12月
2009年
01月02月03月04月05月06月
07月08月09月10月11月12月
2008年
01月02月03月04月05月06月
07月08月09月10月11月12月
2007年
01月02月03月04月05月06月
07月08月09月10月11月12月
2006年
01月02月03月04月05月06月
07月08月09月10月11月12月
ヘルプ利用規約サイトマップ

あなたの愛車、今いくら?

複数社の査定額を比較して愛車の最高額を調べよう!

あなたの愛車、今いくら?
メーカー
モデル
年式
走行距離(km)
© LY Corporation