レースに使っていたフライトコントローラーにArdupilotをインストールする。

息子の大学の研究室に買ったままの状態のドローンがあり、教授からこれを飛ばす様に言われたらしいのですが、これがまた数十万円もする機体で、慣れ親しんだレース機の様に墜落上等!!なモノとは緊張感が違う様です。
この機体のフライトコントローラー(以下FC)にはPixhawk(これも10万円前後するやつ!)が載っていて、ファームウェアにはArdupilotが書き込まれています。

FCのオープンソースなファームは各種ありますが、レーシングドローンだとBetaflightがメジャーなのに対し、オートパイロット用途ではこのArdupilotPX4等が多く使われている様です。

Ardupilotを初めて知ったのはMake:日本版Vol09の記事でした。この頃はArduinoベース(なのでArdupilotという名前)でしたが最近はPixhawkが主流になっています。

で、いきなり何十万円もする機体を飛ばす前に、落ちてもダメージが少ない5インチ程度の機体を使ってArdupilotに慣れたいという希望が出てきた様です。そこで手持ちのFCにArdupilotをインストールできないか調べてみました。上手くいけば自作フライトコントローラーのHOIHOI-FCに載せられるかもしれません。(下まで読んで貰えると現状のHOIHOI-FCには載せられなかった事が分かるのですが)

何はともあれArdupilotをビルド

必ずしも手元でビルドできる必要は無いかもしれませんが、最終的にHOIHOI-FCに載せるとしたら設定を変えてビルドする必要が出てきそうです。
という事で今回もWSL(Windows Subsystem for Linux)上にビルド環境を作ってみます。
基本は下記のドキュメントに沿って作業していきました。

https://ardupilot.org/dev/docs/building-setup-windows10_new.html
https://ardupilot.org/dev/docs/building-setup-linux.html
https://github.com/ArduPilot/ardupilot/blob/master/BUILD.md

という事で、まずはWSLを開き、GithubのArdupilotリポジトリをクローンします(gitの環境は予めインストールしてあります)。
但しその前に改行コードを勝手にCRLFに変更しない設定にしておきます。「CRLFにする」設定のままで作業すると、後々エラーが出てしまったのです。

git config --global core.autocrlf false   ←勝手にCRLFに書換えない設定。
git clone --recurse-submodules https://github.com/Ardupilot/ardupilot

出来上がったardupilotディレクトリに移動して設定スクリプトを実行しました。

cd ardupilot
Tools/environment_install/install-prereqs-ubuntu.sh -y

スクリプトが.profileに加えた変更を反映させます(ログインし直しても良いですが)。

. ~/.profile

ビルド可能なボード名一覧を参照し、この中からMatekF405をビルドしてみました。
(MatekF405を選んだのはBetaflight用HOIHOI-FCをビルドした時、MatekF411を元に作成したので今回も近いボードで試したいから)

./waf list_boards    ←ビルド可能なボード一覧を見る
./waf configure --board MatekF405 
./waf copter

暫くすると”adrupilot/build/MatekF405/bin/”の下に”arducopter_with_bl.hex”ができました。
FCがMatekF405であれば、このままファイルを書き込めば良い筈です。

HOIHOI-FC用にビルドできるか?

ではHOIHOI-FC用の設定を作ろうと思います。
各FC用の設定はどうやら”ardupilot/libraries/AP_HAL_ChibiOS/hwdef”の下にFC名のディレクトリを作ってそこに置く様です。
先ほどのMatekF405だと”ardupilot/libraries/AP_HAL_ChibiOS/hwdef/MatekF405″で、この中に”hwdef-bl.dat”,”hwdef.dat”の二つのファイルがあります。
よってこのディレクトリをHOIHOI-FCディレクトリとして丸ごとコピーした後に変更を加えていこうと思います。
・・・ところがHOIHOI-FCに載せているマイコン、STM32F411はArdupilotでサポートされていない事が分かりました。
wikiによるとフラッシュメモリが1MB以上必要との事。STM32F411は512KBなのでファームが入りきらない様ですね。
ならばSTM32F722もHOIHOI-FCに載せた事があるのでこれならどうだっけ?・・こちらも512KBでサポート対象外ですね。 うーん、なんてこった。

iFLIGHT SuccexF405に載せてみる。

