はじめに〜
愛車のコペンLA400K(MT)に乗っている時,「あれ?今シフト5速(トップ)になっているよね?」と度々不安になる.
不安を解消するため,シフトインジケータをつけたいと思っているが、
これだ!と思ったシフトインジケータはすでに販売終了、今販売しているシフトインジケータはダサい好みのデザインではないかな...ということ仕方なく自分で作る作戦に移行...
そこで目を付けたのが,あらゆる車載パーツにも使われるOBD2で車のシフト情報を取る作戦!
本記事では「OBD2 x Python x コペン(LA400K)」で車の情報が本当にとれるかテストをする!
※OBD2がどのようなものか本稿では記載しない
PythonのOBDライブラリを使ったら,コペンがどんな情報をよこしやがってくれるのか?も調査する
使ったもん
色んな記事を見ると,電子回路を組んでごちゃごちゃやってる人が多いのでハードル高いかと思っていたが,そんなことはない!
● OBD2アダプタ
クルマから故障修理情報を取る『On Board Diagnostics/オン・ボード・ダイアグノーシス』を活用してみる.
よくBluetoothを使った記事が多いが,私は有線の方が安定してそうと考え,有線のOBD2コネクタを用いた
Amazonリンク:ELM327 OBD2 USB接続 スキャンツール A0328U
● Pythonを動かせるPC
本記事ではmacで確認(一応Raspberry Pi でも動くことを確認した)
● コペン LA400K (OBD2対応車種であれば大抵なんでも可)
「ラオウの黒王号」,「カービィのワープスター」,「ワルイージのハナチャンバギー」のように,「『ののの』の愛車/相棒的存在のコペンLA400K」
おお我が愛車よ!君もOBD2コネクタ持ってるのねと嬉しみを感じながら実験体とする.
(まぁ2009年以降の新型車は,OBD2搭載が義務化されているから大抵ついているっしょ)
● その他情報(Pythonライブラリなど)
・Python-OBD(Pythonライブラリ):https://python-obd.readthedocs.io/en/latest/
$pip install obd
だけでOBD2の情報とれるようになる
君有能すぎひん?
・OBD-II PIDs - Wikipedia:https://en.wikipedia.org/wiki/OBD-II_PIDs
指定したPIDを送ると,それに応じて情報を返してくれる
接続 クルマ → OBD2 → PCへ
話は単純.OBD2アダプタのコネクタ側をクルマに,USB側をPCに挿してPythonを実行する.
ただそれだけである.
ちなみに,コペンのOBD2は下記のところにある.
【接続テスト】OBD2x Pythonで取得
接続テストとして,まずは車速とエンジン回転数を取得してみる!
まずはPython-OBDの公式サイトに従い,ライブラリをインストールする!
$ pip install obd
※ BluetoothのOBD2コネクタを使用する場合は,それに応じたライブラリも公式サイトを参考にインストールすること
インストール後,下記コードを実行してコネクション確認をする!
#######################
# OBD2 テスト用コード
#######################
import time
import obd
from obd import OBDStatus
connection = obd.OBD()
print (connection.status())
if connection.status() == OBDStatus.CAR_CONNECTED:
while(True):
try:
# エンジン回転数 & 車速を取得
rpm = connection.query(obd.commands.RPM).value.magnitude
speed = connection.query(obd.commands.SPEED).value.magnitude
# 表示
print('rpm:{} , speed:{}'.format(rpm, speed))
# 0.2s停止(連続で取るのウザいから)
time.sleep(.2)
except KeyboardInterrupt:
connection.close()
実際にUSB接続&上記コードを実行後,クルマを走らせる.
下記のように,エンジン回転数と車速が取れていれば,上手く接続できていることがわかる!
ちなみに,RPMとSPEEDの取得部分は下記のようにPIDを指定しても取ることができるようだ!
つまり,PID一覧を見て,それで欲しい情報があればPIDを指定すれば良い!
rpm = obd.commands[1][12] # mode 1, PID 12 (Engine speed [rpm])
speed = obd.commands[1][13] # mode 1, PID 13 (Vehicle speed [km/h])
【本題】コペンでどこまでの情報が取れるのか?
さて,本題である.
今回作るものとして,ギアポジションを取りたい...
Wiki:OBD2 PIDsによると,ギアはPID:164を送信すると返してくれるらしい.
このPIDにコペンが対応しているか確認が必要である.
ついでにスタンダードPID(0〜196)のうち,コペンが対応しているPIDを全部確認する.
(ついでにGoogle翻訳に通したので,それも載せる)
そのために,書いたコードは以下の通りである.
###########################
# OBD2 使用可能なPIDを確認
###########################
import obd
from obd import OBDStatus
connection = obd.OBD()
print (connection.status())
if connection.status() == OBDStatus.CAR_CONNECTED:
for i in range (0,197):
try:
flag = obd.commands.has_pid(1, i) # 使用可能か判定
print('PID {} : {}'.format(i, flag))
except KeyboardInterrupt:
pass
connection.close()
printで表示し,"True"であれば対応(情報取得可能),"False"なら非対応(情報取得不可)である.
その結果を一覧にまとめたものは以下の通りである.
(車種によって取得できる情報が少し異なるようで有る.下記はコペンLA400Kの結果である.)
上記より,様々なデータがOBD2から取れそうだとわかり,色んな事出来そうとロマンが膨らんだ
だが,残念ながら今回のターゲットであるギア情報は取れないようだ...
しか〜し!ここで諦めるにはまだ早い...
次回はどうにかしてギアポジションを取る方法を考える.
まとめ
OBD2コネクタ x Python x コペンLA400Kを使用し,クルマから情報を取れるかテストをした.
結果として,コネクタ1500円とノートPCを使用することで多くのデータをクルマから取れそうであるとわかった.
(残念ならが,コペンLA400Kはギア情報のPIDに対応していないことも...)
上記からシフトインジケータ作成のロードマップは以下のようになる!
次回はシフトインジケータ作成の為に,どうにかしてシフトポジションを取る方法を記載したい!