サイトアイコン すけログ

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

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

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

 

環境

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

FIカブのECU(こいつを卓上で動かして挙動を調べるためにエミュレータを作ります)

エミュレータ基板の製作

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

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

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

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

 

回路構成

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

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

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

 

一通り部品を載せた状態の基板

また、この回路構成で動作させるとECUが以下エラーを検出してPGM-FI警告灯(LED)が点灯します。バンクアングルセンサエラーはDACに繋いで電圧を調整、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本接続しました(一度外すと元に戻すには手間がかかってしまいます)。
念のため回路がショートしていないか確認してから電源投入です。

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

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

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

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

 

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

 

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

参考

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

 

モバイルバージョンを終了