読者です 読者をやめる 読者になる 読者になる

PG.Lib

主にUWP、C#に関することやガジェット系

UWPアプリでOBD2連携して車の情報を色々見てみる!

この記事は、Windows 10 Mobile / Windows Phone Advent Calendar 2016 22日目の記事です。

www.adventar.org

なんとネタが被ってしまいました…orz が、めげずに書きます!

 

既に公開しているアプリですが、「Multi Function Display」をOBD2対応の実装を進めています。

www.microsoft.com

次回アップデートで載る予定ですが、実装の内容や苦戦の模様をお伝えしたいと思います。

 

OBD2 とは

開発のお仕事してると「ODB2(おーでーびーつー)」と言いたくなりますが、「OBD2(おーびーでーつー)」です。

車のEPUには色々なセンサーからの情報が集まっています。ECUには自己診断機能がついていてそれをOBDと呼ぶようです。

センサーの内容は様々で車速やエンジン回転数、水温などなど。かなりの種類のデータが取得できます。


ここ10年くらいに新車販売された車であれば搭載が義務化されているため、場所はまちまちかもしれませんが大抵の車についています。

ただ、通信のプロトコルが何パターンかあるようで、それぞれに対応するのは大変です。

今回使用したような機器は、車とそれぞれの規格に応じた通信を行って、共通の結果を返してくれるという素敵な代物です。

そして、使用機器はこちら!

ELM327 OBD2 Bluetooth for Android & PC by Eurostile

ELM327 OBD2 Bluetooth for Android & PC by Eurostile

 

言い換えれば、本アプリでのサポート対象機器ということになりますね(笑)

 

実装方法

機器との接続はBluetoothを使い、シリアル通信でやりとりします。

値の種類ごとにコードが決まっていて、それを投げるとレスポンスの内容に値が含まれているという感じ。

コードのことをPIDと呼ぶようですね。

値の種類やPID、値の内容は以下のWikiを参考にしました。

OBD-II PIDs - Wikipedia

 

コードを投げる際は、モード+PIDで投げるらしく、情報取得時のモードは[01]です。

なので実際に投げる際には、[0111]といったような文字を送信します。

 

また、使える値は車種で違い、PID[00]を投げると[01]~[20]までの使用可否がBitで取得できるいった形でチェックすることができます。

が、一部使える値でうまく取得できないケースがあり、原因究明に時間がかかってます…orz

これについては後述します。


戻ってきたデータのサンプルがこちら

7E9 03 41 11 22 \r3F A8 13 00

ASCIIでエンコードしています。

スペースで区切られたデータの[41]がキーになります。改行(\r)が含まれているので、取り除いたうえで探します。

このデータの次がこちらから投げたPIDです。この場合は[11]ですね。

さらにその次からが実際の値です。サンプルからだと[22]です。

データには1バイトのものや2バイト、4バイトなど種類があるので、値の種類によって取得の内容や計算方法を組み込む必要があります。

計算式に当てはめて得られたものが、実際の値ということになります。


実装例

UWP C#での実装例です。


Bluetoothの初期化

var services = await Windows.Devices.Enumeration.DeviceInformation.FindAllAsync(
        RfcommDeviceService.GetDeviceSelector(RfcommServiceId.SerialPort));

foreach (var device in services)
{
    if (device.Name == "OBDII")
    {
        var targetService = await RfcommDeviceService.FromIdAsync(device.Id);
        if (SupportsProtection(targetService))
        {
            // 変数とか用意して確保
            service = targetService;
        }
    }
}

使用可能か判定

public static bool SupportsProtection(RfcommDeviceService service)
{
    switch (service.ProtectionLevel)
    {
        case SocketProtectionLevel.PlainSocket:
            if ((service.MaxProtectionLevel == SocketProtectionLevel
                    .BluetoothEncryptionWithAuthentication)
                || (service.MaxProtectionLevel == SocketProtectionLevel
                    .BluetoothEncryptionAllowNullAuthentication))
            {
                return true;
            }
            else
            {
                return false;
            }
        case SocketProtectionLevel.BluetoothEncryptionWithAuthentication:
            return true;
        case SocketProtectionLevel.BluetoothEncryptionAllowNullAuthentication:
            return true;
    }
    return false;
}

バイス名はOBDIIでした。他の機種だと違うかもしれませんね。


Bluetoothへの接続

socket = new StreamSocket();
await socket.ConnectAsync(
    service.ConnectionHostName,
    service.ConnectionServiceName,
    SocketProtectionLevel
        .BluetoothEncryptionAllowNullAuthentication);


データの送受信

// データ送信
byte[] bytes = Encoding.GetEncoding("ASCII").GetBytes("取得したいコード");
writer.WriteBytes(bytes);
var result = await writer.StoreAsync();

// データ受信
val = new byte[32]; // 要調整っす
reader.LoadAsync(Cmn.BT_CACHE);
reader.ReadBytes(val);

 

苦戦している点

1つはデバッグ方法です。実際に値が取れる機材が車しかないので、動きの確認をするには車を動かすしかありません。

夜な夜な車へ乗り込み、デバッグしては直してを繰り返してます。あんまりアイドリングを続けたり、エンジンON/OFF繰り返してると近所迷惑にもなってしまうので、心ゆくまでとはいかないのが大変ですね。

シミュレーターみたいのがあればいいんですが、需要も少なそうですしコツコツやるしかないのかなー?と。


もう1つは通信が返ってこなくなる問題です。車種によるかもしれませんが…。

エンジンの回転数を取得していると、アイドリング程度の時は比較的安定して取れるのですが、踏み込んでいって2000rpmを超えてくると不安定になっていき、最終的にはレスポンスが返ってこなくなります。

そもそも値が返ってこないPIDもあるんですが、これは恐らく対応していない為だろうと踏んでます。

普段取れているだけに、対応方法どころか原因を突き止めるのが(前述した実車でしかデバッグできないのと含め)難しい状況。

これが解決すれば、一気に公開までいけそうなのになー!と思ってます。

確実に取れそうなのだけでまずは公開・・・という逃げもアリですが…。


使い方例とまとめ

Windows10Mobileだとこんな感じ。日中はスマホスタンドに装着しましょう。


Windowsアプリ Multi Function Display 通常モード

 

そしてこのアプリの特徴の1つ反転モード(別名HUDモード)!


Windowsアプリ Multi Function Display HUDモード

 

特に夜間使えるモードで、ダッシュボードに置くことでフロントウィンドウにメーターが映し出されます!

百均とかに売ってる滑り止めと合わせて使うのがおススメです。上海問屋とかに売ってるこういうのを使うのもアリですね。

HUDは長距離運転でかなり効果があります。視点移動少なく情報を得られるので、疲労感がだいぶ違いますよ。

 

また、UWPアプリなのでWindows10でも動きます!

8インチタブレットが手元に余ってる方は、是非、高精細大画面メーターとしてお使いください♪

 

どのプラットフォームでもこの手のアプリはそこまで多くないので、良いもの作ってストアの賑わいの1つになればなーと思います。

一応目標はR35GT-Rのメーターをこの手に!です(笑)

www.nissan.co.jp