LEDタイミングライト(回転数表示付き)~その2~

先日タイミングライトを作りましたが、エンジンの回転数を上げると揺れて見えるのが気になってきました。常にフライホイールが1度回る時間だけLEDを点灯する様にプログラムしたのですが、数千rpmで回ると1度といっても十数μSとかの時間になってくるのでうまくプログラムを作らないとずれてきてしまいます。

スケッチを書き直す。

という事でタイミングパルス入力→LED点灯までの遅延を最小にするため、割込み処理をインラインアセンブラで書き直してみました。
また前回はLEDの点灯時間をメインルーチン内のmicros()関数の値で判断していましたが、これもタイマー割込みにすることで正確に1度回転する期間だけLEDを点灯する事を目指します。
AVRのアセンブラは初だし、割込み/インラインアセンブラのオーバーヘッドを極力減らすため、レジスタの退避(pushやpop)も含めて手書きしたので色々調べながら作りましたが、もっと効率の良い書き方があるかもしれません。

しかしこれで動作させるとまだ揺れて見えます。むしろ酷くなったような。。。
うーん。では改めて下記回路図(前回と同じ)でのSigとMPULSEの波形を見ていきます。
(Sigはエンジンから来るタイミング信号、MPULSEはマイコンに入れる割込み信号。)

下がその波形でCH1(黄)がSig、CH2(青)がMPULSE。
思いっきりバウンドしていましたね。300μSもの間大きく揺れ、この間に何度も割込みが掛かっている様です。
前のプログラムでもこれが揺れる原因だったのかもしれません。

揺れが約300μS続く内、必要なのは先頭の瞬間のみです。この揺れを抑える為にフィルターを用いると遅延が大きく発生する可能性が高いので、ソフトウェア的に対処します。具体的にはタイミング信号による割込み発生後、次の割込み許可は800μS後にする事でバウンドをやり過ごしました。

スケッチはこちら。http://www.hoihoido.com/data/TimingLight2.zip

以上によってアイドリング~高回転までピタッと止まって見える様になりました!!

でもやっぱりLEDが暗い

しかしやっぱりLEDが暗いですね。前回電源を12V→9V(角型電池)に変更して少し暗くなっていたのが、9V電池が消耗すると更に効いてきて、曇りの日なら良いですが晴天だと日陰でも見えづらいのです。
まず9V電池にした時点で回路図の12Vライン(今は9V)にあるC6が1μFだと小さすぎるのでLED点灯の瞬間少し電圧が下がっていました。これを1000μFに変更して電圧降下は無視できるレベルになりましたが・・・体感光量は大きく変りませんね。
現在LED6個には以下の様な回路で電流を流しています。これに9Vの角型電池とパワーMOSFET(2SK2232)が直列に入ります。

LEDのスペック上のVf(順方向電圧)は3.1Vと記載されているので2個直列だと6.2V。電池が9Vだと5Ω抵抗(10Ωの2並列)には2.8Vが加わるので各LEDには560mAが流れる目論みでした。しかし考えてみると定格100mAのLEDに大幅な大電流を流すとVfも高くなってきますよね。そこで制限抵抗5Ωの両端電圧を測る(160μSのON期間中最後の瞬間をオシロで測定)と、1.76Vしか掛かっていません。電流にすると350mAなので想定よりかなり少ないです。

という事で定格を超える状態でのVfと電流の関係を大雑把に調べると下記グラフの様になっていました。
横軸はLEDを2個直列した合計のVf電圧です。また前半と後半で別個体のLEDで測ったりしているので凸凹しているのはそのあたりの影響だと思いますが大体の傾向はつかめます。

これによると9V電源なら抵抗など無くしても620mA程度でそれ以上は流せません。
当然ながら絶対最大定格を超えているので壊れない保証はないですがデューティーが1/360なので頑張ってくれる事を期待してもっと(1Aとか)流してみたいところです。
案としては現在の2個直列を止めて1個ずつにすればもっと電圧を掛けれますね。
これらはいずれ試すとして今回は制限抵抗無しにしてみました。これで620mAなので現状の約1.8倍になります。

動作しているところの動画・・・まだ暗いけどマシにはなりました。

回転数も問題なく測れています。

以上でだいぶマシになりましたがピーカンの屋外は厳しいですね。あまりそういうシーンはないですが。
・・・これで暫く使ってみて、まだ暗かったら配線(またはLEDの機種)を見直します。

LEDタイミングライト(回転数表示付き)

