おぼえがき

バイクの細かな整備情報などをアップしていきます。

AIを使ってバイクのECUを自作しよう①RPMを検出する

・もしかして、AIを使えば難しいプログラミングも不要なのでは…?

バイクの主流がインジェクション車になって20年近く経ちます。一部の人気車種ならサブコンがメーカーから出ていますが、そうでない車種が多いのも事実。それじゃあ自分でECUを自作して進角制御や燃料噴射量の制御、はたまたリミッター解除をしよう!となるのですが、20年が経過した今でもネット上で検索してもきちんとまとまった情報は出てきません。(やっている人は何人かいるようですが)
自分も昔挑戦して、結局諦めていました。

これの失敗の原因は後程触れますが、何せ当時は手に入れられる情報量が少なすぎた。


しかし今は最先端のツールがあります。それがAI!!
これに相談しながらトライ&エラーを繰り返し、制作していきます。CHATGPTとGeminiを使いましたがGeminiがおすすめです(チャッピーはすぐ口答えする)。

・今回使用したもの

・ArduinoR4minima
・スズキ アドレスV50(CA44A)

・フォトカプラ(PIC817)

・抵抗器10kΩ,100Ω

・ショットキーバリアダイオード(11EQS03L)

・12V-5Vレギュレータ(BP2593-50)

・ほか配線やテスターなど

 

 

・まずエンジンの回転数を検出しよう

これができないと点火も燃料噴射も始まりません。
「ただのタコメーターでしょ?」と思う方も多いかもしれませんが、最近インジェクション車のフライホイールは歯が複数個付いています。(初期のインジェクション車は歯が

一つでした)クランク角度を正確に認識するためなのですが、これが厄介です。

先ほどのアドレスV125の記事も、ピックアップコイル(VRセンサー)の数を一つだけだと勘違いして設計したためクランク1回転でとんでもない量の火花を飛ばす点火回路になっていました。(それじゃあ動くわけない)

 

単純に1回転1パルスならピックアップからのノイズの除去だけで制御が済むのですが、今回10個の信号と欠歯(歯と歯の感覚が広い部分)を検出してクランク角がどこにあるのか正確に判断しなければいけません。

f:id:kamaboko13:20260715111118j:image

そこのところをGeminiと対話して作ったコードがこちら

const int INPUT_PIN = 2;


volatile unsigned long lastPulseTime = 0;
volatile unsigned long firstPulseTime = 0;
volatile unsigned long rotationPeriod = 0;
volatile bool newRotation = false;
volatile int pulseCount = 0;

const int PULSES_PER_ROTATION = 9; // レッツ4仕様(10-1欠歯)
const unsigned long DEADBAND_TIME = 1000;

void onPulse() {
  unsigned long currentTime = micros();
  unsigned long interval = currentTime - lastPulseTime;
 
  if (interval > DEADBAND_TIME) {
    if (pulseCount == 0) {
      firstPulseTime = currentTime;
    }
   
    pulseCount++;
   
    if (pulseCount >= PULSES_PER_ROTATION) {
      rotationPeriod = currentTime - firstPulseTime;
      newRotation = true;
      pulseCount = 0;
    }
   
    lastPulseTime = currentTime;
  }
}

void setup() {
  Serial.begin(9600);
  pinMode(INPUT_PIN, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(INPUT_PIN), onPulse, FALLING);
 
  Serial.println("=================================");
  Serial.println("  レッツ4 RPMメーター (バグ修正版)");
  Serial.println("=================================");
}

