―― エンジン信号エミュレーターによる誤動作条件特定の試み ――
1. 概要
BP-VE エンジンとフリーダムコンピュータ(以下、フリーダム)の組合せにおいて、「パワー低下」「エンジン停止」「激しいハンチング」などの深刻な誤動作が頻発する事象が確認されている。
これらの誤動作については、発生中の各信号をオシロスコープにより直接観測することに成功しており、誤動作時の信号状態そのものについては、すでに解析を完了している。
(誤動作時の詳細な信号状態については『BP-VE とフリーダムコンピュータの組合せで不具合発生 その1』を参照されたい。)
しかしながら、「どのような条件下で誤動作が発生するのか」という根本的な発生条件については、依然として不明であった。
そこで本研究では、誤動作発生条件を机上で再現・制御することを目的として、フリーダムコンピュータ専用のエンジン信号エミュレーターを新規に作成した。
本稿では、そのエミュレーターの設計思想、ハードウェア構成、およびソフトウェア仕様について、詳細に記録する。
2. エミュレーターの定義と目的
2.1 エミュレーターとは
本稿における「エミュレーター」とは、実際のエンジンから出力される各種センサー信号を、時間・位相・振幅の点で忠実に再現する装置を指す。
語源は emulate(模倣する、再現する)であり、対象システム(本件ではフリーダムコンピュータ)に対し、実物と区別できない入力信号を与えることを目的とする。
フリーダムコンピュータを含む ECU は、
- クランク信号
- カム信号
- 各種アナログセンサー信号
を周期的に受信し、それらを基に
- 燃料噴射時期および噴射量
- 点火時期
- バルブタイミング制御量
を演算し、エンジンを制御している。
したがって、エンジンを実際に回転させることなく、これらの信号を正確に再現できれば、ECU は「エンジンが動作している」と認識し、通常通り制御動作を行う。
2.2 エミュレーターを用いる利点
エミュレーターを用いる最大の利点は、机上環境で ECU の挙動を安全かつ詳細に観察できる点にある。
実車走行中において、
- オシロスコープを接続すること自体が困難
- 走行しながら波形を観測することは極めて危険
- 誤動作が一瞬で消失する場合、再現が困難
といった制約が存在する。
エミュレーターを用いれば、
- 任意の条件を意図的に作り出せる
- 同一条件を何度でも再現できる
- ノイズや異常信号を意図的に注入できる
- ECU の反応を時間をかけて観測できる
という利点が得られる。
本研究では、この特性を活用し、誤動作を「再現可能な現象」として捉えることを目的とした。
3. エミュレーターの設計方針
3.1 基本方針
フリーダムコンピュータがエンジン制御を行う上で、最も本質的な入力信号は、
- クランク信号
- カム信号
の2系統である。
他のセンサー信号(水温、吸気温、スロットル開度等)は一定値で代用可能であり、エンジン回転および同期認識に直接関与するのは、上記2信号である。
2024年当時の仮説として、
- 誤動作の主因は クランク信号の読み落とし
である可能性が高いと考えていた。
そのため、本エミュレーターでは、
- クランク信号を意図的に「追加」「間引き」できる
- クランク信号のパルス幅を可変にできる
- カム信号の位相を進角・遅角方向に自由に変化させられる
構成とした。
また、
- 始動時相当の 100rpm
- 設定上の上限である 10000rpm
まで、回転数を断続的に変化させ、全回転域での ECU の挙動を確認できるようにした。
4. エミュレーター構成
4.1 システム全体構成
4.2 エミュレーター部構成
5. エミュレーター詳細仕様
5.1 使用したマイコンおよび周辺部品
- Raspberry Pi Pico 2
- Pico Explorer Base
- 4ビット双方向ロジックレベル変換モジュール(BSS138 使用)
各部品の詳細
Raspberry Pi Pico 2 H(完成品)
https://akizukidenshi.com/catalog/g/g130982/
販売コード:130982
Pico Explorer Base
https://akizukidenshi.com/catalog/g/g116239/
販売コード:116239
4ビット双方向ロジックレベル変換モジュール(BSS138 使用)
https://akizukidenshi.com/catalog/g/g113837/
販売コード:113837
Raspberry Pi Pico の I/O 電圧は 3.3V 系であるため、フリーダム側の 5V 系信号とのインターフェースにはレベルシフタが必須である。
本モジュールは仕様上 10MHz 程度まで動作可能である。
ECU コネクタ(NA8 Sr.2 用)
AliExpress にて調達。
- 26pin メス:917992-6 / 90980-11390
- 22pin メス:917989-6 / 90980-11392
- 16pin メス:917983-6 / 90980-11425
※フリーダム側 64pin オス(178883-6 / 30050-64A)は今回は未使用。
6. ハードウェア仕様
6.1 フリーダムコンピューターへの入力信号(全て 5V 系)
- クランク信号(マイコン生成)
- カム信号(マイコン生成)
- 水温(固定抵抗による一定値)
- 吸気温(固定抵抗による一定値)
- スロットル開度(可変抵抗:全閉〜全開)
- 吸気圧(可変抵抗:全閉〜全開)
- O2 センサー(可変抵抗:A/F 10〜20 相当)
6.2 フリーダムコンピューターからの出力信号(観測対象)
- イグニッション信号(5V 系、1-4 / 2-3 の 2 出力)
- インジェクター信号(12V 系、4 気筒分)
- VVT 信号(12V 系、PWM 制御 0〜200)
- ISCV 信号(12V 系、PWM 制御 0〜255)
6.3 回路図
(ピン番号は NA8 Sr.2 ECU 用。左下のトランジスタに Raspberry Pi Pico の出力を接続。)
7. ソフトウェア開発
7.1 開発概要
エミュレーター用ソフトウェアは、本稿に記載する仕様書を基に、ChatGPT によって生成した。
この程度の仕様書であっても、ChatGPT はエンジン制御の概念を十分に理解しており、制御として破綻したソースコードが出力されることはなかった。
やりたいこと、目的、制約条件を明確に与えることで、人間では到底不可能な速度で実装案を提示してくる点は、従来の開発手法と比較しても特筆すべき点である。
初期段階では、
- 回転数 1000rpm 固定
- クランク信号・カム信号を周期的に出力
する最小構成のコードを作成した。
この段階で、フリーダムコンピューターは想定通りの出力を示し、エミュレーターとして成立することを確信できた。
しかし、その後の道のりは長かった。
- 位相変更処理
- LCD 表示
- ボタン操作
特に、カム信号位相を連続的に変化させる処理は最も難航した部分である。
出力されたコードを精査し、修正提案を行いながらのやり取りを繰り返し、最終的には数十回に及ぶ修正を経て完成に至った。
数十回の修正要求にも一切不満を示さず対応する ChatGPT に対し、月額 3,500 円でここまで付き合うエンジニアは存在しないだろう、というのが率直な所感である。
なお、最も手間取ったのはRaspberry Pi Pico 2 の開発環境構築であった。
従来の Pico に関する情報は豊富だが、新型である Pico 2 に関する情報は極めて少なく、事実上ベータ版ファームウェアしか存在しない状況であった。
ChatGPT の支援がなければ、Pico 2 への書き込みすら行えなかった可能性が高い。
8. ソフトウェア仕様書詳細
本節では、作成したエミュレーターソフトウェアの仕様を、原仕様書に基づき詳細に記載する。
本エミュレーターは、回転数の変化により信号の時間幅(実時間)が変動する。
そのため、時間軸を実時間(µs など)で指定すると、回転数に依存して信号形状が変化し、実車信号との同等性が崩れる。
そこで本エミュレーターでは、時間軸をすべて角度(度)で指定し、回転数が変化しても、実車信号と同様の角度位置でパルスが発生するように設計した。これにより、回転数が変化しても、波形の「角度上の意味」を一定に保つ。
8.1 回転数調整範囲
- 調整範囲:100rpm〜10000rpm
- ステップ:100rpm
- 初期値:1000rpm
エンジン始動時の挙動を確認する目的で、下限回転数を 100rpm に設定した。
8.2 カム信号(実車信号測定値)
カム信号は以下の角度条件で定義する。
- 0度から Lo スタート
- 160度から 180度まで Hi
- 180度から 315度まで Lo
- 315度から 337.5度まで Hi
- 337.5度から 348.75度まで Lo
- 348.75度から 360度まで Hi
上記は、実車信号測定結果に基づく定義である。
(クランク2回転720度で、カム1回転360度)
8.3 クランク信号(実車信号測定値)
クランク信号はノーマリー Lo とし、以下の角度位置で Hi パルスを出力する。
(合計 8 発)
- 0度
- 70度
- 180度
- 250度
- 360度
- 430度
- 540度
- 610度
上記は、実車信号測定結果に基づく定義である。
(クランク2回転720度で、カム1回転360度)
8.4 クランクパルス幅
- 調整範囲:0.25度〜10.00度
- ステップ:0.25度
- 初期値:5度(実車信号測定値)
8.5 カム‐クランク位相
- 調整範囲:±180度
- ステップ:1度
- 初期値:6度(実車信号測定値)
9. テストモード
本節では、クランク信号に対して意図的な異常(追加・欠落)を与えるテストモードについて記載する。
9.1 クランクパルス追加(Test1)
Test1 は、クランク信号に対して 1 発余計なパルスを挿入する機能である。
- 追加パルス幅:1度〜10度(1度ステップ)
追加位置は以下 2 系統を想定する。
追加位置 1(パルス間中央狙い)
パルスとパルスの間(中央)を狙い、Lo‐Hi‐Lo の追加パルスを挿入する。
追加位置 2(TDC 基準の 8 か所)
1 番気筒の TDC から順に、720 度までの 8 か所を対象とし、1〜8 の番号で追加位置を指定する。
9.2 クランクパルス間引き(Test2)
Test2 は、クランク信号から 1 発パルスを削除する機能である。
- 間引く位置:1 番気筒 TDC から順に 720 度までの 8 か所
- 指定方法:1〜8 の番号で指定
10. 押しボタンおよび LCD 表示仕様
本節では、Pico Explorer Base のボタン、および LCD 表示に関するユーザインターフェース仕様を記載する。
10.1 基本ボタン機能
- A ボタン:決定(Select)
- B ボタン:一つ前に戻る(Return)
- X ボタン:Up
- Y ボタン:Dn
10.2 LCD 画面のボタン案内表示
LCD 画面四隅に以下の案内を常時表示する。
- A ボタン:Select
- B ボタン:Return
- X ボタン:Up
- Y ボタン:Dn
操作体系は次の通りである。
- X,Y ボタンでカーソル移動
- A ボタンで Select(決定)
- B ボタンで Return(戻る)
10.3 電源オン時のメインメニュー表示
電源投入時、LCD に以下の 5 項目を表示する。
1 行目:回転数モード
2 行目:位相モード
3 行目:クランクパルス幅モード
4 行目:クランクパルス追加(Test1)
5 行目:クランクパルス間引き(Test2)
カーソル初期位置は、電源オン時は回転数モードとする。
下層画面から戻った場合は、遷移前のモード位置にカーソルを復帰させる。
メインメニューにおける各ボタン機能は次の通りである。
- A:決定
- B:戻る
- X:カーソル Up
- Y:カーソル Dn
11. 各モード画面の仕様
11.1 回転数モード
表示内容:
- 1 行目:「回転数」
- 2 行目:現時点の回転数(最大 5 桁、単位 rpm)
操作仕様:
- A:機能なし
- B:「電源オン画面」に戻る
- X:回転数 Up
- Y:回転数 Dn
ここで設定した回転数は保持する。
11.2 位相モード
表示内容:
- 1 行目:「位相」
- 2 行目:現時点の位相(±180度、単位 度)
操作仕様:
- A:機能なし
- B:「電源オン画面」に戻る
- X:位相 Up
- Y:位相 Dn
ここで設定した位相は保持する。
11.3 クランクパルス幅モード
表示内容:
- 1 行目:「クランクパルス幅」
- 2 行目:現時点のパルス幅(単位 度)
操作仕様:
- A:機能なし
- B:「電源オン画面」に戻る
- X:パルス幅 Up
- Y:パルス幅 Dn
ここで設定したパルス幅は保持する。
11.4 クランクパルス追加(Test1)画面
表示内容:
- 1 行目:「クランクパルス追加」
- 2 行目:パルス幅(単位 度)
- 3 行目:追加位置(1〜8)
- 4 行目:Fire!
操作仕様:
- X,Y ボタンで 2,3,4 行目間をカーソル移動
- A ボタンで Select(決定)
- B ボタンは機能なし
- 4 行目(Fire!)で A ボタンを押すと、クランクパルスを 1 発追加し実行する
モード内で設定した値は保持する。
2 行目(パルス幅)選択時の下層画面
表示内容:
- 1 行目:「パルス幅」
- 2 行目:現時点のパルス幅(単位 度)
操作仕様:
- A:機能なし
- B:一つ上の層に戻る
- X:パルス幅 Up
- Y:パルス幅 Dn
ここで設定した値を保持する。
3 行目(追加位置)選択時の下層画面
表示内容:
- 1 行目:「パルス追加位置」
- 2 行目:追加位置(1〜8)
操作仕様:
- A:機能なし
- B:一つ上の層に戻る
- X:位置 Up
- Y:位置 Dn
ここで設定した値を保持する。
11.5 クランクパルス間引き(Test2)画面
表示内容:
- 1 行目:「クランクパルス間引」
- 2 行目:パルス幅(単位 度)
- 3 行目:追加位置(1〜8)
- 4 行目:Fire!
操作仕様:
- X,Y ボタンで 2,3,4 行目間をカーソル移動
- A ボタンで Select(決定)
- B ボタンは機能なし
- 4 行目(Fire!)で A ボタンを押すと、クランクパルスを 1 発間引いて実行する
モード内で設定した値は保持する。
2 行目(パルス幅)選択時の下層画面
表示内容:
- 1 行目:「パルス幅」
- 2 行目:現時点のパルス幅(単位 度)
操作仕様:
- A:機能なし
- B:一つ上の層に戻る
- X:パルス幅 Up
- Y:パルス幅 Dn
ここで設定した値を保持する。
3 行目(位置)選択時の下層画面
表示内容:
- 1 行目:「パルス追加位置」
- 2 行目:追加位置(1〜8)
操作仕様:
- A:機能なし
- B:一つ上の層に戻る
- X:位置 Up
- Y:位置 Dn
ここで設定した値を保持する。
12. オシロスコープ・トリガー用信号
- 出力ピン:GP7
- 仕様:TDC で立ち上がり 1 発
- 通常状態:Lo
- パルス時:Hi
- パルス幅:20µs 固定
目的は、オシロスコープにおいて1 番上死点(TDC)の波形を確実にトリガし、表示を安定して停止させることにある。
13. Pico2 周辺の写真
Pico2 周辺の写真
14. エミュレーターの画面表示
以下に、エミュレーターの画面表示例を示す。
- メイン画面
- 回転数画面
- カム位相画面
- クランク信号幅画面
- クランク信号 1 発追加画面
- クランク信号 間引き画面
15. まとめ(本稿の位置づけと所感)
本稿「BP-VE とフリーダムコンピュータの組合せにおける不具合発生(その4)」では、誤動作の原因特定そのものではなく、その原因特定を可能にした エンジン信号エミュレーター(シミュレーター)の仕様と設計思想に焦点を当てて記述した。
●誤動作の具体的な再現条件および原因の切り分けについては、すでに前稿「その3」にて説明済みであり、
本稿はあくまで、
- どのような考え方でエミュレーターを設計したのか
- なぜこの仕様が必要だったのか
- どこまでを再現し、どこを切り捨てたのか
といった 検証のための土台を記録することを目的としている。
●本エミュレーターの開発を通じて、改めて強く感じたのは、AIの活用可能性の大きさである。
AI の持つ知識量と処理速度は、すでに人間を遥かに凌駕している。
ただしそれは「何でも勝手に解決してくれる存在」という意味ではない。
- 何をしたいのか
- 何を検証したいのか
- 何が分かっていて、何が分かっていないのか
これらを 人間側が明確に言語化し、構造化して指示できた時、AI は非常に強力で、かつ忍耐強い「相棒」となる。
数十回に及ぶ仕様修正、コード修正、設計意図の再説明にも付き合い続ける存在は、少なくとも従来の開発現場には存在しなかった。
●また、本研究を通じて再認識したのは、エンジン制御という分野の本質的なシンプルさである。
エンジン制御は一見すると極めて複雑で難解に見えるが、
本質的には、
- クランクがどこにあるか
- カムがどこにあるか
この 2 点を正しく認識し続けられるかどうかに集約される。
不要な要素を一つずつ引き算し、「本当に必要な信号は何か」を突き詰めていくことで、問題の構造は驚くほど単純な形で姿を現す。
今回のエミュレーター設計は、その「引き算してシンプルにする」という姿勢の重要性を、改めて強く実感させる結果となった。
ーーー
ちなみに本原稿。要点と流れをなぐり書きした原稿を、ChatGPTに「論文調に仕上げて」と指示して完成させた。
最近のAIは、日本語も極めて上手。偽メールが来たら、騙されてしまうだろう。
最後までお読みいただき、ありがとうございました。
免責事項(Disclaimer)
本記事に掲載している回路図・改造手法・ソフトウェア等は、特定の条件・環境での動作を確認したものであり、すべての環境で安全に動作することを保証するものではありません。誤使用、改造、実装により発生したいかなる損害・事故・故障についても、筆者および当サイトは一切の責任を負いません。
この情報に基づいて何らかの作業を行う場合は、ご自身の責任において安全・法令遵守の下で実施してください。













































