カブ系エンジン用自動進角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セルリポでも動くかも。
(野外で使う事はないですけど)。

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

RotorHazard

NonsayaDroneWorksにRotorHazardの記事が載っていました。

私はドローンレースを主催する事はありませんが、練習の時にはラップタイムを計測したくて、この記事と同じ様にARマーカーを試したりしましたがやっぱり時々読み取りミスが発生するんですよね。また、かつてこんな記事を書いたこともありましたがその後まったく手を付けていません。
そこでこのRotorHazardなるラップタイマーを試してみようと思います。

RotorHazardはRX5808レシーバーが受信したFPV信号強度をArduinoを経由してRasberry Pi(以下ラズパイ)に渡します。ラスパイはWebサーバーとして動作し、PCのブラウザーで接続して操作できます。
RX5808とArduinoは受信するチャンネル数だけ必要なので最終的には3セット欲しいところですが、取り合えず手元にある1セット分で、またラズパイ3がおすすめらしいですが無いので手持ちのラスパイ2でやってみます。

最初RotorHazardのリリース版(RotorHazard-2.2.0)だとエラーが出たのでRotorHazard-2.3.0-beta2で実行できました。ライブラリバージョンとのからみっぽいです。
まあ何はともあれ上手く動作している様なのでAliexpressにRX5808モジュールを追加注文して2チャンネルにしてみました。
なおシールドしておかないと離れていても電波を受信してしまうのでお菓子の空き缶に収めています。

そして庭でTinyレース。庭だとどうしても計測ゲート以外を飛んでいる時の電波を拾いやすくなるのでコース設定に工夫が必要です。

こうなると野外に出て3インチや5インチの機体で試したくなります。その為にはちゃんとした基板とケースに収めたいと思います。
基板はRotorHazardのサイトにガーバーデータが掲載されているのでこのまま作ればよいと思ったのですが・・・

どうやら最小のビアサイズが小さすぎて約500円の激安仕様では作れず、見積もり価格が3000円を超えてしまいます。また基板の元データが無くてガーバーのみなので簡単には修正できないのです。

ならば新たに基板パターンを作ってみようと思った訳です。
日本では大抵3チャンネルで足りるしArduinoNANOを載せるのも勿体ないので直接ATmega328のフラットパッケージ版を載せたらコンパクトにできそうです。
また屋外のインターネットがつながらない場所で使うならリアルタイムクロックも搭載すると便利です(ラズパイ標準ではリアルタイムクロックを持っていないので電源を切ると時計がリセットされるのです)。

そして10枚500円仕様で作った基板がこれ。 。

マイコンの上を跨いで受信モジュールを実装する立体構造。

今回メタルマスクは注文せず、紙をレーザーカットしたマスクでハンダペーストを塗ってみました。ちょっと塗り辛いけど何とかなります。もしかすると塗り辛いのはハンダペーストが乾き気味だったせいかもしれません。
ただ何枚も塗るだけの耐久性はありません。

メタルだとそうでもないのに紙だと何だか汚く見える。

そしてリフロー

やっぱりリフロー炉作って良かったですねー。
表面実装できると何かと便利です。

リフローの結果。
一か所抵抗が立ち上がっています。これがマンハッタン現象ってやつですかね。
ハンダペーストの塗りが薄かったのかも。ここはコテで修正しました。

そしてブートローダー書込み×3回。

基板の裏に書き込み用パッドを設けているのです。

次にファームウェア書き込み×3回。

一旦ファームを書き込めば以降のアップグレードはラスパイからできる仕様になっています。(試してませんが)

ここでミスに気づきます。RX5808のピン並びが逆になっていて裏返しでしか実装できません。ま、とりあえず裏返しに実装します。

ラスパイに載せて動作確認OK!
ラスパイはメルカリで格安だったラズパイ3にアップグレードしています。

ボタン電池が載っているモジュールがリアルタイムクロック。

