システム開発部のTです。
今回は車ネタってことで、ELM327を使ってAndroid版シフトインジケーターアプリを作ってみたので、そのことについてお話したいと思います。
実際のコーディングについては、次回ということで、今回はシフトインジケーター、ELM327について、接続確認するまでのお話をします。
シフトインジケーター
MT車で運転していると、ときどきシフトポジションを見失うことは無いでしょうか。つねに左手をシフトレバーに触れていれば大丈夫かと思いますが、基本的にはハンドルを両手で操作するかと思います。そういう状況でいざシフトレバーに手を伸ばしたとき、どのギアに入れているのか???ってことってありません?
そういう人のために、モータースポーツのパーツメーカーからシフトインジケータというのが販売されていたりします。
有名どころでは以下のような製品があります。

http://www.nagaidenshi.co.jp/MONITOR/4500.shtml
しかし、普通に購入となると、軽く10000円を超えてしまいます。
また、その取り付けもECUから車速とエンジン回転数の信号線と接続する必要もあり、素人が簡単に取り付けというわけにもいきません。
もっと簡単に車速とエンジン回転数が取れないのか・・・と考えていたところへ、本題のELM327というデバイスを見つけました。
ELM327
ELM327(※)は、車のOBD2規格の故障診断コネクタから車の状態を取得することができるデバイスです。このデバイスをコネクタに取り付けて、対応アプリで読み込ますことで、わざわざ高価な追加メーターを購入することなく、さまざまな情報を見ることが可能となります。
(※実際はELM327というチップを搭載したOBD2スキャンツールのこと)
本題では、このELM327を利用してシフトインジケーターを作っていきたいと思います。
ELM327搭載スキャンツール自体は、怪しいものも含めていろいろと出ておりますが、本件では以下のデバイスを利用して開発をしていきたいと思います。

https://www.maxwin.jp/content/obd/m-obd-v01.htm
接続確認
開発前に、実際にELM327とターミナルで接続確認しておきましょう。
ELM327を車の故障診断コネクタに接続し、イグニッションONにします。
エンジンがかかったところで、PCのターミナル(自身はWindows10のTera termを利用)し、シリアル通信でELM327に接続します。
ATコマンドを送信
接続確認のため、ターミナル上にatz
と入力しEnterしてみましょう。
上記はATコマンドの一種で、ELM327自身に対する命令をするためのコマンドです。atz
コマンドはシリアルポートのリセットとユーザプロファイルの読み出しをするようです。
atz[enter]
ELM327 v1.5
>
上記のように返却されました。
確かにELM327と会話できているようですね。
ELM327との接続確認を終えたところで、いよいよ車との会話をやってみたいと思います。
OBD2のコマンドを送信
車との会話をする場合、OBD2コマンドというのがあるので、それを使っていきます。コマンドについては、以下のWikiで詳しく説明がございますので、一度参考にしていただければと思います。
https://en.wikipedia.org/wiki/OBD-II_PIDs
本件では、OBD2のサービス1の内容を表示するので、コマンドの頭は01
になります。
さらにサービス1の情報から参照したいデータが車速だった場合、車速のPIDを確認し0D
が車速になるので、コマンドは010D
となります。010D
を入力し、Enterします。
010D[enter]
41 0D 00
>
コマンドの送信が成功していた場合、上記のように「41 0D 00」とかえってきたと思います。41
はサービスを表す01
にレスポンスを示す0x40
が付与された値、0D
は車速のコマンド、00
というのが速度を示す値になります。今回は止まった状態でコマンドを送信しているので、0kmが返却されてきました。
これだとあまり実感沸かないと思うので、続けてエンジン回転数を取得してみましょう。
エンジン回転数を取得するためのコマンドは010C
になります。010C
と入力し、Enterします。
010C[enter]
41 0C 0B 00
>
コマンドが成功していた場合、上記の内容が返却されたかと思います。
この0B 00
の箇所がエンジン回転数を表しておりますが、そのまま10進数にすると2816
という値になってしまうかと思います。返却される値は実数を4倍した値になっているので、2816 / 4
の数値704
が実際の回転数になるかと思います。
上記のようにコマンドひとつで簡単に値が取得できることが分かっていただけたかと思います。
シフトポジションの取得
コマンドで取得できることが分かったところで、シフトポジションについても確認してみたいと思います。
先ほど、上記のWikiを確認すると、コマンド一覧のなかに「Transmission Actual Gear」というのがございました。コマンドでは「A4」と表記されているので、01A4
と送信することで値が取得できそうです。実際にやってみた結果、
01A4[enter]
NO DATA
うーん・・・、どうやら取得できなかったようです。
ELM327でも、車種によっては取得可能な値、不可能な値というのが存在しているようでして、筆者の車はサポートしていなかったみたいです。
このままだとシフトインジケーターは作れないので、別の方法を考えてみたいと思います。
ググってみると、以下のような方程式を見つけることができました。
これなら、ギアレシオの値を逆算して、どのギアポジションなのか把握できるはずです。

とはいえで、アプリ側には以下の値を事前に入力しておく必要がありますね。
- タイヤの外径(タイヤサイズ)
195/45R17
って記載されているもの
純正タイヤであれば、メーカーの諸元表にも記載されている - ギア比(ギアレシオ)
メーカーの諸元表等に記載されている - ファイナル比
上記同様、メーカーの諸元表等に記載されている
要件定義
要件をまとめてみた。
これでアプリが作れそうですね。
- 車速、エンジン回転数の表示
ELM327と接続し、車速、エンジン回転数を取得し、画面に表示する機能の実装 - シフトインジケーター機能の実装
シフトインジケーターの表示については、車速、エンジン回転数、設定画面で入力した車両情報から割り出し、その結果を画面に表示する - シフトタイミングランプの実装
設定したエンジン回転数以上になったときに、画面効果と音でユーザーに通知する機能 - OS側であらかじめペアリング済みのELM327と接続するための設定画面の実装
- 車の情報(タイヤの外径、ギアレシオ、エンジン回転数警告)を登録するための画面の実装
次回より、実際にAndroidアプリのコードを紹介したいと思います。
ELM327でシフトインジケータアプリを作成・実装編①につづく