OBDⅡを扱うアプリ開発で知っておきたいことをまとめた

自動車のデータを取得する際に使われるOBDⅡについて、アプリ開発で把握しておきたい知識をまとめました。本記事はアプリ開発者の視点で書いています。自動車整備の資料として使う場合は書かれている内容をしっかりと精査した上でご利用をお願いいたします。また、本記事の内容は私の個人的な趣味でまとめたものですので、所属企業やその関連企業には関係ありません

#OBDの歴史

細かい事は [WikiPedia](https://ja.wikipedia.org/wiki/%E3%82%AA%E3%83%B3%E3%83%BB%E3%83%9C%E3%83%BC%E3%83%89%E3%83%BB%E3%83%80%E3%82%A4%E3%82%A2%E3%82%B0%E3%83%8E%E3%83%BC%E3%82%B7%E3%82%B9) などにも書いてありますので大雑把にまとめてます。

## 1971年 FI(Fuel Injection: 電子制御式燃料噴射装置)搭載車の登場

この頃は自動車の排気ガスによる大気汚染が問題となっていました。1970年にアメリカで「マスキー法」と呼ばれる厳しい排ガス規制が始まり、これの解決策としてFIの仕組みが採用されました

当時のエンジンはキャブレーター式が主でした。キャブレーターはメカニカルな仕組みでガソリンと空気を混ぜて燃やしていましたが、最適な燃焼状態を実現するにはエンジン内部の汚れ具合や気温などの状態を見て変えていく必要があります。ちなみに、昔の車は寒い時にエンジンがかかりにくい状態があって、チョークというスイッチを操作してガソリンを濃くしていました

センサーの値から適切なガソリンの噴射量をコンピューターで計算して最適な燃焼状態を維持することでクリーンな排出ガスを実現する仕組みがFIです

日本でも1973(昭和48)年、1975(昭和50)年、1977(昭和52)年、1978(昭和53)年と段階的に排ガス規制が厳しくなっていました。最も厳しい1978年規制に対応したキャブレーター車は一部存在しましたが、次第に姿を消していきました

## 1980年代 自己診断機能で修理しやすく

FI初期の頃は電圧テスターやオシロスコープを使ったアナログな診断方法でしたが、後に自己診断機能が搭載されて車自体が異常を検知するようになりました。今まで整備士の経験や感覚に頼っていた所が、診断コードを見て即座に故障箇所が分かるようになったのがこの時代です。代表的なのはトヨタの「TCCS」や日産の「ECCS」のシステムが挙げられます

この頃から整備情報が多くなってきて整備手順を記したサービスマニュアルのデータ化が始まってきたらしいです(憶測)

## 自己診断機能の統一化からOBDの誕生

自己診断機能が実現されたものの、各メーカーでばらばらな規格であったために統一する動きがアメリカでありました。1982年にGM社が作ったALDLという診断システムが好評だったことから、この規格をベースにOBDが誕生しました

### ALDLの主な診断項目

1. エンジン回転数
2. 冷却水温度
3. アクセル開度
4. 吸気温度
5. エアフローセンサーの状態
6. 吸気負圧
7. 速度
8. 電圧
9. 空燃比
10. 点火時期

ほぼ現在のOBDⅡと同じです

アメリカでは1988年以降の新車にはOBDを搭載するように義務付けられ、MIL[^MIL](警告灯)によって排出ガス対策装置の異常をユーザーが検知できるようになりました

## 1996年 OBDⅡの登場

OBDⅡによって各社ばらばらだったプロトコルが共通化され、コネクタも16ピン端子(DLC[^DLC])に統一されました。アメリカでは1996年以降の新型車に対してOBDⅡの搭載を義務付けただけでなく、メーカーに対して診断に必要な情報を公開して一般整備工場でも読めるように義務付けました

2008年にアメリカではCANプロトコルを使うように法制化されています。それまで5つのプロトコルが混在してました

OBDⅡの採用は世界的にも広がっており、2006年に中国で、2007年に韓国で義務化されています

## 日本のOBD (J-OBD/J-OBDⅡ)

日本のOBD規格は少し違った事情があったために補足します。日本車はアメリカのOBD規格から派生したJ-OBDの規格となっています

### J-OBD

2000年にJISで規制されました。MIL(警告灯)の搭載とDLC(16ピン)の搭載が義務化されました。1996年のOBDⅡ相当の義務化でしたが、診断機能は1980年代のOBDベースで項目が多くなく、故障時の状態を記録するフリーズフレームデータに対応していない場合がありました

DLCコネクタを搭載していても、OBDⅡではないためCANではなくメーカー独自のプロトコルが使われている可能性があります

### J-OBDⅡ

ここでアメリカのOBDⅡ(1996年)に準拠します。2008年以降の新型車に義務付けられましたが、継続生産車は2011年までの猶予期間がありました

アメリカのようにCANプロトコルの使用が定められている訳ではないため、CANに対応しない車種もあるかもしれませんが、多くはアメリカに輸出することを考慮してCANに対応していると思われます (個人的な期待感)

### 日本車でOBDⅡを扱う注意

J-OBD規格でも汎用のツールが使えるようにはなっているものの、J-OBD/J-OBDⅡにはこういった経緯があるために2012年より前の車でアプリを使うには、対応できない可能性があることをご認識ください

## 2輪車のOBD

2輪車ではこれまでもK-LINEベースの故障診断の仕組みはありましたが、2020年12月以降の新型車からOBDⅡの搭載が義務化[^BIKEOBD]されました

# そもそもOBDⅡって?

何となく車のデータを取るためのインタフェースというイメージだと思いますが、OBDとは何なのか簡単にまとめます

## OBD (On Board Diagnosis)
Diagnosisが「診断」を意味する通り、車の故障診断をするためのシステムです。車速などのデータを取るのはその補助的な機能の一部です

On Boardとは車のコンピューター(ECU[^ECU])に搭載されていることを意味し、Off BoardとなるとFI初期のアナログの診断のように外部の診断装置を車に繋ぐことを意味します。診断装置に繋ぐにはブレイクアウト・ボックス(またはピン・ボックス)と呼ばれる物を使って、その端子から測定機に繋いだり、電圧を測ったりオシロスコープで波形を見て故障を判断してました

OBDの歴史を見て分かるように大気汚染を防ぐ目的で、排ガス対策装置の異常を検知するシステムがOBDです。通信するための16ピンコネクタやCANプロトコルはシステムを構成する一部にしかすぎません

## OBDⅡでできること

### 自己診断機能

* 車の異常を検知、記録、読み出しを行います
* 元々は排ガス対策装置の異常を検知するためでしたが拡張が進み、ライトなどの電装系の異常も検知できるようになってます

### OBDⅡテスト (ドライビングサイクルテスト)

アメリカやドイツの車検では決められたパターンで車を動かして、その時に得られたOBDのデータでOK/NGを決めるテストがあります。NGの箇所を修理したら再度テストを行って、全ての項目がOKにならないと車検が通りません

日本でも2024年からOBDⅡを使った検査が開始[^OBDTESTJP]されますが、故障履歴(DTC)のチェックまでのようです

### データストリーム機能

リアルタイムなエンジンの状態や走行の生データを見ることができます。この機能を利用してアプリでは車のデータを取得しています。どんなデータが取得できるかは車種次第ですがOBDⅡでは以下の17項目を出すことが決められています(当該センサーが搭載されていない場合は除く)

1. エンジン負荷率
2. 冷却水温度
3. エンジン回転数
4. スロットル開度
5. 車速
6. 燃料圧力
7. 吸入空気温度
8. 吸気管圧力
9. 吸入空気量
10. O2センサー出力
11. 空燃比センサー出力
12. フィードバック状況
13. 燃料補正量
14. 点火時期
15. 二次空気の状態
16. 保存されているDTCの数
17. MILの警告状態

### アクティブテスト

ECUから疑似信号を送ってセンサーの値を変えたり、アクチュエーターを強制的に動かすための機能。部品の交換や故障箇所の切り分けに使われます

### リプログラミング
ECUプログラムの書き換え(update)、読み出しを行います。この機能は車メーカー専用の装置を使うこと前提で、一般の人は不可能となっています

### 設定値変更
部品を交換した後にその部品に合わせて設定の変更(アダプテーション)や、ECUに車種、車体番号、国別仕様、装備仕様などの情報を書き込む(コーディング)機能です。この機能はメーカー毎に仕様が異なる上、ロックが掛けられているため、汎用のツールでは扱うことができません

## 16ピン端子(DLC)

### ピン配列

端子の図は [Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%AA%E3%83%B3%E3%83%BB%E3%83%9C%E3%83%BC%E3%83%89%E3%83%BB%E3%83%80%E3%82%A4%E3%82%A2%E3%82%B0%E3%83%8E%E3%83%BC%E3%82%B7%E3%82%B9)などを見てください

ピンは 1, 2, 4, 5, 6, 7, 10, 14, 15, 16 がOBDⅡの規格で定められており、残りの 3, 8, 9, 11, 12, 13 がメーカー独自に利用されています

### 端子の位置

コネクタの位置は運転席から0.9m(3フィート)以内と定められていますが、インパネの下、シフトレバー付近、ヒューズボックス内、灰皿近くなど場所は様々です。素の状態で端子が見えるのもありますが、カバーで隠れていたり、内装を剥がす必要があったりもします

### 24V車のコネクタ

12V車のコネクタと24V車のコネクタでは微妙に異なり、24V車用の端子には真ん中の仕切りに切り込みが入っています。12V用の端子には切り込みが無いために、誤って24V車に12V専用の端子が刺さらないようになっています

# 警告灯(MIL)の規定

## 仕様

* 黄色であること (昔の車は赤色で「ALARM」と光る物もありましたが、現在では赤は警告灯には使えません)
* 他の表示と兼用できません

## パターン

* 点滅: 異常を検知して早めの修理・点検が必要な状態
* 点灯: 故障してバックアップモードに移行した状態

どちらにしても警告灯が光ったらすぐに修理が必要です。修理しないと車検は通りません

## 故障検知のルール

* エンジンの始動から走行して、エンジンを停止するまでの1サイクルの `1トリップ` でカウントします
* 1トリップ内でECUが故障を検知するとペンディングコード[^PEND]が保持されます (仮故障)
* 次のトリップで同じ故障が連続で検知されると警告灯が点灯します (本故障)
* 仮故障の状態で故障が検知されなければ、誤検知としてペンディングコードが消去されます
* 本故障の状態で3トリップ以上、故障が検知されなければ誤検知として警告灯が消えます

警告灯が点灯して本故障になると故障の履歴(DTC[^DTC])が残ります。ツールから意図的に消すこともできますが、暖機運転サイクル(ウォームアップサイクル)で消える仕組みもあります

* 暖気運転サイクルとは、冷却水の温度が22度以下でエンジンを始動し、70度以上で運転を終えるサイクルです
* 暖気運転サイクルで最低40回以上連続して故障が検出されない場合はDTCの本故障情報が消去されます

これらはOBDⅡで定められている規格によるものですが、これ以外のメーカー独自のルールで警告灯が光るケースもあるかもしれません。場合によってはディーラーの修理が必要になることも考えられますので、試される場合は自己責任でお願いします

# 診断コード (DTC)

本故障状態となって警告灯が点いたときに故障の詳細を示す診断コードが記録されます。DTCの項目はアメリカではSAE、日本のJ-OBDⅡは国交省がデータベース化しています

## コードの書式

* 先頭にアルファベット1文字(P/B/C/U)のいずれかと4桁の数字で構成されています
* 最近はコードが増えすぎて1万件を超えたらしく、4桁では収まらないとも言われています
* 一般ユーザーが扱える程度のアプリでは一部の `全メーカー共通のジェネリックなコード` のみと考えた方がいいでしょう。メーカー独自の診断コードは膨大な数があるため手軽には扱えません
    * メーカー独自のコードの場合、同じコードでもメーカーが違えば示す内容が大きく異なる場合もあります。ネットで検索する場合は注意が必要です
    * 不明なコードは市販のスキャンツールを使うか [故障診断ハンドブック](https://www.kouronpub-onlineshop.com/html/products/list?category_id=107) などの書籍を参考にするのが良いでしょう

### 例: P0115 水温センサー回路異常

P0115 のコードの意味は次のようになります

| P | 0 | 1 | 15 |
|:---|:---|:---|:---|
| P: パワートレイン | 0: 全メーカー共通のコード | 枝番(以下は Pコードの場合) | 発生箇所 |
| B: ボディ電装関係 | 0以外: メーカー独自のコード | 0: 全体的なシステム | センサー1 |
| C: シャシ電装関係 | | 1: 燃料と空気計量系統 | センサー2 |
| U: ネットワーク&データリンク | | 2: 燃料とインジェクタ回路 | : |
| | | 3: 点火系統と失火(ミスファイア)検出 | |
| | | 4: 排ガス対策装置 | |
| | | 5: 車速制御とアイドリング制御系統 | |
| | | 6: コンピューターとアクチュエーターの出力異常 | |
| | | 7-8: トランスミッション(変速機) | |
| | | 9-: 将来のための予約範囲 | |

枝番は増えすぎて、9では足りないためにアルファベットも割り振られているらしいです
パワートレインはエンジンやトランスミッション、ボディ電装関係はエアバッグやドア、シャシ電装関係はABSやエアサス、ネットワーク&データリンクは通信系統やイモビライザーなどが相当します

## 補足

* 診断コードが分かったとしても大体の悪い所が分かるまでで、故障の原因を突き止めるにはそれなりの知識や経験が求められます
* 作業中に不要にコネクタを外してしまうと、それが原因で別のDTCが出てしまうこともありますので注意が必要です
* 診断コードはむやみに消さない方がいいらしいです。本来ならば普通に走っていても記録されるはずのコードもあるようで、整備の時にそれが確認されないと不正な改造を行ったと疑われるかもしれません(憶測です)

# フリーズフレームデータ

本故障(警告灯が点いた)時の状態を記録したデータです。基本項目として以下の13項目を残すように定められています

* エンジン負荷(計算値)
* 冷却水温度
* エンジン回転数
* スロットル開度
* 車速
* 燃料圧力
* 吸気温度
* インテークマニホールド負圧
* 吸入吸気量
* フィードバック状況
* 燃料補正量
* 点火時期
* 二次空気状態

# レディネスコード(履歴情報データ)

排ガス対策装置に関係した故障が2回検知された時に記録します(警告灯に関係なく記録されます)。以下の6項目をチェックするように定められています
1. 触媒(排気ガス中に含まれる有害物質を浄化する装置)の劣化具合
2. エンジンの失火検知
3. O2(酸素)センサー、A/F(空燃比)センサーの状態
4. EGR(排気再循環)装置の状態
5. 燃料供給装置の状態
6. 二次空気供給装置の状態

フリーズフレームデータの13項目に加えて、以下の項目も記録されます

* O2センサー、A/Fセンサーの出力
* 保存されているDTCの数
* 警告灯の表示状況

# PID (Parameter Identification Data)

ECUから情報を引き出したり、コマンドを送るためのリクエスト信号です。基本的な部分はアメリカのSAE standard J1979により定められています

数が多いのでここでは紹介しきれませんが、以下のService(モード)から分岐して構成されています

| Service(hex) | 意味 |
|:-------------|:-----|
| 0x01 | 現在の測定値を出力 |
| 0x02 | フリーズフレームデータを出力 |
| 0x03 | DTCの格納された値を出力 |
| 0x04 | DTCと格納された値を消去 |
| 0x05 | テスト結果、(CAN以外のO2センサーのモニタリング値) |
| 0x06 | テスト結果、他のコンポーネントやシステムモニタリング (CANのO2センサーのモニタリング値) |
| 0x07 | 現在または最後のトリップに記録されたペンディングコード(仮故障コード) |
| 0x08 | ECU上やシステムのコントロール操作 |
| 0x09 | 車両情報(VIN)の表示 |
| 0x0A | 恒久的なDTCのクリア |

標準的なPIDは [Wikipedia](https://en.wikipedia.org/wiki/OBD-II_PIDs) に掲載されていますが、これ以外にも車メーカーが独自に定めたPIDもあります

[^MIL]: Malfunction Indicator Lamp
[^DLC]: Data Link Connector
[^BIKEOBD]: http://www.mlit.go.jp/report/press/jidosha10_hh_000223.html
[^ECU]: Engine Control Unitですが、アメリカではPCM(Powertrain Control Module)とも呼ばれています。「E」はElectricを指すこともあります
[^OBDTESTJP]: http://www.mlit.go.jp/common/001279097.pdf
[^PEND]: 「仮故障コード」、「未確定コード」とも呼ばれます
[^DTC]: Dianostic Trouble Code