先日の投稿以来、原付バイクの電装系が気になっておりCDIを作ってみたくなりました。
CDIというのはエンジンの点火プラグに火花を飛ばすための回路で、エンジンから来るタイミング信号を受けてイグニッションコイルに電流を流すという仕事をしています。

CDIの例

最終的には回転数に応じて微妙にタイミングをずらす(進角とか遅角)事を考えているので、そうすると実際の点火タイミングを確認したくなります。それにはタイミングライトなるものが必要です・・・が、持っていません。

タイミングライトというのは点火プラグに繋がるコードの被覆の上から電極を挟み込んで信号を取り出し、その瞬間にライトがピカッと光るという動作をします。その光でエンジンのフライホイールを照らすと、フライホイールが毎回同じ角度になった瞬間に照らされるので人間の目にはフライホイールが止まって見えるというものです。
フライホイールには点火すべきタイミングの位置に刻印がされているのでこの刻印がどの位置に見えるかによって思い通りのタイミングで点火しているかどうかを確認できるのです。

フライホイールの例

で、タイミングライトの構造をネットで調べてみました。昔からある市販品はカメラのストロボ同様のキセノン管を使っているそうで、ネット上では使い捨てカメラのストロボで自作されている記事が見当たります。
またLEDを使って自作されている方もおられます。
今回、使い捨てカメラを入手するのも面倒なので手持ちのLEDで試してみました。
なお特にLEDの場合は光量が低くて見づらかったという情報が多いので、この辺りを気にしながら作ってみます。

構想

LEDでタイミングライトを作ると光量が足りないという問題ですが、ネットでよく見る例ではプラグコードから検出した信号をそのままトランジスタに入れてONした瞬間にLEDが光るという構造でした。

そこでプラグコードから検出する信号の幅を実測したところ2μS程度しかありません(これはバイクの機種や信号取り出し方法によって差があるとは思います)。
仮にエンジンが1000回転/分(以下rpm)で回っているとすると1回転に要する時間は60mSです。
この場合60mS毎に2μSだけLEDが発光するのでONしている割合は0.0033%。よくLEDを調光する時にPWMを使いますが、デューティー0.0033%でLEDを光らせる様なものなので、これはやっぱり暗いでしょうね。

という事でプラグコードから検出する信号幅に係わらず一定の時間LEDを光らせる構造にする必要がありそうです。
ではどれだけの時間光らせるかですが、まずはフライホイールが回る角度にして1度を目標でやってみる事にします。すると1000rpmの時、60mS/360度なので167μSですね。これでもデューティ0.28%ですが直接よりも80倍以上明るくなるだろうという目論みです。これで足りない部分はLEDに流す電流を増やしてみましょう。

で、LEDですが手持ちにこんなのがありました。12Vで7WのLED。これだと光量はたっぷりとれそうですが試してみると内部に諸々の回路が入っていて瞬間的な発光ができませんでした。

そこでいつだかジャンクで購入したチップLEDを使う事にします。定格100mA、瞬間的には150mA流せる事になっています。

これを2個直列で使用してみます。

試作1号

という事で次のような回路で試してみました。

プラグコードから取り出した信号を4本のダイオードで電圧制限してQ1に入力します。Q1がONになるとQ2とQ3のワンショット回路をトリガーして一定時間分Q4をONにすることでLEDが点灯します。

なお電源には12Vを用いて抵抗経由でLEDに流しますが、ワンショット回路付近はレギュレータで5Vに落として使っています。5Vに落としているのは特に意味はなく、これも試行錯誤の痕跡です。
Q4のMOSFETは2N7000という、あまり大電流を流せるFETではありません。これはゲート容量を低く抑える為で、大容量のパワーMOSFETだとゲート容量も大きくなり遅延が発生するのを防ぐ目的です。

ワンショット時間はC2とR2で決まります。またLEDに流す電流はR5で決まります。試行錯誤の結果、これらの値は上記回路図に対し次の様に変更しています。
C2:0.01μF(回路図通り)、R2:68KΩ、R5:8.5Ω
これで発行時間を約170μSに固定しています。
またR5はLEDに瞬間的に流す電流を決めます。ここでは約0.7Aを流しているのでLEDもMOSFETも定格オーバーですが光量を得るためなのです。実際には1/360の期間しか点灯しないので平均電流だと余裕で定格に収まっているんですよね。実際どうなんでしょう。

そして実際に作ったのがこれ。C2,R2,R5のあたりに試行錯誤の痕跡が残っています。
またプラグコードからの検出には事務用クリップ(目玉クリップと呼ばれるやつ)に電線を繋いで、これでコードを挟んで点火信号を取り出します。
車体アースに接続するワニ口クリップも設けましたが、接続しなくても動作しました(目玉クリップも近づけるだけで点灯した)。

