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

OBD2(OBDII)で遊ぼう 其の一:ELM327と通信

OBD2(OBDII)で遊ぼう 其の一:ELM327と通信 結構前からOBDから車の情報を取得できないかなぁ~なんてゆーことを漠然と妄想しておりました.

むずかしーんだろーなぁとか無理かな?とか調べもしないであきらめムードたっぷりだったのですが、みんカラでもOBD端子から情報拾って楽しんでいる方が結構いることに気付きました.一体どうやってデータを得ているのかな?と読み進めると、どうやらELM社のチップ(or Clone)を利用した機器を使っているようです.

ELM社のHPにあるデータシート(PDF)を開いてみると内部ではシリアル通信で車輌プロトコルに変換して情報のやりとりをしていることが分かります.つまり、各種プロトコルを意識することなくこのチップが車輌とお話ししてくれるので、どういう会話をしろ!という命令をシリアル通信で与えればよいことになります(正確には違いますが、おおざっぱにはそういう感じ)  これならできそーだ(^ー^o 一気にハードルが下がった感じがしますね♪

OBD端子に接続して情報を表示する機器は、インフォメータをはじめ様々なものが販売されています .どういった情報が得られるのかは、こちらを参照してもらうと分かります.各要素にIDが振られているのでシリアル通信でこれを発行すると決まったバイト数のデータが戻ってくるようです.これを、要素別変換式で翻訳してやると意味のある値として得ることができるみたいです.車輌診断機でしかわからないトラブルコードも得られるようですね.おもしろそう! ん~簡単そーにみえたけど、やっぱりハードル高いか・・・!!??

さて、今回はみんカラでも至る所で紹介されているELM327、およびその姉妹品的なOBD2接続器に関して書いてみます.普通なら車輌のOBD端子に接続して、スマホでBluetoothペアリング済ませたらTorquなどのアプリで接続するのが一般的. なのですが、それではつまらないのでBluetooth版を購入して有線化してみました.これでPCやマイコンからいじりやすくなりますネッ.

とゆ~ことで、OBD計器が作りたくていろいろ模索し始めてみたのが今回の内容です.同じように自作を考えている方にはちょっとしたヒントになるのではないでしょうか.手探り状態なので、遠回りしている感もありますが、それはそれ.素人なりに悩んでみます(^ー^/


※【OBD2(OBDII)で遊ぼう 其の二】もご覧下さいませ/



対応している車輌プロトコル

OBDの全てのプロトコルに対応してます.しかしながらCANプロトコルを利用するにはさらに別のICが必要になりますが、冒頭で紹介したような機器には大抵セットで組み込まれているので、そこら辺は意識する必要はありません.

OBD機器を自作する手前、ELMチップを購入して1から設計しようかと一瞬思いましたが、まずは手っ取り早く市販の機器をつかってこれに手を加えて素性を確認してみることにしました.

・・・ というか、自分の手に負えるものなのかどうかを確かめる意味合いの方が強い.

マイクロコントローラ(MPU)との接続方法もデータシートに載っているのでこれを参照してテスト回路を作り込みます.今回の場合シリアル通信は”送信”と、その反応を”受信”するという高度な技(←黒っ9にとって)が必要になってきます.ここら辺がかなり自信なし・・・. データの送信か受信を一方通行で行う通信はちょっぴり試したことがありますが、今回は双方向通信なので、頭を悩ませること間違いなし.



車輌側OBD2コネクタ例

ELM327機器に電源を供給する端子が分かります.OBD2はバッテリーからの常時電源供給らしいので、ちょっと気持ち悪い.エンジン始動したときに電源供給できるよう改造している方をみかけるのはそういった事情があるようです.

自作回路を作るときには電源を別ラインからとる方が良さそうですね..


さて、久しぶりにのんびりとした休日だったので通信プログラムを作ってみることに.まずはコマンドを投げるところから.これは非常に簡単でコンパイラのリファレンス通りに記述するだけで処理できる.問題は、コマンドを受け取る部分なのだが、これが非常にやっかい.

こちらからコマンドを投げてそのレスポンスをキャッチしなくてはならないのだ.コマンドを投げてから単にELM327から帰ってくるレスポンスを待っていては、他の処理ができない.かといって、全体にループをかけて他の処理をしながらレスポンスの有無をチェックする方法だと、他の処理をしている間にレスポンスが帰ってきてしまい取り逃がしてしまうことになってしまう.う~む.

いろいろ調べた結果、マイコン機能の受信割込機能を使ってみることにしました.これは黒っ9にとって初の試み!要はいつ帰ってくるか分からないレスポンスに対して、”レスポンスがきた時に対応する”処理を作っておいて、そこで受信してバッファリングしておく.こうすることで次に新たに受信しても直前のデータが消えないようにする.

そしたらメインプログラムの方で、都合の良いときになったら先ほどのバッファからデータを読んでくればよい.そうすれば、他の処理をしながら適当にバッファをチェックしてデータがあれば表示なり演算なりをすればよいというお気楽な設計が可能になる! ・・・はず.

回路を考えるのもおもしろいけど、バッファリングアルゴリズムを考えるのもなかなかおもしろい.自分の思考回路をC言語で実現させる.電子工作やプログラムは仕事とは全くの畑違いなので、違った刺激がありますね♪ 作ったプログラムはシミュレータで確かめます.バーチャル通信ポートとELM327を接続して実行! 試行錯誤の結果、ばっちり期待通りの動作をしてくれました!

こうなってくると、実際の回路でも試してみたくなっちゃって、ちょっとまえに自作設計した基板を改良して即席ELM通信装置をこさえてみました.その名も ”ELM327 TALKER” ♪ それがTOP画像の真ん中のやつです.シミュレータからELM327にコマンドを投げるとシミュレータと即席回路の2つで受信します.

即席回路は、何の前触れもなくやってくるレスポンスを見事にとらえてディスプレイしてくれます(^ー^o
今回の実験はひとまず大成功! ELM327と通信ができさえしちゃえば、あとは楽勝でしょう! 次回はランサーに取り付けて任意のPID(データ要素)を指定してデータ取得できるかの実験ですね!

最終的には今回購入したELM327通信機器の部分も全て自作してみようかと.
市販品よりも超小型にできるはず♪
今回Bluetoothも試しましたがもちろん接続OK. ただ、実践で使うにはスマホ設置したりする必要があるので、自分はやらないなぁ~と思ってオーソドックスな有線式シリアル通信に改造して単独計器として製作を進めてみます.

 

【OBD2で取得できるデータ要素一覧 】 ※全リストから一部を抜粋
de
(hex)
PID
(hex)
Data
(Byte)
Description Min value Max value Units Formula
01 00 4 PIDs supported [01 - 20]       Bit encoded [A7..D0] == [PID $01..PID $20] See below.
01 01 4 Monitor status since DTCs cleared. (Includes malfunction indicator lamp (MIL) status and number of DTCs.)       Bit encoded. See below.
01 02 2 Freeze DTC        
01 03 2 Fuel system status       Bit encoded. See below.
01 04 1 Calculated engine load value 0 100  % A*100/255
01 05 1 Engine coolant temperature -40 215 °C A-40
01 06 1 Short term fuel % trim—Bank 1 -100 Subtracting Fuel (Rich Condition) 99.22 Adding Fuel (Lean Condition)  % (A-128) * 100/128
01 07 1 Long term fuel % trim—Bank 1 -100 Subtracting Fuel (Rich Condition) 99.22 Adding Fuel (Lean Condition)  % (A-128) * 100/128
01 08 1 Short term fuel % trim—Bank 2 -100 Subtracting Fuel (Rich Condition) 99.22 Adding Fuel (Lean Condition)  % (A-128) * 100/128
01 09 1 Long term fuel % trim—Bank 2 -100 Subtracting Fuel (Rich Condition) 99.22 Adding Fuel (Lean Condition)  % (A-128) * 100/128
01 0A 1 Fuel pressure 0 765 kPa (gauge) A*3
01 0B 1 Intake manifold absolute pressure 0 255 kPa (absolute) A
01 0C 2 Engine RPM 0 16,383.75 rpm ((A*256)+B)/4
01 0D 1 Vehicle speed 0 255 km/h A
01 0E 1 Timing advance -64 63.5 ° relative to #1 cylinder A/2 - 64
01 0F 1 Intake air temperature -40 215 °C A-40
01 10 2 MAF air flow rate 0 655.35 grams/sec ((A*256)+B) / 100
01 11 1 Throttle position 0 100  % A*100/255
01 12 1 Commanded secondary air status       Bit encoded. See below.
01 1F 2 Run time since engine start 0 65,535 seconds (A*256)+B
01 21 2 Distance traveled with malfunction indicator lamp (MIL) on 0 65,535 km (A*256)+B
01 22 2 Fuel Rail Pressure (relative to manifold vacuum) 0 5177.265 kPa ((A*256)+B) * 0.079
01 23 2 Fuel Rail Pressure (diesel, or gasoline direct inject) 0 655,350 kPa (gauge) ((A*256)+B) * 10
01 2C 1 Commanded EGR 0 100  % A*100/255
01 2D 1 EGR Error -100 99.22  % (A-128) * 100/128
01 2E 1 Commanded evaporative purge 0 100  % A*100/255
01 2F 1 Fuel Level Input 0 100  % A*100/255
01 30 1 # of warm-ups since codes cleared 0 255 N/A A
01 31 2 Distance traveled since codes cleared 0 65,535 km (A*256)+B
01 32 2 Evap. System Vapor Pressure -8,192 8,192 Pa ((A*256)+B)/4 (A and B are two's complementsigned)
01 33 1 Barometric pressure 0 255 kPa (Absolute) A
01 34 4 O2S1_WR_lambda(1):
Equivalence Ratio
Current
0
-128
1.999
127.99
N/A
mA
((A*256)+B)/32,768
((C*256)+D)/256 - 128
01 35 4 O2S2_WR_lambda(1):
Equivalence Ratio
Current
0
-128
2
128
N/A
mA
((A*256)+B)/32,768
((C*256)+D)/256 - 128
01 36 4 O2S3_WR_lambda(1):
Equivalence Ratio
Current
0
-128
2
128
N/A
mA
((A*256)+B)/32768
((C*256)+D)/256 - 128
01 37 4 O2S4_WR_lambda(1):
Equivalence Ratio
Current
0
-128
2
128
N/A
mA
((A*256)+B)/32,768
((C*256)+D)/256 - 128
01 38 4 O2S5_WR_lambda(1):
Equivalence Ratio
Current
0
-128
2
128
N/A
mA
((A*256)+B)/32,768
((C*256)+D)/256 - 128
01 39 4 O2S6_WR_lambda(1):
Equivalence Ratio
Current
0
-128
2
128
N/A
mA
((A*256)+B)/32,768
((C*256)+D)/256 - 128


LCD - Analog scrolling 8 digit odometer with Proteus(ISIS)
ひさしくプログラムから遠ざかっていたので、アルゴリズム構築の頭の体操がてら、先日こんな物を作ってみました.せっかくなので動画も作ってみました♪

海外の方からの問い合わせが意外にあるので、ナレーションは中学生なみのボテボテ英語で(笑) 一見複雑な動きに見えるけど、ソースコードは10数行.カンマ無しの連続した数字ならさらに3行減らせます
(^ー^  YouTube広しといえど何人が製作してるかな?
ブログ一覧 | PIC+電子工作 | 日記
Posted at 2013/03/31 21:27:56

イイね!0件



タグ

今、あなたにおすすめ

ブログ人気記事

本日のランチ
nogizakaさん

あれ....
Keika_493675さん

危険防止の意味を込めて導入します!
のうえさんさん

ドッグイヤー予防接種の春来る
CSDJPさん

ポイ活の日 ( ̄∀ ̄)
のび~さん

また騙されて、、、、悲劇😫 気を ...
なうなさん

この記事へのコメント

2013年3月31日 22:31
そこに目を付けましたか。
最近レーダー探知機もOBDII使ったりしてますねぇ。
これを使ってどんなものが作られるのか楽しみです。

でもでも自分はフルコン入れちゃったからOBDII機器が利用できましぇん。
コメントへの返答
2013年3月31日 22:43
難しそーだな~って指をくわえて見てたけど、ちょいと調査してみたら案外いけそーな感じがしたので挑戦してみやした(^ー^o

双方向通信がクリアできたので、あとは実践のみ.表示器はいろいろ選択肢がありますね♪

今日1日でだいぶ進捗がありましたが、のんびりオモチャを作ってみます/
2013年3月31日 22:39
スロットル開度を...
コメントへの返答
2013年3月31日 23:12
心拍数とか一緒に採ってみるのも?
なんてネッ.
2018年11月29日 14:26
過去記事にコメント失礼します。
現在OBD2からのデータ取得でELM327とArduinoを使ったデータ取得を試みているのですが、今回どのようなマイコンを使ってプログラムの方を組みましたでしょうか?またプログラムの内容を教えて頂けたら幸いです。
コメントへの返答
2018年11月29日 18:56
こんにちは。
8bitのPICを使ってます。ELMとシリアル通信ができればどんなマイコンでも良いでしょう。
プログラムはELMにATコマンドを投げて、割り込みでレスポンスを拾い上げてるだけです。

レスポンスの分析は"其の二"をご覧下さいませ。

プロフィール

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

ユーザー内検索

<< 2025/4 >>

  12345
6789101112
13141516171819
20212223242526
27282930   

リンク・クリップ

自作♪パルスジェネレータ(車&バイク用) 
カテゴリ:その他(カテゴリ未設定)
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