このまま止める訳にもいかず、手持ちの中からArdupilotがサポートしているFCを探したところ、iFLIGHTのSuccexF405がありました。このボードに載っているSTM32F405(フラッシュ容量1MB)ならOKです。

ではSuccexF405のファームをビルドして書き込んでみます。書き込み方法は“1/3三田式3型改1製作記さん”のブログ“を参考にしました。
まずFCのBOOTボタンを押しながらUSBに接続する事によりDFUモードで起動し、STM32CubeProgrammerで先ほどのファームを指定して「Download」ボタンを押すと書き込みが始まります

書込みは特に問題なく終了しました。
一旦USBケーブルを外し、今度はBOOTボタンを押さずに接続すると・・・反応ありません。
WindowsのデバイスマネージャーにCOMxとして認識されるはずなんですけどねぇ。

そこでSTM32CubeProgrammerでVerifyをやると不一致のエラーがでました。上手く書けていない様ですね。
結局、消去ページで一旦全体消去をしてから同様の書き込みをするとVerifyも一致し正常に動作する様になりました。「Download」ボタンで自動的に消去もやってくれる訳ではない様です。

以上によりMissionPlannerとも接続でき、まだ細かい所はこれからですがArdupilotとして動作し始めました。

次はGPSやコンパスを繋ぐ必要がありますね。。。

超音波洗浄機を作ってみる。

3年ほど前になりますが、日本橋のデジット閉店セールの時に激安の超音波振動子を買った事を書きました。その時は振動子にタッパーを両面テープで貼り付けるという雑な状態で洗浄してみましたが、もっとちゃんとした形にしようと思いながら早三年。

器にはタッパーではなくステンレスを使いたいのですが、購入すると2~3千円するので何となく放置していました。
ところが先日百円ショップの「ワッツ」で丁度良いサイズのステンレス容器を見つけました。値段は660円。しかも内側にピッタリの金網が330円。合計しても990円ですね。

百円ショップのワッツで見つけたステンレス容器

内側にピッタリ入る金網

作る

さて容器と振動子をどうやって取り付けるかです。振動子にはネジ穴が開いていますが容器側に穴を開けると漏水が心配です。ネットで調べると接着剤でくっつける様な事が書いてありましたが、どんな接着剤を使うかを書いた資料までは見つけられませんでした。

素人考えですが、なるべく超音波振動を吸収せずに伝えてほしいので硬化後に弾力があるタイプよりもカチッと固まる方が良さそうな気がします。という事でエポキシ系接着剤で試してみましょう。
まず接着面をヤスリで荒らして表面積を稼ぎ・・・

そして接着!

固まるまでの間に筐体を作ります。
いつもの様にMDFをレーザーカットして作成。本当は水に濡れる可能性が高いのでMDF材よりもアクリル等にしたいのですが、まずは安い材料でやってみます。

こんな図面を書いてレーザーカットし・・・

そして組み立てたところ・・・

またもや素人考えなのですが筐体と容器の間についてはあまりカチッと固定すると振動が抑えられそうなので、シリコンラバー(ダイソーで200円)をレーザーカットして間に挟んでみます。

内側の金網に真鍮線の取手を付けて、ひとまず完成。
本当はドライバ基板もケースに入れてタイマーなんぞを付けると使いやすいんでしょうけど・・・またその内に考えます(多分このままになる)。

では動かしてみましょう。
洗浄物として適当な物を探してきました。カブのインテークマニホールド。
台所用洗剤を水に混ぜた液に半分浸して洗浄してみます。

電源を入れるとジリジリとした音が聞こえるので、一応は振動が伝わっているのでしょう。
徐々に液が白っぽくなってきました。
そして30分程経過した後がこれ・・・濡れてると良く分からないですね。

という事で乾いた後・・・

綺麗になった・・・のかな?洗浄前の写真を残しておくべきでしたね。
もうちょい色々と試してみます。

という事で今後・・

色々と洗浄条件を変えて試そうと思います。
そして上にも書いた様にタイマーを追加してドライブ基板と一緒にケースに収めたいですね。
また市販品を見ると温度を上げる機能も付いている様です。以前3Dプリンターのホットエンド用ヒーターを10本まとめ買いしたのが残っているので使えないかな?

広告とか・・・

これまでこのブログには広告等は載せず純粋に趣味のサイトとして運営してきましたが、今回欲に目がくらんで思うところがあって広告を掲載してみる事にしました。

