コンテンツへスキップ

[カブ] Arduinoで作る簡易インジェクションコントローラー(その1)

FIカブ50に97ccボアアップシリンダーを流用して搭載したとき、そのままだと燃調が狂ってエンジンが始動すらしませんでした。ボアアップして排気量が増えるに伴い燃調をあわせる必要があります。FI仕様カブでは市販のサブコン/インジェクションコントローラを使うのが一般的かと思いますが、自作も可能です。私も先輩方の情報を参考にArduinoを使った簡易インジェクションコントローラを自作してみました。

 

環境

Arduino nanoはAliexpressで購入した安価な互換品を使用しました。おひとつ300円以下でとても便利です。今回の回路はボアアップしたエンジンが燃料供給量を増やしてやることでアイドリングするようになるかを確認するためのものです。ブレッドボード上にちゃちゃっと構築してミノムシクリップで実車に接続して使用しました。

  • プレスカブ50 2008年式(JBH-AA01)
  • Arduino nano互換品
  • ブレッドボード&ジャンパ配線
  • ミノムシクリップ
  • 部品少々(抵抗、コンデンサー、ダイオード、LED、FET)
簡易インジェクションコントローラをブレッドボード上に構築
今回はインジェクションコントローラの回路をブレッドボード上に構築しました

 

簡易インジェクションコントローラの構成

回路

回路構成は以下のブログを参考にさせて頂きました。この情報のおかげで簡単に作ることが出来ました(作者さんありがとうございます!)

カブ簡易インジェクションコントローラの回路図
簡易インジェクションコントローラの回路図

参考元の回路ではPICを使用されていたのをArduino nanoに置き換えました。FETは家にあったIRF3710というものを使っています。これは耐圧100V電流57Aまでというスペックで、おそらく耐圧が不足しています。以前に実車のインジェクタ信号をオシロスコープで観測したところ200Vくらいの電圧が発生していました。いつ壊れるか分からないので、実走行する際にはもっと耐圧の高いFETに置き換える必要があります。

回路中のD3,D4,R2は燃料インジェクタの動作確認用です。電源接続のダイオードD1は間違って逆接続したときの保護と、Arduino nano(互換品)に載っている5Vレギュレータの入力電圧が15Vまでのため電圧を下げる目的でつけました。

また燃料噴射量を調整するのにスケッチを何度も書き換えるのは面倒なので調整用のジャンパスイッチをつけています。このスイッチでインジェクタ動作時間の増量を0~7msecの間で指定します。

 

Arduinoスケッチ

簡易インジェクションコントローラのスケッチです。処理はとてもシンプルに以下のようにしました。

  1. ECUの燃料インジェクタ信号をポーリングしてONすると、インジェクタON
  2. ECUの燃料インジェクタ信号をポーリングしてOFFすると、そのまま設定時間DelayしてからインジェクタOFF
  3. これを繰り返す

噴射時間の増分は、電源投入/リセット解除時にジャンパスイッチの状態を読み込んで判定しています。

インジェクタON時にはArduino nano搭載のデバッグ用LED(D13,PB5端子接続)が点灯するようにしました。万が一このLEDが点灯しているにもかかわらず基板上のインジェクタ動作確認用LED(D4)が点灯しない場合は、FETが破損しているか接続に問題がある可能性があります。


/**
* Simple Injection Controller for CUB(JBH-AA01)
* http://www.suke-blog.com
*/

#include <Arduino.h>
#include <stdio.h>

#define SERIAL_RATE 115200
#define SERIAL_TIMEOUT 1000

//PIN Config
#define PIN_ECU_INJECTOR_SIG 3
#define PIN_INJECTOR_OUT 8
#define PIN_MODE0 A0
#define PIN_MODE1 A1
#define PIN_MODE2 A2
#define PIN_LED 13

uint8_t g_mode = 0;
const uint32_t g_modeTable[] = {
0, //0
1000, //1
2000, //2
3000, //3
4000, //4
5000, //5
6000, //6
7000 //7
};