では実際のバイクでタイミングを見てみます。カブ系エンジン(Jazz50)のフライホイールです。

一応「F」マークの位置が見えていますね。
但しLEDの点灯時間が170μS固定なので1000rpmで回っている時はフライホイール1度の期間点灯しますが、仮に1万rpmで回ると分解能10度となってしまい広すぎます(それにLED点灯のデューティも1/36となり破壊のリスクも高まる)。
実際上の動画で若干ブレて見えるのは回転数が高めだったので1度を超えているのだと思います。
できれば回転数に係わらず1度の期間だけ点灯させたいですね。これをアナログ回路で実現するのは難しいので次の試作ではマイコン(Arduino)に頼ることにします。

試作2号

Arduinoで制御しますが、そのまま入れるのは勿体ないので裸のATmega328PにArduino UNOのブートローダを書き込んで使いました。
プラグコードから検出した信号はQ5経由でArduinoのD2端子(ATmega328PのPD2)に入力して割込みを掛けます。
するとD5端子(ATmega328PのPD5)から一定期間のパルスを出し、これをパワーMOSFETのゲートに入れてLEDをドライブします。
今回はマイコンのGPIOがゲートを叩くので多少ゲート容量が大きくても影響は少ない事を期待してパワーMOSFET(手持ちの2SK2252)を用いる事にします。

パワーMOSでドライブすると大電流を流せるのでLEDも2直列×3並列の計6個を光らせてみます。
LEDと制限抵抗は回路図に含まれていませんが下図の様に接続しました。
LEDの定格Vfが3.1V×2個で電源が12V、よって合成抵抗5Ωには5.8Vが加わります。なので各LEDの瞬間電流は1.16Aとなり、定格に対して10倍位多いですがデューティ1/360なので耐えてくれる事を期待しています。
実際手で触った感触では全く温度が上がった様には感じられませんが、もし壊れる様なら電流を減らそうと思います。

LED基板はこんな感じ。抵抗は裏側に付けています。


一方Arduinoのスケッチでは点火信号の間隔を測定しておき、それに比例してワンショットの発光時間を決めています。これにより回転数に係わらずフライホイールが1度回転する時間だけLEDが点灯します。

また点火信号による割込みからLEDオン迄の時間を最小にするため、DigitalWrite関数は使わず直接PORTDレジスタに値を(1バイトまとめて)書き込んでいます。なので後述する液晶ディスプレイはPORTDを避けた端子に接続しました。
なお割込み処理の内部ではdelayMicroseconds関数を使って時間待ちをするという無理やりな事をしています。もしかするとこれによりmicros()関数や1秒タイマーの精度に影響があるのかもしれません。このあたりはArduinoのシステムの動作をきちんと調べるべきですが、影響しても1/360なのでとりあえずこのまま進めます。

そして折角マイコンを載せるのならと液晶ディスプレイに回転数を表示してみました(1秒毎に割込みを掛けてその間のパルス数から算出しているだけなので分解能は高くないです)。

一時CBF125Tのタコメーターとして働いていた液晶ディスプレイを流用

実際動作させてみた時の写真。上とは別のバイクなのでタイミングマークが分かりにくいのですが、明るくはなっているし回転数を上げてもタイミングが見えています。

ケースに入れて最終形態にする。

このままだと使いづらいのでケースに入れたいと思います。
ただ電源に12Vを入れるのは面倒なので006Pの角型9V電池にしました。これによりLEDに流れる電流は約半分になり、少し暗くなりましたがまあ使えます。制限抵抗を減らしても良いのですが当面このままで試してみます。


測定中の動画

以上で点火タイミングを確認できるようになったのでCDIを作れる準備ができました。
で、対象とするバイクは当初は先日修理したDioチェスタを予定してしていたのですが、息子が友達に売り払ってしまった(原付バイクが沢山あり過ぎて邪魔だといったのは私です)のでカブ系エンジンのバイクに変更しようと思います。
Dioチェスタはバッテリー式CDIだったので12Vから250V程度に昇圧する必要がありましたがカブ系は最初から250V程度の交流を元に点火するのでCDI内部では整流するだけで済みます。
実はもう実験を始めているのですが、それはまた次のお話・・・。

最後に参考用としてArduinoのプログラムを載せておきます(言うまでもないと思いますが、これを参考にされて何か起こっても責任は持てません)。

スケッチ(Arduino UNO用)