Category Archives: Arduino

CBF125T タコメーター故障&作成 ~その3 また壊れて修理~

ウチのバイク、中国は新大州本田製CBF125Tで、昨年タコメーターが壊れてステッピングモーターで作り直したのですが、先日猛暑日に走っていたら止まってしまいました。

これエンジン掛けてない状態です。

記録を見返すと最初にタコメーターが壊れたのが昨年の日本一周で東北町を走っていた頃、8月26日だったので丁度1年前ですね。その後ツーリングから帰り、11月にステッピングモーター化して使っていました。

バラして原因を調べる。

うーん1年で故障かぁ。とにかく開けてみます。

バイクから外してきて・・・


これが基板。Arduino-NANOを載せています。

半固定抵抗は以前液晶表示にした名残り

原因を調べる

電源に12Vを入れてみました。しかしArduino-NANOのLEDが点きません。
VIN端子まで12Vは来ていますが5V端子からは出てこないですね。
ソケットから外して裏を見ると・・・

コンデンサが弾けてパターンを切った様です。

コンデンサが弾け飛んでいて、その下を通っていたVIN配線パターンも切ってしまった様です。これではマイコンに電源が入りません。
猛暑に耐えられなかったんでしょうね。ケースの中で風も当たらないし・・確かに厳しい条件だったと思います。
またArduino-NANOと言っていますが中国製の互換品なのでどんなコンデンサを使っていたのかも分かりません。

