Category Archives: FlightController

レースに使っていたフライトコントローラーに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やコンパスを繋ぐ必要がありますね。。。

MP9943GQ 同期整流式ダウンコンバータ ~その2~

昨日の投稿で最終的に下の様な波形になった事を書きましたが、やはり納得いかないのです。
出力にスパイク状のノイズが見えるのはプローブの当たり方の問題ですが、正弦波っぽく揺れるリプルが大きすぎます。また、そもそもSW出力が一定の周期でないのも変ですよね。

CH1:(黄)がMP9943GQのSW出力。CH2:(青)がインダクタを通った後の最終的な出力。

SWのプローブは取り外し、出力だけを20mVレンジで拡大するとこんな感じで振幅400mV程度で揺れています。

改めてMP9943GQのデーターシートを見ると下の様な波形が載っていました。
出力が3.3Vだったり負荷電流が3Aだったりで自分のとは条件が違いますが、リプルは10mV以下の振幅に収まっているしSW出力も一定周期で変化しています。自分のはやっぱりおかしいですよね。

もう一度回路図を眺めながら・・・

ここでMP9943GQのFB端子にどんな電圧が入っているかを見ようとしてプローブを当てると出力リプルの振幅が20mV程度に減ってしまいました。FB端子からプローブを離すとまた400mVに増えます。

どうやらFB端子回りの問題っぽいです。
苦し紛れにFB端子とGND端子の間に12pFのコンデンサをつけると振幅20mV程度に収まりましたが、あまり対処療法的なのは嫌ですよね。

何が原因でしょうか?
5V出力に設定する為、R7,R8を68K/12Kに設定していますがデーターシートの推奨値は41.2K/7.68Kです。
まあこんな値の抵抗は持ってないし、あまり影響なさそうとは思いつつ39K/6.8Kに変更しましたが、予想通り変化なしでした。

フィードバックの経路にスイッチングノイズが載るんでしょうか?
次にR7,R8の分割抵抗をチップに近づける様、図の場所に移動すると・・・

納まりました!

よく見るとデーターシートにもFB端子回りの抵抗はできるだけチップの近くに取り付けろと書いてありましたね。

5) Place the T-type feedback resistor close to chip to ensure the trace which connects to FB pin as the short as possible.

拡大しても振幅10mV程度になっています。

SW出力もちゃんと一定周期な波形になっているし・・・

たぶん、今度はちゃんと動作していると思います。

MP9943GQ 同期整流式ダウンコンバータ

いきさつ

MP9943GQモノリシックパワー社のDC-DC スイッチングダウンコンバータ用ICで、最近のドローン用フライトコントローラーのBEC回路にはこのICがよく積まれています。
ほいほい堂本舗ではこれまでスイッチングコンバーター用ICMP2359DJ,MP1584ENを試してきましたが、今回MP9943GQも試してみます。なぜこのICを試したいかというと同期整流回路が内蔵されているのです。

同期整流回路はコンバーターの効率UPを目的として使われる事が多いのですが、フライトコントローラーにとってはそれよりもダイオードを省略できるので基板面積を節約できて嬉しいのです。

以前製作したHOIHOIフライトコントローラRev2にはMP1584ENを使った下の様な回路を載せていました。

MP1584ENの内部にはINとSWの間にスイッチング用MOS-FETが入っています。コイツがONの時はVBATからインダクタL1に電流を供給し、OFFの時はインダクタL1に貯めたエネルギーがダイオードD2を通して流れます。なのでD2には結構電流容量の大きなダイオードが必要なのです。
一方、同期整流の場合、外付けダイオードに代わってIC内にもう一つのMOS-FETが入っており、内部でタイミングを合わせてON/OFFしてくれるのです。

上述のHOIHOI-FC Rev2では写真の様な容量2Aのショットキーダイオードを載せていました。MP1584ENの規格上は3Aの能力がありますが、ダイオードが大きくなるので2Aタイプで済ませています。MP9943GQになるとこのダイオードが不要なのに加え、IC自体のパッケージサイズも3mm×3mmとコンパクトになっており、この点でも面積が節約できます

試してみる

という事でMP9943GQを動作させる実験を行います。
例によってジャンクのFC基板からICとインダクタ(10μH)を取り出しました。
(データーシートによるとAMGMとマーキングしてある内、AMGがMP9943GQを示すそうです。
最後のMはyearコードとなっていますがMは何年を示すのでしょうね?)

Ki-Cadで回路を書いて・・・

基板のパターンも書きます。今回基板は切削するので広めに部品を配置して・・・。

それでもこのまま我が家のCNCで加工するのは精度的に厳しいので一旦加工データーをDXFで保存し、jw-cadに読み込んで切削しやすい様に修正しました。

作った基板がこれ。
(配線間にサンハヤトのソルダーレジスト補修液を塗っていますがハンダを載せたい部分にも付着してイマイチなので後で除去しました)

そして一通り部品を載せたところ。。。

なおベタパターンを設けたかったので両面基板にしています。
裏面はこんな感じ。。。

実は片面基板を2枚張り合わせたナンチャッテ両面基板です。

