2013年4月19日金曜日

AndroidとELM327で車と会話(OBD2)



「車と会話できる方法がある」という噂を聞いてそれについて調べてみました。


■準備

1.ELM327 OBD2 スキャンツール
 ⇒amazon等で2000円程度で購入できます。

2.android端末(SO-02C)
 ⇒bluetooth使えればOKです。

3.車(2004年式Suzuki Swift)
 ⇒ELM327に対応していない車も結構あります。


■構成

イメージ的にはこんな感じです。

このandroidで車の情報を収集できます。


ELM327の実物です



ELM327スキャンツールを車に差し込んでアンドロイド端末とbluetoothで通信します。


■OBDプロトコル

OBDとはOn Board Diagnostic Systemの略で、車に搭載されたコンピューターが故障の診断を行います。
そして今回やりたい事は車に搭載されているコンピューターに対してELM327経由で問い合わせをし情報を収集する事です。

故障の診断を行うのですからandroidから「故障情報」が取得できるのだろうと思うのですが、
実は故障情報だけでなく走行中の車のスピードやエンジンの回転数等がとれます。

私はどちらかと言うと故障情報よりはスピードやエンジンの回転数を取得して、androidでスピードメーターアプリなんかが興味あります。


■ペアリング

まずはELM327とペアリングを行う必要があります。流れとしては以下の通りです。
1.車にELM327を差し込みます。
  ⇒車ごとに差し込み口は異なり、見え難いところだったりしますので
   注意が必要です。私は20分位探しまくってやっと見つけました。。
  ⇒正しく差し込むと赤いランプが点灯します。(エンジンかけなくとも)

2.android端末でペアリング操作
  ⇒[設定]-[無線とネットワーク]-[Bluetooth設定]・・・
   ELM327のデバイスを選択する。私の場合は[CHX]でした。pinコードは6789。


■プログラミング

1.権限
  <uses-permission android:name="android.permission.BLUETOOTH" />
  <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>

2.UUID
  bluetoothで使用するUUIDは
  "00001101-0000-1000-8000-00805F9B34FB"とします。
  これは、Bluetooth SPP(Serial Port Profile)のUUIDです。

3.bluetoothでコネクト
UUID uuid = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
socket = device.createRfcommSocketToServiceRecord(uuid);
socket.connect(); // この処理は最大12秒位かかるので非同期処理が良さそうです。

  ※deviceはELM327のBluetoothDeviceのインスタンスです。
   bluetoothの接続についての詳細は割愛します。

4.初期化コマンド
  いよいよコマンドをELM327に送ります。
  "atz", "ate0", "atl0" という3つのATコマンドを送ります。

OutputStream outputStream = socket.getOutputStream();
outputStream.write("atz\r".getBytes()); // ★コマンドの最後は\r
outputStream.flush(); // 送信
// 送信直後に応答を待ちます
// 応答は '>'(プロンプト) を受けるまで読み続けます
ByteArrayOutputStream buf = new ByteArrayOutputStream();
while( true ) {
 InputStream in = socket.getInputStream();
 byte[] buffer = new byte[1];
 if( in.read(buffer) > 0 ) {
  buf.write(buffer);
  if( new String(buffer).indexOf(">") >= 0 ) {
   break; // ★プロンプトを終端とする。
  }
 }
}

※ATコマンド
    http://elmelectronics.com/ELM327/AT_Commands.pdf

  以下の通り結果は以下の通りです。

  送信[atz]
  受信[0d 0d 45 4c 4d 33 32 37 20 76 31 2e 35 0d 0d 3e](hex)
     \r \r  E  L  M  3  2  7 △  v  1  .  5 \r \r  >
  送信[ate0]
  受信[61 74 65 30 0d 4f 4b 0d 0d 3e](hex)
     a  t  e  0 \r  O  K \r \r  >
  送信[atl0]
  受信[4f 4b 0d 0d 3e]
     O  K \r \r  >

5.走行自動車のスピードを発行
  4のコマンドを"01 0D"とします。

  結果は以下の通りです。

  送信[010D]
  受信[42 55 53 20 49 4e 49 54 3a 20 4f 4b 0d 37 46 20 30 31 20 31 31 20 0d 0d 3e](hex)
     B  U  S △  I  N  I  T  : △  O  K \r  7  F △  0  1 △  1  1 △ \r \r  >

  BUS INIT:OK までは良かったのですがその後の
  7F 01 11 という回答はどうもスピード情報ではないようです。
  何度"01 0D"コマンドを発行しても 7F 01 11 でした。
  この結果は残念ながら「失敗」の様です。

  ※コマンドのPID一覧
    http://en.wikipedia.org/wiki/OBD-II_PIDs


■最後に

  スピードの情報は一番とりたかった情報なのに残念です。
  もしかして試した車が2004 Suzuki Swift 15で、対応していないのかもしれません。

  進展があったらブログを更新したいと思います。


0 件のコメント:

コメントを投稿