ところでこのコンデンサ、VINとGNDとの間にありますが回路図には見当たりません。
レギュレーターへの入力なら普通は最短位置にコンデンサを付けますが・・回路図の抜けなのか互換品が気を利かせたのか?
値が分からないので手持ちにあった10μF/35Vのチップコンを取り付けました。
(安心の村田製作所製です。→https://akizukidenshi.com/catalog/g/g113161/
また切れた配線は前後のレジストを剥がしてメッキ線で接続し直しました。

これで動作は正常に戻ったのですが、よく見たらとなりのダイオードのモールドにもヒビ入ってますね。まぁ動作はしているのでヨシ!としましょう。

追記(2024-09-01):
ArduinoNANOに入れる電源電圧を下げる目的で、12V電源にシリコンダイオードを2本直列に入れてみました。多少は負担が減る筈。
更に2~3本入れるかツェナーダイオードで5V程落とせばもっと安心かもしれません。

ついでにソフトを見直す。

外したついでに今まで気になっていた下記の部分についてソフトを見直します。

  • まだ揺れが大きい。特にアクセルを開けた状態。
  • 長時間走っていると(恐らくモータが脱調して)指針がずれている。

という事でステップ時間を延ばし、移動平均フィルタのサイズも倍に増やしました。
また上昇/下降の変化点では1回休みの処理を入れてみました。

スケッチ→ https://www.hoihoido.com/data/tachometerX27_4.zip

取り付けて走ってみると・・・揺れはだいぶ納まった(まだ少しある)様です。
脱調の有無は長距離を走らないとわからないですが、揺れが減った時点で少なくともマシになっているものと期待しています。

カブ系エンジン用自動進角CDI ~その4~ 作り方ページ開設

先日投稿した カブ系エンジン用自動進角CDI ~その3~ シリアル接続で小型化する。を元にしたCDIの作り方ページを開設しました。→カブ系エンジン用自動進角CDIの作り方

今回は敷居を低くするため、切削で作る方式ではなくユニバーサル基板にArduinoNANOを載せる方式で作っています。

またこれまでは下の様なハードウェア的なコントローラーで動作を設定していましたが、これも同時に作ると結構大変なので第一段階はPCで設定する事にしています。

PCからの設定は、当初はコントローラーがやり取りする情報をArduinoIDEのシリアルモニターから手入力する方式で記載していましたが、これだと結構面倒です。

そこで急遽C#でGUIなツールを作成しました。このツールはコントローラーのエミュレータになっていて、ハードウェアコントローラーと同じ操作をPC上で実行できます。

ご興味がある方は下記リンクをご参照ください。

また、これまで投稿したCDI製作関係へのリンクです。

カブ系エンジン用自動進角CDI ~その3~ シリアル接続で小型化する。

カブ系エンジン用自動進角CDI自作の続きです。
先日の自動進角CDIですがサイズが大きくてカブに積み辛かったので小型化しました。
またコントローラーとの接続がパラレル接続だと線を伸ばし難かったので、シリアル接続に変更する事で扱いやすくします。

シリアル接続するにはコントローラ側にもマイコン(本体同様ATmega328p使用)を載せる必要がありますが、配線を伸ばせるとコントローラーをハンドル近くに設置してタコメーター代わりにも使えるのです。

回路図

まず本体側・・・
シリアル化によりコントローラーとの接続本数が減ってスッキリしています。

そしてコントローラー側。
こちらはマイコンを追加しています。また本体からケーブル経由で12Vを供給するので、コントローラー内に5Vを作り出すレギュレーターも載せています。
ケーブルを通す電源は5Vにしても良かったかな?LCDのバックライトに比較的大電流を流すのでレギュレーターを通す前の12Vを使ったんですが。。。

そして本体基板のパターンを設計。
なお図では両面基板ですが実際には片面基板に切削して表側(赤色)パターンはジャンパーで配線します。
シリアル接続にした事でコンパクトになり、ほぼ純正CDIと同じサイズにできました。
追記:前回はArduinoNANOの基板を載せていましたが今回はATmega328Pを直接実装したのでこれも小型化に効いていますね。

あ、レギュレーターの極性を間違っている!

基板はいつもの様にCNCで切削します。
ところで切削で使う刃物は以前からオリジナルマインドさんで売られている「土佐昌典VC」を使っていますが、だいぶ前から使っているので刃先が劣化して切り跡ががケバ立ってきました。
これ、最近オリジナルマインドのページで見つけられなかったので販売が終了したのかと思っていましたが実は探し切れていなかっただけで、またちゃんとあった事が判り、今回新たに購入しました(1本¥2980円。これ凄くイイんですがちょっとお高いんですよね)。

まあとにかく切削実行!・・・結果、下の写真の様に上下に2回切っていますが、下側は深さ0.15mmで切削したら深すぎたので上側の0.1mmでやり直しました。
使い古した刃物で0.1mmだと切れていない事があったので0.15mmにしたのですが、断線したところがあります。
やはり新しい刃物は切れ味が良く0.1mmでバッチリです。

今回は表面実装のマイコンを載せるのでピッチが細かく、また高圧部分もあるので短絡の心配を減らす為に不要パターンを手作業で剥がしました。

そして部品を搭載。レギュレーターの極性を間違っていた部分はパターンをカットしてジャンパーで修正しました。
その後ArduinoNANO用ブートローダーを書込み、そしてファームも書込みます。

部品搭載後の表側。
高圧用コンデンサは前回のと見た目が違いますが1μF,630Vの同等品です。
コントローラーとの接続用に4pinのXHコネクタを設けています。

そしてコントローラー側のパターンも作って・・・

切削!
こちらは実験的に不要銅箔もCNCで取り除いてみたところ、切削時間は大幅に伸びますが手作業で剥がすよりも楽です。刃物は半月刃を使っていました(土佐昌典VCは切れ幅が狭いし第一勿体ないので)。
切削直後はまだ細い銅箔が残っていますが、これは手作業で除去します。

そして実装(裏面)

本体に接続するケーブルは4芯接続なので古い電話線を使ってグルーガンで補強しています。
またコントローラーは前回と同じケース(MDF材で作成した)に収めています。
現状MDF材ですが、ずっと使うなら防水が必要ですね。

本体側は3Dプリントしたケースに収めます。
これも現状オープン状態ですが、十分にテストした後は樹脂で埋めて防水するつもり。

では前回と同じカブ(息子が50ccをボア/ストロークアップした107ccエンジン搭載車)に積んでみます。
CDI本体の小型化によりサイドカバーを閉めやすくなりました。

コントローラーは長めの4芯ケーブル(古い電話線)で接続。

ケーブルを1.5m程度に伸ばしたので見やすい場所にコントローラーを設置できる様になりました。

走った感触

点火部分はソフト、ハード共に前回から変わっていないので走った感触は前回のままです。

ファームウェア(Arduinoスケッチ)を掲載

試行錯誤の後が残ったままで汚いですが現状のファームウェアを掲載します。
マイコン(本体、コントローラー共)にはArduino NANOのブートローダーを書き込んだ上でこのスケッチを書いています。なのでもし追試される方はArduinoNANOをそのまま使う方が手っ取り早いかもしれません。

本体用→https://www.hoihoido.com/data/CDI-AC6.zip

コントローラー用→https://www.hoihoido.com/data/CDI-AC_Control.zip

なお前回の投稿ではコントローラーをパラレルで接続していました。今回の本体用ファームはシリアルコントローラー、パラレルコントローラー、どちらにも使用可能です(前回投稿の回路図で作ったCDIに書いても使える)。

回路図とファームウェアを使用される場合の注意

この回路図やファームウェアを参考にされる場合は事前に「免責・著作権・肖像権・リンク」のページを御一読願います(要は何か問題があっても責任持てませんよとか、自作するのは自由ですが販売とかを考えられるなら相談してねとか、そのあたりです)。

カブ系エンジン用自動進角CDI ~その2~ 107ccカブに積んでみる。

前回、自作の自動進角CDIを50ccカブに積んでみて効果が今ひとつ体感できなかった事を書きました。
その後、息子がもう一台ジャンクの50ccカブをボア、ストロークアップにより107cc化したので、そちらに積んでみたところ、効果が見られました。

107ccカブ(なお原付2種としてちゃんとナンバー取り直してます)
自動進角CDI

はっきり効果が見られたのは低速側です。
純正CDIの点火タミングは全回転域で上死点前27度(BTDC27°)に固定されているのに対し、自作CDIはアイドリング回転数付近は17°に設定しています。これにより、まずキックスタート時のケッチンが発生し難くなりました。また走り出しの加速もスムーズです。
一方高速側は最大37°程度にしてみましたが効果があるのか無いのか判りません。50cc程度なら急な上り坂で全開走行を試せるかもしれませんが107ccともなると公道で試す訳にいかず、多分サーキットとかシャーシダイナモで試さにゃハッキリしない気がします。

そして・・・

いずれにしても50cc用純正CDIよりは良くなるので107ccカブではこのCDIを使います。
という事でもうちょっと安心できる形にしたいと思います。現在の状態(上の写真)だと雨の日は心配ですもんね。

という事で純正CDIと同程度のサイズになる様、以下の点を踏まえて作り直そうと思います。
・ArduinoNANOを載せるのをやめてATmega328pを直接載せる。
・コントローラーとの接続をUARTに変更する事で、本体⇔コントローラー間の配線本数を減らす。
・最終的には樹脂で埋めて防水する。

では下記の基板パターンで試作してみます。まずは切削で基板を作る予定。
・・・なのですが切削用刃物がだいぶ劣化していて上手く削れなかったので刃物入荷待ちです。

まとめ

50ccエンジンだと効果が感じられなかったけど、107cc化したエンジンでは特に低回転側で効果がありました。
なお90ccカブの純正CDIが15°~28°の間で変化する様なので高回転側をあまり増やしても効果ないのかもしれません。実際はどうなんでしょうね?
どなたかこのCDIを試してみられますか?

カブ系エンジン用自動進角CDI

先日ミニマム構成なCDIを作った事を書きました。今回は自動進角機能を盛り込んでみます。

※5/7追記:この記事で純正カブの進角を28度と記載していますが、正しくは
 27度でした。 1度の違いで大きな影響はないと思いますが訂正いたします。

進角について

ここで言う進角とはエンジンの点火タイミングの事です。よくあるエンジンの行程説明ではピストンが上まで上がり切ったタイミング(上死点)に点火していますが、実際には混合ガスが燃え広がるのに時間を要するので上死点よりも少し早めにプラグに火を飛ばします。
この時どれくらい早めに点火するかをクランクの回転角で表し「進角xx度」と表現します。

我が家にある(1995年頃の)スーパーカブ50では回転数に係わらず進角は28度辺りに固定されています。28度というのはピストンが上死点に達するよりもクランクが28度早いタイミングでプラグに点火する事を意味します。
情報によると90ccのカブでは15度~28度の自動進角CDIになっているとか。またDAYTONA製CDIをレーシングモードにすると22度~37度位を自動進角する様です。

構想

スーパーカブ50ではフライホイールの回転角をピックアップコイルが検出してCDIにパルスを送ります。CDIではこのパルスが入ったら即時プラグに点火するので、進角が28度固定となっています。
よって自動進角する為に28度よりも遅らせるにはアナログ的な遅延も可能ですが、進める事は簡単にはできそうにありません。だってピックアップパルスよりも早く点火信号を出すのですもの。。。


これを可能にする方法ですが、多分それ以前の回転数を元に次の回転数を予測し、ここぞというタイミングに点火するしかなさそうです。(車体側を改造してピックアップタイミングを大幅に進めてしまえば遅らせる処理だけで済みますが、改造のリスクが大きそうですし。。。)
この複雑な動作を実現するにはマイコンで処理するのが良いでしょう。

という事でピックアップパルスをマイコン(Arduino-Nano)に入力し、良い頃合いに点火信号を出す仕組みにしようと思います。

回路

以下の回路でやってみます。
ACジェネレーターの電圧をコンデンサやサイリスタを使ってイグニッション信号を出す部分は前回のミニマムCDIと同じです。
違うのはピックアップコイルのタイミング信号をマイコン(Arduino-Nano)に入力するあたりで、このマイコンがタイミングを見計らってサイリスタのゲートを駆動します。
また設定変更用にコントローラーを接続する為の13pinのコネクタを設けています。
なおマイコンを動作させる電源は車体からDC12Vを貰う事にし、Arduino内部のレギュレータで5Vに落としています。

コントローラーは次の回路で、ボタン4つとLCD(よくある1602タイプのヤツ)を接続しています。

作ったハードウェア

最終的には防水する必要があると思いますが現時点はこんな状態でテストしています。

フラットケーブルの先には設定用コントローラーが繋がっていて回転数毎の進角を変更できます。
またカブにはタコメーターが無いのでLCDに回転数を表示します。
コネクタで接続しているのでセッティングが決まったら取り外して本体のみで使用します。

Arduinoに入力するDC電源は写真の様な分岐線を作ってウィンカーリレーの配線から分岐しました。

ソフトウェアの動作

まずArduino-NanoのEEPROMにマップデータを保存します。
マップデータは4点の回転数(1000,3000,5000,7000rpm)に対応する進角値とします。各数値の間は直線で補完し、1000rpm以下は1000rpmの設定値、7000rpm以上は7000rpmの設定値を用いる事にします。
グラフにすると下の様な感じ(具体的な値は実験中)。

横軸が回転数(rpm)、縦軸が進角(度)

動作としてはピックアップパルスが入る度にタイマーで一つ前からの時間を測定し、それを回転数に変換して上記マップに基づいた進角値を求め、次に点火するまでの時間を算出します。
この時、ピックアップタイミングの28度よりも点火タイミングが遅い場合と早い場合に応じて色々と処理が分かれます。

まず28度よりも遅い場合・・・
下図の様に進角28度のタイミングで車体からパルスが来るので、ここからAの時間分遅らせた赤線のタイミングで点火します。その後のTと書いたタイミングが上死点です。

28度よりも早い場合・・・
1周期よりも少し短いBの時間分遅らせて点火する事で、次の周期では28度よりも早い赤線のタイミングに点火します。

面倒なのは28度よりも遅い状態と早い状態を切り替えるときです。

遅い→早いに切り替わる場合・・・
切替りの周期ではA,Bの2発の点火信号が必要となります。

早い→遅いに切り替わる場合・・・
こちらは逆に全く点火させない周期が発生します。

遅角を予定していたのに次のパルスが来てしまった場合。。。
回転数が下がってくる上がっていく時には予定していた点火タイミングよりも先に次のパルスが来てしまう事も考えられます。その場合はとりあえず直ちに一発点火を発生させます。

ちょっと面倒でしょ。でもまあこれらの考えられるパターンへの対応をプログラムしていきました。

動作させてみるが・・・

実車に繋いでタイミングライトを当ててみます。
本来ならアクセルを開けると回転数が上がるに応じて進角も進んでいく筈ですが、少し遅れて進角が進みます。特にアクセルを閉じた時は逆に進角が大きくなり、十分回転数が落ちてから進角が戻ります。
どうやら回転の加減速が早いので直前の周期が次の周期と同じ前提だと無理がある様です。

加減速予測

対策として回転数の加速/減速を加味して次の周期を予測する事にします。具体的には前2回分のパルス間隔の変化(=加速度)が次も続くと仮定する事にします。
更に4ストロークエンジンでは一回転毎に燃焼する為パルス間隔も変動している可能性があるので一回置きに計算します・・・言葉で説明し辛いですが図にすると下の様になります。

これで動作させると下の動画の様にそれっぽい動作をする様になりました。

それっぽく動くようになった動画

マップのセッティング

以上で思惑通りに動作していると思います。
そこで実際にカブで走ってセッティング中ですが、今ひとつ進角の効果が体感できません。
車体が古くて本来の性能を発揮できていない事も十分考えられます。。。
点火タイミングだけじゃ大きく変わらないのかな。。。もう少し試行錯誤してみます。


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用)

