コンテンツへスキップ

[カブ] ECU(PGM-FI)エミュレータの製作

我が家のカブはFI仕様です。何もしなくてもその時のコンディションに応じて燃料を噴射してくれるのでとても便利です。ただ、ボアアップしたりで燃調を自分で調整したいとなるとそのままでは難しく、市販されている外付けのインジェクションコントローラーが必要になります。そこまで高価なものではないと思いますが、私の貧弱な財布には堪えます。

どうしたものかと余所さまのブログを拝見していると自作されている方がおられました。高機能を求めなければ自作出来そうな気がします。そこで手始めにカブECUの動作を理解するため、卓上でECUの動きが見れるよう実車環境をエミュレートするものを作ることにしました。これがあればエンジンをかけなくてもECUの信号を観測することが出来ます。

 

環境

エミュレータ環境には以前にヤフオクで購入した予備のECUを使用しました(実車からECUを引っこ抜いてもよかったのですが、万が一壊すと不動車と化すので)。

  • カブJBH-AA01(2008年式)搭載ECU
  • Arduino Nano
  • ユニバーサル基板、抵抗、コンデンサ、ジャンパ
カブECU
FIカブのECU(こいつを卓上で動かして挙動を調べるためにエミュレータを作ります)

エミュレータ基板の製作

PGM-FI ECUコネクタの端子を調べる

一般に外部コネクタは、オスと見なせるピンを左から、メスを右から数えることが多いようです。サービスマニュアルを確認すると同じ割り当てのようなので、ここではピン番号をECU本体コネクタを正面から見て左からふっています。ロック用の突起があるほうを上にしています。

R0012166.JPG
ECUコネクタ(左上を1番ピンとしています)

さて、エミュレータを製作するにあたってECUの端子一覧が必要です。これについてはサービスマニュアルにある程度は記載されています。私がまとめた端子機能一覧を以下に記載します。ただし、私の理解した(と思っている)範囲で記載しているので勘違いしている箇所があるかもしれません。

 

回路構成

ECUに実車と同じような信号を入力してやれば動作するはずです。そこで以下のような回路を作成しました。Arduinoを使ってクランクパルスや各センサ信号を作成しECUに入力しています。また燃料インジェクタや点火信号を観測するためにジャンパを設け、視認出来るようにLEDを接続しました。

Arduinoは手元に転がっていたNanoを使用しました。NanoにはDACが無いのでPWMとローパスフィルタを組み合わせD/Aとして使いました。ただ、このDACは0-5Vで解像度8bitと荒いので、なるたけノイズを減らすためにローパスフィルタの抵抗値を大きめにしています(プログラムで出力値を変えても追従するのに秒単位でかかってしまいます)。

カブECUエミュレータ回路図
カブECUエミュレータ回路図

 

FIカブECUエミュレータの基板
一通り部品を載せた状態の基板

また、この回路構成で動作させるとECUが以下エラーを検出してPGM-FI警告灯(LED)が点灯します。バンクアングルセンサエラーはDACに繋いで電圧を調整、IACはモーターの代わりに抵抗でも繋いでやれば解決しそうな気がしますが、動作上問題なかったのでひとまずこのままでいくことにしました。

  • バンクアングルセンサーのエラー
  • IAC(アイドルエアコントロールバルブ)のエラー

 

エミュレータ用ソフトウェアの製作

シンプルに固定条件の信号を出力するだけのスケッチです。
setup()でセンサ出力値を設定して、メイン処理のループでクランクパルスセンサ信号を生成しています。
吸気温度センサ等は2.7-3.1Vと範囲が狭く、DACで出力するとセンサ正常値となる範囲は20ステップくらいしかありません。電圧がこの範囲を外れるとエラーとして検出され、実車であればPGM-FI警告灯が点灯します。


/**
* PGM-FI Emulator
*/

#include <Arduino.h>

#define SERIAL_RATE 9600
#define SERIAL_TIMEOUT 1000

#define SENSOR_O2 3
#define SENSOR_THL 5
#define SENSOR_TA 6
#define SENSOR_TO 9
#define SENSOR_PB 10

#define PCP 8

const uint8_t analogOutPins[] = {3,5,6,9,10,11};

// forDebug
static FILE uartout;
static int uart_putchar(char c, FILE *stream) {
if(Serial.write(c) > 0) {
return 0;
} else {
return -1;
}
}