動作させてみる

3mmx3mmのQFNを切削基板にハンダ付けするのに苦労し、何度か加熱し直してようやく動作しました。

5Vの出力端子に負荷として5Ω抵抗を接続したときの波形です。CH1(黄)がICのSW出力。CH2(青)が最終的なDCDC出力。
DCDC出力にスイッチングノイズが載っている様にみえますが、これはプローブの当たり方の影響で、この時はプローブのワニグチクリップでGNDを取っていました。

DCDC出力のみにして200mV/Divに拡大。
このプローブの取り方だとスパイク状のノイズが振幅800mV程度で出ている様に見えます。

そこでプローブの取り方を下の写真の様に最短にしてみます。
(写真右上に見えている白いカタマリは5Ωのセメント抵抗)

すると・・・

スパイク状のノイズはかなり納まりましたね。
でも振幅数十mVでグニャと揺れているのでSW端子と重ねてみると・・・

スイッチング周期と同期している様です。
因みに無負荷だと綺麗に収まっています。


どうでしょう?まあこんなものなんでしょうかね?

フライトコントローラーを自作してみる。~その19~ F7マイコン購入

コロナ禍による半導体不足で長らく手に入らなかったSTM32F722マイコン、最近Aliexpressを見たらマトモな値段で売られているのを見つけ、2個注文したのが届きました。
1個1297円×2個。

自作FCの中に壊したのが1枚あって、どうもマイコンが壊れているっぽいのでこれに交換しようと思います。
でも最近、ちょっと忙しいのでもう少し先。。。


フライトコントローラー自作関連の投稿一覧

フライトコントローラーを自作してみる。
フライトコントローラーを自作してみる。~その2~
フライトコントローラーを自作してみる。~その3~
フライトコントローラーを自作してみる。~その4~
フライトコントローラーを自作してみる。~その5~
フライトコントローラーを自作してみる。~その6~
フライトコントローラーを自作してみる。~その7~ リフロー炉
フライトコントローラーを自作してみる。~その8~
フライトコントローラーを自作してみる。~その9~ 動作確認
フライトコントローラーを自作してみる。~その10~ FPVで飛ばす。
フライトコントローラーを自作してみる。~その11~ Rev2基板
フライトコントローラーを自作してみる。~その12~ Rev2基板組み立て
フライトコントローラーを自作してみる。~その13~ Rev2基板動作確認
フライトコントローラーを自作してみる。~その14~ マイコンパワーアップ検討
フライトコントローラーを自作してみる。~その15~ 基板データ公開
フライトコントローラーを自作してみる。~その16~ JDLで飛ばす。
フライトコントローラーを自作してみる。~その17~ F7マイコンを載せる。
フライトコントローラーを自作してみる。~その18~ またまたF7
フライトコントローラーを自作してみる。~その19~ F7マイコン購入



JDL2022R4 宮崎戦に参加

今年も行ってきました。JDL2022 Round4。宮崎での開催です。

JDL(ジャパン・ドローン・リーグ)は年間7戦のレースが開催され、各レースのポイント合計で年間の成績が決まるという仕組みです。この7戦は九州から北海道まで日本の各地で開催され、第4戦は宮崎開催なのです。
九州ではここだけなので、毎年1度だけ宮崎戦に参加しています。

機体

今回使った機体は昨年とほぼ同じ。ベースは息子の「お古」であるEachin製激安レース機Tyro99をベースに色々いじくった物です。

他に予備機(こちらも「お古」)も持って行ったけど
今回壊さなかったので、この1台で済みました。

また当然ながらフライトコントローラー(以下FCと略す)はHOIHOI-FC Rev2を載せています。
昨年はこのFCがマトモに動作するかドキドキでしたが、もうそこまでの心配はなくなりました。また、前回投稿した様に予備FCも準備しています。

先日作成したF722搭載のFC。
まだ実績が少ないので予備とします。

でもまぁ、いい加減な機体ですよね。ウラから見るとベニヤ板を使っていたり。。。
JDLの中の人、A2Cさんにも心配してもらって色々とアドバイスして頂きました。(昨年はプロペラを逆につけて練習フライトを飛べなかったり、今回の練習フライトでもVTXのアンテナコネクタが抜けて映像が極端に弱かったり、 色々とやらかしてますからねー。 )
こんな感じでドローンレースは初心者には優しいのです。

そして第一日目・・練習日

第一日目は練習日で5回の練習フライトが出来ました。練習フライトは予選と同じ形式なので90秒間に何周飛べるかを競います。90秒を過ぎて次に計測ゲートを追加した時の周回数が記録となるのです(同じ周回数の人同士ではタイムが早い方が上位となります)。
私が参加するオープンクラスは一番初心者向けのクラスですが上位の人は5周回ります。私は5回の練習フライトの内、ベストが3周でした。
本番では4周行きたいですねー。

いよいよ第二日目・・本番

予選は2回のフライトを行い良い方の記録が採用されます。
まず一回目スタート・・・しかし直後にゴーグルがずれてきて画像が見づらくなってきました。両手は送信機を操作しているのでゴーグルを修正する事はできません。しかしどんどん酷くなってくるので2周目の直線で速度を緩めてゴーグルを修正し、その後は良く見える様になったのですが、結局3周でゴールです。次からはゴーグルのベルトをもっときつく調整しておきます。

そして予選二回目スタート。 今回はゴーグルもずり落ちてはこないし、予選落ちすればこのフライトで終りなので後の事は考えずに速度を上げます。するとまあそれなりに飛べていますね。
という事で4周でゴール!一応本日の目標は達成です。

レースの結果

あとは結果発表待ち。この間に予選1回目の結果を見ると18人中10位でした。9位までに入れば予選突破なのであと一つ。
予選1回目は3周飛んで10位だったので、4周飛べた2回目では順位が一つ上がれば予選通過できるはず(無謀にも期待してしまうのでした)。
で、結果が発表されると結局は予選落ち。・・・順位的には10位のままで、やっぱり皆さん2回目はタイムが上がってるんですね。

あと一つで予選通過と考えると惜しいのですが、タイムを見ると9位の人との差は約7秒もあり、これから考えるとそんなに惜しくもないです。
もっと精進するしかありません。

そして・・・

という事で天候にも恵まれ、適度に風が吹いたので暑さもそこまで厳しくもなく、年に一度のお祭りが終了しました。
また色々な人と話していると新たに作りたいものが次々と出てきて、そちらの面でも収穫がありました。

会場の「こどものくに」はすぐ横が遠浅のビーチです。浜に出てみると泳いでいるレース参加者もいました。

いいとこですねー。

BETAFLIGHT CLI設定の覚え書き

BetaFlightのCLI設定で、たまにしか使わないコマンドをすぐに忘れるのでメモ。

バッテリー電圧低下補正の設定。

# set vbat_sag_compensation = 80

補足:
出だしに比べてバッテリー電圧が下がってくると感触が変わってくる。そこで出だしのパワーを抑える事で最初から電圧が下がった時と同じ感触で飛べる様にする(なので出だしのフルパワーは下がる)。

SmartAudioのVer2.1の時にVTXに設定できるパワーを尋ねる。

# vtx_info

RUSH TINY TANKの例

# vtx_info
level 14 dBm, power 25 mW
level 20 dBm, power 100 mW
level 23 dBm, power 200 mW
level 25 dBm, power 300 mW

補足:
VTXテーブルの設定ページでは、そのVTXが使えるパワーの選択肢も設定するが、SmartAudioのVer2.0まではVTXが何mW出せるかはメーカーのドキュメントを見るしかなかった。
Ver2.1からはこのコマンドでVTXに問い合わせる事ができる。なおVer2.1からはdBm指定になっている。

フライトコントローラーを自作してみる。~その18~ またまたF7

久々のFC自作ネタですが、内容は前回とほぼ同じ。
壊れたFCを大量に貰ってきたので、ここからSTM32のF7マイコンを外して自作基板に載せるのです。
未だにSTM32マイコンは入手困難なので壊れたFCを頂けると非常に助かります。

ESCまで含まれていますがこっちの自作は難易度高く、今の所FCだけ。

こうしてみると見るからに壊れている基板からパッと見では何ともなさそうなモノまで色々あります。正常っぽいのはもしかして直るかもという期待もあるので今回は明らかに壊れていそうな中から2枚を選び、マイコンを外して新しいFCを2個作ろうと思います。

では取り外しから。ヒートガンで温めると・・・

隣の発振子も一緒に外れました。

もう一個も外しましょう。今度はレギュレーターらしきICも一緒に外れました。

次に新しい基板にハンダペーストを塗って部品を載せます。前回までは古くなったハンダペーストにアルコールをスプレーして無理やり使っていましたが今回は新しいハンダペーストを使う事にします。

そしてリフロー

なんかいっぱいブリッジしています。

でも裏面に進み、またリフロー。

裏面は結構うまくできました。

問題は表面のブリッジ。 基板から外した時にリードが曲がり、これを完全に直していなかったのでバラバラです。
実装前にもっと完璧に直しておくべきでしたね。
もう半田ゴテでやるしかありません。汗かきながらなんとか修正しました。

またSHコネクタが思いっきりずれているのを発見。
リフロー前に手でも当たったのな?こちらも修正。

なおこの部分、F4の頃はSBUS信号を入れる為に反転回路を通す必要があったのでXOR用ICを載せる設計にしていましたが、前回F7だと反転不要である事が判ったのでXORは載せずに直結しています。

ところで私のレベルでは実装をミスる事が結構あるので実機に載せてテストするまで安心できません。という事で実装テスト。

一番良く実装をミスるのがジャイロセンサーのMPU6000ですが、今回新品のハンダペーストが効いたのか一発で動作しました。

しかし片方の基板はバッテリーから電源を供給するとDCDCコンバータ付近からジーという音がします。このDCDCはバッテリー電圧から5Vを作り出しますが、5V波形をオシロで見てもガタガタです。
DCDC周りの配線を見まわしても原因らしきものが見当たらないし、以前「MP1584EN その3」の時にハズレICを引いているので今回もMP1584ENを外してみました。外観は異常ない様ですが、別の個体を取り付けてみると正常になったので、やっぱりハズレICを引いたんですかね(もう一度このICに戻せばハッキリするんですがやる気が起きません)。’’

前回のハズレ品は裏面パッドが無かったけど今回はちゃんとついています。

今のところ10個買った内の2個がハズレなのは確率高すぎですね。やっぱりパチもんだったのかなぁ。まだ半導体不足になる前とはいえ10個で218円だったしなぁ。

ところでこの部分、VTX用の5V電源をチップコンデンサの根本から取っています。

回路図ではこの部分で・・・

ここから5Vを取ればUSBから電源供給する時にはVTXを動作させなくできます。
もし通常の5V端子からVTX電源を取ると、レースや大勢で飛ばすとき、PCと接続してレートを変更するだけでも電波が出てしまうと色々と不都合があるのです。
次に基板を設計する際はこのためのパッドを設けておこうと思います。

そんなこんなでFC2枚完成です。

実は今年も7月23,24日のJDL宮崎戦に参加する予定なので予備基板を作っておきたかったのです。機体に積んでいるFCは去年作ったF4搭載の物なので今回作ったF7の方が高性能ですが、レースまでに飛ばす機会がないので実績のある方を積んでいきます。
去年は自作FCで参戦する事が目標な感じでしたが、今回は人並みのタイムで飛ばし、できれば(オープンクラスですけど)予選を通過したいと思います。


フライトコントローラー自作関連の投稿一覧

フライトコントローラーを自作してみる。
フライトコントローラーを自作してみる。~その2~
フライトコントローラーを自作してみる。~その3~
フライトコントローラーを自作してみる。~その4~
フライトコントローラーを自作してみる。~その5~
フライトコントローラーを自作してみる。~その6~
フライトコントローラーを自作してみる。~その7~ リフロー炉
フライトコントローラーを自作してみる。~その8~
フライトコントローラーを自作してみる。~その9~ 動作確認
フライトコントローラーを自作してみる。~その10~ FPVで飛ばす。
フライトコントローラーを自作してみる。~その11~ Rev2基板
フライトコントローラーを自作してみる。~その12~ Rev2基板組み立て
フライトコントローラーを自作してみる。~その13~ Rev2基板動作確認
フライトコントローラーを自作してみる。~その14~ マイコンパワーアップ検討
フライトコントローラーを自作してみる。~その15~ 基板データ公開
フライトコントローラーを自作してみる。~その16~ JDLで飛ばす。
フライトコントローラーを自作してみる。~その17~ F7マイコンを載せる。
フライトコントローラーを自作してみる。~その18~ またまたF7
フライトコントローラーを自作してみる。~その19~ F7マイコン購入

DSHOT信号を作ってみる。その2

前のを壊しまったので新たに発注していたNucleoボードが届きました。
実験を再開してモーターを逆転させてみようと思います。

左が新たに届いたNucleoボード。
右は壊したやつ。

前回「値として0~47のどれかを送ると逆転するはず」という様な事を書きましたが、結局何番なん?というと、やはり資料が見当たらないのでbetaflightのソースを眺める事にします。

探し当てたのはこれ。ソースツリーを~/Gitに置いたとして次の場所にあるファイルを見ると・・・
~/Git/betaflight/src/main/drivers/dshot_command.h