CBF125T タコメーター故障&作成 ~その2 ステッピングモーター化~

先日液晶表示のタコメーターを作りましたが、液晶ディスプレイが小さいのと昼間はコントラストが低くて見づらかったのでステッピングモーターに置き換えて針を振らせてみました。

まず前回のタコメーターは下の状態。

反射光でもバックライトでも見えるというディスプレイですが、はやりちょっと見づらいのです。

今回のステッピングモーターについて

ステッピングモーターはAmazonで2個¥1940円で購入。
X27-168という型番で、CNCや3Dプリンタで使う様なヤツではなく、下の写真の様にメーター用の軽量のものです。

後ろ

このモーターはこちらのブログで紹介されていました
またデーターシートはここで発見しました

元々付いていた(壊れた)タコメーターと比べるとこんな感じ。電子回路が別に必要だとしてもかなり小さくて済みそうです。

ところでこのステッピングモーター、2相のバイポーラ動作ですがコイルの駆動が5V/20mAで済むのですね。
という事はAtmega328PのArduinoで直接駆動できます。改めてAtmega328Pの絶対最大定格を見たらI/Oピン電流は40mAと書かれています(20mAだと思ってたのでギリのつもりでしたが、実は結構余裕だったのね)。

また通常動作(マイクロステップ等にしない場合)では、1ステップで1/3度回るのでタコメーターの分解能としては十分です。

