忍者ブログ

≪ 前の記事次の記事 ≫

【OBDで車とお話】ELM327データシート

車のエンジン回転数や速度、その他情報を読んでみる企画です。
近年の自動車は各コントローラ間の通信にCANを用いていたり、共通のメンテナンス用の通信規格(?)としてOBDIIってのがあります。そこにいろんな情報が流れているので読んでみましょうと。

マイコンを使ってOBDIIの規格で通信をするのは骨が折れるので、
シリアル通信でOBDIIのコマンドをやりとりできるELM327ってICを使います。
で、都合の良いことに、このICとシリアル-Bluetooth変換モジュールが乗っかったアダプタがあるので手に入れます。
いろーんな種類が\1000くらいから。安いっ。
自分が買ったのはこれ。

お店の方で全数チェックして出荷してるとのことで安心。なぜかシガーソケットからUSB電源取るやつもついてくる。

-----------2016/02/27追記-----------
↑販売終わってますね
この辺が同等品です。Amazonで"ELM327"で検索するとたくさんヒットします。700円くらいから。

----------------------

OBDII端子は大抵車のステアリング下あたりにあります。

これでパソコンなりスマホなりとBluetoothでペアリングしてターミナルソフトからコマンドポチポチするだけで車の情報が読めちゃいます。

このアダプタとスマホを使ってタコメータとかスピードメータを表示するアプリもあるので使ってみたけど、表示更新が遅かったりしてイマイチ。
とりあえず自在に扱えるようにデータシートを読みまーす。
ELM327データシート
なかなか日本語で解説しているサイトがないので翻訳していきましょう。
英語できないのでまずはそのまま翻訳。
随時更新。

