Betaflight 4.0 から導入された双方向DSHOTの機能を使用するRPMフィルターは、モーター由来のノイズを大幅に取り除くことができ、スムーズなフライトにつながります。Betaflight 4.1 ではRPMフィルターの設定が簡単になりました。この記事ではRPMフィルターを設定してみます。
はじめに
この項目はしくみを出来るだけわかりやすくしたつもりですが、RPMフィルターを使用するのに理解する必要はありません。次の項目「 双方向DSHOTを使用するには 」まで読み飛ばしてかまいません。
双方向DSHOT
RPMフィルターは、双方向DSHOT(Bidirectional DSHOT)という機能を使用します。DSHOTはFCとESCがデジタルデータで通信をします。通常はFCからESCへモーターを「これだけ回せ」とデータが流れるだけですが、双方向DSHOTは名前の通りESCからFCへ(逆方向)にもデータが流れます。別の言い方をするとESCのテレメトリーが取得できるという事です。これによりESCから得られるリアルタイムのモーターのRPM(回転速度)を使用してよりきめ細やかな制御が可能となります。
双方向DSHOTでは既存のシグナル線を使用するので、新たに配線する必要はなく、専用にURAT(シリアルポート)も必要ありません。ただ対応しているファームウェアに更新するだけで使用できます。
RPMフィルター
モーターの高周波ノイズの除去には「ここからここまでのノイズを除去しろ」というノッチフィルターを使用します。通常は「ここからここまで」の幅をノイズが多い範囲に設定しますが、モーターのノイズは回転数によって周波数が変化しますので、「ここからここまで」が広くなるためにフィルター処理による遅延が大きくなります。
双方向DSHOTにより、リアルタイムのモーターRPMが得られるので、フィルターで除去するべきノイズの周波数もリアルタイムで分かります。 そのためノッチフィルター は現在のノイズ周波数に合わせて「ここからここまで」の幅を狭くできます。 (2019年11月10日:上の表記を下の青線のように変更しました。)
RPMフィルターによりモーター由来のノイズが完全に除去されるので、ノッチフィルターはモーターノイズを考慮する必要が無くなりました。そのためノッチフィルターの可動範囲を狭くでき、その結果フィルター処理による遅延が少なくなり飛行特性が向上します。
ただし、通常より各種処理が増えるのでCPUの負荷が大きくなります。
双方向DSHOTを使用するには
まずESCのファームウェアを双方向DSHOTに対応したバージョンに更新する必要があります。
現在 BLHeli_32 と BLHeli_S のファームウェアを使用しているESCで双方向DSHOTが使用できます。
お使いESCがどのタイプかはESCの仕様書を確認する必要があります。
BLHeli_32
お使いのESCのファームウェアが、BLHeli_32 なら バージョン32.7.0 に更新します。更新方法は下の記事を参考にしてください。
BLHeli_S
使用しているファームウェアが、BLHeli_S でしたら、JESCという有料のファームウェアを購入して更新します。JESCは jflight.net から入手可能です。専用の jesc-configuratorをダウンロードして使用します。
私はまだ JESC を使用したことがありませんので、jesc のインストール方法を参照してください。
JESCを使用してRPMフィルターを使用できるようにする記事は下記にあります。
有料のJESCを使用せずに、有志の方が作成したBHLeli_sファームウェアを使用してRPMフィルターを実現する方法もあります。下記記事を参考にしてください。
Betaflight 4.1.0 以降にバージョンアップ
双方向DSHOTは Betaflight 4.0 と 4.1 で仕様が異なります。Betaflight 4.1 を使用してください。
Betaflight 4.1 と対応した Betaflight Configurator 10.6.0 はこちらの記事を参考にしてください。
双方向DSHOTを有効にする
ONにする
双方向DSHOTを有効にするには、Betaflight Configurator 10.6.0 の基本設定タブで、下図のように「モーター極数」を入力後、「双方向Dshot」をONにするだけです。これでRPMフィルターも有効になります。


