フライトコントローラーを自作してみる。~その10~ FPVで飛ばす。

前回、自作フライトコントローラーでホバーリングできるところまで確認したので次はFPVで飛ばしてみたいと思います。

が、その前に電源周りをもう少し強化しておきます。前回ノイズっぽかったのを転流ダイオードの配線を縮めて改善したのですが、まだスイッチングノイズが載っているのでその他の配線も縮めました。またGNDも配線追加により強化し、ノイズがかなりマシになりました。第二弾の基板ではこの辺りを盛り込む必要があります。

スイッチングレギュレータ周りの配線短縮&GND強化
だんだん汚くなってきました。

また機体発見ブザーを鳴らすトランジスタ、2SC2712のピン配を間違っていてブザーが鳴りませんでした。そこで無理やりトランジスタの向きを変えて取り付けています。
更にベース電流を決めるR14を100KΩにしていたのは大きすぎで5.1KΩに変更しました。試作基板はちゃんと5.1Kだったのになぜか回路図の段階で間違っていたのです。

機体発見ブザー周り。
トランジスタ斜め取付け。
R14はこの後変更しています(5.1Kの手持ちがなく6.8Kを使用)

以上の対策をした上でレース機に積むのですが、5インチ機にいきなり積むのも勇気がいるのでまずは3インチ機で試します。しかしフライトコントローラは35mm角なので一般的な3インチ機には積めません。そこで以前作ったウッドフレームに積んでみます。これだと35mm角の基板を載せるスペースがあるのです。


久々に登場、木製フレーム機。

この機体、いまはバラバラなので別の3インチ機からフレームとFC以外の部品を持ってきました。
ESCは25mm角なのでこの様な変換スペーサーをプリントして載せることにします。

35mm角⇔25mm角変換スペーサー

こんな感じで25mm角のESCの上に35mm角のFCが載っています。

全てが無理やり・・・

そしてホバーリング実験。
この時点ではBetaflightのバージョン3.5を書き込んでいて、前回の確認と同じで問題なくホバーリングできます。。
次にBetaflight4.2を書き込んでみます。前回の機体では4.2だと機体の揺れが収まらなかったのですが・・・この機体だとピタッと安定しています。

ならばFPVやっても大丈夫そうですねー。
という事で近くの原っぱにやってきました。

ゴーグルを付けて飛ばしてみると、何事もなく飛んでいきます!!
基板はツギハギだらけですが飛んでいる間は市販FCと特に違いは感じられないのです。
息子にも飛ばさせてみましたが特に違和感は無い様でした。

という事で色々見つかった不具合を修正すべく第二弾のパターン設計をしながらも次は5インチ機で試そうと思います。

フライトコントローラーを自作してみる。~その9~ 動作確認

前回基板に部品を実装したので、いよいよ動作させてみます。

まずはUSBコネクタから5Vを入れて電流が振り切れない事を確認しました・・・これは問題なし。
その後、BOOTボタンを押しながらPCとUSBケーブルで接続するとDFUモードに入る筈ですが・・・入りません。(T_T)

回路を見直していくと基本的な間違いに気づきました。USBのD+とD-が逆になっています!!そりゃダメだわ。


完全に見落としですねー。

とにかく修正します。
D+とD-には後からダンピング抵抗を入れられる様0Ωの抵抗を付けているのでこのパターンを使って配線をクロスさせます。

モーターのコイル巻き直しに使ったエナメル線で配線をクロスさせました。

改めてケーブルをつなぎなおすと、今度はDFUモードに入りました。
そこでBetaflightConfiguratorのUpdateFirmware画面から以前作ったファームを書き込みました。
ここまで何とか問題なし(いや問題はあったけどとりあえず修正済)。

そして改めてケーブルを挿し直してBetaflightConfiguratorで接続すると、ちゃんと認識されています。この状態で基板を手で動かすと傾きが表示されるので、ジャイロセンサーも正常に接続できている事になります。実はここのパターンが細かくて一番心配でしたが正常にリフローできた様です。

あとはフライトコントローラーとしての諸々の設定をしていきます。
ここまで正常。