各ピンの説明
MCLR (pin1)
Low入力でデバイスのリセット。このピンを使わない時はHighに接続する
Vmeasure (pin2)
0~5Vのアナログ入力。ELM327の電源電圧を超えないように注意。使わない時はVDDかVSSに接続する。
J1850Volts (pin3)
J1850バスの+出力の電源コントロールに使う。8Vが要求された時Highレベル、5Vが要求された時はLowレベルを出力する。これはPP12によって変わる。
このスイッチング機能が必要ないときはオープンで。
J1850 Bus+ (pin4)
J1850 Bus+ラインをアクティブレベルにするのに使う。
Memory (pin5)
メモリー設定のデフォルトの状態を決める入力。電源ONもしくはリセット時にHighなら、メモリー機能はデフォルトで有効になる。起動後はAT M1, ATM0でそれぞれ有効、無効を切り替えられる。
Baud Rate (pin6)
RS232インターフェースのデフォルトのボーレートを決定する。電源ONもしくはリセット時にHighならボーレートは38400bps、Lowレベルなら9600bpsになる。コマンドPP 0Cでも38400bpsに設定できる。
LFmode (pin7)
デフォルトのライン送りを設定する。電源ONもしくはリセット時にHighなら、ELM327のメッセージの終わりにはキャリッジリターンと改行が送られる。Lowならキャリッジリターンのみとなる。AT L1(改行あり)とAT L0(改行なし)でも切り替えられる。
Vss (pin8)
GND
XT1, XT2 (pin9, pin10)
4.000MHzのオシレータを接続し、キャパシタ(通常27pF)を各ピンからVssにつなぐ。
VPW In (pin11)
J1850 VPWデータ信号の入力。バスがrest時(bus recessive)はLowレベルである必要がある。また、入力はシュミットトリガ付きで、特別なアンプ等の処理は必要ない。
ISO In (pin12)
ISO9141とISO14230の入力。K Lineの信号で、Bus recessiveのときHighになる。シュミットトリガ入力。
PWM In (pin13)
J1850の入力ピンで、bus recessive時などにはHighレベルになる。シュミットトリガ入力。
J1850 Bus- (pin14)
J1850 PWMのJ1850バス+ラインをactive(dominant)レベルにするために使う。使用しない場合はオープンに。
IgnMon / RTS (pin15)
電源制御オプション(PowerControlOptions)(PP 0E)の設定によって動作が変わる入力ピンである。
PP 0Eのbit2とbit7が1なら、このピンはイグニッションモニターとして働く。車のイグニッション信号がオフになり、ピンの信号がLowレベルになると、Low Powerモードに移行する。入力信号のノイズ対策として内部のDebounceタイマが使われる。
Pin15の電圧が再びHighに戻って設定時間たつと、ELM327は”Warm Start”し通常動作になる。設定時間はPP 0Eのbit1で設定する(1秒 or 5秒)。PP 0Eのbit2に依らずpin15のLowからHighへの変化で通常モードへと移行する。いつどのようにスタンバイモードにするか選択し、イグニッション電圧やスイッチ入力によってスタンバイから回復するといった処理ができる。
PP 0Eのbit2かbit7が0だと、送信要求入力として働く。OBDプロセスに割り込みで新しいコマンドを送るためや、イグニッションがオフになったのを検知するのに使う。通常はHighレベル。attentionでLowになり、Busyライン(pin16)がbusyでなくなるかプロンプトキャラクターを受信するまで維持する(pin16が電源制御に用いる設定の時)。
シュミットトリガ入力。デフォルトではpin15はRTS割り込み入力として働く。
PwrCtrl / Busy (pin16)
電源制御オプション(PowerControlOptions)(PP 0E)の設定によって動作が変わる入力ピンである。
PP 0Eのbit7が1なら(デフォルト)、このピンは電源制御出力として働く。通常時のピン状態はPP 0Eのbit6で決定され、ELM327がLowPowerモードになった時に出力が反転する。この出力は制御Enable信号としてや、リレーを動作させるのに使う。77ページ’Modifications for Low Power Standby Operation’参照。
PP 0Eのbit7が0の時、pin16は’Busy’出力として働く。ELM327がコマンド処理中はHighレベル、コマンド受付の準備ができているときはLowレベルとなる。
初期状態ではPP 0Eのbit7は1であり、pin16は電源制御機能として働く。
RX232Tx (pin17)
RS232の送信。
RX232Rx (pin18)
RS232の受信。シュミットトリガ入力。
Vss (pin19)
GND
VDD (pin20)
電源。
ISO K, L (pin21, 22)
ISO9141とISO14230バス。最近の車種はLを使わないものが多い。その場合はオープンで。
CAN Tx, Rx (pin23, 24)
CANトランシーバICにつながる。使わない場合はpin24はHighレベルにしておく。
RS232 Rx LED, Tx LED (pin 25, 26)
OBD Rx LED, Tx LED (pin27, 28)
通常時はHigh出力。ELM327が送信中や受信中にLowになる。これらのピンはLEDを直接駆動できる。必要ない場合はオープンに。
Pin28はすべてのパラメータをオフにするのにも使える。詳細は58ページ。

Unused Pins
Pin12, 13はLowに、残りの入力端子はHighにしておく。


Overview
概要
はじめにどのように通信するか。次にATコマンドを使ったオプションの変更について。最後に故障コードを得る方法とそれらをリセットする方法について述べる。
ほとんどのユーザーはATコマンドを発行したりタイムアウトの設定をしたりヘッダーを変えたりといった操作は必要ない。PCやスマートフォン等のターミナルソフトとちょいとのOBDコマンドの知識があればおっけー。

