🌟

Raspberry Pi 3を用いてOBD-IIとBluetooth通信する

2023/07/07に公開

概要

raspi3とbluetooth対応のELM327 OBD2アダプタを用いてエンジンの回転数を取得します。

環境

・ELM327 v1.5 OBD2アダプタ
・Raspberry Pi 3 Model B
・ubuntu 20.04
・BMW 3シリーズ F系

OBD-IIについて

OBD(On-board diagnostics)は自動車の自己診断機能のことで、このコネクタから様々な車の情報を取得することができます。
排出ガス規制の一貫として義務付けられたので、規定の診断機能ではエンジンに関する情報が主に入手できます。
OBD2コネクタは車によってついてる場所が違うので、それぞれ確認する必要があります。
今回使用した車では、OBD2コネクタがアクセルペダルの右側にありました。青いのがアダプタでコネクタに挿してある状態です。コネクタにはエンジン停止時でも電圧がかかっており、アダプタを挿すとLEDが光ります。

https://ja.wikipedia.org/wiki/オン・ボード・ダイアグノーシス

ELM327について

ELM327は、OBD-IIの通信を簡単に行えるICチップで、USB, Bluetooth, WifiなどでPCにつなぐことができます。
ELM327には、v1.5とv2.1が存在します。
しかし、v2.1では古い通信規格での通信機能が無くなっているようで、少し古い車の場合はv1.5を使うのが無難だと思われます。
今回v1.5とv2.1をどちらも購入して試しました。v1.5ではシリアル通信できましたが、v2.1ではできませんでした(ペアリングはできましたが、シリアル通信の返答がありませんでした。)
今回使用した車は2010年ごろに発売されたものだったので、通信の規格に対応されていなかったのかもしれません。
(製品に当たりはずれもあるらしく、実際に通信規格が悪かったのか、不良品なのかは不明です。)

購入したELM327 OBD2アダプタは以下です。購入するとwindowsなどで使うドライバがダウンロードできるCDが付いてくることがありますが、今回は使いません。
https://www.amazon.co.jp/gp/product/B07RNHZS44/ref=ppx_yo_dt_b_asin_title_o02_s00?ie=UTF8&psc=1
https://www.amazon.co.jp/gp/product/B00QUL6U8Y/ref=ppx_yo_dt_b_asin_title_o03_s00?ie=UTF8&psc=1

SSH接続

今回は、スマホをテザリングしてノートPCからraspiにssh接続しました。
スマホからraspiのIPアドレスが確認ができるので、ssh接続が楽でした。

raspiとペアリング

以下のコマンドでbluetoothctl CLIを起動します。
インストールされていない場合はこちらを参照してインストールします。

bluetoothctl

アダプタとペアリングします。

# OBD2アダプタのMACアドレスを取得するためにスキャンモードにします(少し時間がかかります)。
# デバイスが発見されたらMACアドレスをメモします。
scan on 
default-agent
# 先ほどのMACアドレスを入力します。
pair MAC_address
trust MAC_address

通常のbluetooth端末に接続する場合はこの後にconnect MAC_addressをしますが、今回はシリアル通信をするため、使用しません(やるとエラーが出ます)。

シリアルポート設定

RFCOMMを用いて、/dev/rfcomm0にバインドして、シリアル通信をエミュレートします。rfcommの後の数字は0以外でも任意の数を指定できます。

sudo rfcomm bind rfcomm0 <MAC_address of OBD2 adapter>

シリアル通信する

screenまたはcatを使ってシリアル通信をします。

screen /dev/rfcomm0

ATコマンドで以下のように初期設定を行います。
ATIでバージョンが表示され、それ以外でOKと表示されれば大丈夫です。

# print the version ID
ATI
# reset all
ATZ
# Linefeeds on
ATL1
# Headers on
ATH1
# printing of Spaces
ATS1
# Erase stored protocol
ATSP0

ELM327の対応しているATコマンドは以下の10ページあたりに書かれています。
https://www.elmelectronics.com/wp-content/uploads/2017/01/ELM327DS.pdf

OBD-II PIDでエンジンの情報を取得する

OBD-II PIDは、車からデータを要求するために使用されるコードです。以下から調べることができます
https://en.wikipedia.org/wiki/OBD-II_PIDs#
現在のエンジンの回転数を取得する場合は、Service 01 - Show current dataの0Cがコマンドになります(010Cと入力する)。

>010C
SEARCHING...
7E8 04 41 0C 00 00
7E9 04 41 0C 00 00

エンジンの回転数の場合は、下4桁の2つのデータバイトを見ることでエンジンの回転数を計算することができます。
詳しい読み方は以下に記載されています。
https://en.wikipedia.org/wiki/OBD-II_PIDs#Response

参考

https://qiita.com/nomunomu0504/items/8876f34fb33d8bf24fcb
https://fsjohnny.medium.com/connecting-your-bluetooth-obdii-adapter-or-other-serial-port-adapters-to-a-raspberry-pi-3-f2c9663dae73
https://theksmith.com/software/hack-vehicle-bus-cheap-easy-part-1/

Discussion