回路

回路的には先日作った液晶方式からディスプレイを取り外し、ステッピングモーターの配線4本をつないだだけ。
あ、あとパルスを割込みでカウントするため、入力ピンをD5→D2に変更しています(Atmega328PのArduinoで割込みを使うにはD2かD3に入れる必要があるので)。

取り付け

パネルへは新たな穴を開けて直接モーターを取り付けました。
不要になった穴は夜間に光が漏れそうなので裏からプラパテで埋めたのち、表から黒塗りしています。


取り付けにちょうど良いサイズのタッピングビスが手持ちになかったので、モーターの取り付け穴(元々Φ1.85)にタップを立ててM2ネジで取り付けました。

指針は元々付いていたものを使うのですが、軸の太さが元のメーターだと0.8mmに対し、今回のモーターは1mmと太くなります。
そこで指針の軸穴を0.95mmのドリルで拡大したら丁度良くなりました。
因みに0.95mmのドリルは写真のセットに含まれています(Tinyドローンの軸拡大にも時々0.95mmを使うので単品で買っておきたいのですが売っているのを見かけません。通販で買っとけばよいのですが)。

そして一通り接続したところ。。。

プログラム

前回はゲートタイム200mSでパルスをカウントしていましたが、低回転での分解能を改善するため1パルス毎に割込みをかけてArduinoのmicros()時刻からパルス間隔を測定しています。
モーターコイル2本のそれぞれ両端に加える電圧は以下の配列を用意しておき順次切替えています。

