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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1990652/da5abc93-3066-4df1-d2bd-cfc7b6d3ca6b.png)

# はじめに〜 
愛車のコペンLA400K（MT）に乗っている時，「あれ？今シフト5速（トップ）になっているよね？」と度々不安になる．

不安を解消するため，シフトインジケータをつけたいと思っているが、
これだ！と思ったシフトインジケータはすでに販売終了、今販売しているシフトインジケータは~~ダサい~~好みのデザインではないかな...ということ仕方なく自分で作る作戦に移行...
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1990652/71399231-861e-feae-9545-9bd4d03175b1.png)



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

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



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

図にすると以下のだけをつかう
![qiita_OBD2てすと1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1990652/db456729-4652-80a3-7a3f-c5bdb228c55d.png)

● **OBD2アダプタ**
クルマから故障修理情報を取る『On Board Diagnostics／オン・ボード・ダイアグノーシス』を活用してみる．
よくBluetoothを使った記事が多いが，私は有線の方が安定してそうと考え，有線のOBD２コネクタを用いた
[Amazonリンク：ELM327 OBD2 USB接続 スキャンツール A0328U](https://www.amazon.co.jp/%E3%83%8E%E3%83%BC%E3%83%96%E3%83%A9%E3%83%B3%E3%83%89%E5%93%81-A0328U-ELM327-OBD2-USB%E6%8E%A5%E7%B6%9A-%E3%82%B9%E3%82%AD%E3%83%A3%E3%83%B3%E3%83%84%E3%83%BC%E3%83%AB-%E8%BB%8A%E6%95%85%E9%9A%9C%E8%A8%BA%E6%96%AD%E6%A9%9F-%E8%BB%8A%E3%81%AE%E7%8A%B6%E6%85%8B%E3%82%92%E7%B4%B0%E3%81%8B%E3%81%8F%E8%A8%BA%E6%96%AD%E3%81%99%E3%82%8B%E3%83%89%E3%82%AF%E3%82%BF%E3%83%BC-A0328U/dp/B00MU9AD1U)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1990652/c72f9e29-0ae7-ed00-1d8b-11301aee6dc8.png)

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

● **コペン LA400K (OBD2対応車種であれば大抵なんでも可）**
「ラオウの黒王号」，「カービィのワープスター」，「ワルイージのハナチャンバギー」のように，「『ののの』の愛車／相棒的存在のコペンLA400K」
おお我が愛車よ！君もOBD2コネクタ持ってるのねと嬉しみを感じながら実験体とする．
（まぁ2009年以降の新型車は，OBD2搭載が義務化されているから大抵ついているっしょ）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1990652/d42da66c-8719-4262-5ae2-26e71eb7cd94.png)


● **その他情報（Pythonライブラリなど）**
・Python-OBD（Pythonライブラリ）：https://python-obd.readthedocs.io/en/latest/
 　`$pip install obd` だけでOBD２の情報とれるようになる
　君有能すぎひん？

・OBD-II PIDs - Wikipedia：https://en.wikipedia.org/wiki/OBD-II_PIDs
　指定したPIDを送ると，それに応じて情報を返してくれる

# 接続  　クルマ → OBD2 → PCへ
話は単純．OBD2アダプタのコネクタ側をクルマに，USB側をPCに挿してPythonを実行する．
ただそれだけである．
ちなみに，コペンのOBD2は下記のところにある．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1990652/451b6127-d4a4-880f-7eb5-b21283fe0220.png)


# 【接続テスト】OBD２x Pythonで取得
接続テストとして，まずは車速とエンジン回転数を取得してみる！
まずはPython-OBDの[公式サイト](https://python-obd.readthedocs.io/en/latest/)に従い，ライブラリをインストールする！
```言語:Python-OBDライブラリ　インストール
$ pip install obd
```
※ BluetoothのOBD2コネクタを使用する場合は，それに応じたライブラリも公式サイトを参考にインストールすること

インストール後，下記コードを実行してコネクション確認をする！
```python: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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1990652/257fe798-d067-df04-cf3c-6e7abd28dd28.png)


ちなみに，RPMとSPEEDの取得部分は下記のようにPIDを指定しても取ることができるようだ！
つまり，PID一覧を見て，それで欲しい情報があればPIDを指定すれば良い！
```python
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](https://en.wikipedia.org/wiki/OBD-II_PIDs)によると，ギアはPID:164を送信すると返してくれるらしい．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1990652/ee2614d9-f838-a80a-6ff2-3fb6d8577c48.png)
このPIDにコペンが対応しているか確認が必要である．
ついでにスタンダードPID(0〜196)のうち，コペンが対応しているPIDを全部確認する．
（ついでにGoogle翻訳に通したので，それも載せる）

そのために，書いたコードは以下の通りである．
```python: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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1990652/dd745ade-a704-fad2-2d36-3c1738f8a818.png)

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

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

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

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


上記からシフトインジケータ作成のロードマップは以下のようになる！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1990652/b6751f66-6cc2-a8e1-1102-6f0e7c4f9ae9.png)

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

# 参考文献
●[Python-OBD 公式ドキュメント](https://python-obd.readthedocs.io/en/latest/Command%20Tables/)
●[OBD-II PIDs](https://en.wikipedia.org/wiki/OBD-II_PIDs)