モーター極数とは、モーターのベル(外側部分)の内側に貼り付けてある磁石の数です。5インチ機などで使用される2206とか2307などのモーターは14個あります。3インチ機以下で使用するモーターは12個が多いです。


以上で終了です。
と言いたいところですが、前述のように双方向DSHOT は FC の処理を多くし、CPU の負荷が増えます。したがって一部設定を変更して負荷を下げます。
設定を変更する
負荷を下げるために以下の項目を変更すします。
- ESC/モータープロトコルを「DSHOT300」にする
- 「ジャイロ演算周波数」と「PIDループ演算周波数」をそれぞれ 4KHz / 4KHz にする
- 動的ノッチフィルターの幅を狭くしてフィルター処理量を減らす
なお、Betaflight 4.2 からはジャイロ演算周波数は自動で設定されるため変更する必要はありません。
これらをまとめて設定するためのCLIコマンドがあります。ここにアクセスします。
(2019年11月10日:上記リンク先と下記画像を変更しました。以前と一部コマンドが変更になっていますので再度CLIで設定したほうがいいようです。)


リンク先まで行くのがめんどくさい時は下記をコピペしてCLIで入力してください。
set gyro_sync_denom = 2
set pid_process_denom = 1
set motor_pwm_protocol=DSHOT300
set scheduler_optimize_rate=on
set dshot_burst=off
set dshot_bidir=on
set debug_mode=gyro_scaled
set dyn_notch_range = medium
set dyn_notch_width_percent = 0
set dyn_notch_q = 250
save
コマンドをコピーしてCLIに貼り付けEnterキー。saveで保存します。


このコマンド内にはブラックボックスのログとして、フィルターされる前の生のジャイロデータを記録するように設定してあります。(set debug_mode=gyro_scaled)これにより後で効果を検証できます。
また、Dshotビーコンを使用している場合は、双方向DSHOTに干渉するかもしれないとのことですのでOFFにします。


確認する
FC と ESC とを再起動します。Betaflight Configurator 10.6.0 でCLIタブを開きます。
dshot_telemetry_info
と入力してEnterキーを押します。


まだESCにバッテリーを繋いでないので、Dshot reads: は 0 です。
Betaflight Configurator 10.6.0 のモータータブを開きます。


1~4までのモーターの下にR:とE: が表示されています。まだESCに電源が入っていないので、E:(エラー)100%になっています。
ここより必ずプロペラは外して作業をしてください。実際にモーターを回します。
バッテリーを繋いでESCに通電します。モーターを回すために右下の「リスクを認識し…」のスイッチをONにてごく低速でモーターを回転させます。


モーターの下の数値が変わりました。R: が回転数で E: はエラーです。
モーターを回転させたままでCLIタブを開きます。
コマンドラインに先ほどと同じコマンドを入力します。
dshot_telemetry_info


DSHOTテレメトリーが表示されました。現在のモーター回転数はRPMですね。Invalid の数値が1%を越えないことを確認してください。
また、Configurator の一番下のステータスバーのCPU使用率も注意してください。60%を越えるようならオーバークロックする必要があるかもしれません。
EXITと入力して終了します。(モーターの回転も同時に止まります。)
以上で終了です。
設定を戻すには
双方向DSHOTをOFFにしてRPMフィルターを停止するにはフィルター設定も同時に戻す必要があります。
CLIで下記のコマンドを入力して保存してください。
# ジャイロとPIDループを8KHz/8KHzにします. set gyro_sync_denom = 1 # 双方向DSHOTをOFFにします. set dshot_bidir = OFF # モータープロトコルをDSHOT600にします. set motor_pwm_protocol = DSHOT600 # 動的ノッチフィルターをデフォルトに戻します. set dyn_notch_width_percent = 8 set dyn_notch_q = 120 save
実際フライトする際ですが、何か設定を変更した時の最初のフライトは短時間にして、モーターの温度を確認するようにするといいでしょう。例えば極端ですがフィルターをほとんど有効でない値にしてしまった時、ノイズを除去できずにモーターを過熱させ焼き切ってしまうでしょう。フライト後モーターを触って思わず「熱い!」ってなるようなときは躊躇なく設定を元に戻してください。