先日のMP1854ENモジュールを取り付けてリポから電源を取れるようにしました。

ケースに使う空き缶を探しましたがちょうど良いのがなかったので、2.5mm厚のMDFをレーザーで切って箱を作り、ダイソーの0.3mm厚アルミ板(裏面テープ付き)を貼り付けてシールドしました。

ケースのアルミシールドは回路のGNDに接続。

電源の入り口

XT60コネクタで給電

蓋を一部切って電波を取り入れます。ここの開き具合で感度を調整する予定。

ここの空け具合は色々調整してみます。

なおWi-Fiのアクセスポイントがない屋外で使うときは 、ラスパイとPCとの間をアドホックモードでつなごうと思いましたが設定変更が面倒です。
結局リサイクルショップに行ったらWi-Fiルーターが¥770だったのでこれを使う事にしました。

Wi-Fiルーター。中古とはいえ安くなったもんです。

これで完成かな。今度練習する時に使ってみようと思います。

ところでいまRotorHazardのページを見たらこんな基板がリリースされています。Arduinoの代わりにSTM32を使い、マイコン1個でRX5808モジュール8枚(ドミノ倒しみたいに縦に実装!)を制御するという構造。進化してます。
しかし8台同時にレースできるんですね、海外って。

フライトコントローラーを自作してみる。~その7~ リフロー炉

細々と続けているフライトコントローラー自作の続きです。
部品が一通り揃ったのでリフローの準備を始めます。

フライトコントローラーはすべて表面実装部品を使うので手ハンダでは難しく、リフローで実装したいのです。
また35mm角の基板に部品を載せていくと両面実装になるので、ホットプレートを使ったリフローでは裏側実装のとき密着できない懸念があり、ここはやはりリフロー炉を使う必要がありそうです。

という事でオーブントースターを改造してリフロー炉を作る事にします。
内容的にはスイッチサイエンスさんのこのキットを真似して作ります。
(キットはずっと品切れなのでバラで部品を集めます)

まずオーブントースターを入手。リサイクルショップで適当なものを¥1800で買ってきました。TIGERのKAM-A130という機種で1300Wの品です。どれだけのパワーがいるか不明なので、足りないとどうしようもないので強めの機種を選びました。

ヒーターは3本備えていますが、この内2本は並列につながっています。常温で抵抗値を測ったところ並列状態の2本と単独の1本が同程度の値になっていて、2系統の配線が半分ずつのパワーを受け持つ様に制御しています。

前面にはタイマーと温度設定つまみがあります。タイマーはゼンマイ式で0まで戻ると「チン」となるアレです。温度設定つまみはバイメタル式サーモスタットらしき機構につながっています。
タイマーの方はそのまま安全タイマー(なにかトラブルがあって通電を続けても時間が来たら止まる)として使いたかったのですが、カバーが金属のツメを折り曲げて止めてあり、一度外すと元に戻せなくなりそうなので諦めました。
結局ヒーターに接続する電線だけを引き出して利用することにします。

回路はこれ。
オリジナルのスイッチサイエンスのキットはATMega328Pを3.3Vで動作させていて、これはたぶん温度センサーのMAX31855が3.3V動作の為だと思います。でも今回はAdafluitのMAX31855モジュール基板(秋月電子で入手)を使うので内部に5V→3.3Vレギュレータを持っているし、更にSSRは入力が4V以上となっているので5V系のArduino UNOの方が都合が良いのです。

温度を測定する熱電対は秋月電子で買ったステンレス管に入ったタイプでやってみます。
オーブンの内部に突っ込むので電線がピラピラしているよりもしっかりした棒状のセンサーを突っ込む方が保持しやすいと思ったのです(が、これは失敗だった事に後で気づきます)。

では改造です。
オーブントースターの筐体に穴をあけて電線を引き出します。穴の縁が鉄板そのままだと電線を傷つけそうなのでハトメを打ちました。 でもハトメの穴も案外ギザギザしているんですね。これだと効果が薄いので結局ハトメは外して他の方法を探します。