void setup(){
//forDebug
fdev_setup_stream(&uartout, uart_putchar, NULL, _FDEV_SETUP_WRITE);
stdout = &uartout;

// config serial
Serial.begin(SERIAL_RATE);
Serial.setTimeout(SERIAL_TIMEOUT);

// config output pin
for(uint8_t i = 0; i<sizeof(analogOutPins); i++){
pinMode(analogOutPins[i], OUTPUT);
}
pinMode(PCP, OUTPUT); //CrankPulse

//sensor initial value
analogWrite(SENSOR_O2, 25); //0-1v(0-51)
analogWrite(SENSOR_THL, 22); //0.4-4.8V(21-245)
analogWrite(SENSOR_TA, 138); //2.7-3.1V(138-158)
analogWrite(SENSOR_TO, 138); //2.7-3.1V(138-158)
analogWrite(SENSOR_PB, 138); //2.7-3.1V(138-158)
}
void loop(){
uint8_t i = 0;
uint32_t pulseHigh = 500;//1700RPM
uint32_t pulseLow = 2500;//1700RPM
uint32_t count = 0;

//generate crank pulse
while(1){
for(i=0; i<12; i++){
if(i < 9){
digitalWrite(PCP, HIGH);
}
delayMicroseconds(pulseHigh);

if(i < 9){
digitalWrite(PCP, LOW);
}
delayMicroseconds(pulseLow);
}

}

 

動作確認

ECUに使われているコネクタは一般入手が難しいようなので、ジャンパを使って1本1本接続しました(一度外すと元に戻すには手間がかかってしまいます)。
念のため回路がショートしていないか確認してから電源投入です。

FIカブECUコネクタ(メス側)
このコネクタ、住友電装製のような気がするのですがカタログにありません。海外でひとつ見つけましたが最小発注数があって入手が難しい。
ECUとエミュレータ基板の接続
こんな感じにメス-メスのジャンパ線を使って基板と接続します

実は最初はECUの立ち上がり(燃料ポンプが数秒動作する)は問題なかったものの、いざ走行時の動作をさせるとうんともすんとも動作しませんでした。何度やっても燃料は噴かないしプラグも点火しません。何故だと唸りながら触っていると、クランクパルス信号あたりを指で触れたときに急に動き出しました。色々試したところ、クランクパルス信号の電圧が低すぎたことが原因でした。サービスマニュアルにはピーク電圧0.7Vとあったのでそれにあわせたのですが、もっと高い電圧でないと動作しないようです。

分圧抵抗を付け直してから動作させてみると無事に動いてくれました。PGM-FI警告灯は点滅しますが、サービスマニュアルを参照するとバンクアングルセンサとIACエラーだったので無視しています。

FIカブ ECUエミュレータ
FIカブ ECUエミュレータの動作確認中

 

FIカブ ECUエミュレータの波形(燃料インジェクタ)
FIカブ ECUエミュレータの波形(上:クランクパルス信号/下:燃料インジェクタ信号)

 

FIカブ ECUエミュレータの波形(点火)
FIカブ ECUエミュレータの波形(上:クランクパルス信号/下:点火信号)

参考

この記事は以下のサイト及び書籍を参考に記載させて頂きました。

 

7 thoughts on “[カブ] ECU(PGM-FI)エミュレータの製作

  1. motoge

    凄いことをやっていますね
    私のは CG125Fi でミクニのECUがついていますが、情報が無くて
    下記の所で動作を確認中です。 中華製は色々情報なくて、でも色々探すのが楽しみです
    https://www.alientech-tools.com/k-tag/

    あとガーミン中華製
    etrex 221x
     日本語表示、地図も表示できました ありがとうございました。

    返信
  2. リトルカブズ

    コメントにて失礼します。こちらのページを拝見しエミュレータを製作いたしましたが、エンジン回転数の変更(設定)方法が分からず困っています。お手数をお掛けしますがもし良ければご教授下さい。

    返信
  3. かぶへい

    初めまして、こちらのページを拝見しECUからの信号を見ようとしています。
    大変恐縮ではございますが、2点教えてください。
    1.Arduinoの14番に接続される場所が回路図には未記入になっておりますが、接続先を教えて頂けませんか?

    2.+5Vの明記がある場所はArduinoの5Vに接続されていますか?

    全く同じものを作ろうとした際に投稿されている写真を拝見すると不明な点が有りましたので、質問しました。
    軽く電子回路を学んだ程度の素人で大変恐縮お手数ですがご教示願います。

    返信
    1. suke

      返信遅くなりました。

      > 1.Arduinoの14番に接続される場所が回路図には未記入になっておりますが、接続先を教えて頂けませんか?

      arduinoのpin14は未接続です。ちょっとうろ覚えなのですが、もしかして何か使うかもと考えてD/A出力ポートの予備として用意したような気がします。結局使いませんでしたが。。。

      > 2.+5Vの明記がある場所はArduinoの5Vに接続されていますか?

      接続していません。ECUの5Vは入力ではなく出力(スロットルボディのスロットル開度センサ/吸気温度センサ用5V電源)だったと思います。

      また、恐らくですがECUのTOP_SW信号はリトルカブ(4速)ECU以外(プレスカブのやつとか)は繋いでも意味が無いと思います。多分、エンジン回転数と油温が一定以上かつトップギア(4速)のときにスロットルを閉じると燃料噴射を止めるんじゃないかなぁと妄想しています。

      返信
  4. はりっち

    随分マニアックな事をされるんですね。驚きます。何でも知ってそうな貴殿を見込んでひとつ質問が
    あります。私はクロスカブに乗っており、去年はキタコのインジェクションコントローラを介在させてレブリミット解除など色々操作して遊んでいましたが、やはり純正が良いと思い返し同部品を取り外しを試みた次第です。ところが元の配線に戻す際に黒/橙おそらくO2センサのコードだけが余ってしまいECU側からコードが出ていないことに気が付きました。初期状態が思い出せず、どこに繋げばよかったかなと悩んでいる次第です。何かアドバイスいただけるでしょうか?

    返信
    1. suke

      こんにちは。

      キタコのインジェクションコントローラというと、以下の製品でしょうか?
      http://www.kitaco.co.jp/data/product/media/763-1429100.pdf

      実機が無いの確かなことは言えませんが、JA10のサービスマニュアルを見てみると"黒/橙"は仰るようにO2センサの配線です。インジェクションコントローラの接続時に配線加工したのでなければ、ワイヤーハーネス(セルモータor点火コイルの近く?)にくっつくようにO2センサのカプラーがあるはずです。

      ただ、上記のインジェクションコントローラだとO2センサの配線は特に弄っていないようなので、もし黒/橙の配線だけが(カプラもギボシも無しに)余っているのならカプラ根元で切れたりしていないか確認した方がいいかもしれません。

      ご参考になればと思います。

      返信
      1. suke

        (追記)

        配線図を見てみると、O2センサ配線(黒/橙)はECUの3番ピンから出ているようです。そこから辿れるかもしれません。

        返信

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください