「車と会話できる方法がある」という噂を聞いてそれについて調べてみました。
■準備
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 件のコメント:
コメントを投稿