2014年4月27日

MultiWiiでヘリコプター(2) PWMの意味に注意

前回の続きで、まずnanoWiiでマイクロヘリを飛ばすことを目標にします。

マイクロでないヘリを飛ばしてる人はフォーラムに複数いるので、基本的にはそこを参考にできます。

必要な機材:
  • HobbyKing nanoWiiボード
  • HobbyKing orange-サテライトRX
  • HobbyKing orange-RX620受信機 (サテライトRXのバインド時のみ使用)
  • メイン、テールのESC (今回は1Sでテストします)
  • 適当なダブルブラシレス機体



まだ浮いていないので結線やパーツの詳細はさておき、MultiWiiの設定について勉強していきます。

nanoWiiをはじめとするMultiWiiでは、基本設定は汎用のarduino開発環境とconfig.hのオプション書き換えによって行い、arduino-IDEでnanoWiiに書き込んだ後で、動作状態でPID等のパラメータをGUIで設定していくという手順でセットアップを行います。

この、基本設定をして書き込むというところがかなりの難関です。



まずボード上の信号出力ピンですが、結論から言うとボードタイプでnanoWii(内部的にはpromicro)を選び、ハードウェアPWMを利用する A32U4_4_HW_PWM_SERVOS オプションをONにすると、各所でこの場合専用のコードが走り、ソース内の下記コメントの通りのピン割り当てになります。
  • motor[0] = motor       = pin  6
  • servo[3] = nick  servo = pin 11
  • servo[4] = left  servo = pin 10
  • servo[5] = yaw   servo = pin  5
  • servo[6]  = right servo= pin  9
ピン6だけがデューティPWMのモーター信号で、他は全てサーボ信号です。
メインモーターをサーボにする選択肢(HELI_USE_SERVO_FOR_THROTTLE)や、テールモーターを使う選択肢(YAWMOTOR)もありますが、この初期化ハードコード部と相性が悪いので当面使わないことにしました。


また、サテライト受信機は事前にRX620でバインドしておけば、#define SPEKTRUM 1024 をコメントアウトするだけで機能するのですが、デフォルトではコレクティブピッチがスロットル信号連動になっているので、

#define COLLECTIVE_PITCH      AUX2

としてちゃんとピッチ信号をコレクティブに割り当てる必要があります。(少なくともdeviationのDSM2出力ではこれでOKでした)

さて、ここまでの手順であっさりスワッシュサーボは動き、ちゃんとジャイロによるフィードバックも効きます。難しいのはモーターです。



まず、ヨーサーボの信号はそのままBLHeliに食べさせてあげればテールモーターは回ります。ただサーボ信号ってことはスロットルホールド時にカットされず50%出力になるので墜落してもテールモーターがまわりっぱなしになりますから、何らかの対策は必要です。(最悪の場合送信機でTHスイッチに左ラダーMAXを割りあてるという手もありますが、せっかくコントローラソフトをいじれるんですから機体側で止めたいですよね)


問題はメインモーターで、5番ピンからはFET経由でブラシモーターに繋げばしっかり回るはずの500HzのデューティPWMが出てきますが、これはBLHeliの受付範囲外なので正しく回りません。(とはいえ、EXT_MOTOR_RANGEをコメントアウトしてOFFにしておけば、なんとか始動さえすればそれなりに回ります)



以前nobさんがmaster CPの記事で書かれていたように、BLHeliは500Hz以下のパルスはサーボ信号であると認識します。ここでちょっと用語の混乱が生じますが、BLheliの説明書にPPM信号と書かれているサーボ信号は、PPMではなく正確にはPWM信号の一種です。

ただ、ブラシモーターの駆動に使われるPWMのほうはHi/Loのデューティー比が0~100%まで変化する方式なのに対し、サーボを駆動するPWM信号はHiパルス部分の時間幅そのもので情報を送ります。1000usが値0、1500usが50%、2000usが100%とする流儀が主流です。

ここで、パルスの出現間隔であるPWM周波数自体はサーボが受け付けてくれればどんな値でもよく、そもそも一定の周波数である必要すらないというのがモーター信号のPWMとまったく違うところです。


で、周波数がなんでもいいのなら、制御の反応速度を良くするにはできるだけ高頻度でパルスをサーボに送りつけリフレッシュレートを上げるのがよかろう、ということでサーボのPWM周波数をめいっぱい上げていくと、パルス自体の幅が最大2000us=2msなので、500Hz弱がこの方式で情報を送るときの理論上最大リフレッシュレートです。


という前提があるので、「500Hz以下のPWMはサーボ信号とみなす」というBLHeliのルールはたいへん筋の通ったものです。



つまり、悪いのは500Hz付近やそれ以下の周波数のまぎらわしいデューティPWMを出す受信機だ、というわけでここはmultiWiiの出力の方を変更するべきでしょう。




nanoWii基板へのソフト書き込み前にクリアすべき課題:
  • muliWii側のテールサーボ出力を、メインモーターカット時には0%にする
  • メインモーターのPWM出力周波数を、500Hzではなくもっと速い1kHz以上に変更する

#次回に続く

2 件のコメント:

  1. なんか面白そうですが、内容の半分は理解できません。
    ところで、これで飛ばすのはマイクロでしょうか?
    こういうコントローラはコンパスや加速度計載せてると思いますが、かなり電系統の影響を受けます。
    マイクロだと設置場所探しが大変そうな予感がします。

    返信削除
    返信
    1. nobさんのardupilotにだいぶ遅れながら追いかけています。
      multiwiiで450や250を飛ばしている人は既にいるし、そもそも130クラスまでしか持っていないので確実にマイクロですねー。

      目標は「市販ジャイロ並みのカスタマイズ性を、Kbarや似非ビースト等の道義的にまずい手段によらず実現する」というところなので、正直加速度センサすら使わずに3軸ジャイロのみでほぼ十分です。せっかく付いているので加速度は使ってみますけど。

      コンパスやバロメーターは乗ってる基板もありますが、GPS無しであまり楽しい使い道も思いつかないのであまり使う気がありません。

      というわけで、電気系の影響はあまり心配ないのですが、振動には予想通りかなり悩まされています。

      削除