LoginSignup
7
4

More than 1 year has passed since last update.

OBD2とPythonでクルマの情報を取る with コペン

Last updated at Posted at 2022-06-30

image.png

はじめに〜

愛車のコペンLA400K(MT)に乗っている時,「あれ?今シフト5速(トップ)になっているよね?」と度々不安になる.

不安を解消するため,シフトインジケータをつけたいと思っているが、
これだ!と思ったシフトインジケータはすでに販売終了、今販売しているシフトインジケータはダサい好みのデザインではないかな...ということ仕方なく自分で作る作戦に移行...
image.png

そこで目を付けたのが,あらゆる車載パーツにも使われるOBD2で車のシフト情報を取る作戦!
本記事では「OBD2 x Python x コペン(LA400K)」で車の情報が本当にとれるかテストをする!
※OBD2がどのようなものか本稿では記載しない

PythonのOBDライブラリを使ったら,コペンがどんな情報をよこしやがってくれるのか?も調査する

使ったもん

色んな記事を見ると,電子回路を組んでごちゃごちゃやってる人が多いのでハードル高いかと思っていたが,そんなことはない!

図にすると以下のだけをつかう
qiita_OBD2てすと1.png

OBD2アダプタ
クルマから故障修理情報を取る『On Board Diagnostics/オン・ボード・ダイアグノーシス』を活用してみる.
よくBluetoothを使った記事が多いが,私は有線の方が安定してそうと考え,有線のOBD2コネクタを用いた
Amazonリンク:ELM327 OBD2 USB接続 スキャンツール A0328U
image.png

Pythonを動かせるPC
本記事ではmacで確認(一応Raspberry Pi でも動くことを確認した)

コペン LA400K (OBD2対応車種であれば大抵なんでも可)
「ラオウの黒王号」,「カービィのワープスター」,「ワルイージのハナチャンバギー」のように,「『ののの』の愛車/相棒的存在のコペンLA400K」
おお我が愛車よ!君もOBD2コネクタ持ってるのねと嬉しみを感じながら実験体とする.
(まぁ2009年以降の新型車は,OBD2搭載が義務化されているから大抵ついているっしょ)
image.png

その他情報(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は下記のところにある.
image.png

【接続テスト】OBD2x Pythonで取得

接続テストとして,まずは車速とエンジン回転数を取得してみる!
まずはPython-OBDの公式サイトに従い,ライブラリをインストールする!

Python-OBDライブラリ インストール
$ pip install obd

※ BluetoothのOBD2コネクタを使用する場合は,それに応じたライブラリも公式サイトを参考にインストールすること

インストール後,下記コードを実行してコネクション確認をする!

obd_rpm_speed.py
#######################
# 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接続&上記コードを実行後,クルマを走らせる.
下記のように,エンジン回転数と車速が取れていれば,上手く接続できていることがわかる!
image.png

ちなみに,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を送信すると返してくれるらしい.
image.png
このPIDにコペンが対応しているか確認が必要である.
ついでにスタンダードPID(0〜196)のうち,コペンが対応しているPIDを全部確認する.
(ついでにGoogle翻訳に通したので,それも載せる)

そのために,書いたコードは以下の通りである.

obd_PIDs_check.py
###########################
# 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の結果である.)
image.png

上記より,様々なデータがOBD2から取れそうだとわかり,色んな事出来そうとロマンが膨らんだ

だが,残念ながら今回のターゲットであるギア情報は取れないようだ...
しか〜し!ここで諦めるにはまだ早い...

次回はどうにかしてギアポジションを取る方法を考える.

まとめ

 OBD2コネクタ x Python x コペンLA400Kを使用し,クルマから情報を取れるかテストをした.
結果として,コネクタ1500円とノートPCを使用することで多くのデータをクルマから取れそうであるとわかった.
(残念ならが,コペンLA400Kはギア情報のPIDに対応していないことも...)

上記からシフトインジケータ作成のロードマップは以下のようになる!
image.png

次回はシフトインジケータ作成の為に,どうにかしてシフトポジションを取る方法を記載したい!

参考文献

Python-OBD 公式ドキュメント
OBD-II PIDs

7
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
4