<- BACK

自作タコメーター(さらに実験編)


TOYOTAのOBD2端子

CAN通信もやってみよう!

実験編実用1号機、からの続きです。

たまたまOBD2端子から回転信号(TAC)が取れる車種だったので、タコメーターは比較的イージーに実装することができましたが、やはりCAN通信が気になりますよね。

バッテリー電圧も見たいし、車速を取ってHUDなんかも挑戦してみたいところです。
TOYOTAのOBD2端子

CAN通信ちがった。

で、情報収集する中でわかってきたのが、

最近は「CAN通信」が主流となっている車内ネットワークですが、ちょっと古い車だと「K-Line」だったりします。K-LineはOBD2端子の7番に信号が来ています。うちの車もこれに該当するようです。

※「KWP2000」とも呼ばれますが、KWP2000プロトコルを使う信号ラインにK-Line(PIN 7)とL-Line(PIN 15)があって、現状L-Lineはほとんど使われていないようです。
ELM327 BlueTooth dongle

K-Line簡単攻略法

攻略法はいくつかあるようですが、中でもBlueToothドングルからシリアル通信の信号線を引っ張り出す方法が簡単でいいですね。

ドングルの心臓部に「ELM327」というチップ(ほとんどが中国製クローン)が使われていてECUとの仲介をしてくれます。信号線は5VロジックのArduinoに直結可能です。

写真のようにBlueToothモジュールがそのまんま乗っかってるやつがおススメ。ハンダ付けポイントが一目瞭然です。

----- 参考 -----

mint_@ さん
ArduinoとELM327でOBD取得する
ELM327 BlueTooth dongle check

まずはドングルをチェック

「ELM327 Identifier」という便利なアプリがあるので、これでチェックしておきましょう。

搭載されているELM327チップがどんなコマンドに対応しているのか調べてくれます。

製品が「ELM327 v1.5」表記で、チェックの結果が左画面のような感じだとたぶんOKです。

※製品が「ELM327 v2.1」だと逆に古い車に対応してなくてダメっぽいです。
ELM327 dongle 電流測定

ついでに待機電流をチェック

OBD2端子は基本常時電源になっているので、バッテリー上がりを警戒して多くの方がスイッチを入れたりACC電源に付け替えたりしていますね。

実際の所どれくらいの電流が流れているのでしょう?ただLEDが1個光ってるだけで例えば1mAとかなら全然無視でOKなのになぁと思いつつ、

測ってみると結構流れてました。対策して正解。
ELM327とUSBシリアル変換

まずはおうちで練習

信号線を引っ張り出してきました。

Bluetoothモジュールを残したまま上からハンダ付けで構わないようですが、私は撤去しました。

いきなり車載環境では落ち着いて作業できないので、まずはUSBシリアル変換器を通してパソコンで様子をみていきます。
TeraTerm 画面

繋がった!

ターミナルはTeraTermを使用。スピードは38400baud、他はデフォルト設定でいけました。

ATZでELM327を初期化、ドングルがピカピカッと光ります。

ATIでELM327のバージョンを表示。

ATRVで電圧表示までいけました。ECUに繋がなくても電圧は取れるんですね。簡単です。
Toyota Corolla nze121

車のご紹介

ここから情報の大前提となる車種の確認をしておきます。

9代目カローラの中期モデル(2004年2月登録)、形式「NZE121」、4ATセダンです。電装以外はほぼノーマル。エンジンは「1NZ-FE」

ECUのプロトコルが「ISO 14230-4 KWP(5 baud init 0x8113F1,9.6kbaud」「Toyota OBD-II / EOBD ~1999-2008 K-Line/KWP + extra sensors」(スマホアプリで接続成功した時の表示より)
ELM327 Arduinoに接続

今度はArduinoに接続

Arduinoベースのターミナルに接続してさらに実験。

ATSP4でプロトコルを4番に切替(一回やればEEPROMに記憶される)、ATDPで結果を確認。

010Cで回転数をリクエスト、INITが始まるがまだ車に繋いでいないのでERRORで終了。想定内の動きなので大丈夫です。

----- 参考 -----

黒っ9(クロック) さん
OBD2(OBDII)で遊ぼう 其の一:ELM327と通信

創活こんぺさん支部 さん
【OBDで車とお話】ELM327データシート
ELM327 車載で実験

いよいよ車載で実験

プロトコルを4番にすればそれで繋がりそうだけどすんなりはいかない。トヨタの独自仕様に合わせる必要がありますね。(先人のリサーチ力に感謝)

ATIB96
ATIIA13
ATSH8113F1

これで通信が確立しました。(これらのカスタムはATZ,ATDで元に戻るので注意)

回転数を見てみましょう。
リクエスト:010C
レスポンス:41 0C 0A EC (699 RPM)

水温を見てみましょう。
リクエスト:0105
レスポンス:41 05 7B (83℃)

車速を見てみましょう。
リクエスト:010D
レスポンス:41 0D 00 (0km/h)

正常(っぽい)にデータが取れました!

ここまで来ればあとは気合とセンスでオリジナルのメーターパネルが作り放題!(センスは持ち合わせていないのでつらい、)

----- 参考 -----

TORQUE WIKI - Custom Init

ELM327_data_sheet.pdf - Archived from Elm Electronics official website

WIKIPEDIA - OBDII-PIDs
code

データ処理の実践

まず30-50byte程度のバッファを作り順次シリアルデータを読み込んでいきます。期待される文字列が現れたところで測定データ部分を抜き出します。

ここでちょっと問題なのが、ELM327はchar型のアスキー文字を返してくるので、必要に応じて演算可能なbyte型のデータに変換する必要がありますね。そこは関数を作って処理しましょう。

human2machine.zip
まだまだ続く(たぶん)