ブログに載せる広告

今までちゃんと調べた事がなかったので改めて調べたところ、ブログに載せる広告には大雑把にアフィリエイトアドセンスというのがあるそうです(広告は何でもアフィリエイトかと思っていましたが違うんですね)。
アフィリエイトというのは自分が薦める商品を記事中に貼り付けておき、それをクリックや購入して貰うと報酬がもらえるというもので、一方アドセンスの場合は自分では広告を載せる枠を用意しておき内容は広告業者が決めるものと理解しました。
で、アフィリエイトでは実際に購入までして貰えると結構ガッポリ貰えるが、アドセンスの方はクリックしてもらう度に数円~数十円が細かく入る仕組みだそうです。

当サイトの記事では個別の商品を進めるというパターンはあまりないので今回はアドセンス(の中でもメジャーなGoogle Adsens)を使ってみたいと思います。

そのための準備。サイトに色々追加設定

まず当サイトは未だにSSL化していませんでした(今更!)。
流石に今どきこれはマズそうですよね。最近はChromeの左上に「保護されていない通信」と出ていましたし・・・(*_*)。
幸い私が利用しているレンタルサーバーでは数年前からSSLの無料サービスが始まっていたので今回それを有効にしました。
またhttp://で接続するとhttps://にリダイレクトする様、サーバーの.htaccessに設定を入れたので、いま見て頂いているページはSSLになっていると思います。(たぶんHSTSという仕組みを使う方がより良いんだと思いますが、別件で苦労した経験があるのでもう少し様子を見てからにします)。
SSL化した事で下のスクリーンショットの様に「保護されていない通信」の警告は消えました(もっと前にやっとけよ!)。

またGoogle Adsensで広告を載せるには審査に合格する必要があります。中身のないサイトや他から丸コピーのサイト、社会的にマズいサイト等はダメよという事ですが、その点ではウチは大丈夫だと思っています。
しかしプライバシーポリシーの記載や問い合わせフォームの掲載等も必要との事ですが無かったので今回載せました。
という事で今日時点下の様なページ構成になっています。


Google Adsens

設定の詳細はネット上の解説ページに譲りますが、要はGoogleAdsensのサイトにログインして2行ほどのスクリプトを発行して貰い、これをページのヘッダに貼り付けます。
またブログの場合、本サイトの様にWordPressを使っているならGoogle Site Kitなるプラグインを入れるとそのあたりを自動的に設定をしてくれます。
その後に審査ボタンを押すと数日して結果のメールが送られてきます。今回は無事パスした様です。

という事で・・・

下図の様に広告が載りました(今見ていただいている画面にも出ていると思います)。
この場所が最適なのか分からないので表示位置を色々試してみるかもしれません(なるべく邪魔にならない様にしようと思います)。

ところで色々説明を読んでいると広告を1回クリックしてもらうと20~30円程度になる様な事が書いてありました。
でテスト的に自分でクリックした結果をAdSenseの収益ページを見ると・・・1円!! やっぱり?
どうやら広告内容によってクリック単価が異なるみたいですね。
でもそれってあちらさんで決めちゃうんじゃないの?

今後暫く使ってみて余りにも収益が低かったら止めるかもしれません。

カブ系エンジン用自動進角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タイミングライト(回転数表示付き)~その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の機種)を見直します。

ハンズマン ガラクタ市2024春

恒例のハンズマン ガラクタ市が始まりました。
ハンズマンとは九州を中心に展開するホームセンターで、春と秋にガラクタ市というイベントが開催されます。名前はガラクタ市ですが結構イイ物が安く出るのです。
大体いつもは木曜日に始まり翌週の月曜日が最終となるパターンですが、今年は春分の日である3月20日(水)が初日で3月25日(月)が最終日です。
という事で初日の7時、開店と同時に行ってきました。

到着すると既に大勢並んでいます。

角を一つ曲がり、二つ目の角の直前が行列の最後尾でした。

今回、売り場は比較的空いていましたね。コロナ以降、以前の様に大々的に広告を出さなくなった様なので、その影響でしょうか?(でもドローン関係者とは売り場で会いました。やっぱり皆来るんだねぇ)。

・・・で、早速ですが買ったものはこちら。
通常価格の商品も含んでいます(パンク修理用パッチとか・・・これだけですね)。

今回の掘り出し物