次に受信機を接続し、送信機の操作が伝わっている事も問題なし。

ではESCを接続してモーターを回してみます。安定化電源から2セル分の7.4Vを供給してBetaflightConfiguratorモーターつまみを上げていくと・・・ちゃんと回ります。

ならばバッテリー(3セル)を接続して送信機から制御してみると・・・なぜかArmingできません。安定化電源に戻して色々試したところ、どうやら2セル電圧だとArmingできるのに3セル電圧だとダメみたいです。
となるとBEC回路ですかね。電源電圧によって違いがあるのはBEC回路より手前だけの筈・・・。

そこでBEC回路の出力をテスターであたるとちゃんと5Vになっています。
しかしオシロで見るとBECのスイッチングノイズが電源が高いと大きく載る様です(波形取り忘れた)。

原因はどうやら図のところ、スイッチング電源のダイオードのループが長すぎた様です。
2層基板に無理やり載せたので電源周りが厳しい気がしていたのですがやっぱり。 GNDの取り回しが遠回りな感じ。

そこでGND側を最短になる様に配線を追加しました。これでもOKだったのですが念のため5Vラインに47uFを追加しています。でもまだちょっとノイズっぽいけど先に進めていきます。

これで3セル電圧でもArmingできる様になったので例の「えー加減な機体」にペラを付け、Angleモードでホバーリングさせてみます。

すると斜めに振動しながら浮き上がりました。でもこれは想定内。試作回路で飛ばした時もファームがBetaflight4.2だと同様の現象が起こり、市販のFCでも同じでBetaflight3.xに下げると安定したのです。今回もファームのバージョンは4.2を書き込んでます。
4.2で揺れる原因は調べていませんが何か機体の特性みたいです。でもバージョンで変わるのでPIDかフィルターかそのあたりを調整すれば4.2でも納まりそうな気がします。

とりあえず今回はBetaflight3.xを書き込んでみます。
・・・すると、あれ?またDFUモードに入らないぞ?

どうもDFUに入る時と入らないときがあります。
DFUモードに入れる方法には二通りあって、BOOTボタンを押しながら電源を投入する方法とBetaflightConfiguratorの「ブートローダー/DFUを有効化」ボタンを押す方法があります。このどちらの方法も不安定で、ダメなときはずっとダメなのに入る時は繰り返してもうまく入るのです。成功率30%くらいでしょうか。

BOOTボタンを押すとSTM32F411のBoot0端子がHレベルになる筈で、実際オシロで見てもHになっていて、この部分は大丈夫だと思います。
ここでひとつ気になるのはBoot1端子です。 Boot1はPB2と共通の端子で、マニュアルによるとDFUモードに入れるためにはこれをLレベルにすることになっています。
しかしDIOと共有なんですよね。この端子を本当にLに落とす必要があるのか、回路図を書くとき疑問に思いました。そこでSTマイクロエレクトロニクス社の純正開発ボードSTM32F411Nucleoを調べたらこの端子はオープンで、これを使った試作機は問題なかったので、安心してフライトコントローラーもオープンにしていたのです。
しかし改めてマニュアルを読むとやはりLにしろと書いてあります。
という事で0.5mmピッチQFPのリードに無理やり電線をハンダ付けしてプルダウン抵抗をつないでみました。

これで成功率が上がりました。でもまだ時々ミスるのでまだ何か他に原因がありそうですが、やっぱりBoot1はLにするのが正しいのですかね。まあマニュアルに書いてあるから当然そうすべきで、最低でもパターンを引き出しておけば良かったんですが。でもNucleoはなんで大丈夫なんだろう?(端子オープンなのでたまたま上手くいっているだけなのかもしれません)

時々失敗する理由は判りませんが、とにかくBetaflight3.5のファーム書き込む事ができたので再びホバーリングにチャレンジ。
初飛行の動画です。

ちょっとふらついていて調整の余地が(私の操縦技術の問題も)ありますが一応ホバーリングしています。

