アルドウィーノを使った
オープンソース、オープンハードの
ローコストECU
テージのECUが壊れているみたいなので
Speeduino(STM32)に装換しました。
その24:
アイドリング中のエンジン停止の解析
デュアルホイールをフォトインタラプタ用に変更
2025年
5月17日
プライマリ/セカンダリパルスの電圧を確認します。コネクタの間に緑枠のアダプタを入れて信号を分岐します。

プラグを外して、クランキングします。全体的に上にシフトしているようです。理論値はLOWが0.84V、HIGHが1.68Vです。原因は定電流出力がTypの7/14mAを超えているからだと思われます。データシートの定電流出力の範囲はMinが5.6/11.2mA、Maxが8.4/16.8mAです。

現在のヒステリシスコンパレータの閾値は理論値を元に、以下のようになっています。上にシフトしているとLOW側のマージンが少ないです。

R1を2Kから2.4KΩにすると良さそうです。

5月19日
以前に行った、シンク・ロスが発生した時にプライマリパルスのカウント数を表示するコードを少し変更しました。割り込みハンドラ内でvss(車速)に代入するのを止めて、新しく宣言したloss_toothCurrentCounterのみカウント数を代入します。割り込みハンドラはなるべく早く抜けた方が良いです。

logger.cppは元のvss(車速)に戻します。

メインループ内でgetSpeed()の代わりにvss(車速)にloss_toothCurrentCounterを代入します。

5月20日
ダイレクトイグニッションに変更したので、ベースボードに載っている、緑枠のイグニッションドライバの電源を5Vに変更しました。このコイルの点火信号は3.3Vでも点火しますが上限は不明なので、念のため、駆動電圧を下げました。

上記に加えて、ヒステリシスコンパレータの閾値も変更しました。気温が高いので、午後の4時過ぎてから、1時間ほど試走しました。今のところシンク・ロスによるエンジン停止は出ていません。

5月21日
ダイレクトイグニッションのステーはアルミで作製しましたが、カーボンで再作します。

1mm厚のアルミ板で型を作ります。全部で4個、雄雌型が必要です。

ポリエステル樹脂で積層します。クリップが足らないので2個つづ作ります。

シンク・ロスの続きです。近所を1時間ほど試走しました。シンク・ロスでエンジン停止はありませんでしたが、急にイグニッションがオフになりエンジン停止しました。メータユニットの電源も落ちるので直ぐに分かります。イグニッションスイッチの接触不良のようです。たまに、イグニッションスイッチをひねっても電源が入らない時があり、分解して確認する必要がありそうです。

初めの2個を離型しました。

続いて、残りの2つを積層します。

5月22日
ステーの続きです。整形して取り付けます。垂直気筒の左側です。

こちらは、水平気筒の左側と右側です。


イグニッションスイッチを外して分解します。タンクとエアフィルタボックスの上側を取り外して、固定ボルトを2本外すとスイッチが外れます。

スイッチを分解して、接点を2000番のサンドペーパで磨きました。接点には接点グリスを塗っておきます。

組み立てて、何回か切り替えて、テスタで導通を確認します。微妙な位置でオフにならない事を確認しました。

5月24日
細かい不具合が2件発生しました。1つ目はフロントブレーキのストップスイッチの故障です。ブレンボのブレーキマスタはストップスイッチが無いので、マイクロスイッチを後付けしています。

使用しているのはアマゾンで購入したオムロン互換のマイクロスイッチで、10個で800円の安売り品です。故障の原因は振動と思われますが、クリックが無くなり動作しなくなります。

今回は本物を買ってみます。価格は互換品の約10倍です。これでダメなら油圧スイッチに交換します。

2つ目は右ハンドルの汎用スイッチが動作不安定です。このスイッチはSDログの開始/停止、燃調マップの切替に使っています。テスタで測ると、スイッチに問題は無く、別ボードとエンジンエミュレータでは正常に動作するので、ハーネスかECUの内部の不具合と思われます。

汎用スイッチは緑枠のように、5VプルアップをスイッチでGNDに接続してロジックレベルを作っています。信号はD24(STM32のPA15)に接続されています。元々、未使用ポートなので、Speeduinoのベースボードでジャンパ接続しています。

5月25日
アマゾンで購入の本物のマイクロスイッチが到着しました。下が購入したオムロン製です。