// 各ステップの端子状態
int coil1a[]={1,1,0,0,0,0};
int coil1b[]={0,0,0,1,1,0};
int coil2a[]={1,0,0,0,0,1};
int coil2b[]={0,0,1,1,0,0};

動作させてみる・・・

アイドリング時の振れが大きいです。
またキーをOFFした時に0rpmに戻らずその場で止まってしまうのがカッコ悪いですね。

対策

まず振れが大きい問題についてはソフト的にローパスフィルターの処理を強目にしました。

次にキーOFF時の動作ですが、OFFの瞬間に電源が切れてしまうと0に戻せないので、戻すまでの時間分の電力を貯めておく必要があります。なら電解コンデンサでしょうね。
ざっくり計算で10000μF程度をつけたいところですが手持ちにないし大きすぎるので試しに4700μFを、ArduinoNANOのレギュレータに供給している12VとGND間に付けてみました。
・・が、キーOFF時に0rpmには戻りませんね。
でもこれは想定内。単に12VとGND間にコンデンサを繋いだだけではコンデンサに貯めた電荷は車体側にも流れてしまうのであっという間に放電し、タコメーター側に供給する電力は僅かになってしまいます。
これを防ぐため、バイクから供給する12Vとタコメーターの間をダイオードで分離してみます。また電源ON時にガバッと流れるのがイヤなので抵抗とダイオードをパラにつないで下図の様に接続しました。

これでコンデンサの容量を替えて試したところ2200μFでOKですが1000μFだとダメ。よって少し余裕を持たせて3300μFを取り付けました(4700μFの方が安心ですが50V品で大きくてケースに入らないのです)。

実際の配線は下の様なのを作ってギボシ端子接続に割り込ませています。

コンデンサはテープで貼り付けました。この位置ならケース内に納まります。

もう一度動作確認・・・

指針の揺れがかなり納まり、キーOFF時に0rpmに戻る様になりました。
しかし実際に走ってみると、アクセルを開けている間だけまだ揺れがすこし大きいですね。
もう少しローパスフィルターを強めに効かせようと思いますが、またメーターを外すのが面倒なので次回バラす機会があればやろうと思います。

Arduinoのスケッチ

参考に今回のプログラムを載せておきます。

http://www.hoihoido.com/data/tachometerX27_2.zip

CBF125T タコメーター故障&作成

先日の長距離ツーリング中、岩手県のあたりでタコメーターが壊れました。
最初は指針の大きくブレているなと思っていたらだんだんと明らかに低い回転数を指す様になり、最終的には全く振れなくなりました。
まあ速度計の方は正常なので走るには問題なく、帰宅までこのままの状態だったので原因を調べてみます。

とにかくメーターを外してみます。

中身・・・

更にバラすと・・・

タコメーターは電気式で3本の電線が出ており、黒色が+12V。緑色がGND。黒/黄が信号線です。
黒が+12Vというのに違和感がありますが何故かそうなっています。

基板上にはBAK225というICが載っていて入力パルス数に応じてメーターを動かしている様です。
このあたりの事はこちらのブログが参考になりましたがICのデーターシートは見つかりませんでした。

まずは問題切り分けの為、車体側からタコメーター側に信号が来ていることを確かめます。
タコメーターを接続していないと0V付近のノイズっぽい信号しか見えず、タコメーターを接続すると下の波形が見えました。プルアップでも波形が出るのでオープンコレクタ出力かもしれません。

アイドリング時の波形。

何はともあれ車体から信号は出ているのでメーター側に問題がある様です。
ではメーター側を調べていきます。
後で組み立てる際に指針がずれない様1000rpmの位置にマジックで印をして・・・

取り外しました。

メーターコイルの配線をテスターで当たると導通がなく、どうやらコイルが切れている様です。
でも目で見る限り断線箇所は分かりません。

更にバラしている間にバネも歪んでしまい、もう正確なメーターに戻る気がしません。

さてどうしましょう。
CBF125T用として売られているメーターAssyは1万円くらいします。
同様のメーターがジャンクでないか、バイク基地(UPガレージ)を探したけど見当たらず・・・
市販の適当なメーターを取り付けるのも考えましたが元々がスピードメーターと一体のデザインなのでハンドル回りの納まりが不格好になりそうです。

まあタコメーターなので無くても走れないわけではありませんが、急坂をシフトダウンして上る時に回しすぎていないか気になります。

という事で、使えそうなメーターがみつかるまで、Arduino NANOでパルス数をカウントして手持ちのLCDに表示する事にします。

ざっとこんな回路で・・・

そしてプログラムの作成。
カウンターのライブラリはこちらで紹介されていたものを使用しました。
ゲートタイムを指定できるので200mSにしています。

スケッチ(参考)