void loop() {
  unsigned long safeLastPulseTime;

  // 1. 変数データの安全なコピー(データの衝突を防ぐ)
  noInterrupts();
  safeLastPulseTime = lastPulseTime;
  interrupts();

  // 2. 停止判定(判定時間を2.5秒に延長し、安全にコピーした時間で比較)
  if (micros() - safeLastPulseTime > 2500000) {
    static unsigned long lastZeroPrint = 0;
    if (millis() - lastZeroPrint > 1000) {
      Serial.println("RPM: 0 (Engine Stopped)");
      lastZeroPrint = millis();
    }
    return;
  }

  // 3. クランク1回転の計算
  if (newRotation) {
    unsigned long currentPeriod;

    // ここでも安全にデータをコピー
    noInterrupts();
    newRotation = false;
    currentPeriod = rotationPeriod;
    interrupts();
   
    if (currentPeriod > 0) {
      float rpm = 60000000.0 / currentPeriod;
     
      static unsigned long lastPrintTime = 0;
      if (millis() - lastPrintTime > 200) {
        Serial.print("クランク1回転の時間: ");
        Serial.print(currentPeriod);
        Serial.print(" us | ");
        Serial.print("RPM: ");
        Serial.println*1 {
    digitalWrite(IGNITION_PIN, LOW);
    isDwelling = false;
  }
}

 

こうなります。

f:id:kamaboko13:20260715195303j:image

こんな具合です。

現時点では点火回路が完成していないので、仮で13番のLEDをチカチカさせているだけ。実際に点火するかまでは確認していません。

この辺り自分もあまり詳しくはないので、AIの言いなりです。何か実際の走行でトラブルが起こる可能性も十分あり得ます。

 

・おわりに

久しぶりにarduinoを使いましたが、やっぱり自分で(AIの力を借りながらですが)何かを作るのって面白い!

仕事そっちのけで何時間もパソコンとバイクの前で試行錯誤するのは大変ですが、うまく動いてくれた時の達成感はたまらないものがあります。

 

次は実際に点火させてエンジンを始動させる事、そしてインジェクターの制御まで進みたいと思っています。詳しい人がいましたら改善案やコメントお待ちしております!

f:id:kamaboko13:20260715111154j:image

つづく

*1:int)rpm);

        lastPrintTime = millis();
      }
    }
  }
}

こうして文章で書くと単純ですが、これをAIから生成させるにはかなり苦労しました…聞き方が悪かったのかもしれませんが何回も訂正を要求しました。
回転数の検知もとくに問題なく動いています。

f:id:kamaboko13:20260715110629j:image

 

・回路図

手書きなので分かりにくいかもしれませんが、あくまでも自分のメモ用ということで…

f:id:kamaboko13:20260715110528j:image

 

・点火機能を付けよう
RPMが正確に出せるようになったら次は点火制御です。これもGemini頼りですが

const int INPUT_PIN = 2;       // VRセンサー
const int IGNITION_PIN = 13;   // 点火出力ピン

// ドエルタイム(通電時間:3.5ms = 3500us)
const unsigned long DWELL_TIME = 3500UL;

volatile unsigned long lastPulseTime = 0;
volatile unsigned long firstPulseTime = 0;
volatile unsigned long rotationPeriod = 0;
volatile bool newRotation = false;
volatile int pulseCount = 0;

// レッツ4 10パルス固定
const int PULSES_PER_ROTATION = 10;
const unsigned long DEADBAND_TIME = 400UL;

// 点火タイマー用の変数
bool isDwelling = false;
unsigned long dwellStartTime = 0;

void onPulse() {
  unsigned long currentTime = micros();
  unsigned long interval = currentTime - lastPulseTime;
 
  if (interval > DEADBAND_TIME) {
    if (pulseCount == 0) {
      firstPulseTime = currentTime;
    }
   
    pulseCount++;
   
    if (pulseCount >= PULSES_PER_ROTATION) {
      rotationPeriod = currentTime - firstPulseTime;
      newRotation = true;
      pulseCount = 0;
    }
   
    lastPulseTime = currentTime;
  }
}

void setup() {
  Serial.begin(9600);
  pinMode(INPUT_PIN, INPUT_PULLUP);
 
  pinMode(IGNITION_PIN, OUTPUT);
  digitalWrite(IGNITION_PIN, LOW);
 
  attachInterrupt(digitalPinToInterrupt(INPUT_PIN), onPulse, FALLING);
 
  Serial.println("=================================");
  Serial.println("レッツ4 常時点火システム(稼働)");
  Serial.println("=================================");
}