そして見つけたのがこれ「ダイソーのシリコーンマット」。230度までOKとなっています。これを適当に切り電線の周りに巻いて穴にツッコミました。


これで電線を傷つける心配はないと思います。

制御回路はまだバラックです。

ファームをGithabから取ってきてリフロー条件もそのままでArduinoに書き込みました。
そしてとりあえず何か焼いてみます。以前基板を発注したら間違って届いたものを使い、適当なランドにクリームはんだを塗って適当なチップ抵抗を載せます。


まずはソースコードに最初から書かれていた温度プロファイルそのままでやってみます。これは130℃まで上がるとで15秒待ち、その後230℃まで上がると目標を225℃に下げ、更に100秒経過するとすべてのヒーターを止めるという動作です。

ではスタートスイッチをポチッと。
最初の段階は1系統のみヒーターONで130℃を目指して温まっていきます。 そして130℃で一旦ヒーターが切れますがそれでも暫く温度が上昇し140℃まで上がりました。そして15秒のタイムアップ後2系統共ヒーターONとなり230℃を目指して上昇していきます。230℃に達するとヒーターOFFになり目標温度が225℃に下がるのですがまだまだ温度が上昇し240℃を超えてしまいました。基板からは時々プチッという音が聞こえてきます。その後225℃まで下がるか下がらないかの間に100秒の待ち時間が過ぎて一通りの処理が終了しました。

扉を開けると・・・

何か色が濃い・・・

結果・・・基板が黒くなっていて過熱しすぎっぽいですね。

左はリフロー前, 右がリフロー後。
過熱により黒くなりました。

ならば温度センサーがちゃんと温度を取れているのか、熱電対温度計と並べてヒートガンで過熱してみます。

結果、温度はまあ一致するのですが、ステンレス管に入った方は温度が伝わるのに時間がかかり、遅れて追いつく様な感じになります。
ステンレス管の熱電対を選んだのは失敗ですねー。さっき温度読みが240まで上がりましたがこれは遅れた表示なので実際はもっと上がっていたと想像できます。
まあちょっと予想はしていて、電線直接の熱電対が何本か手持ちが あるのでステンレス管がダメならこっちに変えようと考えていました。

電線直接の熱電対だと固定しずらいのでどうするかですが・・・3Dプリンタで使ったテフロンパイプがまだあった筈。これを適当に切ってその中に熱電対を通し庫内まで貫通させてみます。

次は制御回路と温度計、二つの熱電対を基板のほぼ同じ位置に貼り付けて動作させてみます。

こうすると制御回路と温度計の表示がほぼ同じで動作しているので測定自体は大丈夫みたいです。しかし通電を止めてから10℃くらい上がるのは変わりません。ヒーターからセンサーまで熱が伝わるのに時間がかかるのでしょう。

このファームは設定値に温度が達したら通電を切り、設定値よりも下がったら通電するというシンプル制御です。そこでPIDを追加してみたりと迷走したのですが結局止めました。最大温度に達する直前に過熱をゆるめるので温度の跳ね上がりはなくなりますが、最大温度付近にいる時間が長くなってしまうのが気に入らなくなったのです。

で、結局元通りのファームを使って温度プロファイルだけ調整する事に落ち着きました。

なお庫内でピロピロしない様、こんな感じでセンサーを固定しようと思います。この状態で基板に貼り付けた温度計と比べると、温度計の方が最大10℃くらい高い温度となるのでその分と跳ね上がり分を差し引いた上限値にします。

こんな感じで横からセンサーが出っ張ります。

更に何度か試してほぼ目途がたったので、次はいよいよフライトコントローラー基板に部品を実装しようと思います。

ArduinoIDEが保存するスケッチの改行コードが変わった?