あとOSDとBLACKBOXへのロギングも大丈夫でした。
ここまでの問題点をまとめると次の通りです。基板の第二弾を作る時(やるのか?)修正したいと思います。

  • USBのD+とD-の入替り。
  • 5Vスイッチングレギュレータ周りのGNDの取り回し
  • Boot1端子のプルダウン

という事で何とかホバーリングするところまでたどり着いたのでレーサー機に載せてどうなるかを試していきたいと思います。

フライトシムのモーションシミュレータ化~9~

モーション フライトシミュレーターのArduiono側ソースコードを見たいという書き込みを頂いたのでアップします。

FlightMotion6.zip

中身が行き当たりばったりで恥ずかしいので載せていませんでした。
※温かい目で見てください。
(PC側のプログラムはもっとかっこ悪いのでまだ載せていませんが、もしこちらも見たい方がおられたらコメントください)

で、この中身は自分でも殆ど忘れていますが思い出しながら簡単に説明させていただきます。

  • ジャイロ/加速度センサーのMPU6050へのアクセスライブラリは、たしか下記から貰ってきたと思います。→https://github.com/jrowberg/i2cdevlib/tree/master/Arduino/MPU6050
  • PCからは”ピッチ,バンク<改行>”がテキストで送られてきます。
    ピッチとバンクは角度の少数以下一桁までを10倍した値です(浮動小数点をさける為)。
  • PCから送られるピッチとバンク角から目標とするリニアアクチュエータの目標長を算出します。
  • MPU6050が示す加速度センサーの値でも同様にリニアアクチュエーターの現在長を算出します(加速度だけ使ってジャイロの値は使っていません)。
  • ソース中の”//各ジオメトリ”に続く数行はモーションシミュレータの各寸法で、角度からリニアアクチュエーターの長さを算出するための情報です(これら値の詳しい説明は今できませんが当時は下の様な寸法図を書いていました。ソース中の値とは変わっているところもあると思います)。
  • リニアアクチュエータの目標長と現在長から動かす方向と速度を決めてPWMの関数に送ります(速度の加減は試行錯誤で決めました)。
モーション計算用寸法図

モーターを動きをもっとスムーズにするため、この次のバージョンでPID制御にしてみようと取り掛かりましたが放置状態です。

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

いよいよフライトコントローラーの基板に部品を実装したいと思います。

まず実装前の基板はこれです。PCBgogoで製作して入着済。

約500円で10枚作れるPCBgogoの基板

そしてメタルマスクも購入済。こっちは基板よりも高くて約¥1000します。
画用紙をレーザーカットして代用できないかとも思いますが、初めてのリフローなので確実な方でやってみます。

実装前の準備として部品を紙の上に並べていきました。コンデンサの様に何も書いていない部品もあるので手をひっかけてバラケると大変なことになります。なので紙はテープで机に貼り付けています。

そして板の上に不要な基板の切れ端を貼り付けて固定治具にします。
まずは部品が少ない裏面(機体に積んだ時に下側にくる面)から実装する事にしました。

その上からメタルマスクを貼り付けて・・・

慎重に位置合わせ・・

マスクの上からクリームはんだを塗っていきます。

プラスチック板の切れ端でスリコミ スリコミ・・・

マスクを剥がすとこんな感じでクリームハンダが載っています。
まあ大丈夫そうです。

そして1個ずつピンセットで部品を置いていった後の写真。
この時には気づいていませんが左下のスイッチングレギュレーターICの位置がずれていて、リフロー後に気づく事になります。

ではいよいよオーブントースター(改)リフロー炉に投入。
不要基板に温度計のセンサーを貼り付けて横に置き、温度を見ながらやります。

スタート!
そして リフロー中・・・

よし終わった・・・

大体良いのですが、先程書いた通りレギュレーターICがずれていたのでポロッと落ちてしまいました。これは後ほど手ハンダで取り付けます。

またよく見るとOSD用ICのリードにブリッジがあります。なにか条件が良くなかったのでしょうね。クリームハンダが厚すぎたのかな?
これもはんだゴテで除去します。

ちょっとピンボケですがMAX7456のリード2か所にブリッジが見られます。

ハンダブリッジとレギュレータずれ以外、見た感じは良さそうです。