まずスマホ用ワイヤレス充電器が398円。Qi規格対応なのでiPhoneに充電できます(私のは安物Andoroidなので非対応ですがが息子のiPhoneには充電できるのです)。スマホを載せると電動で両側から挟み込むという、凝った作りの物です。

そしてショックドライバーセットが198円。固着したネジを外すのに尻の部分をハンマーで叩けば押さえつけながらビットが回転するという、バイクのレストアには必須の物です。普通2000円程度しますよね。我が家にも1本ありますがあまりに安いので予備として購入。

スプレーガンが1480円。これも普通より1桁以上安いです。

緊急水なし非常用トイレ(20回分)が980円。今年は能登で大きな地震がありましたし熊本でも以前あったので備えておくと安心です。ホームセンターなのでこういうモノ作りとは趣が違う商品も売られています。

という事で初日の収穫はこんな感じでした。
このガラクタ市では暫く時間を置いて新たな商品が並ぶのが常なので、開催期間中に何度か行ってみるとイイ物に出会える確率が上がるのです。

Acrobat Readerの「戻る」ボタン

色々なPDF文書を読むのにAcreobat Readerを使っています。
このツール、よく更新されていて操作が変り戸惑う事があります。
今回「戻る」ボタンが見つからず手間取ったので覚書きです。

ここでいう「戻る」ボタンとは、文書中のリンクを押して離れたページに飛んだ後、元のページに戻るときに使うボタンです(単にページを上下するボタンなら初期状態でありますが、これではないのです)。
ブラウザーだと普通に「←」「→」なボタンがありますよね。またAcrobat Readerでも以前のバージョンは画面の上の方にボタンが並んでいたと思います(この頃も何か設定してボタンを並べたのだっけ?)。
でも私が現在使っているAcrobat Readerにはこのボタンが見当たらず、どうやって設定するのかを探していました(ググっても違うバージョンの情報が多いのです)。

なお現在使っているのはWindows版のAcrobat Readerですがバージョン番号も判りません。普通はヘルプメニューに書いてあったりしそうですがこの版では見当たらないのです。
という事でバージョン番号は分かりませんが画面が下の様になっているタイプです。

この様にページを上下に移動するボタンはウィンドウの右下付近にありますが、リンクを戻るボタンはありません。

ショートカット Alt+←、Alt+→ で戻る

とりあえずショートカットでAltキーと矢印キーを同時に押す事でもリンクを戻る事が出来ます。

ボタン「←」「→」を常に表示する

このバージョンにも「←」「→」ボタンを常に表示する設定方法が見つかりました。
まず右下の赤で囲んだアイコンを押すとメニューが開きます。

メニューの最下部が「さらに表示」となっている場合はこれを押す事でスクロールバーが現れます(既にスクロールバーが表示されているなら次へ)。

スクロールバーを下に下げていくと「←前の画面」「→次の画面」が見つかりました。(こんなところにあったのね・・・)


これを選択する事でリンクを戻る事も出来ますが、毎回このメニューを選ぶのも面倒なので常に画面に表示したいですよね。それにはメニュー右部のピン止めアイコン(画鋲マーク)を押します。すると画面右のペインに「←」ボタンが表示されます。


同様に「→次の画面」横の画鋲アイコンも選ぶと下の様に「←」「→」ボタンが追加されました。

これでストレスなく文書が読める様になりました。
初期状態で表示してくれたらいいのに。
(みんな必要だと思うんだけどなぁ、あって困る場面があるのかな?)

原付バイクのCDIを作ってみる。

前回(タイミングライトの時)書いた様にCDIを作っています。
ネット上では色々試された先輩方がおられるので参考にしながら制作中。
なおCDIとはバイクの点火プラグに火花を飛ばす為の回路です。詳しくはこちら→Wikipedia CDI

上記Wikipediaにも書かれている通りCDIには交流式と直流式があります。
先日イジくったDioチェスタは直流式なのでCDI内部で直流12Vを2~300Vに昇圧し、これをコンデンサに貯めた後、一気にイグニッションコイルに流してプラグに点火します。ざっくり書くと下図の構造になっている様です。点火用の電源は直流12Vだけなので内部に昇圧回路が必要です。
最初はこれを対象に考えていましたが、Dioチェスタは息子が友達に売り払ったのでもうありません。