最近ArduinoIDEでスケッチを保存し、gitにコミットする前にdiffを取ってみたら、数行しか変更していないはずなのに全行が不一致として表示されました。
どうやらArduinoIDEのバージョンを上げたのが絡んでいて、以前は改行コードがLFのみだったのが今はCR+LFに変っている様です。

リリースノートにはそのあたりの記述は見当たりません(英語なので見落としているかもしれないけど)。

そこでArduinoのサイトから旧バージョンのIDEを取ってきて色々試したところ、バージョン1.8.5から1.8.6になる時に変った様です。

Arduiooのフォーラムで検索すると次のやり取りが見つかりました。そのうち治してくれるんちゃう?っぽい会話みたいですが最新の1.8.12でも戻っていない様です。
https://forum.arduino.cc/index.php?topic=575025.0

致命的な問題ではないんですが、できれば統一したいところです。
どなたか、このあたりの経緯をご存じですか?

FPV LAPタイマーを作ってみる。

先日のドローンレースのタイムアタックではFPV LAPタイマーなる物を使っていました。これはドローンが出すFPVの電波を (ゲート近くの) 受信機が受けて通過した時間を測定するというもの。スタート前にこんな感じで受信感度を調整します。

これ作れないかなーと考えています。そこで手元にあってあまり使っていない受信機RC832のフタを空けてみました。ここから電界強度を示す信号が取り出せないかと。

中身はこんなの。高周波のフロントエンドはシールドされたモジュールになっています。

表側
裏側

このモジュールはおそらくこちらで紹介されているRX5808というモノだと思います。だとするとRSSIという端子が信号強度を出しているはず。電波を受信しながらテスターで当たってみると確かにその様です。

ならばこの端子から電線を引っ張り出します。

リード線をはんだ付けして・・・
プレートに穴をあけて・・・
電線を引き出しました。

引っ張り出した信号の電圧を測定しながらVTXを近づけたり遠ざけたりすると無信号時は約0.5Vで信号が入ると最大1.5V程度に上がります。アンテナを外した状態でVTXを部屋の端まで離しても信号が1.5Vに上がり切ってしまうので最も近づいた瞬間を検出するのは結構難しそうです。受信機全体をアルミホイルで包んでもまだ強力に受信しています。

当初は微分回路でピークを検出できるかと考えていましたが1.5Vに貼り付いてしまうとこの方法が使えません。そこで立上りと立下りの中間時刻を採用しようと思います。途中で速度が変ったり受信機のすぐ近くに墜落したりすると正確に測れないですが、まずは練習用には使えるかと。

またどっちみち信号が飽和するならとコンパレータでデジタルにしてしまってArduinoに入れます。オペアンプをブレッドボードに乗っけて実験・・・

まだ試行錯誤中の回路

まずはどんな感じで受信できるか試す為、 庭に持ち出して信号の立上りと立下りで割り込みが掛かった時刻(millis()関数の結果)をSerial.printでPCに表示させてみます。

・・・が、庭程度の広さだと一番離した位置でも電波を受信してしまいまうのでもっと広いところで試す必要があります。また近づいたときでも結構揺れがあり、H/Lを細かく繰り返していて判定が難しそうです。
本当は広いところでドローンが通過する時の波形をオシロで取りたいのですが、野外で使えるオシロを持っていません。
当面はソフト側で一定時間以上信号アリが続いたらドローンが通過したと判断する方式でやってみます。

・・・という事で練習場に持っていきました。ところが上手く受信できません。
調べたところRC832から引き出した信号線を間違って5V電源につないでいました。マズイ!
これくらいでは壊れないだろうと思いましたが・・・その後RSSI信号が出てこないし画像も受信できていません。
やっちまいました。

この後どうしましょう。折角ここまでやったのに止めたくないし、でもわざわざ受信機を買うか?とも思うし。。。
結局RX5808モジュール単体をAliexpressに発注しました。送料込みで¥1070円、あーもったいない。