ELM327の載ったデバイスを手に入れたので、今エントリでは実際に自動車に取り付けて動作確認をしたいと思います。
前回のエントリで自分はBluetooth版デバイスを買いましたが、基本的にデバイスとお話しする方法はシリアル通信となります。RS-232C接続(つまりシリアル接続)の場合には該当するデバイスとお話をすればいいですし、USBやBluetoothの場合、各OSで仮想的なシリアルデバイスを作成できます(WindowsだったらCOM1とか、Macだったら/dev/tty.*とか)。
MacだとBluetoothで仮想デバイスを使って常にお話しするのはどうも安定性に欠けるようなのですが(Snow Leopardは長く試してないので改善しているかもしれません)、いずれにせよ動作確認のためだけであれば問題ないでしょう。
普通だったらここで実際に配布されているソフトウェアを使って動作確認をするのでしょうが、自分の場合は(それだとつまらないので)実際にターミナル経由でデバイスと直接お話をしてみることにします。
プロトコル
ELM327は古き良きATコマンドを含む対話型のインタフェースを提供しています。詳細は前回のエントリでも紹介したELM327のデータシートに書かれているのでそれを参考に進めます。
ま、英語なので斜め読みして頂くとして、重要なのは5ページ目の “Communicating with the ELM327″からです。曰く、「>プロンプトが出てきたらコマンド入れてリターンすれば結果が返ってくる(超訳)」とのこと。ま、そのほかにも大文字小文字区別しないとか、スペースをどこに挿入しても関係ないとかいろいろ書いてありますが、ま、気にしないことにします。
で、そのコマンドですが7ページ下部からずずっと載っています。
AT Z とするとreset allです。デバイスが再起動します(車の情報をリセットする訳じゃありません)。このときにELM327チップのバージョンが分かります。
AT RVとすると、ELM327に届く電圧(≒バッテリの電圧)を測ることができます。定格12Vですが、実際にはもう少し余裕を持った値になっている可能性があります。
実際にバッテリの電圧を調べるということを22ページ目で示していますので、参考になります。
このコマンドがATで始まらない場合には、ELM327は入力されたコマンドをOBDコマンドと解釈します(23ページ)。24ページ以降に実際にOBDコマンドがいくつか紹介されていますが、WikipediaのOBD-II_PIDsを見た方が手っ取り早いかもしれません。
たとえば、01 05 と打てばEngine coolant temperatureがわかり、01 0Cと打てばエンジン回転数が分かります。
接続
ELM327は、数多くの車種に対応しています。さらには、それらの車種で使われている詳細なプロトコルを自動判別して差異を吸収してくれるすぐれものです(ELM326にはそのような機能はなく、CANを使うマツダ車などは対応していなかったようです)。
車によってコネクタの位置が違うのですが、これは他社さんのページで申し訳ないのですがBLITZなど、同じコネクタを使う製品を出されている会社の情報を参考にするとすぐに分かると思います。たとえば、こちらのページから参照できる車種別適合表などは参考になると思います。
ターミナル
シリアルな機器と(手っ取り早く)お話しするときには、ターミナルを利用します。ZTermとかいろいろありますが、自分はminicomを使いました(macportsからインストール)。まぁ、お好きな物を使えばよいと思います。
基本的にデフォルトで動きましたが、add linefeedはonにしないと全て同じ行に表示されてしまいました。実際の様子はこんな感じです。
いろいろ返事がもらえていますが、OBDコマンドの場合には3バイト目からが実際の値になります。
たとえば01 0Cの返事に
41 0C 0D 2F
が返ってきていますが、ここで大事なのは0D 2Fです。これを16進数から10進数に直すと3375です。この値はエンジン回転数の4倍の値が返ってきているので(wikipediaの該当部分参照)、実際の値は843.75rpmとなります。RX-8のアイドリング時(エンジンが暖まってきた後)はだいたいこんなものなので比較的正常な値が取れていることが分かります。
とまぁ、デバイスもきちんと動いているようなので、次回からは実際にプログラミングをして値を取り出すことにしてみます。