という事で今回は交流式のカブ系エンジン(カブ50とかJazz50。)を対象にしようと思います。
交流式のざっくりした回路は下図の様な構造。発電コイルが発生する交流が元々2~300VあるのでCDI内部では整流するだけで済みます。これはシンプルで済むのですが直流電源がCDIには入っていないので制御回路に複雑な処理(マイコンとか)を入れようとすると5V程度の電源が欲しくなって、これをどうするかを考える必要があります。

正規品CDIの波形

正規品CDIの動作に当たりをつけるため、Jazz50の波形を見てみました。
※注意:「正規品」と書いていますが中古バイクなので本当に正規なのかというと保証はありません。

まずステーターコイルからCDIに入ってくるAC入力

AC入力は本来正弦波のはずですがCDI内の整流回路の影響でギザギザの波形になっています。
ここから想像混じりですが以下の動作をしていると思います。

まずフライホイール1回転で4サイクル分の交流波形が出て、整流した電荷を段階的にコンデンサに貯めていく。その後点火する事で電荷が抜ける・・を繰り返す。

LT-Spiceで試した結果、整流部分は以下の回路になっていると辻褄が合います(TP1の波形)。
ACジェネレータの内部抵抗は分からないのでとりあえず波形が近くなる値を入れました。
また回路中V2、IGNは電荷を抜く為にあります(実物ではサイリスタに相当)。
ダイオードD2がなぜ要るのかはわかりません。これが無いと負電圧期間が全然違う波形になりますが、それでも動作上は問題なさそうに思えます・・・負電圧期間にD1に加わる逆電圧を減らす為かな?という予想をしています。そうであれば今回使用しているダイオード(IN4007)は逆耐圧1000VなのでD2を無くしても良いかもしれません。

次にタイミング入力とイグニッションコイルに出力する信号を見ます。
CH1(黄色)がタイミング入力、CH2(青色)がイグニッション出力
※2回分の波形が重なってしまいました。
タイミング信号は+の山の後に-の谷が来るみたいですね。この内の+3Vのあたりで点火している事が判ります。

とにかく動作するものを作ってみる。

最終的には進角・遅角機能を盛り込みたいですが、まずはとにかく動作するものを作ってみようと思います。
ネット情報を参考に最初に試したのは下の回路。

C1およびD1,D2でAC入力の振幅を2倍の直流に昇圧してC2に貯めておき、サイリスタ(TY625)にトリガを入れるとC2に貯めた電荷がイグニッションコイルから引き抜かれて点火する仕組みです。タイミング信号はQ1で受け、このままだと逆相になるのでQ3でもう一度反転してからサイリスタのゲートに伝えます。

AC入力を倍電圧整流にしたので上で見た波形にはならない筈で正規版CDIとは回路が違っていると思いますが、まずは確実に火花が飛びそうな方法にしています。またQ1,Q2を動作させるために外からDC5Vの電源を入れる必要があります。正規版CDIはDC電源は不要ですが、これも一旦確実に動作しそうな方式でやってみます。

ではバイク(息子が整備中のJazz50)に繋いで・・・

キックするとあっさりエンジンが掛かりました!!
では波形を見てみましょう。オシロを持ってきて・・・

まずはCH1:タイミング入力CH2:AC入力
予想通りAC入力はグニャグニャで正規版CDIとは違う波形になっています。
真ん中あたりのガクンと下がっているところが点火タイミングでしょう。


次にCH1はタイミング信号のままCH2をC2の左側端子(ほぼC2の充電電圧を表示)に繋ぎ変えてみます。
※タイムスケールは変更しています。
C2は倍電圧整流の効果で600V以上にまで上がっていて、点火の威力はあると思いますがコンデンサやサイリスタの耐圧ギリギリなので、倍電圧整流は止めた方が良さそうです。

では倍電圧整流を止めるためにC1を短絡してみます。
これでAC入力としてはLT-Spiceで試した回路と同じになりますが、今度はエンジンが掛かりません。
掛からないながらもキックの瞬間に撮った波形は下の通りです(プローブは上と同じ接続)。予定通りC2は300Vに下がっています。エンジンが掛からないのは電圧が下がったためでしょうか?


ならば点火エネルギーを増やすため、C2に1μFを追加して計1.47μFにするとエンジンが掛かりました。
(後で考えるとキャブレターの調子が不安定なのが影響していたのかもしれませんが。)
この状態でのCH1:タイミング信号CH2:AC入力波形を見ます。AC入力は倍電圧を止めた事で正規品CDIと似た波形になっています。