Communicating with the ELM327
ELM327との通信
ELM327はPCとRS232によって通信する。最近のPCには232のポートがないので、USBシリアル変換ケーブルやBluetoothアダプタなどを用いて仮想シリアルポート経由で通信してね。通信するソフトは、よくあるハイパーターミナル等のターミナルソフトを使ってね。
ターミナルソフトの通信速度の設定は、9600bps(pin6 = Low)か38400bps(pin6 = High)。
その他の設定は 8bitデータ、パリティなし、ストップビット1。ELM327からの応答の最後はキャリッジリターンだけなので、それで改行になる設定にしておくと吉。ELM327の設定で改行コードも出すことができるけど。
正しくつないでELM327に電源を入れると、4つのLEDが点灯して次のメッセージが出力される。
ELM327 v2.0
>
文字’>’はELM327のプロンプト文字。デバイスがアイドル状態であることを示し、RS232ポートからコマンドを受信することができる。この出力が確認できなかった時はコマンド AT Z[リターン] を送ってデバイスをリセットしてみて。ATとZの間のスペースは無くてもいい。これで変な文字が返ってくるようならボーレートの確認をしてみてね。
PCから送ったコマンドはELM327の内部だけで用いられるか、車のフォーマットに合わせて送られる。内部だけで用いられるのはATで始まるコマンド。OBDコマンドは0~9とA~Fのみで構成される。
いずれのコマンドも、最後はキャリッジリターン(0x0D)で終わる必要がある。不完全なコマンドでキャリッジリターンがない場合は内部タイマによって20秒後に破棄される。その際ELM327は’?’を出力する。間違ったコマンドが送られた時も’?’が返される。ただし、車両がコマンドを認識したかの表示ではないので注意が必要。OBDメッセージの有効性については確認しない。
OBDコマンドの処理中は、ELM327はRTS入力とRS232入力からデータが来ないかモニタし続ける。割り込みがあればすぐユーザーにコントロールが戻る。次のコマンドを送る前に、ELM327から’>’が来るかBusy出力ピンがLowになるのを待ってね。
コマンドの大文字小文字は関係ないので、’ATZ’でも’AtZ’でも’atz’でも同じである。スペースや制御文字は無視するので、可読性のために使っても大丈夫。
単にキャリッジリターンを送ると、前のコマンドを再び実行する。
稀に、NULL文字(0x00)が送信されることがあるけど無視してね。Microchipが悪いよ。


ATコマンド
基本的には触る必要はないけど、タイムアウト値やヘッダーバイトを変えたりといった設定をするのにATコマンドを用いる。
PCのモデムなんかでよく使う方法で、ELM327も同様にPCからのデータを常に確認し’AT’で始まる文字列が来ると続く文字列を解釈して、リターンが来るとコンフィグレーションやATコマンドを実行する。設定を変更するだけのコマンドでは、成功すると’OK’と返す。
いくつかのコマンドでは、値を決めるために16進数2桁の数字を続けて送信する。On/Offタイプの設定では1か0を送る。
以下ATコマンドリスト。*ついてるのがデフォルトの設定。詳細は11ページから。

<略>

バッテリー電圧読み取り
ATコマンドのの使い方の例を示す。P71のFig.9の回路ではバッテリーの電圧を読むことができる。
ATコマンドリストのRVを用いる。'>'が表示されていることを確認し、'AT RV'と入力しenterを押す。
>AT RV
このコマンドに対する応答は電圧となる。
12.6V
>
この精度はいくつかの要因による。工場出荷状態での精度は2%。更に良い精度にするために、キャリブレーションをするコマンドがある。
まずはテスタなどで精度よくバッテリの電圧を測っておく。
12.47Vだったとする。ELM327での値が12.6Vだったとして、テスタで測った電圧に合わせたいとする。この場合、単純にテスタで測った電圧をCVコマンドで送れば良い。
>AT CV 1247
OK
ELM327は2桁目と3桁目の間に小数点があると認識する。
ここで、内臓のキャリブレーション値が更新され、EEPROMに書き込まれる。入力電圧正しく12.47Vとして認識されるようになる。電圧を読んでみる。
>AT RV
12.5V
ELM327は測定値を丸めて3桁で表示する。
バッテリー以外でも他の既知の電圧源でキャリブレーションすることができる。9Vの乾電池を用いて精確には9.32Vだったとする。CVコマンドの引数の電圧は頭に0を付けて4桁で表記する。
>AT CV 0932
OK
もし変な値を設定してしまった場合は、CV 0000でキャリブレーション値を工場出荷状態に戻すことができる。
>AT CV 0000
OK
他のATコマンドも同様に使うことができる。単純にA、Tと入力し、送りたいコマンドと必要な引数を送信する。最後にリターン(Enter)。可読性を上げるために途中にスペースを入れても構わない。

P29
OBDコマンド