では表面側の実装に取り掛かります。
ところで表面にクリームハンダを塗る際、裏面には既に部品がついているので先程と同じ方法だと基板が浮いてしまいメタルマスクと基板が密着できない事に気づきました。
そこでMDFをレーザーで切り、部品のない四隅を支える治具を作成しました。このままだと基板厚の分MDFより高くなるので厚みが基板とほぼ同じ1.6mmの段ボールを見つけてきて基板の周りに置く事で全体が面一になりました。

1.6mm厚の段ボールに窓を開けてこの上に載せると全体が同じ高さになるのです。

あとは先程同様クリームハンダを塗って部品を載せました。

SHコネクタやタクトスイッチが溶けないか心配

リフローの時、実装済みの裏面から部品が落ちるとまずいのでアルミ箔で熱を遮ってみました(効果の程は判りませんがとりあえず大丈夫でした)。

リフロー完了

コネクタやスイッチが溶けないか心配していましたが無事みたいです。
でもやっぱりマイコンのリードにブリッジがありますね。何がいけないんだろう。
なお表面の過熱により裏面のブリッジが直っていないかと期待しましたが変化ありませんでした。 まとめてはんだゴテで除去します。

リフロー×ブリッジでググると、クリームハンダがそもそもブリッジしている場合は当然として、高温時間が長い場合も狭い隙間にハンダを吸い上げてしまう様です。毛細管現象みたいなものですかね。
今回のはリードの少し上でブリッジしているので高温長すぎの方かもしれません。

何はともあれ、基板に部品がつきました。
次は動作を確認していきたいと思います。

フライトコントローラーを自作してみる。~その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℃くらい高い温度となるのでその分と跳ね上がり分を差し引いた上限値にします。

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

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

Microsoft Flight Simulator 2020 + モーション機構

先日マイクロソフトからFlight Simulator 2020が発売されました。
前作のFlight Simulator Xで開発は終了との事でしたが14年振りに復活したのです。
フライトシミュレーターといえば黙って見過ごす訳にはいきません。早速ダウンロード(一晩かかった!)して実行するとこんなのが毎回出ます。

i3-7100じゃ不足なんですかねー。
Microsoftの製品紹介ページではi5-4660以上となってます。
まあOKを押せば先に進むのでいいんですが、こんな毎回出さなくても・・・。

ソフトはまだ日々更新されているらしく、立ち上げる毎にしばらく何かのダウンロードが始まり時間がかかります。

この画面でダウンロードを待たされるのです。

その後このメイン画面が立ち上がります。
以前のXや2004とはだいぶ操作方法が変わっていますね。

メイン画面。まだ全体を見渡せていません。

コックピットの風景はこんな感じ。リアルにはなってるけどちょっと計器が見づらいなー。前作では計器類を固定表示できけど、これもできるのかな?

熊本空港 RUNWAY07

モーション機構を接続

Flight Simulator Xの時に作ったモーション機構を接続したいのですが、それにはSimconnectを使う必要があります。Simconnectは過去のバージョンからある機能で、シミュレータとは別に動かしたプログラムからシミュレーターの情報(速度とか姿勢とか)を取ってきたり設定したりできる機能なのです。これはCのライブラリとしてSDKに含まれています。

これが今回のバージョンでも使えるかですが、いろいろググってみると今回もSimconnectがついていて、デベロッパーズモードというのをONにするとダウンロードでそうなのでやってみました。

そしてコンパイルして実行したら確かにデータが取れています。
でもその後Flight Simulator Xの時にコンパイルしたプログラムをそのままで動かしてみたらこれでも問題なく動作しました。新たにコンパイルする必要なかったんですね。

とにかくここまでくれば動作したも同然。実行するところを動画にしてみましょう。
ところでいつもこのブログに動画を載せるときはYoutubeにアップロードしてリンクを貼っています。Youtube側には殆ど説明を書いていなかったのですが、今回はBGMやキャプションを入れてYoutuberの動画っぽくしてみました・・・

さ、いろんなところを飛んでみよっと。。。

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

PCBGOGOに発注していた基板ができてきました。

