最新のドローンレースで使われているモーターの制御方法について。
特にラジコンから入られている方はマイコン等に詳しくない方が多いので初歩から解説します。
まずはベータフライト設定画面からここのESC/Motor Featuresからいきましょう。
PWM、ONESHOT125, ONESHOT42, MULTISHOT
BRUSHED, DSHOT150, DSHOT300, DSHOT600
2017/1/10現在、8個のプロトコル(制御方法)から選べるようになっています、多分将来的にはもっと増えていくはずです
1.PWMとは・・・・
昔からラジコンサーボの制御方法です
以前の私の
HPから拝借してきました、詳しくみたい方はリンクをどうぞ。
上記の図のように周期20msでDUTYを0.8msから2.4msの間で動かしサーボホーンの角度を指定します。
ESCも同じようにDUTYが0.8msの時は最スローで2.4msの時は最速でモータを回そうとします。
因みに1秒(1sec)は1000msec(ミリセコンド)で
1msecは1000usec(マイクロセコンド)になります
つまり上記のPWMの場合は周期20msなので1秒間(1000ms)の間に50回制御出来るようになります。
これだけみると1秒間に50回制御出来るので十分なような気がしますが、現在のレーシングドローンのようにすぐ、140~150Km/hでてしまうような場合制御が遅れてきます、
そこで出てきたのがONESHOT125, ONESHOT42、MULTISHOT などという方法です。
2. ONESHOT125とは・・・・・
上記のPWMの波形をよく見てますと周期20msの間でDUTYは最高でも約2.5msです、つまりDUTYが最高の時でも残りの17.5msは何もしていません、
なぜこんな仕様になっているかはアナログサーボの名残だと思いますが、現在のサーボ、ESCはもちろんマイコンを使っているのでこの場合はインプットキャプチャーでDUTYを読み取っています。
インプットキャプチャーに関しては
ここに詳しく解説があります。
で最近のマイコンは以前より相当早いので上記のPWMはほぼ遊んでいる状態に
で、もっと周期を早くしてどんどん更新していこうと考えたのがONESHOT125になります。
まず
ONESHOT125を選び
System Configurationで、とりあえずわかり易いようにPID Loopを1khzに設定し
フライトコントローラから出ている信号をオシロで観測してみます。
基本PWMの信号にそっくりですね、ただ周期をみてみるとさきほどPID Loopを1khzに設定したので
ちゃんと1ms=1khzで更新されています、PWMの50回に比べると1000回ですから20倍早く更新しています。
でなぜONESHOT125という名前なのかは
最スローの時の信号のDUTYが125usecだからであって
最速の時は最スローの約2倍250usecになっています.
とここで思うのは周期1msec=1000usecのうち最高で250usecなら残りの750usec意味ないね
ということでPID Loopを倍の2khzにしてみましょう
で観測してみます
スロットル最速の信号です。
ちゃんと周期は500usec=2khzになっています。
スロットル最速でDUTYは1khzの時と同じ244usecです。
じゃぁPID Loop 2.67khzなら・・・・・・
周期は2.67khz = 374usecになりました
その内最速スロットルの場合は244usですのでこれ以上PID Loopを上げると信号が破綻します。
以上、ONESHOT125の場合は最スロー時の信号が125usecなのでPID Loopは2.67KHZが限界値となります。
とこれでもPWMの50hzに比べると2.67Khzですので更新速度はPWMの53倍になります。
ただ現在ESCに積んでいるようなSTM32クラスのマイコンのパワーはこんなもんじゃないよね
なら最スローの信号をもっと早くすればよくねっ?ってことでONESHOT42が登場します。
3.ONESHOT42とは・・・・・・
ご想像の通り最スロー時の信号が42usecになります
まずONESHOT42を選択して
PID Loopを8khzで選択してみます
このように最スローの時の信号が42usecになり
周期は選択通り8khz = 125usecですので
最速時の時の信号,
84usecで信号の破綻はありません
とうとう信号の更新周期は8khzに達しました、これだとPWMの160倍に達します、でもまだまだ
プロトコルの更新は続きます......(*^^*)
4,MULTISHOTとは・・・・・
最スローの信号を短くすれば破綻しない更新サイクルを達成出来るという考えはまだまだ続きます
それがMULTISHOTです、もはや125とか42という数字すら出てきません、一体どれくらいの数値なんでしょうか?
詳しいことは僕にもわかりませんので、今使っている
F4ボードで観測してみます。
まずMULTISHOTを選択し
PIDLoopを8khzに選択
で観測します
最スローの信号は5.2usec
で最速の場合はこの2倍の10usecかなとおもいきや
24.6usecになりました、これがMULTISHOTたる名前の由来でしょうか?
でPID Loopは8khz(124usec)なので・・・・・・
まだまだPIDLoopを上げれそうですが、今のところBETAFLIGHTではその設定がありません。
ということは、現在のこのPIDLOOPが8Khz上限では、ONESHOT42だろうがMULTISHOTを使おうが更新回数は同じということです、むしろ信号に余裕があるONESHOT42の方が有利ということになりそうです。
5,DSHOT150,300,600とは・・・・・
PWMから始まりONESHOT125,42,MULTIと進化を続けてきたプロトコルですがその内容といえばPWMの信号をいかに早く更新できるか?というものでした。
実際のPWMの信号を拾っているのは受信側のESCに積んであるマイコンのインプットキャプチャー機能であって送信側が送った数値と合っているかなどのエラー訂正は一切行っていません。
かつ、レースドローンなどというものはモータを高速で回すものなのでノイズ環境たるや最悪の状態になっています、ですので信号の更新回数を早くして平均値を取るということでノイズ対策を行ってきました。
ですから送信側が50.0%と送ったとしても受信側では49.5%とか50.5%とか判断するようになります
ただこれが本当に送信側が送った数値なのかは判断がつきようがありません、
ここでCRCを付けてエラー訂正を行うプロトコル、DSHOTが登場します。
CRCに関して言えば説明するのに相当量必要ですので簡単に説明すると・・・・・
例えば壁を隔てた各部屋にAさんとBさんがいるとします、
Aさんが紙に数字の5を書いて仲介役のCさんを介してBさんに渡します、そうするとBさんは5の数字が果たして本当のものなのかは判断がつきません、もしかしたら仲介役のCさんが数字を換えている可能性もあります。しかし他に方法もないのでBさんは信じます。
上記が今までのMULTISHOTまでの流れです、
しかしDSHOTで使うCRCを付けると・・・・・
AさんとBさんであらかじめパスワードを決めておきます、たとえば10とか。
Aさんは数字の5の後ろにパスワードの10を足した15と付け加えます、それを仲介役のCさんがBさんに渡します、Bさんはパスワードの10を知っているので15から10を引き5が本当にあっているかの確認が出来るようになりました。
例えば仲介役のCさんが5を6と書き換えた場合でもBさんはCRCが16になっていないため
6という数字が間違いであると確信できるようになります。
とここまで理解してもらった上で実際の信号はどのようになっているんでしょうか?
とりあえずDSHOT150からいって見ましょう。
PID Loopは8khzに設定
で観測してみます スロットルは1000
でいきます
こんな感じのデータになります、もはやマイコン間通信の世界に入ってきましたね。
データビット11ビット(0~2047)、ESC1ビット、CRC4ビット合計16ビット
いわゆる2バイトで通信することになります。
で1と0をどうみるのかというと・・・・
Hi時間をみて確認しているようです、つまり上記の0の場合2.3usecが0になり
倍の4.5usecの時は1と読むようになります。
で周期をみてみると・・・・
8khzで設定したんですが7.485khzになっていますね
で実際に2バイト送るのに96usec掛かっていますので7.485khzは133usecなのでもうこれ以上PIDLOOPは上げれないということになります。
でONESHOT125から42,MULTIと変化したように今度は0の時のビット時間を早くすればよくねっ
ってことで登場したのが、DSHOT300,DSHOT600です。
でDSHOT300に設定します
同じくPIDLOOPは上限の8khzに
で見てみると・・・・
0のビット時間が1.2usecになっています、DSHOT150の時は2.3usecなのでほぼ半分になります
同じように1の時のビット時間も2.36usecに小さくなりました
で周期は8khzで
2バイト送る時間も半分(51usec)になりますので
今のところ設定できませんがPIDLOOPを16khzまで上げても大丈夫そうです。
同じくDSHOT600になると・・・・・
PIDLOOPは上限の8khzで
0の時のビット時間はご想像の通リ、DSHOT300のさらに半分0.6usec(620ns)になりました
因みに1usec = 1000nsです、1usecは100万分の1秒になります。
同じく1の時のビット時間はその約2倍の1.14usecになりました。
で周期は8khz上限ですので・・・・・・7.911khz(126.4usec)になっていますが(*^^*)
2バイトを送信するのに必要な時間は26usecですみますので
DSHOT600を使えばPIDLOOPは126/26 = 4.84
ですので8khzの4倍32khzまであげられるようになります。
以上いままでのレースドローンのプロトコルまとめとなります、
今のところDSHOT600にすれば32khzの更新スピードでモータの制御ができるということになりますが、いまだ実際に飛ばしたことがありませんのでどれくらいの効果があるのかは未知数です。
情報ですとDSHOT600にしてもREVOLTなどに搭載されているジャイロでないと高速で更新しても意味がないとか・・・・
最後によく使われているジャイロMPU6000と
最近REVOLTなどに搭載されているICM-20608-Gのデータシートのリンクを載せておきます。