下の様に取り付けました(やはり不格好ではあります)。

ところで車体から出ているパルスはエンジン1回転につきパルス1発なのでしょうか?
その前提でプログラムすると回転数が高すぎた表示をする様です。

そこでイグニッションコードに電線を巻いて取り出したノイズと見比べてみると・・・
黄色がイグニッションノイズ。水色が車体からタコメーターに送るパルス。
タコメーターパルス4発に対し一回イグニッションノイズが出ています。

ここでもう一つの疑問が・・・。イグニッションプラグは毎回転スパークするのでしょうか?それとも2回転に1回でしょうか?
4ストロークエンジンなので爆発は2回転に1回ですが、プラグは毎回スパークしているバイクも結構ある様です(点火タイミングを単純にクランク軸から取り出すとそうなる)。

どうやらCBF125Tではエンジンが1回転につきタコメーターパルス2発の前提で表示すれば正しい回転数になる様です。という事はプラグは2回転に1回スパークしているのかな?(タイミングはどこで検出しているのでしょう?)

動作中の動画

とりあえず回転数が分かる様にはなりましたがLCDが小さくてちょっと見づらいですね。
また、一応昼間は反射光、夜は透過光で視認できる仕様のLCDを使っていますが昼間はちょっと見づらいです。

調べていくとメーター表示用のステッピングモーターというのがAmazonでも入手できる様なので、これで指針を動かしてみるのも良いかもしれません。

HOILog・・無人航空機の飛行日誌を自動化

最近M5Stackにハマっていました。
M5Stackというのはまあ簡単に言うとESP32マイコンにLCDディスプレイやバッテリーを含んだ電源管理回路などをつけて一式をケースに入れたものです。
私が購入したのはCore2という機種で外観はこんな感じ・・・

M5Stackは数年前から出ていて気にはなっていたのですが、値段がちょっとお高めだったりして手を付けていませんでした。で、今更ながら購入してみたら結構便利なんですよね。 特に電源管理回路とかイチから作るとそれだけで何かにハマりそうですが、これなら最初から入っています。

HOILog

という事で何を作っていたかというと「無人航空機の飛行日誌を自動でとるシカケ」です。命名:HOILog。
M5Stack Core2を選んだのは内部に時計(RTC)を持っているので時刻を記録し易いのです。

構造は ざっと下の通り・・・

RC受信機が信号を受けるとSBUSやCRSFプロトコルでM5Stackに伝えます。
(SBUSはフタバ系、CRSFはELRS等で使われるプロトコルです。両方対応しています。)
M5Stack側では信号が来たら飛行開始と判断し、マイクロSDカードに時刻を記録します。そして信号が途絶えたら飛行終了ということでまた記録します。

更にM5StackにはWiFi接続機能があります。これを利用してWiFiが利用できる環境であればASAKICHI先生作の飛行日誌システム( 詳細 はこちら) にもアップロードできるので、Googoleドライブ上のスプレッドシートに記録が残っていきます。

動作しているところはこんな感じ→Twitterに上げた動画

ハードウェア

M5Stack Core2の裏にピンソケットがあります。新品の状態ではここにフタを兼ねた気圧センサー基板がついていますが、今回は不要なので取り外して+5V電源、GND、UART2のRX/TXを引き出し、RC受信機に接続します。
ELRS受信器には入力(RX)信号があり、現在は使っていませんが将来何かに使うかもしれないので繋いでおきます。SBUS受信機の場合は入力信号がないのでM5StackのG14(UART2-TX)端子はオープンにしておきます。

ブレッドボード上に組んだセット(回路図にはないですが分かりやすい様に電源にLEDをつけています)。

ソフトウェア

M5StackはULFlow、ArduinoIDE、Micropython等の開発環境が選択できます。私はこの中から一番なじみのあるArduinoIDEを使用しました。
ところがやり始めて気づいたんですけど、コンパイルが結構遅いんです。ググってみると皆さん同じ問題により、PlatformIOに乗り換えられている様です。PlatformIOとはVisualStudioCode(以後VSCode) に入れるプラグインで、たぶん一言で言い表すと各種マイコンに対応した開発環境だと思います。
確かにPlatformIOでビルドするとかなり早くなり快適です。またベースがVSCodeなので入力補完があったり、キーバインディングをEmacs風に変更したりできて便利です。(余談ですがEmacs風キーバインディングにしたとき、VSCodeの仕様によりEscキーを使用できず、代りにAltキーを使う事になるのが弱点です)。

ところがPlatformIOで作ったスケッチが大体安定した動作になった頃、このブログで公開しようかなーと思い、その前に一旦ArduinoIDEに戻してビルドしたところ何だかうまく動作しません。(M5Core2ライブラリはどちらも同じバージョン(0.1.5)なのですが、もっと奥の方のライブラリのバージョン違いが原因かもしれません。)