こんな箱に入ってきました。

そして基板・・・

10枚550円。以前と比べると信じられない低価格です。
パターンを見ていると何だか無駄な場所が見えてきます。

今回表面実装なのでリフローをする予定です。
ハンダペーストを塗るためのマスクは画用紙をレーザーカットして作れるかとも思ったのですが、リフロー初挑戦なのでメタルマスクを購入しておきました。

メタルマスクは1100円。
基板よりこっちの方が高い・・・。

基板はできましたがまだ部品が揃っていません。
オーブントースターの改造もしなければならないので組立てができるのはしばらく先になりそうです。

HOIドン入手

NONSAYAさんから販売仕様のHOI-LINK-HRを頂きました。
HOI-LINK-HRに受信機を一体化したドングルなので通称「HOIドン」なのです。

立派な箱に入っています。
内容物はドングル本体とクイックリファレンス
ボディは3Dプリントパーツですが綺麗にプリントされています。

いままで使っていたFRISKケース版と比べてかなりコンパクト。
受信機一体なので電線を切る心配がなくてよいです。

フリスクケース版の様に電線がピラピラしません。

では早速PCに接続してみます。ドングルの穴から適当なものを突っ込んでボタンを押しながらUSBポートに挿せば送信機とバインドされます。

ファームゥエアは最新のRev2が書かれていました。
このファーム、USBの更新レートを上げて遅延を減らしたバージョンで、旧版を購入された方にはNONSAYAさんが無償バージョンアップをされるそうです。

なおこのブログを見ていただいている方には申し訳ないのですが、Rev2のファームは大人の事情によってここでは非公開なバージョンなのです。すみません。
それはつまり、HOIドンが売れると私にも分け前を頂けることになっているのです。^^;

・・・という事でご購入はこちらへどうぞ→NOSAYA Graphics

HOI-LINK-HR の遅延を減らせるか試す。

NONSAYAさんが販売されて以来、HOI-LINK-HRがドローンレース界隈で静かな話題になっている様です。このHOI-LINK-HRはSBUSから受けた11bitのデータを8bitに減らさず11bitのままPCに届けるので分解能が上がっていて、私には効果が体感できませんがプロには評判がいい様です。
そこで更なる改良として遅延を少しでも減らせないか試してみました。

どうやって遅延を減らすか

まあそんなに大幅に遅延を減らす方法などはそうそう無いと思いますが、多少でも改善できそうなのが次の点・・・。

まずSBUS信号はRCチャンネル18ch分を25バイトのデーターとして送ってきます。そして25バイトの転送に約3.5mSを要します(計算上3mSだと思っていたのに実測すると3.5mSなのでした。とりあえず3.5mSで話を進めます)。
その後数msの無信号期間を挟んでまた3.5mSのデータを送出するという事を繰り返します(無信号期間の長さは送受信機によって異なりますが、いくつか見た限り4mS~10mS程でした)。

このデータをPIC18F14K50マイコンで受取ります。この時、これまでは25バイトを全部受け取ってからRCチャンネルデータに変換し、USBに送り出していました。そしてUSB側ではPCが周期的にポーリング(問合せ)したタイミングでデーターを転送します。SBUS信号とUSBポーリングのタイミングは同期してはいないのでポーリングのタイミングがデータ転送期間の3.5mSの間に来る事もある筈です。この場合今までの処理だとその瞬間にSBUS転送中のデータは、ひとつ後のポーリング周期にUSBに送る事になります。


そして今回の変更ですが、HOI-LINK-HRは8CHまでのサポートなので約1.5mSの時点で必要なデータは受取っている訳です。なので「この時点で処理を開始してもええんちゃう?」というのが今回の考えです。
先頭から1.5mSの間にポーリングが来たら従来と同じですが、それ以降だと最新のデータを転送する事ができるので、従来の3.5mSと比べ1.5mSなのて2mSの期間は一周期前倒しができる事になります。なおUSBのポーリング周期は10mSらしい(この値、資料が見当たらないのですが、どなたかご存じでしょうか?)ので約20%のデータが今までより一回分(10mS)早く転送できるはず・・・なのです。