・・・こういう記述がありました。

 typedef enum {
DSHOT_CMDtypedef enum {
DSHOT_CMD_MOTOR_STOP = 0,
DSHOT_CMD_BEACON1,
DSHOT_CMD_BEACON2,
DSHOT_CMD_BEACON3,
DSHOT_CMD_BEACON4,
DSHOT_CMD_BEACON5,
DSHOT_CMD_ESC_INFO, // V2 includes settings
DSHOT_CMD_SPIN_DIRECTION_1,
DSHOT_CMD_SPIN_DIRECTION_2,
DSHOT_CMD_3D_MODE_OFF,
DSHOT_CMD_3D_MODE_ON,
DSHOT_CMD_SETTINGS_REQUEST, // Currently not implemented
DSHOT_CMD_SAVE_SETTINGS,
DSHOT_CMD_SPIN_DIRECTION_NORMAL = 20,
DSHOT_CMD_SPIN_DIRECTION_REVERSED = 21,
DSHOT_CMD_LED0_ON, // BLHeli32 only
DSHOT_CMD_LED1_ON, // BLHeli32 only
DSHOT_CMD_LED2_ON, // BLHeli32 only
DSHOT_CMD_LED3_ON, // BLHeli32 only
DSHOT_CMD_LED0_OFF, // BLHeli32 only
DSHOT_CMD_LED1_OFF, // BLHeli32 only
DSHOT_CMD_LED2_OFF, // BLHeli32 only
DSHOT_CMD_LED3_OFF, // BLHeli32 only
DSHOT_CMD_AUDIO_STREAM_MODE_ON_OFF = 30, // KISS audio Stream mode on/Off
DSHOT_CMD_SILENT_MODE_ON_OFF = 31, // KISS silent Mode on/Off
DSHOT_CMD_MAX = 47
} dshotCommands_e;

enamを使ってコマンド毎の番号を定義しています。注目したのは20番と21番。
20だと正転、21だと逆転する様に見えます。更にソースを眺めると、コマンドを送る時は10回繰り返して送っており、それ以降は指定された回転方向になりそうな雰囲気です。10回送るのは少しくらい伝送エラーが出ても確実に伝える様にだと思います。

そこでNucleoボードのGPIOにボタンを2個追加し、これらを押すと回転数信号の代わりに20と21の値を出す様にプログラムを変更しました。

そしてESCとモーターを接続し、逆転ボタンを押した後に回転させると・・・何も起らず同じ方向に回っています。
何か違うのかなー。

上記リストを見ているとDSHOT_CMD_BEACON1というコマンドもあります。これはたぶんモーターを機体発見ブザー代りに鳴らす時のアレみたいですね。
betaflightからはブザーの音色を5種類から選べるのに対し、上記コマンドもBEACON1~5まであるので間違いないでしょう。値として1番~5番を送ってやればモーターから音が鳴りそうです。
そこでさっき取り付けた2個のボタンを押せば1や2を送る様にプログラムを変更しました。
そして試すと・・・やっぱり鳴りません。

うーん。
betaflightのソースをもっと細かく見ていけば解るんでしょうけど結構大変ですよね。

そこでFCから出てくる信号をオシロスコープで見ながら機体発見ブザーを鳴らしてみます。反転信号だと一瞬なので波形を捕まえ難いですがブザーだと繰り返し発生するので捕まえやすいのです。そして以下の事が判りました。

まず今までDSHOTで送る16bitのデータはこう思っていました。
値とCRCの間の1bit(右のLSB側から5番目なので以後「5bit目」と呼びます)は通常は0でテレメトリを要求するとき(RPMフィルタで回転数を取り出す場合等)に1にする。・・・と色々なサイトに書いてあります・・・

Hパルス幅が長いと1、短いと0を表します。

しかし実際にFCが出しているブザーコマンドを見ると1になっていました・・・

どうやら制御コマンドを送る時は5bit目を1にする様です。
ならばNucleoボードでもこの通りの波形を作ってみると・・・
鳴りますねぇ。
そして予想通りBEACON1 と2で音程が変わります。
また普段機体発見ブザーを鳴らすとピッ、ピッと断続的に鳴るのは FCから断続的にコマンドをON/OFFしている訳では なく、ボタンを押し続ければESC側で断続させてくれる様ですね。
試した様子を動画で・・・

https://youtu.be/hmSqN_zpciA

では同様に逆転コマンドの20番、21番も5bit目=1でやってみます。
これもちゃんと逆転しますねー。
逆転に設定しておき電源を入れ直すと正転に戻ります(もしかするとどっかに覚えてるんじゃないかと思ったけど、そんな事ないですね)。
これも動画で・・・

https://youtu.be/Y9Ko3SlgvzI

という事でコマンドを送る時は右から5bit目を1にするのが正しい様です。という事はテレメトリの場合はどうなんでしょう?一つ判っているのはFCでRPMフィルターをONにするとDSHOT信号のH/Lが逆転している様です。
って事はテレメトリは5bit目ではなくH/Lの極性で決まるのかな・・・
あと回転数の値は48~2047だと思っていますが、コマンドである事が5it目で決まるのなら回転値は47以下を使っても良さそうな気がします。

BetaflightでRPMフィルターONの波形

このあたりはもうちょっと調べる必要がありそうですね。

フライトコントローラーを自作してみる。~その17~ F7マイコンを載せる。

自作フライトコントローラーにはSTM32F411というマイコンを搭載していました。これは普通に飛ぶには十分な性能ですが、RPMフィルター等という負荷の高い処理には計算周期を下げる必要があるのです。そこでもっと早いマイコンを試したかったのですが、恐らく昨今の半導体不足のせいで納期が未定だったり発注してもキャンセルされたりして入手できていなかったのです。

そこに救世主が現れました。

宮崎ドローンクラブにお邪魔して練習させていただいたとき、基板のパターンがはがれて使えなくなったフライトコントローラーを頂いてきたのです。
これにはSTM32F722RET6という、まさに欲しかったヤツが載っています。

という事で、この基板からマイコンだけ取外しHOIHOI-FCに載せてみました。
今回も色々発見があったので忘れない内にこのブログに書いておきます。

まず頂いた基板をヒートガンで温めてマイコンを外しました。

そしてHOIHOI-FC Rev2基板に搭載します。

組み立て後の一発目、安定化電源から5Vを供給して電流を測ると180mAも流れていました。 F411搭載基板では70mA程度なので、 これはどこかミスったと思いショートした箇所を探したのですが、それらしき所は見当たりません。

そこで恐る恐るUSBケーブルでPCとつないでみたところ、あっさりとDFUモードに入りファームを書き込む事が出来ました(F722用ファームは前にビルドしておいたのです)。
もしかするとOSDデバイスに大電流が流れているのかという事も考えたのですが、カメラとVTXを繋ぐとこちらも正常動作しています。
またESCと接続してモーターを回しても正常です。
暫く通電していると結構温まりますがF7だとこれくらい流れるのでしょうか?データーシートには最大300mA流れる様な事が書いてあるので今の所これで正常だろうと思っています。

という事で、とりえあずはあっさり動作したかと思ったのですが、そう簡単にはいきませんでした。

受信機からSBUS信号を入れても受け付けてくれないのです。

このFCでは下図の回路でUART6RX端子にSBUS信号を入れています。

SBUS信号は通常のUARTとは極性が逆なので間にXORを入れて反転し、将来通常のUARTデバイスを接続したくなった場合はJP3をショートさせる事で正極性に戻せる様にしているのです。
今回SBUS信号を何故か受付けず、色々試してもダメなので 反転回路を外部のブレッドボードに載せてUART2から入れてみたけど、これでもダメでした。

こりゃファームの設定が間違っているのかと見直してもそれらしい箇所が見当たりません。

で、色々試している内に突然動作したのです。
改めて回路を見直すと、誤って外部で反転させた信号をまたXORで反転させていました。
・・・という事は反転しなくても良かったの?
そこでXORのジャンパーJP3をショートさせると正常に動作する様になりました。またUART2に直接(反転なしで)入力しても動作します。

F4の時は反転必須だったのにF7だと不要になった・・・?
F7のデーターシートでUARTの機能を確かめると次の文言があります。

「Separate signal polarity control for transmission and reception」

極性を個別に設定できる?(って事は個別じゃなければ今までもできたんか?)
詳しい事は解りませんがマイコン自体に極性を反転する機能が付いたのでBetaflightがこの機能を使って上手くやってくれるみたいですね。
という事はF4の時みたいにSBUS信号は反転回路がついたUART端子に接続しなければならないという制約はなくなり、F7なら受信機をどのUART端子にでも接続できるのだと思います。これは便利になりましたね。
今回はXORの片方の入力をLに落として対処しましたが次からはXORの搭載自体を止めて直結しようと思います。

という事でF7で一通りの機能が動作したので息子が持っていた適当な機体に載せてみました。
飛ばしてみると上手く飛んでいる様です。

RPMフィルターでハマる。

次にせっかくのF7なのでRPMフィルターをオンにすると・・・
フリップした時に変な挙動をしました。何だか急に思った以上のレートで回転した様です(さっきから「様です」と言うのはこの辺りのテストパイロットは息子に任せているのです。自分じゃフリップとかできないので。)。
もう一度RPMフィルターOFFに戻すと正常。またONにすると異常。
明らかにRPMフィルターが絡んでいます。

なんか、波形的な問題か?
そこで写真の様な中継基板を作ってFCとESCの間に割り込ませ、オシロのプローブを当ててみます。

で、波形はこれ。。。

モーター2 のDSHOT600 双方向ONの波形

ちょっとオーバーシュートはあるけど鈍ったりはしてなさそうですけどねー。
気になって市販のFCを眺めると、STM32の出力とモーター信号の間に100Ωの抵抗が載っていました。たぶんオーバーシュートを抑えるダンピング抵抗ですかね。または双方向Dshotで万一信号がぶつかった時の保護?

市販FCはこうなっていました。HOIHOI-FCには抵抗はなく直結です。

これが無いとだめなのかな?そこで先程の中継基板に100Ωを割り込ませてみましたが・・・効果はありませんでした。

ここであと一つ心当たりが・・・RPMフィルターをONにして動作を確認したとき、BetaflightConfiguratorのモータータブを使ってモーターを回転させ、回転数が取れている事を確認しますが、この時モーター2だけエラーレートが0.6%前後となっていたのです。

赤線部分が回転数取得のエラーレート。

BetraflightのWikiによれば1%程度までに抑える様にと書かれています。0.6%なので良さそうにも思えますが、過去に幾つかの市販FCで試した時は0%しか見たことはなく、今回の動作異常と関係しているかどうかは分かりませんがちょっと気になります。

この原因、色々試した結果 ファームをビルドする際のコンフィグファイルtarget.hに以下の記述があるとダメでこれをコメントアウトするとエラーは消えました。

#define DSHOT_BITBANG_DEFAULT   DSHOT_BITBANG_OFF

この記述はCLIで設定を見たときの’DSHOT_BITBANG’に相当します。
‘DSHOT_BITBANG’ はON|OFF|AUTOのいずれかを選択する内、上記行が記述してある場合はOFF、上記行を削除するとAUTOになる様です。
そして回転数取得のエラーはOFFだと発生し、AUTOまたはONだと発生しませんでした。

この辺り、BetaflightWikiにはOFFにしろと書いてある様に見えるので(英語ですが、たぶんそういう意味だと思います。汗。)、試した現象とは逆なのです。
どなたか真相が分かりますか?(そもそも DSHOTでのBITBANGとは何を意味するのでしょう?)。

何はともあれ市販のFCを見てもAUTOになっているし、HOIHOI-FCもAUTOで様子を見る事にします。

そして回転数取得エラーが無い状態で飛行させると「変な挙動」は無くなりました。やっぱり回転数エラーと同じ原因だったみたいですね。
以上で当面の使用には問題はなくなりました。

でもあと一つ気になっている事があります。

HOIHOI-FCはモーター8個まで制御できる端子を設けており、いずれオクタコプター(モーター8個の機体です)を作るという野望があるのです。
ここでCLIモードでDUMPコマンドを使って設定を見るとDMA周りが次の様になっていてB09端子にDMAが割り付けられていません。

 dma pin B04 0
pin B04: DMA1 Stream 4 Channel 5
dma pin B05 0
pin B05: DMA1 Stream 5 Channel 5
dma pin B06 0
pin B06: DMA1 Stream 0 Channel 2
dma pin B07 0
pin B07: DMA1 Stream 3 Channel 2
dma pin B08 0
pin B08: DMA1 Stream 7 Channel 2
dma pin B09 NONE
dma pin A00 0
pin A00: DMA1 Stream 5 Channel 3
dma pin A01 0
pin A01: DMA1 Stream 6 Channel 3

なおDMAというのはDirectMemoryAccessの略で、CPUを介さずメモリーと周辺レジスタとの間でデーター転送を行う機能です。その間CPUは別の仕事ができるので負荷が下がるのですが、具体的にDSHOTの制御として何をしているのかは分かりません。
これでも全端子ESCに繋いで回せる事は確認済みなのですが・・・。
でも一つだけDMAを使えないというのは気持ち悪いですよね。 もしかするとこれもRPMフィルターで影響を受けるのかも。

で、B09端子というのはモーター6に割り付けています。これはファームのコンフィグファイルtarget.cの中で下記(ここではPB9と表現)の様に指定しています。
そしてこのモーター端子はタイマー4のCH4を使用しています。

 DEF_TIM(TIM3, CH1, PB4 ,  TIM_USE_MOTOR,  0, 0), // MOT1
DEF_TIM(TIM3, CH2, PB5 , TIM_USE_MOTOR, 0, 0), // MOT2
DEF_TIM(TIM4, CH1, PB6 , TIM_USE_MOTOR, 0, 0), // MOT3
DEF_TIM(TIM4, CH2, PB7 , TIM_USE_MOTOR, 0, 0), // MOT4
DEF_TIM(TIM4, CH3, PB8 , TIM_USE_MOTOR, 0, 0), // MOT5
DEF_TIM(TIM4, CH4, PB9 , TIM_USE_MOTOR, 0, 0), // MOT6
DEF_TIM(TIM2, CH1, PA0 , TIM_USE_MOTOR, 0, 0), // MOT7
DEF_TIM(TIM2, CH2, PA1 , TIM_USE_MOTOR, 0, 0), // MOT8

なぜこのモーター6だけがDMAが割り当てられないのか、この原因を探るため、STM32F72xxxリファレンスマニュアルを調べると下の表がありました。タイマー番号_チャンネル番号毎にDMAの割り当てが決まっている様です。
表の中で色を塗っている項目はHOIHOI-FCでモーターに使っているタイマー番号ですがモーター6に割り当てているTIM4_CH4は記載がありません(なので恐らくDMAが割り当てられない)。

次に基板を変更するときはこの辺りの端子割当ても考え直そうと思います。
また今の基板のままオクタコプターをやるなら他の端子を使う事も可能です。例えば現状UART2に割り当てているPA2,PA3だとTIM2_CH3,TIM2_CH4なので,どちらもDMAの割り当てがあります。UART端子は1本減りますが。

という事で・・・

まずはF7でも使えそうだという事が分かってきました。
次に基板を作るなら直したいところが色々と溜まってきましたが 、そもそもF7のマイコンがまだ普通に買えそうにないんですよね。


フライトコントローラー自作関連の投稿一覧

フライトコントローラーを自作してみる。
フライトコントローラーを自作してみる。~その2~
フライトコントローラーを自作してみる。~その3~
フライトコントローラーを自作してみる。~その4~
フライトコントローラーを自作してみる。~その5~
フライトコントローラーを自作してみる。~その6~
フライトコントローラーを自作してみる。~その7~ リフロー炉
フライトコントローラーを自作してみる。~その8~
フライトコントローラーを自作してみる。~その9~ 動作確認
フライトコントローラーを自作してみる。~その10~ FPVで飛ばす。
フライトコントローラーを自作してみる。~その11~ Rev2基板
フライトコントローラーを自作してみる。~その12~ Rev2基板組み立て
フライトコントローラーを自作してみる。~その13~ Rev2基板動作確認
フライトコントローラーを自作してみる。~その14~ マイコンパワーアップ検討
フライトコントローラーを自作してみる。~その15~ 基板データ公開
フライトコントローラーを自作してみる。~その16~ JDLで飛ばす。
フライトコントローラーを自作してみる。~その17~ F7マイコンを載せる。
フライトコントローラーを自作してみる。~その18~ またまたF7
フライトコントローラーを自作してみる。~その19~ F7マイコン購入

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

自作フライトコントローラーの目標の一つにレースで飛ばすというのがありました。
そこで今回 JDL(ジャパン・ドローン・リーグ) 2021年Round4の宮崎戦に息子と共に参加してきました。
実は昨年の宮崎戦にも参加したのですが結果はボロボロで、今回は少しはマシに飛ばせるでしょうか? なお息子は今回本気で臨んでいます。

こんなコースです。

通常JDLは土・日の二日間あり、初日は練習日、二日目が実際のレースとなります。しかし今回は土曜日が雨(雷も!)のため中止となり、日曜日のみの開催となりました。実は中止を知らず早起きして宮崎まで行ってしまったので、初日は宮崎ドローンクラブSkyDRONEの方々と一緒に練習させていただきました。

なお私が飛ばす機体はこれ。
これTyro99というかなり安物で普通レースに使う人は見かけない機体をベースに、上側だけ載せ替えて軽量化したもので、元は息子のお古なのです。

ここに自作フライトコントローラー’HOIHOI-FC’を載せています。
がんばってくれよー(というか自分が操縦頑張らにゃならんのですが)。

緑の基板がHOIHO-FC

・・・そして日曜日。
時間を詰めて朝イチに一回だけ練習フライトが設けられる事になりました。

という事で早々に(一度きりの)練習フライトの順番が回ってきます。
スタート位置に機体を並べ、ゴーグルをつけて他の選手と3人で操縦席に座ります。そしてスタート・・・と思ったら私の機体はモーターだけブンブン回って離陸しません。なんと、プロペラ2枚を逆に取付けていたのです。やってもうた~!
他の選手はフライトしているのでコースに入る訳にはいかず、一度きりの練習フライトは飛べずに終わりです。

あとはぶっつけ本番で2回の予選フライトを飛ぶのみ。

そして予選フライト1回目。機体をセットした時に少しモーターを回して確認したので今回はちゃんと離陸しました。
操縦席の後ろで、以前我が家の工作室に来られた事のあるNONSAYAさん(井上さん)がアドバイスして頂けたので落ち着いて飛ばすことができました。
でもシミュレーターではもっとスロットルを開けれたんですがねー。実機だと辛うじて落ちずに飛んでいる程度です。結局既定の時間内にコースを2周して終了。
でもまあ、自作フライトコントローラーでJDLを飛ぶという目標は達成したので良しとしましょう。

私が参加しているオープンクラスは多くの人が規定時間内にコースを3周回ります。そして4周できれば予選通過というのが今回の目安になりそうです。
私としては次は3周を目指さねば(最初っから4周とは言わない)。

そして予選フライト2回目。
今度は先程よりもスロットルを開け気味で飛んだのですが、2周目の最終ゲート直前(ここって直角に曲がる初心者泣かせのポイントなのです)でフラッグに接触して墜落。リスタートして最終ゲートを通過したのですが約1.5秒足りず結局2周で終了です。

以上で私のJDL2021 Round4は終了しました。

息子はというと、9人が予選を通過できる内の8位で何とか準決勝に進んだ様です。
そして準決勝も他の選手がミスってくれたおかげで決勝に進み、この時点でオープンクラスからエキスパートクラスに昇格決定!
決勝戦ではもう飛ばすしかないという事で何か吹っ切れた様にスロットルを開けて2周目の時点では先頭を飛んでいたのですが、煙を吐いた機体が騒ぎになった(その瞬間息子の機体かと思ったのですが別の選手の機体でした)のに動揺してクラッシュ、何とかリスタートしたのですが結果は3位で終了です。

3位なので表彰状をもらっています。

結果として・・・
・自作フライトコントローラーでレースを飛べた。
・息子はエキスパートクラスに昇格した。
という事で収穫ありとしましょう。


フライトコントローラー自作関連の投稿一覧

フライトコントローラーを自作してみる。
フライトコントローラーを自作してみる。~その2~
フライトコントローラーを自作してみる。~その3~
フライトコントローラーを自作してみる。~その4~
フライトコントローラーを自作してみる。~その5~
フライトコントローラーを自作してみる。~その6~
フライトコントローラーを自作してみる。~その7~ リフロー炉
フライトコントローラーを自作してみる。~その8~
フライトコントローラーを自作してみる。~その9~ 動作確認
フライトコントローラーを自作してみる。~その10~ FPVで飛ばす。
フライトコントローラーを自作してみる。~その11~ Rev2基板
フライトコントローラーを自作してみる。~その12~ Rev2基板組み立て
フライトコントローラーを自作してみる。~その13~ Rev2基板動作確認
フライトコントローラーを自作してみる。~その14~ マイコンパワーアップ検討
フライトコントローラーを自作してみる。~その15~ 基板データ公開
フライトコントローラーを自作してみる。~その16~ JDLで飛ばす。
フライトコントローラーを自作してみる。~その17~ F7マイコンを載せる。
フライトコントローラーを自作してみる。~その18~ またまたF7
フライトコントローラーを自作してみる。~その19~ F7マイコン購入