// 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);

//GPIO setting
pinMode(PIN_ECU_INJECTOR_SIG, INPUT_PULLUP);
pinMode(PIN_INJECTOR_OUT, OUTPUT);
pinMode(PIN_MODE0, INPUT_PULLUP);
pinMode(PIN_MODE1, INPUT_PULLUP);
pinMode(PIN_MODE2, INPUT_PULLUP);
pinMode(PIN_LED, OUTPUT);

//Injector off
digitalWrite(PIN_INJECTOR_OUT, LOW);

//debug led OFF
digitalWrite(PIN_LED, LOW);

//delay 100ms
delay(100);

//read ModePin
// g_mode = digitalRead(PIN_MODE0) | digitalRead(PIN_MODE1) << 1 | digitalRead(PIN_MODE2) << 2;
g_mode = PINC & 0x07;

printf("g_mode=%d,\n", g_mode);
printf("delay=%d,\n", g_modeTable[g_mode]);

//MODE0: for debug
if(g_mode != 0){
cli(); //All interrupt disable
}
}
void loop(){
//wait for injector-on signal from ECU
while(digitalRead(PIN_ECU_INJECTOR_SIG) != LOW){};

//Injector ON
digitalWrite(PIN_INJECTOR_OUT, HIGH);
digitalWrite(PIN_LED, HIGH);

//wait for injector-off signal from ECU
while(digitalRead(PIN_ECU_INJECTOR_SIG) != HIGH){};

//wait Increase time
delayMicroseconds(g_modeTable[g_mode]);

//Injector OFF
digitalWrite(PIN_INJECTOR_OUT, LOW);
digitalWrite(PIN_LED, LOW);
}

 

動作確認

実車にくっつける前に以前作成したエンジンエミュレータを使って動作確認を行います。エミュレータのインジェクタ信号に作成したインジェクションコントローラを割り込ませて動作させ波形を観測しました。思惑通り噴射時間が伸びているようです。波形を詳しく見てみると噴射開始が11usecほど遅くなることがわかりましたが、おそらく問題にはならないと思います(arduino提供のAPIを使わずにレジスタを直接読めば早くなると思います)。

簡易インジェクタとPGM-FIエンジンエミュレータ
組んだ回路をPGM-FIエンジンエミュレータに繋いで動作確認中
簡易インジェクションコントローラの波形
上:純正ECUのインジェクタ信号、下:簡易インジェクションコントローラの信号(4msecほど噴射時間を増やした場合の波形です)

 

簡易インジェクションコントローラの波形(インジェクタ制御信号の遅れ)
インジェクタ信号の遅れを測定。下の簡易インジェクションコントローラの方が約11usec遅れています。

早速、実車に繋いでみました。これを繋ぐ前は何度キックしてもエンジンが始動してくれませんでしたが、燃料を増量してやるとキック一発であっさりと始動しました。やっぱり50ccのときの噴射量じゃ全然足りないのですね。

簡易インジェクションコントローラの実車テスト
実車に繋いでエンジン始動テストです。燃料噴射量をジャンパスイッチを使って調整して何回かテストしました。一応1msec以上増やせばアイドリングはする模様

 

所感

これで流用シリンダーでもアイドリングしてくれることがわかりました(おお、ちゃんとエンジン動いてるじゃないか、とちょっと感動)。実際に走れるようになるまでの第一歩です。

実走行の際にはこいつをベースにしたものを載せて試走したいと思います。その後はエンジン回転数やスロットル開度に応じて燃料噴射量を設定出来るようなインジェクションコントローラを作ってみたいですね。

 

参考

この記事は以下のサイトを参考に記載させていただきました。

1 thought on “[カブ] Arduinoで作る簡易インジェクションコントローラー(その1)

  1. 匿名

    この回路だと高電圧の負サージでFET損傷しませんか?
    ツェナーダイオードをコイルと並列で入れた方がよさそうですな

    返信

コメントを残す

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

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