次にCH1:タイミング信号CH2:C2波形
C2電圧が少し低くなっています。容量が増えた事で上昇が間に合っていないんでしょうか?
でもこの方がエンジンが掛かりやすいのは容量アップでトータルの電荷が増えているからかな。

結局、1.47μF(コンデンサ2個)は寸法的に大きすぎるので1μFに減らしたところ、これでもエンジンは回ったので1μFを採用します。本当は0.47μFと1μFの間も試して余裕がある事を確認したいところですが、そんなに高耐圧コンデンサを持っていないのです。

以上を踏まえミニマムな構成で2号機を考えます。

まず倍電圧整流は止めます
あと5V電源もなくしたいですね。そうするとタイミング信号をバイポーラトランジスタで受ける事はできません。正規CDIがどうやっているのか判りませんが、たぶんそのままサイリスタのゲートに入れているのではないでしょうか?という事でタイミング信号をそのまま抵抗経由でゲートに入れてみます。この場合ゲート信号が-レベルの時、サイリスタのゲート逆耐圧である-5Vを超える危険があるのでダイオードD3で保護しておきます。
それとエンジンを停止させる機能が付いていなかったのでENの配線を追加しています(1号機では省いていたので停止させるのに手間がかかったのです)。バイクのキーをOFFにした時、ここがGNDに落ちるのでサイリスタがトリガーされなくなって停止します。

という事で2号機は下のかなりシンプルな回路にします。
(たぶん正規品もこうなっているんじゃないかと思っています)

これでもエンジンは掛かったので波形を見ます。

CH1:タイミング入力CH2:AC入力
正規CDIと同様の波形になっています。

CH1:タイミング入力CH2:IGN出力
特に何という事もないですがIGN出力を時間軸を拡大で見ました。


そして回っているところの動画。※音量注意。
なおピザのチラシは絶縁目的で敷いています。

走ってみる。

実際のバイクで走行テストする為、同じ回路で小型版を作りました。
正規品とほぼ同サイズ(コネクタは電線経由ですが)。

適当にビニールテープで絶縁して息子のカブに積んで走ってみましょう。
(上で試しているJazz50はまだ整備中で公道を走れないのです)

カブの正規CDIを外して・・・

いい加減な方のCDIを付けます。

そして家の周りを5分程走ってみました。
特に違和感なく普通に走れるし、走行後も熱を持つ様子は見当たりません。

という事で・・・

ミニマムなCDIを作成する事で理解が深まりました。たぶん正規品も同じ構造じゃないでしょうかね。
この後は進角/遅角機能を盛り込みたいのですが、マイコンを使うとすると上記の通りDC電源をどうするか問題が発生します。あんなガタガタで250Vもある電源から安定したDC5Vを作り出すのは難易度高そうです。空き端子から12Vを入れても良いのですが、そうするとバイク側の改造が必要です。でもできればCDIだけポン付けで交換できる様にしたいですし。。。
なおカブでも90CCのモデルだと進角機能付きのCDIを採用している様で、これがどうなっているのかは気になります。

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

LCR-T4 ~LCR・トランジスタ 測定器~

電子回路をイジっているとコンデンサやコイルの値を測定したい時があります。
コンデンサについては割と安物のマルチメーターでも測定レンジがあるので何とかなりますがコイルまで測定できる物は少なく、これまで簡易的にブレッドボード上に回路を組んで測定したりしていました。しかし作業後バラしてしまうのでその都度組み直すのも面倒です。

ネットで見ると秋月電子にはDE-5000というLCRメーターが現時点9480円で売られています。そろそろ奮発してこれを買うか?と思っているとLCR-T4なる物が目につきました。AmazonAliexpressでは多数のショップから出品されている様で値段も数百円~二千円前後です。
LCRに加えてバイポーラトランジスタやFETも測定できる様で、驚くのは3本の測定端子に適当に繋いでボタンを押せば、それが何の部品であるかも含めて知らべてくれるらしいのです。
画像で見る限りほぼマイコン1個で測定している様なので精度は望めないと思いますが、まあ自分の用途ではコイルの場合は大体の値が分かれば十分。あまり長く待ちたくないのでAmazonに発注しました。税込み1690円です。