早速、レバー部を加工をして、取り付けました。

5月26日
汎用スイッチの不具合の続きです。ECUのコネクタにピンを挿してハーネス側を調べます。

テスタで調べると、汎用スイッチのピンと+5Vが抵抗で接続されていないことが分かりました。熱収縮チューブを取ると、抵抗のリード線が切れていました。イグニッションキーのコネクタの近くなので、イグニッションキーを修理した時に切れてしまったようです。

コネクタのコンタクトに直接抵抗を圧着するのをやめて、短いケーブルで分岐させました。

ハーネスは元に戻りましたが、SDログが汎用スイッチによらず、常時、SDロギング状態になりました。以下は上手く行かない時の手順です。赤枠のように外部ピンのログ開始機能を禁止にして電源を投入します。

その後、電源を投入したまま、D24を使って汎用スイッチによるログ開始を有効にします。

この時のTunerStudioのウインドをキャプチャしました。左下のAux2(D24)ゲージは汎用スイッチに応じて1/0が交番しますが、中央下のSDログのインジケータは常時SDログ中になっています。実際にもログが記録されています。原因は電源の投入時に実行されるinit.cpp内で外部ピンの設定をしているためです。TunerStudioを立ち上げたまま、Speeduinoの電源を再投入すると正常に戻ります。TunerStudioは電源の再投入が必要な時はメッセージが出るのですが、このSDログではメッセージは出ないです。ハーネスの不具合と重なって混乱の元でした。クリックすると、約4.7Mバイトの動画をダウンロードします。

ログ開始の外部ピンの設定のプログラムを確認しておきます。speeduino.inoのsetup関数からinitialiseAll関数が呼ばれ、そこからsetPinMpping関数でボードの種類に対応したピン(ポート)の設定が行われます。

setPinMpping関数内でTunerStudioで設定された選択可能なピンを設定します。緑枠がログ開始の外部ピンの設定部分です。条件は外部ピンが有効でかつ、設定されたピン番号がデバイスの最大番号未満ならピンの番号を設定します。setup関数はSpeeduinoの電源投入時に1回実行されるので、設定を反映させるには電源の再投入が必要です。外部ピンが有効かの条件はなぜか、重複しています。コンパイラは賢いので、影響は無いと思われます。

下はTunerStudioが電源の再投入が必要な時に出すメッセージです。

5月27日
ストップスイッチと汎用スイッチの不具合が解消したので、鶴ヶ島のスーパマーケットまで試走しました。気温が低く、メッシュのジャンパでは少し寒かったです。行きは毛呂山、帰りは東松山市経由の下道で往復約60kmでした。行きにシンク・ロスが3回記録されました。この時のプライマリパルスの数は36より少ない、1や13などで、ノイズなどでセカンダリパルスが本来より前に発生しているのではと思われます。アイドリング中にメータユニットの回転数が異常に高くなってエンジンが停止することはありませんでした。


5月29日
Androidで動くSpeeduino用アプリのmsdroidの有償版を買ってみました。価格は2100円です。無償版との違いはボタンやインジケータ、ヒストグラムが表示できることです。難点は更新が停止している事、GPSを使った車速ゲージが動作不安定です。何故か、googleマップを起動した後でないと、正しく表示されないです。また、ボタンはグローブがタッチパネル対応じゃないと押せないです。ゆくゆくはWinの10インチのタブレットは大きいので廃止したいです。


熊谷のアストロプロダクツまで試走しました。残念ながら、行きにシンク・ロスが2回発生しました。アイドリング中の1回はメータユニットの回転数が異常に高くなってエンジン停止しました。走行中にも1回発生し、一瞬回転が落ちましたが、走行中なので、当然エンジンは停止しません。今回もなぜか、行きのみに発生しています。残念ながら、行きはmsdroidで走っていたので、シンク・ロス時のプライマリパルス数は表示されず、確認できませんでした。90分走ったとして、平均回転数が3000rpmだとすると、エンジンは90分間に270000回転し、この間に2回シンク・ロスが発生したということです。

5月31日
Speeduinoとsynclossで検索すると、色々と見つかり、やはりノイズ関連の不具合が多いです。以下、GitHubの問題がちょっと気になりました。現在使っているファームウェアと同じバージョンのsynclossの不具合です。質問主はsynclossが出ないバージョンもあると言っています。このスレッドは途中で中断しているので、解決したのかは不明なのですが、新しいバージョンのファームウェアも出ているので、試してみる価値がありそうです。