'AT'以外の文字が送られた場合はOBDコマンドとして認識される。それが16進数であるか確認し、車両に送信するデータに結合する。
OBDコマンドは車両に送られる。3つのヘッダバイトとエラーチェックサムバイトが含まれ、ELM327は3つの拡張データをコマンドに付加する。この拡張データの初期値はほとんどの要求に適したものであるが、変えたい場合はその方法が用意されている('Setting the Headers'の項を参照)。
ほとんどのOBDコマンドは1もしくは2バイトの長さである。ELM327は標準である7バイトのデータ長に制限する。それ以上送るとエラーになる。はみ出た分は無視され、'?'を返す。
ELM327との通信にはOBDの標準である16進が使われる。0xA6(166)って値を送る場合、ユーザーが'A6'と入力し最後にリターン(Enter)を押すと、はじめの2文字を1バイトの数値と認識し、ヘッダバイトとチェックサムを付加した合計5バイトを車両に送る。ここで、リターンはELM327への信号であり車両には送られない。
コマンドを送ると、ELM327はOBDバスを監視して応答を待つ。メッセージアドレスが合致するとRS232から受信データが送信される。アドレスに合致しないメッセージは無視される。ただしこの無視したメッセージもAT BDコマンドで見ることができる。
AT STコマンドで設定されている時間メッセージが見つからなくなるまで待ち続ける。メッセージを受信している限りこのタイマをリセットし続ける。いつでも何かしらの応答は示すが、メッセージが見つからなかったり受信フォーマットがおかしい時は'NO DATA'を返す。

くるまとおはなし
車に送るOBDコマンドはちゃんと規格にのっとったものにする。はじめのバイトは要求されるデータの型、2バイト目以降は必要とする実際の情報で'Parameter identification(PID)'と呼ばれるもの。モードとPIDはSAE J1979やISO15031-5で規定されているものやメーカーによって規定されているものがある。
SAE J1979では下に示す10の診断モードが規定されている。
01 現在のデータを取得
02 フリーズフレームデータを取得
03 トラブルコードを取得
04 トラブルコードのクリア
05 酸素センサのテスト結果
06 断続的に見たテスト結果
07 保留されたトラブルコードの取得
08 特別な制御モード
09 車両の情報の要求
0A 永久的なトラブルコードの取得
車両はすべてのモードをサポートする必要はなく、モード中でもすべてのPIDに対応する必要もない。初期のOBDIIな車両はほんの少ししか対応してなかった。いずれのモードにおいても、PID 00はどのPIDがサポートされているかを示すのに使われる。モード01のPID 00はすべての車両でサポートされ、以下の方法でアクセスできる。
ELM327が正しく車両に取り付けられ、電源が入っていることを確認する。ほとんど車両ではイグニッションキーをONの位置にしないと応答はないのでONにする。まだエンジンはかけないでね。まずインターフェースの状態をリセットする。
>AT Z
LEDが点滅し、'ELM327 v2.0'と応答があるのを確認してね。続いて通信プロトコルを選択する。これは単純に'0'とすることで正しいプロトコルを探させる。
>AT SP 0
これで車両と通信する準備が完了である。モード01のPID 00コマンドを発行して。
>01 00
ELM327は'SEARCHING...'と返す。続いて次のような数値を返してくる。
41 00 BE 1F B8 10
'41'はこれがモード01の応答であることを示している(01 + 40 = 41)。次の'00'はPIDの要求をリピートしているだけ。モード02への応答であれば'42'、モード03の応答ならば'43'といった具合。次の4バイトのデータは要求したデータを表す。この場合、このモードでサポートされているPIDをビットパターンで表している('1'ならサポートされている)。
エンジンのクーラントの温度を見てみよう。モード01のPID 05である。
>01 05
応答例は
41 05 7B
こんなかんじ。'41 05'はモード01のPID 05への応答であることを示す。'7B'が所望のデータで、10進数に変換してオフセットの40を引いた値がクーラントの温度となる。この場合123-40で83℃である。
最後はエンジン回転数を見てみよう。
>01 0C
エンジンがかかっていれば
41 0C 1A F8
てな感じで返ってくる。'1A F8'を10進数に変換して6904。4倍の値で送られているので6904/4=1726rpmがエンジン回転数である。
これらの例ではOBDプロトコルとかを意識せずに車の情報を得ている。ELM327がフォーマットを整えたり変換したりしているからねっ。もーっと複雑なことをしようとしなければプロトコルとかについて知る必要はない。
この例では一つの要求に対して一行の応答のみだったが、いくつかの行に分かれるものもある。複数のECUから帰ってきたり、一つのECUでも複数データを組み合わせて応答をみるものも。詳細はP44'Multiple Responses'を見てね。この可変行の応答に対応するため、ELM327は更に応答が来ないか待つ。ある時間メッセージが来なかったら終わりと判断する。このタイマは最初の応答が来るまでの時間にも適用され、時間内にデータが来なければ'NO DATA'を返す。
ELM327のVersion 1.3ではいくつの応答が返ってくるか既知の場合に処理を早くする方法が実装されている。ELM327に難行の応答がくるか教えることで、いつ受信完了するかわかる。んで、最後のタイムアウトを待つ必要がなくなる。OBDコマンドの最後に1桁の16進の数字でいくつの応答を得るか書くだけ。一つの応答が来るエンジン温度の例がこちら。
>01 05 1
EM327は1つの応答があったらすぐに受信待ちから抜ける。デフォルトの待ち時間は200msecなのでかなり時間を節約できる。AT STで待ち時間設定できると思われる。ELM327は、要求を送ったあとこのタイマをセットするけど、ひとつめの応答が帰ってこないときのため。
J1850 PWM等のプロトコルはすべてのメッセージに対してELM327からのアクノリッジを必要とする。
もしとても小さい数のレスポンスを提供するなら、ELM327は早くプロンプトに戻る。また、アクノリッジがないメッセージをECUが再送しようとする間、バスが混んじゃう。このため、いくつのレスポンスがくるのか事前に知っておかなければならない。
例:VIN(vehicle identification number)の受信。この数字は17桁で、5行にわたって送信されてくる。モード09のPID 02で要求できる。
>09 02
もしくは
 >09 02 5