例によってこの変更がどの程度体感できるか不明ですし、私にはまずわからないと思いますが、少なくとも今までよりは早くなっているはず・・・。

あとUSBの処理をプログラムで周期的に呼び出す方式から割り込み方式に変更しました。これはμS単位では早くなっているかもしれませんが殆ど気分の問題だと思います。

その他の変更

一時期SBUSの区切りを検出する方法が色々と迷走していました。8bit版HOI-LINKの時は無信号期間が数mSあったら区切りと判断していましたが、11bit化したとき受信器によって不安定なことが分かり、参考に見たSBUSデコードプログラムでは最終バイトが’00’である事を手掛かりに判断していたのでそれに従っていました。
しかしBetaflightの処理をみたら無信号期間検出方式だったので安心して元に戻しています(不安定だったのはSBUSを受けるUSARTのオーバーフロー処理をしていなかったためで解決済)。
この修正は NONSAYAさん販売バージョンは適用済です。

またPIC18F14K50のRC3~RC7ポート(5~9pin)は今まで空きピンでしたがデバッグ情報を出力する様に変更しており、LEDをつないでおくとオーバーフローやパリティエラー発生時に点灯する様にしています。まあ特に何も接続していなければ影響はありません。

でVelociDroneで試したら・・・

やっぱり体感できません。でも理屈の上では今までよりも遅延が減っているはず(・・・ホンマか?)
このあたり、何か遅延量を測定する方法が必要と考えているのですが、いい案はありますか?

ファームウェア

例によってファーム(ソース・バイナリ)を載せておきます。
なお過去に何度か書いていますがUSBのベンダーID、デバイスIDは適当な値を書いているので使用される場合は自己責任でお願いします。0xffff/0x0012というありそうにない値なので重複する可能性は低いと思いますがもし重複した場合はPCがその機器を認識できない可能性があります。この場合以前このブログに書いた方法でPCに過去の接続を忘れさせる事ができると思いますが保証はできません(まずそんな事態にはならないと思いますが)。
なおNONSAYAさん販売のドングルはマイクロチップテクノロジー社からサブライセンスを受けているのでちゃんとしたIDが書かれています。

またソースはOpenStick Liteから流用した関係で色々と無駄なコードを含んでいるので、読まれる方は温かい心で見てください。

HOI-LinkHR20200822.zip

追記:20200820版は一部ミスっていて効果が出ていなかったので20200822版として再アップロードしました。

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

前回の投稿から3か月も過ぎてしまいましたが、細々とフライトコントローラーの自作は続けています。
前回までで回路は決まったので基板の設計に取り掛かったのですが、私のレベルでは35mm角に収めるのが結構大変で、最初はアナログとデジタルのGNDを分けてやろうとか色々と考えていたんですが、とにかく詰め組むのがやっとな状態です。
4層にすれば楽なんでしょうけど基板代が大幅にアップするので何とか2層に収めたいし・・・ところで市販のFCは何層なんだろう?

基板パターンって一旦配線が完了しても細かい所を色々いじっていると、どんどん時間が過ぎてしまいますよね。あまりいつまでもパターンをいじっていてもキリがないし疲れてきたのでここらで一旦発注してみる事にします。何かミスがあるとは思いますが・・・。

今回発注した基板パターン
どこかミスっている気がする。

基板の発注先ですが、過去何回かFusionPCBに発注しているので今回もそのつもりでしたが、500円ちょっとで10枚作れる仕様だとソルダーレジストの最小幅が0.4mmという制約がネックになりました。マイコンやジャイロセンサのパッドとパッドの間にソルダーレジストを塗りたいのですが、そうすると0.4mmよりも少し細くなってしまうんです。0.1mmというオプションもありますが、これを選ぶと3000円を超えて一気に値段が上がります。
そこで他社を調べたところPCBgogoというメーカーだと0.25mmまでなら500円ちょっとで作れるみたいなのでここに発注してみました。

まだ部品が全部揃ってないし、リフロー用にオーブントースターの改造もいるので、基板ができても組立てがいつになるかわわかりませんが、少しづつ進めていきます。