そして到着。

表側

裏側

どうやらこのLCR-T4には色々なバージョンがある様です。オリジナルはAVR(現マイクロチップ)のATmega328等が載っている様ですが届いた基板にはAPT32F172という謎のICが載っています。
もしかしたらATmega互換かと思って調べたところ中国語のデーターシートしか見つかりませんでしたがC-Sky Microsystemsの32bitマイコンらしいです。中国でATmegaから移植したんでしょうか?

動かしてみる

では006Pの角型9V電池をつなぎ、ネット上の記事に従いキャリブレーションをやります。
その為には3本をショートさせる必要があるので下の様なショートピンを作りました。

このショートピンを繋いでボタンを押すとキャリブレーションが始まります。
その後メッセージに従いピンを外し、そして0.1μFのコンデンサを差して暫く待つと完了となります。
しかし「0.1μF以上のコンデンサをつなげろ」というメッセージですが「以上」ってのは精度は不要なんでしょうか?そのあたりはイマイチ分からないままとりあえず先に進みます。

では過去の測定で100μHだと思っているコイルを測定してみます。

130μH(0.13mH)ですね。過去の測定も簡易的なものなのでまあこんなものだと思います。

トランジスタもコンデンサもつないでボタンを押すだけでどれがどの端子かを含めて表示してくれます。便利ですねぇ。

LCR-T4について調べる

この基板、ネットで直ぐに見つかるサイトではあまり詳しい情報が示されていなかったので、もう少し粘って調べるとGitHubに以下のページに辿り着きました。

https://github.com/Mikrocontroller-net/transistortester

そして140ページもの詳細なドキュメントが下記の場所に。

https://github.com/Mikrocontroller-net/transistortester/blob/master/Doku/trunk/pdftex/english/ttester.pdf

これによるとオリジナルはやはりAVRマイコンみたいです。またLCR-T4基板(何故かLCD-T4と書かれている)についても言及されていますがAPT32F172版の記述は見つかりません。

またボタンを長押しするとメニューが出て色々と設定ができる筈ですが、自分の基板では何も起こりませんでした。マイコンが異なるので上記サイトのファームを書く訳にもいかず・・・という事で購入する時はATmega搭載の基板を選ぶ方が良いかもしれません。
(因みにパッと見ではATmega版はマイコンの横に水晶振動子が載っていますがAPT32F172版はこれが見当たりません。また基板の取付け穴の位置も違う様です。)

次に気になったのは電解コンデンサをどっち向きに挿入するのが良いかです。流石に電解コンデンサの極性まで自動判別はできないでしょうから適当につなぐと逆電圧を印可するのでは? この辺りを上記のドキュメントで調べると次の様な説明がありました。

Normally the polarity of part is irrelevant, you can also connect pins of electrolytical capacitors in any order. The measurement of capacity is normally done in a way, that the minus pole is at the test port with the lower number. But, because the measurment voltage is only between 0.3V and at most 1.3V , the polarity doesn’t matter.

Google先生に訳してもらうと・・・

通常、部品の極性は関係ありません。電解コンデンサのピンを任意の順序で接続することもできます。 容量の測定は通常、マイナス極が番号の小さいテストポートに来るようにして行われます。 ただし、測定電圧は 0.3V ~ 1.3V の間だけなので、極性は関係ありません。

マイナス側を小さい番号に繋ぐ方が良いけどあまり気にするなという事みたいですね。
それでも気になったのでコンデンサを測る時の波形を見ると下の様になっていました。コンデンサを1,2ピンに接続し、青色が1ピン,黄色が2ピン、紫色は差電圧(黄-青)です。結構上下逆転している瞬間があるみたいですが気にしないでおきましょう(でもタンタルコンデンサみたいに逆電圧に特に弱いのは避ける方が良いかもです)。

どうやって測ってんの?

上記のドキュメントに英語で詳しく書かれている様なのでその内読んでみたい(たぶん読まない)と思いますが、測定端子は3本共下の様な接続になっている様です。
これだけで測っているんですね。

ケースを作る。

便利に使えそうなのでケースを作りました。本体はMDF、上蓋は透明アクリルをレーザーカットして作成しました。

キャリブレーション用ピンはそのままだと絶対無くす自信があるのでケース内に収納できるポケットを設けています。

なかなか便利です。