"5"は応答の行数。間違ってこれより少ない数にしないように。
 応答の数を明確にするメリットは
インターフェースの手順によっていくつのレスポンスが来るのか決定できる。この数字を送信命令に付加することで応答時間を最適化できる。いくつかのトラブルコードを得るためには、この節約はあまり意味がなく、要求をするための古い方法の簡単な使い方である。
 そこで、車から情報を得るスピードの最適化をするにあたっての注意点を述べる。2002年4月に出たJ1979によると、J1850要求の送信を100ms周期以上でやるのは禁止。2002年4月のアップデートでは、スキャンツールはレスポンスをすべて受信したら遅れなしに次の要求を出すことができる。これより前の車は、速すぎる要求を許容できないかも知れないので注意が必要である。
 モードとかPIDのさらなる情報はSAE(www.sae.org)とかISO(www.iso.org)とかwebを漁ってね。


Interpreting Trouble Codes
 モード03でトラブルコードを得られる。でもまずはいくつのトラブルコードが出てるか知る必要がある。
 >01 01
応答例は
 41 01 81 07 65 04
41 01 はリクエストへの応答を示し、次の"81"は今のトラブルコードの数を示す。単純に0x81個(129個)ではないよ。

頭1ビットをとったものが、保存されているトラブルコードの数となる。
この例ではトラブルコードは1つ。チェックエンジンランプorMIL。続きのデータはパーティキュラーモジュールのテストの情報。
 この例では1行だけだったけど複数のモジュールでコードが保存されていた場合はそれぞれの数分の行数が出る。どのモジュールがトラブルコードを吐いたのか汁には、ヘッダーをAT H1に変えて3バイトヘッダの3バイト目を見てその情報を送ったモジュールのアドレスを確認する。