とりあえずハマったのは下記の2点。
・タイマーの一旦停止後再起動する場合の動作の違い。
 timerStop(timerxx)で停止した後に再起動するとき、 PlatformIOはtimerRestart(timerxx) で再起動できていたのがArduinoIDEだと止まったまま。
 →対策:timerAlarmDisable(timerXX)で止めて timerAlarmEnable(timerXX) で復帰させる。ただし復帰直後のカウントアップが嫌だったので timerAlarmEnable(timerXX) 直前にtimerRestart(timerxx) も実行した。

・HTTPにPOSTした後同じオブジェクトでGETできない問題。
 Googleドライブへアップロードするとリダイレクト指定が返ってきます。このため一旦POSTでアクセスした後、今度はGETでアクセスするという2段階のアクセスが必要となります。そこでPlatformIO上では、HTTPClient http;で作ったオブジェクトを使いまわして接続していました。しかしArduinoIDEだとエラー(エラーコード400が返る)となりました。
色々試したところ、どうやらArduinoIDE上では GET→GETなら できますがPOST→GETはダメでした。
 → 対策: HTTPClient http2; の様にもう一つオブジェクトを宣言し、POSTはhttpオブジェクト、GETはhttp2オブジェクトで使い分けた。

使い方~セットアップ編~

  1. ArduinoIDEとM5Stack Core2の開発環境を準備する。私はこちらのページを参考にしました。
  2. この投稿の一番下からM5Stack Core2用のスケッチをダウンロードして解凍する。
  3. PCとM5Stack Core2の間をUSBケーブルで接続する。
  4. 「2.」で解凍したフォルダ内のHOILog.inoをダブルクリックするとArduinoIDEが開く。
  5. ArduinoIDEのツールメニュー→ボード名を”M5Stack-Core2″、シリアルポートを該当するポート名(不明な場合はWindowsであればデバイスマネージャーで調べる)に設定する。
  6. 書込みボタンを押して書き込む(若干時間が掛かります)。書き込みが完了したら電源ボタンを長押し(約6秒)して一旦電源を切る。
  7. 上の「ハードウェア」に書いた様にM5StackとRC受信機を接続する。
  8. 設定ファイル”hoilogini.txt”を作成して マイクロSDカードのトップディレクトリに置く。※SDカードの使用は必須です。
  9. 電源ボタンを押して起動!!

設定ファイルについて

SDカードのトップディレクトリに”hoihoiini.txt”の名前で作成します。
内容は1行に1パラメータを設定。1行は256バイトまで。行先頭にディレクティブ、その後1文字以上の空白を置いて設定値を書きます。#記号より右側はコメントです。

設定ファイルの例・・・

# HOILog 設定ファイル 

LOGFILE /hoilog.txt # File name
SCREEN 60 # Screen save time.(Seconds)
RCTYPE SBUS # SBUS or CRSF
RCJUDGE RSSI # RSSI or RCSIGNAL
RCRSSICH 16 # Channel number
RCRSSITH 1000 # Threshold value
RCCONTTIME 3 # Signal continue time
BAUDRATE 100000 # SBUS:100000 CRSF:420000
WIFITIMEOUT 20
SSID XXXXXXXX
PSWD XXXXXXXXX
LOGURL https://script.google.com/macros/s/XXXXX/exec
LOC1 ASO
LOC2 AMAKUSA
LOC3 KOSHI
MODEL1 Tyro99
MODEL2 Switch
MODEL3 Five33

各ディレクティブの説明:

LOGFILE:SDカードに残すログファイルの名前です。
SCREEN:指定の秒数イベントがないと画面を暗くします。ボタンを押したりRC信号が変化すると表示を再開します。値が0の場合は常に表示です。
RCTYPE:RC受信機の信号フォーマットがSBUSかCRSFかの指定です。
RCJUDGE:飛行中の判定をRC信号の有無で判定するか、RSSIで判定するかの指定です。受信機によっては電波が途絶えても最後の状態を維持するので単に信号が途絶えたかどうかでは判別できません。その場合でもRSSI(信号強度)がどこかのチャンネルに出ていればこれを基に判別可能です。
RSSICH:RSSI によって飛行中である事を判定をする場合、RCチャンネルの何番がRSSIを示すかを指定します。
RSSITH:RSSI によって飛行中である事を判定をする場合、 RSSICHで示すRCチャンネルの値が幾つ以上なら信号ありとするかを指定します。CRSFの信号範囲が172~1811、SBUSも大体その程度なので1000あたりを入れておけば大体OKだと思います。
RCCONTTIME:瞬間的な信号の切断やノイズによる入感を除去するため、
(立上り/下り共) 信号が何秒間連続で続いたら変化したと判断するかを指定します。
BAUDRATE:RC信号のボーレートを指定します。SBUSは100000固定。CRSFは420000がよく使われる値です(115200も使われる様ですが手元に確認する環境がなく、動作を確認していません)。
WIFITIMEOUT:WiFi接続時、何秒以内に接続できなかったらあきらめるかを指定します。
SSID:WiFi接続のSSIDを指定します。
PSWD:WiFi接続のパスワードを指定します。
LOGURL:Googleドライブにアップロードする為のGoogleApplicationScriptへのURLです。こちらのASAKICHI先生の動画の8分20秒頃に説明があるURLです。
LOC1~5:飛行場所を5つまで設定できます。M5Stack上のメニューでこの中から一つを選択してログに残せます。電源投入直後はLOC1が選択されています。MODEL1~5:機体名を5つまで設定できます。 M5Stack上のメニューでこの中から一つを選択してログに残せます。 電源投入直後はMODEL1が選択されています。

