水津です。
この記事は、Bluemix(SoftLayer) Advent Calendar 2016 11日目の記事です。
http://qiita.com/advent-calendar/2016/bluemix
突然ですが、今回は自分の車をBluemix上のIoT Platform(以降、IoTP)に繋ぎたいと思います!!
目次
構成イメージ
以下のような構成で車とIoTPを繋ぎます。
車(OBD2端子)との接続には、ELM327で繋ぎます。これはOBD2情報をBluetoothで読み出せるデバイスです。そして、Bluetooth経由で読み出したOBD2情報をAndroidでキャッチし、それをインターネット経由でクラウド上のIoTPに飛ばすというわけです。ということで、今回はBluemix以外に以下が必要となります。
- ELM327 Interface
- インターネットに接続できるAndroid端末
- OBD2情報をBluetooth経由で呼び出し、IoTPに送るAndroidアプリ
- もちろん、被検体となる車も必要
準備
IoTPにデバイスを追加
OBD2の情報を受け取るデバイス定義をIoTPに追加します。追加の方法はOBD2だからといって特別なことはないので、以下記事を参考に追加ください。
Internet of Things Platformを使ってみた
OBD2コマンド結果をMQTTで飛ばすAndroidアプリ
OBD2アダプタとなるELM327は、Bluetoothでの接続となります。Bluetooth経由でODB2コマンドを発行し、その結果をIoTPに対しPublishする必要があります。その為、その間をブリッジするアプリが必要ですが、、、、単純にOBD2結果を画面表示するAndroidアプリはあるのですが、MQTTに乗せて飛ばす機能まで搭載しているものは見つかりませんでした。。。仕方がないので、以下のソースコードを元に、とりあえず結果をMQTTで飛ばせるAndroidアプリを作りました。
https://github.com/pires/android-obd-reader
https://github.com/ibm-watson-iot/iot-starter-for-android
(今回私が作成したアプリのソースは少々お待ちください。整理した後に公開します。)
ELM327を車のOBD2端子に接続
TOYOTA 86は以下の位置にOBD2端子があります。
ここ(OBD2端子)に、ELM327を差し込みます。
尚、OBD2端子は自己診断機能(検査用)の端子ですので、常に電気が流れてます。挿しっぱなしでほっとくと車のバッテリーが上がる可能性がありますのでご注意ください。
Bluetoothペアリング
作成したAndroidアプリからELM327を使うため、Bluetoothのペアリングを行います。ペアリングは、Androidの設定画面でペアリングを行ってください。その後、アプリを起動し設定画面から使用するデバイスの選択をを行って下さい。
Androidアプリ接続確認
AndroidアプリでOBD2情報が取得できるか確認します。まずは、車のエンジンをかけましょう。その後、Androidアプリを起動しOBD2と接続、車の情報が取得できているか確認します。
Androidアプリの画面上に回転数等の情報が表示されていれば準備完了です!!
IoTPで確認する
接続の確認
IoTPのデバイス画面より、デバイスの接続ログを確認します。AndroidアプリがIoTPに接続したことがログから確認できます。
受信したイベントとデータの確認
上記同様、IoTPのデバイス画面より、イベント受信ログを確認します。Androidアプリからの何らかのイベントを受信したことが確認できます。
この表の1行をクリックすると、どんなイベント情報を受信したのか確認できます。
受信したデータをエディタでキレイにしてみました。
{
"d": {
"EQUIV_RATIO": "0.0%",
"AMBIENT_AIR_TEMP": "20C",
"altitude": "<<高度>>",
"DISTANCE_TRAVELED_MIL_ON": "0km",
"SPEED": "0km/h",
"Short Term Fuel Trim Bank 2": "NODATA",
"ENGINE_OIL_TEMP": "NODATA",
"ENGINE_LOAD": "21.6%",
"VIN": "@ ",
"TROUBLE_CODES": "C0300\n",
"ENGINE_RUNTIME": "00:06:51",
"TIMING_ADVANCE": "71.8%",
"CONTROL_MODULE_VOLTAGE": "14.0V",
"Short Term Fuel Trim Bank 1": "-1.6%",
"MAF": "3.27g/s",
"FUEL_PRESSURE": "NODATA",
"ENGINE_RPM": "1527RPM",
"vehicleid": "KSTest",
"longitude": "<<経度>>",
"THROTTLE_POS": "14.1%",
"FUEL_TYPE": "Gasoline",
"Long Term Fuel Trim Bank 2": "NODATA",
"FUEL_CONSUMPTION_RATE": "NODATA",
"INTAKE_MANIFOLD_PRESSURE": "35kPa",
"DTC_NUMBER": "MIL is OFF0 codes",
"WIDEBAND_AIR_FUEL_RATIO": "14.18:1 AFR",
"latitude": "<<緯度>>",
"ENGINE_COOLANT_TEMP": "91C",
"AIR_FUEL_RATIO": "14.63:1 AFR",
"Long Term Fuel Trim Bank 1": "4.7%",
"BAROMETRIC_PRESSURE": "102kPa",
"FUEL_LEVEL": "100.0%",
"AIR_INTAKE_TEMP": "60C",
"FUEL_RAIL_PRESSURE": "4040kPa"
}
}
うーん、、、受信はできたけど、全部String型、しかも単位付き。この情報を実際に使う際は、一旦Node-REDとかに渡してデータをクレンジングするか、そもそも送る側のAndroidアプリで数値情報にして送る必要がありますね。(たぶん今回のAndroidアプリを作成する際、私がCSVログ出力部分をベースとして作成したことが原因でしょう。)
IoTPのカードで確認する
今回は受信情報が文字列となるため、「値」カードを作成しました。(本当は折れ線グラフにしたかった。。)作成方法は先程同様に以下記事を参考にしてください。
Internet of Things Platformを使ってみた
作成したカードでの表示は以下のようになります。
まとめ
いかがでしたでしょうか?
IoT系のキーワードで「Connected Car」と呼ばれるものがありますが、「ちょっと試す」のにはハードルが高かったかと思います。しかしながら、今回のようにOBD2、AndroidアプリそしてBluemix Watson IoT Platformを用いることで、「Connected Car」の入り口には立てるのではないかと思います。あとは収集した情報をどう使うのか次第。皆さんも是非色々試して見て下さい。