貯まってるコードの数を確認したら、モード03の要求によって実際のトラブルコードを要求する。
>03
43 01 33 00 00 00 00
 "43"はモード03への応答を示す。残りの6バイトは、2バイトずつ組で読む。"00"で始まる応答は実際のコードではないよ。
 蓄えられたコードの数を要求するとき、それぞれのトラブルコードの重要なビットは追加の情報を含む。次の表を用いて1桁目から判断する。

 トラブルコードが"0133"だった場合、はじめの"0"は"P0"と置き換えられ、"P0133"となる。これは酸素センサ回路の応答が悪いことを示す。ISO15765-4(CAN)プロトコルはかなり似てるが、拡張データバイトが追加されている。いくつのデータアイテムがあるかは後で示す。
 
Resetting Trouble Codes
 ELM327は、モード04のコマンドを用いて診断コードをリセットすることができる。やる前に動作をよーく考えて。
 ・トラブルコードの数をリセット
 ・診断コードの消去
 ・フリーズフレームデータの消去
 ・フリーズフレームを伝えるDTCの消去
 ・酸素センサーのテストデータの消去
 ・モード06と07の情報の消去
 ・永久的なトラブルコードはECUによってのみ消去できる
 これらのデータの消去は別にELM327に限った機能じゃないし、いろんなスキャンツールでできる。ただ、大きな問題として車両の寿命が縮むよん。再キャリブレーションをするから???

Quick Guide for Reading Trouble Codes
SAEでは、モード04を送る前にしっかり確認することを規定している。すべてのトラブルコードは送るとすぐに消える。ELM327はメッセージ内容は特に表示したりしないので、ソフト的に対応してね。
 実際に診断コードを消すよ。モード04を送るだけ。44が返ってきてMILが消える。消すのにちょっと条件がいる車両もある。イグニッションオンでエンジンはかかっていない状態、とか。
 というように、モード04を送るだけでトラブルコードが消えるので、間違って送っちゃわないように。

P34
Bus Initiation
ISO9141-2とISO14230-4では車のOBDバスは、通信が行われる前に初期化されるとしている。ISO1931は初期化プロセスに2~3秒かけることを許す。ISO14230はその遅いプロセスと速いの両方に対応している。
 ELM327はこのバス初期化を行う。この間FIとSIコマンドは使える。自動サーチ中にバス初期化していた場合ステータスの応答はこない。でも自動オプションをオフに(プロトコル3, 4, 5のどれか)していれば次のようなメッセージが得られる。
 BUS INIT: ...
 3つのドットは遅い初期化プロセスの時に出る。成功すれば"OK"、失敗ならエラーメッセージがでる(よくあるのはキーをONにしてないとか)。
 一度バスの初期化が完了すると、定期的に通信する必要がある。通常は少なくとも5秒に一度だがそれをすぎるとバスはスリープモードに戻る。ELM327はバスがスリープに入らないようリクエストを送る。送信LEDの点滅で確認できる。
 デフォルトでは、ELM327からの'wakeup'、'idle'メッセージは3秒ごとに送られるが、AT SWコマンドで5秒までに変えることができる。Wakeupメッセージの内容もAT WMコマンドで変えられるが、通常ほとんどのケースではその必要はない。

Wakeup Messages
ISO9141とISO14230の接続が確立されると、周期的なデータを送って接続を続けてスリープに入るのを防ぐ。通常通りリクエストと応答がやりとりされていれば問題ないが、接続が切れるのを防ぐためにELM327は稀にメッセージを送る。
 これを’Wakeup Message’と呼ぶ。ELM327は、他の動作をしていない時にこれを勝手に送信する。OBD送信LEDで確認できる。
 このメッセージの内容は、プロトコルによる。ISO9141では68 6A F1 01 00。ISO14230(KWP)ではC1 33 F1 3E。この内容はWMコマンドで変更できる。ヘッダーバイト11 22 33で内容44 55としたい場合は
>AT WM 11 22 33 44 55
とすればお。ELM327はこれに自動でチェックサムを付け足して送信する。今のVer.のELM327ではメッセージの数は1~6バイト(チェックサム含まず)に制限される。

Selecting Protocols
 ELM327はいくつかの通信プロトコルに対応している。プロトコルのセットはSPコマンド。