※LOCxやMODELxの値に日本語等の2バイト文字を入れるとどうなるかは試していません。

使い方~操作編~

電源を入れるとまずWiFiに接続した後、下の基本画面になります。
WiFiに接続できなかった場合はSDカードへの記録のみ行い、Googleドライブへのアップロードはしません。
この状態でRC電波を受けるとRCCONTTIMEに設定した値の秒数信号が続く事を確認後、SDカード、およびGoogleドライブのログに記録を残します。
Googleドライブへ記録する間、飛行状態表示部に「START UPLOAD」又は「STOP UPLOAD」と表示し、この間RC信号モニタや時計は動作しません。
Googleドライブへの記録は失敗すると3回までリトライします。最終的に成功したか失敗したかはSDカードに記録します。なお稀にですがサーバが正常に受付けて成功した旨の通知を返したのにM5Stackまで届かなかった時はリトライするので複数回の記録が上がってしまいます。その場合はSDカードのログを参照しながら手動でGoogleドライブ上のデータを修正する必要があります。

M5StackのCore2にはボタンがA,B,Cの3つ搭載されています(このボタンは物理的な接点ではなくタッチセンサーになっていて、押した感触が伝わりにくいですがちゃんとボタンとして機能します)。
基本画面ではボタンCを長押しすると設定画面に移ります。
ボタンA,Bには機能を割り当てていませんが、スクリーンセーバーからの復帰には反応します。

設定画面(MAIN MENU)
上から時計設定、電源OFF、機体選択、飛行場所選択、メニュー終了です。
反転文字になっているところが現在対象となっている行で、ボタンAを押すと上、Bを押すと下の行に移動し、Cを押すと選択されます。
「電源OFF」を選択するとシステムの電源を切ります。「EXIT MENU」を選択すると基本画面に戻ります。
時計設定、機体選択、飛行場所選択の各画面を以下で説明します。

時刻設定画面
ボタンA,Bを押すと反転文字になっている部分の値が上下に変化します。ボタンCは決定ボタンで次の値に進みます。年月日~秒まで進み、次にボタンCを押すと図に「NEXT」と表示された部分に移ります。ここではボタンA,Bを押すと「NEXT」、「SAVE&EXIT」、「EXIT:NonSAVE」と順に変化して行きます。それぞれの状態でボタンCを押すと以下の動作をします。
・NEXT:最初の「年」の設定に戻ります。
・EXIT:NonSAVE:時刻は変更せずにメインメニューに戻ります。
・SAVE&EXIT:内臓時計に設定時刻をセットし、メインメニューに戻ります。

機体選択
ボタンA,Bで対象行を上下させ、ボタンCで選択すると機体が選択されてメインメニューに戻ります。

飛行場所選択
ボタンA,Bで対象行を上下させ、ボタンCで選択すると飛行場所が選択されてメインメニューに戻ります。

ログ

実行後はSDカードのLOGFILEで指定したファイル名に以下の様なログが残っています。

TakeOff,2023-03-05 22:46:36                  ←離陸時刻
Upload success,2023-03-05 22:46:36 ←離陸をGoogleドライブにアップロード成功
Landing,2023-03-05 22:47:13 ←着陸時刻時刻
Upload success,2023-03-05 22:47:13 ←着陸ををGoogleドライブにアップロード成功

Googleドライブ上には(アップロードしていれば)次の様なログが残ります。

スケッチ

HOILog20230306.zip

※このソフトウェアを使用されてもし問題が発生しても責任は持てませんのでそのあたりはよろしくお願いします。

自動金ノコ

気がついたら前の投稿から3か月が過ぎていました。
この間も色々とやってはいたのですが、更新をサボってしまったんですよね。
で、最近作ったのはこれ。自動金ノコ。

鉄を切るなら高速切断機が早いですがアルミを切る場合や外で作業できない時、いままで金ノコを使って人力で切っていました。でも時間はかかるし疲れるんですよね。

そこでみら太さんのブログに以前書かれていたのを参考に作ってみました。

ほぼ手持ちのガラクタから作りましたがギヤードモーターだけAliexpressで購入しました。12V167rpm、ブラケット付きで¥1,103-。

早速動作中の動画です・・・まだセンサーもスイッチも付ける前の画像。

その後、切り終わった事を判別するリミットスイッチと・・・

ノコ刃が引っかかってロックした場合を検出するフォトインタラプタを取り付けました。3秒以上変化がないとモーターへの通電を止めます。

センサーの信号をこの箱の中のArduinoで読み、パワーMOSでモーターをコントロールします。ボタンはスタートとストップ。

電源入力はXT60コネクタなのでドローン用3セルリポでも動くかも。
(野外で使う事はないですけど)。

使わない時、こんな感じで立てておくと邪魔になりません(多少)。