6月2日
新しいファームウェアに今までの修正(RTCの時間ズレ、クランキング時の点火パルスの重複対策、車速にシンク・ロス時にプライマリパルス数を入れ替え)を追加してビルド、ダウンロードしました。今まで使っていたのは202402で、pazi88さんの最新は202501.1です。本家のGitHubで確認したところ、202402にはフックスパックの.1と.2があり、その後、202501になって最新は202501.3です。STM32に関連した修正で明記されているのは202402.2の”STM32デバイスで非常に特殊なチューニング条件下での潜在的なロックアップを防止します”がありますが、これがシンク・ロスに関連しているか不明です。

新しいファームウェアでドン・キホーテ北鴻巣店まで片道約29km、時間約40分試走しました。今までのところ、往復ともシンク・ロスは発生していません。


6月4日
新しいファームウェアの試走の続きです。ジョイフル本田の新田店に向かいます。

40分ほど走って、深谷の先でシンク・ロスが発生しました。プライマリパルス数は1です。

ジョイフル本田行きは中止して、帰る途中でもシンク・ロスが発生しました。同じく、プライマリパルス数は1です。これはカンダリパルスの割り込みハンドラでプライマリパルス数が1になっていることを示しています。ファームウェアのバージョンとシンク・ロスは無関係でした。

セカンダリパルスの割り込みハンドラでプライマリパルス数が1になる現象を考察してみます。プライマリパルス数は37番目のハンドラ内で1に初期化されます。ここで不正にセカンダリパルスの割り込みハンドラが実行されると、シンク・ロスが発生して、この状態になります。下はセカンダリパルスが発生した直後のデュアルホイールの位置です。緑枠は鉄ボルトとセカンダリパルスセンサ、緑線が1番目のプライマリパルスです。ホイールの回転は反時計回りで、この後、少し回転すると1番目(37番目)のプライマリパルス割り込みが発生します。

下はロジックアナライザ波形です。プライマリパルスは立ち上がりエッジ、セカンダリパルスは立下りエッジで割り込みます。緑のプライマリパルスが1の期間に不正にセカンダリパルス割り込みが発生すると、この現象が発生します。プライマリパルスの磁束?がセカンダリパルスセンサに干渉すると、この現象が出る可能性があります。ホイールとセンサのギャップを広げると変化があるか確認します。

秋月の非接触回転速度センサはoh182という型番ですが、同じデバイスで文字情報の入ったKIM14のPDFがあるので、動作原理を確認しておきます。(a)磁束がY側に傾いた時に立ち下がりエッジを発生。(b)磁束が開いている時はLOWレベル出力。(c)の磁束が−Y側に傾いた時に立ち上がりエッジを発生。(d)の磁束が収束している時はHIGHレベル出力です。

6月5日
デュアルホイールとセンサのギャップを広げてみます。セカンダリパルスのギャップを約1.8mm、プライマリパルスのギャップを約1.2mmにしました。


ギャップを広げると頻繁にシンク・ロスが発生します。この時のプライマリパルス数はランダムでは無く、35でほぼ固定しています。やはり2つのセ
ンサが干渉しているようです。現在のプライマリパルス歯は36ですが、クランキング時の点火パルスの重複対応で、プライマリパルスを40歯にする予定なので、それに合わせてフォトインタラプタ式に変
更します。透過型フォトインタラプタを使うので、ホイールのかさ上げと直径も少し大きくする必要があります。

秋月のフォトインタラプタを使います。難点は懐が浅いのと、コレクタ電流のスペックが最小/最大で30倍違うので個別に調整が必要です。外来光を遮断する必要があるかも知れません。


ホイールを設計しました。2mm穴を40個開けて、プライマリパルスを発生します。セカンダリパルスは外周のスリットを使います。現在使用中の36歯はモジュール1.5の平歯車で直径は57mmです。今回作製するホイールは1.5mm厚のアルミ板で直径は66mmで作製します。

図面にフォトインタラプタを追加して、スリットの位置を確認します。プライマリパルス用のフォトインタラプタは懐が足らないので改造が必要です。

オムロンのサイトにフォトトランジスタの使い方が詳しく出ています。直近にトランジスタをバッファとして追加するように推奨しています。

