FIカブ50に97ccボアアップシリンダーを流用して搭載したとき、そのままだと燃調が狂ってエンジンが始動すらしませんでした。ボアアップして排気量が増えるに伴い燃調をあわせる必要があります。FI仕様カブでは市販のサブコン/インジェクションコントローラを使うのが一般的かと思いますが、自作も可能です。私も先輩方の情報を参考にArduinoを使った簡易インジェクションコントローラを自作してみました。
環境
Arduino nanoはAliexpressで購入した安価な互換品を使用しました。おひとつ300円以下でとても便利です。今回の回路はボアアップしたエンジンが燃料供給量を増やしてやることでアイドリングするようになるかを確認するためのものです。ブレッドボード上にちゃちゃっと構築してミノムシクリップで実車に接続して使用しました。
- プレスカブ50 2008年式(JBH-AA01)
- Arduino nano互換品
- ブレッドボード&ジャンパ配線
- ミノムシクリップ
- 部品少々(抵抗、コンデンサー、ダイオード、LED、FET)
簡易インジェクションコントローラの構成
回路
回路構成は以下のブログを参考にさせて頂きました。この情報のおかげで簡単に作ることが出来ました(作者さんありがとうございます!)
- 解析まもログ - PICで 自作インジェクションコントローラ
http://pro.kai-seki.net/%E3%83%90%E3%82%A4%E3%82%AF%E3%81%84%E3%81%98%E3%82%8A/pic%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%9F%E3%82%A4%E3%83%B3%E3%82%B8%E3%82%A7%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%B3%E3%83%B3%E3%83%88%E3%83%AD%E3%83%BC%E3%83%A9
参考元の回路ではPICを使用されていたのをArduino nanoに置き換えました。FETは家にあったIRF3710というものを使っています。これは耐圧100V電流57Aまでというスペックで、おそらく耐圧が不足しています。以前に実車のインジェクタ信号をオシロスコープで観測したところ200Vくらいの電圧が発生していました。いつ壊れるか分からないので、実走行する際にはもっと耐圧の高いFETに置き換える必要があります。
回路中のD3,D4,R2は燃料インジェクタの動作確認用です。電源接続のダイオードD1は間違って逆接続したときの保護と、Arduino nano(互換品)に載っている5Vレギュレータの入力電圧が15Vまでのため電圧を下げる目的でつけました。
また燃料噴射量を調整するのにスケッチを何度も書き換えるのは面倒なので調整用のジャンパスイッチをつけています。このスイッチでインジェクタ動作時間の増量を0~7msecの間で指定します。
Arduinoスケッチ
簡易インジェクションコントローラのスケッチです。処理はとてもシンプルに以下のようにしました。
- ECUの燃料インジェクタ信号をポーリングしてONすると、インジェクタON
- ECUの燃料インジェクタ信号をポーリングしてOFFすると、そのまま設定時間DelayしてからインジェクタOFF
- これを繰り返す
噴射時間の増分は、電源投入/リセット解除時にジャンパスイッチの状態を読み込んで判定しています。
インジェクタ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を使わずにレジスタを直接読めば早くなると思います)。
早速、実車に繋いでみました。これを繋ぐ前は何度キックしてもエンジンが始動してくれませんでしたが、燃料を増量してやるとキック一発であっさりと始動しました。やっぱり50ccのときの噴射量じゃ全然足りないのですね。
所感
これで流用シリンダーでもアイドリングしてくれることがわかりました(おお、ちゃんとエンジン動いてるじゃないか、とちょっと感動)。実際に走れるようになるまでの第一歩です。
実走行の際にはこいつをベースにしたものを載せて試走したいと思います。その後はエンジン回転数やスロットル開度に応じて燃料噴射量を設定出来るようなインジェクションコントローラを作ってみたいですね。
参考
この記事は以下のサイトを参考に記載させていただきました。
- 解析まもログ - PICで 自作インジェクションコントローラ
http://pro.kai-seki.net/%E3%83%90%E3%82%A4%E3%82%AF%E3%81%84%E3%81%98%E3%82%8A/pic%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%9F%E3%82%A4%E3%83%B3%E3%82%B8%E3%82%A7%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%B3%E3%83%B3%E3%83%88%E3%83%AD%E3%83%BC%E3%83%A9 - TOSHIBA - メカリレー駆動用 MOSFET の安全設計
https://toshiba.semicon-storage.com/info/docget.jsp?did=30149 - interfacebus.com - Logic Threshold Voltage Levels
http://www.interfacebus.com/voltage_threshold.html
この回路だと高電圧の負サージでFET損傷しませんか?
ツェナーダイオードをコイルと並列で入れた方がよさそうですな