>AT SP 2
OK
これでプロトコル2(SAE J1850VPW(10.4kbaud))にセットされる。以降、電源オン時やAT Dコマンド後のデフォルトが2となる。DPコマンドで設定されているプロトコルを確認できる。
>AT DP
SAE J1850 VPW
 他のプロトコルの車両に接続する場合ははじめに試すプロトコルの前に’A’をつける。
>AT SP A2
OK
>AT DP
AUTO, SAE J1850 VPW
こうするとはじめにプロトコル2を試し、それがだめなら他のを自動で探す。
 SPコマンドをすると内蔵EEPROMへの書き込みを行う。ちょいと時間かかるよ。それを避けるのに、書き込みをする前にプロトコルを試すTP(Try Protocol)コマンドが用意されている。
 SPコマンドと違うのは、正しいプロトコルが見つかり、かつメモリーファンクションが有効(AT M1)の時のみであること。
 >AT TP A2
 OK
 たいてい一発でプロトコルを当てるのは難しいので単純にELM327にプロトコルを決めてもらおう。この自動サーチはプロトコル0でできる。
 >AT SP 0
OK
次のOBDコマンドを送るときにその応答を確定する。'SEARCHING...'メッセージのあとにDPコマンドでどのプロトコルになったか確認することができる。
 SSコマンドでSAE J1978の順でプロトコルをサーチできる。もしくはTPコマンドを使って自分で順番にやるか。
 自動サーチはたいていうまく行く。サーチ中は、ユーザが事前に決めたヘッダーバイトの設定を無視してデフォルトのOBDヘッダを使う。それは通常のリクエスト(01 00とか)でも使われるので注意。
 ECUへの接続試行中に自分で決めたヘッダを使うには、プロトコル0を使わないこと。代わりに、プロトコルを直接指定(AT SP n)するか、使うプロトコル+サーチの設定(AT SP An)にする。ヘッダをセットしておいてリクエストを送るとちゃんと決めたヘッダとデータを使う。それが失敗したときだけ標準のOBD値を使う。
 たいていの場合、オートでサーチ(AT SP 0)してメモリーを有効に(ピン5を5Vに)していればうまくいく。初期サーチが済むと、AT SP 0するまでそのプロトコルが新しいデフォルトとして設定される。

OBD Message Formats
 ここではOBDメッセージの内容について。あとはヘッダとかチェックサムも。
 OBDシステムはとってもフレキシブル。いろんなデバイスとやりとりする。デバイス間でやりとりするために、情報を付加する。加えて、情報の重要性を伝達するためメッセージには優先度も含まれる。例えばクランクシャフトの情報はトラブルコードの数とかより大事。
 ヘッダバイトは、メッセージの優先度とレシーバ、トランスミッタの3バイトからなる。
レシーバはソースアドレスSA、トランスミッタアドレスTAとも呼ぶ。
 メッセージを送っている時に競合するとエラーが起きて受信データはおかしくなる。エラーと検知するため受信データをチェックする方法が提供されている。受信側は受信したデータの和をとり、データの最後についてくるチェックサムの値と比較する。単純な足し算では複数のエラーを検知することはできないのでさらなる信頼性のためにCRC(Cyclic Redundancy Check)を使ったりする。プロトコルによっていろんなエラー検知法やエラーの時のデータの扱いに種類がある。
 OBDデータバイトは初めのヘッダーバイトや終わりのチェックサムメッセージに挟まれる。J1850とISO9141-2, ISO14230-4プロトコルは本質的に同じ構造を取る。3バイトのヘッダ、7バイトまでのデータバイト、1バイトのチェックサム。
 ISO15765-4(CAN)はとっても似た構造。主な違いはヘッダ。CANのヘッダはIDビットと呼ぶ。11ビットor29ビット。
 

--- とりあえずここまで ---

拍手

PR

Comment (0) | ▲TOP

Comment

  • メールアドレスは入力しても管理画面でしか表示されません。
  • コメント投稿時にパスワードを設定していた場合のみ、名前をクリックすると編集出来ます。

Vodafone絵文字 i-mode絵文字 Ezweb絵文字