void loop() {
  unsigned long currentTime = micros();

  // 1. クランク1回転(10パルス分)が確定したら、即座に通電開始
  if (newRotation) {
    unsigned long currentPeriod;

    noInterrupts();
    newRotation = false;
    currentPeriod = rotationPeriod;
    interrupts();
   
    if (currentPeriod > 0) {
      // 13番ピンを通電(HIGH)にし、時間を記録
      digitalWrite(IGNITION_PIN, HIGH);
      dwellStartTime = currentTime;
      isDwelling = true;

      // RPM表示(確認用:不要ならシリアル通信ごと消去して負荷をゼロにできます)
      float rpm = 60000000.0 / currentPeriod;
      static unsigned long lastPrintTime = 0;
      if (millis() - lastPrintTime > 250) {
        Serial.print("RPM: ");
        Serial.println((int)rpm);
        lastPrintTime = millis();
      }
    }
  }

  // 2. 裏で常に時間を監視し、3.5ms経過したら通電をカットして「点火」
  if (isDwelling && (currentTime - dwellStartTime >= DWELL_TIME

スポットクーラーの冷気が出ない 〜JA-SP25G 〜

夏の猛暑に向けてヤフオクで購入したスポットクーラーの修理です。

 

f:id:kamaboko13:20260518170814p:image

動作確認済みとのことで引き取ってきましたがどうも冷気が出ていないような気がする…。

ガス漏れかと思いましたが、よくよく音を聞いてみるとコンプレッサーが動いている音がしていない感じです。

流石ヤフオク…やられました。

 

このまま泣き寝入りは悲しいのでとりあえず分解してみる事に。

f:id:kamaboko13:20260518171003j:image

スイッチの配線が焦げて外れてる!!

f:id:kamaboko13:20260518171019j:image

スイッチ交換したら動きそうな感じです。

 

f:id:kamaboko13:20260518171126j:image

しかしそこすらもケチりたい自分。スイッチを分解してみると配線の一つに使われていないものを発見。

テスターで当たってみると【切】以外では接点が繋がるよう。おそらくオプションパーツの取り付け用の端子でしょう。

 

そこに外れていた配線を繋げてみると無事冷気が出ました!!

 

ただ、【切】以外の時は常に繋がっている状態のため送風モードでも冷気が出ます。

まあ暑い時に使うものだしいいかな〜。

結果的に良い買い物ができました。

 

※修理を試す場合は自己責任にてお願いします

ヤマハ アクシスZ~冷寒時のアイドリングが低い~

アクシスZ、空冷ながらエンジン音が静かで個人的には好きなバイクなのですが、どうにも暖気完了までのアイドリングが低いです。

 

試しにスロットルボディやISCVも清掃、プラグやエアクリーナーも交換しましたが全く改善せず。ネットにも同じ症状の人がいるようです。

《 バ イ ク 》アクシスZの不調 | 釣りと天気と、ほんとにときどきFX

 

音などを聞いてみても全く同じ症状です。

OBDにつないで各センサーの値を見てもとくに異常なし。

ただ、感じとしては冷寒時の燃調がかなり濃い感じです。

そこで考えました。

「濃いなら薄くしてあげればいいのでは…?」

あいにくインジェクション車なのでキャブのようにセッティングはできません。

なので

 

 

油温センサーを外して、ダミーの抵抗器をつけてあげます。

センサーは油温が上がると抵抗値が下がる仕組みのためセンサーは外さないといけません。

(間違えて外したままキーONにするとECUリセットするまでチェックランプ点きっぱなしになるので注意)

こうすることでエンジンは温まっている状態であるとEUCを騙すことができます。(熱い時は少ない燃料で点火させようとします)

 

そしてエンジン始動!

ブルルルン!

かなり始動しやすくなりました!!少し吹かせばアイドリングもすぐに安定します。

ただ、今度は薄すぎてエンジンがかかりにくいような感じです。

 

470Ωで75℃くらいでした。

 

220Ωで99℃。車体により差はあると思いますが、このあたりでベストな値を見つけていけばかなり症状はよくなるのではないかと思います。

 

ただ、これも本来的に言ったらおかしい事をしているわけで、おそらくはECU本体(あくまで予想ですが)を交換すれば改善するのかな~~?という気はします。

 

しかし1本1円の抵抗で改善できると考えればかなりお得!

大した手間でもないので一度試してみるのも良いかと思います(コメントで参考情報などお待ちしてます)

 

自作PCを組みました~はじめてでも案外何とかなる~

 

自作PC、前々から興味はあるけど実際手を出すには中々ハードルが高く(万が一組み立てミスで壊したら高い!など)踏み出せない人も多いのではないでしょうか。

 

自分もそのクチだったのですが、秋葉原の某PCショップの自作コーナーに行って気が変わりました。

www.sycom.co.jp

※イメージ

「えっ…めちゃくちゃかっちょいい~~~~!!!!」


ガラス張りのケースに光るファンやメモリ、もはやインテリア!

とはいえ何の知識もないので店員さんに

「AEとかで動画編集とかする用に自作したいんですけど、いくらくらいですかね…?」

と聞くと(動画のくだりは知った風を出したかっただけ。実際は編集なんてしない)

 

「3~40万くらいですね」

とのこと。いやそんな高いの買えないよ!!!!

 

結局その日は見るだけで帰宅。それでもやっぱり光るPCを諦められず。

(いや待てよ。別に自作PCだからって高性能にする必要無いのでは…??)

 

自作PCシミュレータというサイトを見つけ、とりあえず適当に部品を選択していく。

2tom.jp

 

あれ、10~15万あれば余裕でPC組めるじゃん!!?

 

別に大した作業もしないし、これでいいと思う!!

 

 

そして次の休日また秋葉原へ。

前回の失敗として、何の前知識や目的もなく質問したのが良くなかった。

向こうも客商売だから冷やかしの相手はしたくないのだろう。そこで今回は

 

・組むのに何の部品が必要でどういった規格があるのか

・何のために自作PCにしたいのか

・予算はどれくらいか

 

くらいは調べたり考えたりしてきた。

つまりは店頭サンプルみたいなギラギラのPCが欲しいけど、初心者でどの部品がどの部品に適合するかわからないので部品の選定を手伝って欲しい~という形で声をかけることに!

「こいつ買う気があるな」と思ってもらえると話も早く、スムーズに相談に乗ってもらうことができました。

パーツ選びの順番としては

1.PCケース(見た目の肝!)

2.CPU(そこまで性能はいらないので安いやつで…)

3.メモリ(これもそこそこで)

4.SSD(一応1TBにした)

5.マザーボード(店員さんに丸投げ)

6.電源(同じく)

 

といった感じで選んでいきました。(グラボはコストカットのため省略)

マザーボードと電源は投げ出した訳ではなく、前に選んだ部品との適合やら兼ね合いで決まってくる部品らしいので店員さんに選んでもらいました。

一応この6つの部品(+OS)さえ揃えばちゃんとPCとして動くと考えると、思いのほか難しいことはないのかなとも思う。

 

あと、後々部品の追加や修理することも考えPCは自分で組み立てることにしました。(組み立て代行費用をケチったとも言う)

 

そして届いた部品がこちら!!!

 

「PC自作 組み方」あたりで検索して調べながら恐る恐る組み立てていきます。

 

自作PCの作り方【手順その1】各PCパーツの紹介・CPU取り付け | 株式会社アスク

 

これがCPUってやつか…!!

ケースには最初からLEDファンが搭載されているものを選びました

 

配線がすごい

光学ドライブないけどOSどうやってインストールするんだ!?と思ったらUSBなんですね~すごい!

 

 

とりあえず繋ぐものを繋いで無事起動!!

 

ちょっと難しそうに見えますが各パーツは基本付けられる所にしか付かないようになっているため、そこまで難航はしませんでした。(それでも3時間くらいはかかりましたが…)

 

つまずいた部分としては、LED用の配線(説明書が全部英語)、ケースのスイッチ用配線(オーディオ?の部分と端子が同じで誤配線してた)追加ファンの取り付け位置(裏表逆に付け間違えた)

くらいだったと思います。

 

あとは配線をうまい具合にまとめて無事完成!!!!

 

うお~~~~めっちゃ良いじゃん!!!!

 

LED色はケースのスイッチで自由に変えられる!楽しい!!

 

メモとして今回使用した部品を挙げておきます

・PCケース:KING45PRO

・CPU:CoreUltra5 225BOX(定格3.3GHz10コア10スレッド)

マザーボード:B860Pro-A Wifi

・メモリ:DDR5-5600 8G×2

・電源:SN7100

・CPUファン:RT400

・追加ファン:AX120

・OS:Windows11

合計¥158,440

 

正直なところ、グラボも無いしCPUの性能も大したことないのでこんなにでかいケースや7個もファンは要らないと思うのですが、個人的にはかなり満足です!

それでも以前まで使っていたPCが13年前のしょぼいノートPCだったことを考えると凄まじい進化!金額もそこそこ抑えられることができましたし(光らせる事や見た目を考えなければもう3万円くらいは安くできそう)組み立てる楽しさも味わえました。

 

あと何年かしてPCの性能が追い付かなくなった場合でもまた自分でパーツ交換すればOKというのも良いところです。

 

自作PC気になっている方、ぜひ一度試してみるのも良いかと思います。

 

 

 

 

 

スズキレッツ4〜カムチェーンテンショナー流用

スズキのレッツ4、悪いバイクではないのですがカムチェーンテンショナーがわりとすぐ壊れます。

 

テンショナーがダメになるとベチベチとチェーンのうなる音が…千切れてエンジンがお釈迦になる前に直しましょう。

と、ここで普通に交換してもあまり面白くありません。

 

f:id:kamaboko13:20250917185624j:image

意外な事にジョグのテンショナーがそのまま流用可能なのです。(取り付けする際にはファンシュラウドに隙間ができるのでテープなどで覆います)

 

それにジョグ用ならテンショナーのスプリングが破損しても交換可能ですし、経済的です。

f:id:kamaboko13:20250917185629j:image

といってもスプリングは純正から出でいないのでホームセンタースプリングです。

↑のものだと少し短いので、もう少し長いのがあればベスト

 

この方法はCA4AAなどレッツ系のエンジンでも共通して使えるため何かと便利です。

また、ジョグにレッツのテンショナーも使えるというわけで活躍する場面は色々あると思います。

 

中古シリンダーなどを購入する時は是非テンショナー付きのものをおすすめです笑

動かない燃料メーターの修理〜SA36Jジョグ〜

 

SA36Jジョグにありがちなトラブルの一つとして、燃料メーターの不動があるかと思います。

どうにか直らないものかとメーター側の接点を磨いてみたりするも変化なし。

燃料計自体をバラしてみると

f:id:kamaboko13:20250917184637j:image

 

写真左側の抵抗が焼けていました。テスターで測ってみるも断然しているようです。

この抵抗をスクラップから見つけてきたメーターのものから移植して交換

(抵抗値37.0Ωと75.0Ωでした。参考までに)

 

すると無事メーターが動きました!

メーターの針を付け直す際には何回か位置を調整しながら良いポイントにあわせましょう。

 

 

追加:ただ、燃料計の故障にもいくつかパターンがあるようで、コイル自体が焼けている時はメーター交換しかないと思います。

 

バイクのシートレザーを自作しよう!~エストレアカスタム~

先日入庫したエストレアカスタム。

状態はそこまで悪くなかったのですが残念なことにシートが一部破れています。

 

こちらが剥がした後のシートレザー。ここから型を取っていきます。

f:id:kamaboko13:20250603185325j:image

アイロンで少し伸ばした方が良いかも。

 

ひとまず適当な梱包紙で型を取って(2㎝くらい縫い代をつけました)

f:id:kamaboko13:20250603185339j:image

 

あとは縫う!!!

f:id:kamaboko13:20250603185357j:image

できました!

f:id:kamaboko13:20250603185408j:image

あとは伸ばしながらタッカーを打っていって…。

f:id:kamaboko13:20250603185425j:image
f:id:kamaboko13:20250603185429j:image
f:id:kamaboko13:20250603185433j:image

 

はじめてにしては中々悪くないんじゃないか??!

多少しわは寄ってますが十分使い物になります。

 

 

使っているのは一般的な家庭用ミシンですので、家にある方は一度挑戦してみることをオススメします。

今回使った布

合皮生地 ダイナーレザー(A061) 1.ブラック オカダヤ(okadaya) 布・生地、毛糸、手芸用品の専門店

針は厚手用のものを使いました。

糸は丈夫だろうと思ってジーンズ用の20番の糸を買いましたが厚手用の針に通らないくらい太かったので結局下糸のみ20番、上糸は普通の60番の糸を使っています。

伸ばしてもほつれる感じもなく強度的にもいい感じかなと思います。

 

またバイクいじりの幅が広がりました!