ラベル nanoWii の投稿を表示しています。 すべての投稿を表示
ラベル nanoWii の投稿を表示しています。 すべての投稿を表示

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以上に変更する

#次回に続く

2014年4月25日

MultiWiiでヘリコプター(1)

MultiWiiはチープなフライトコントローラの中で小さくない勢力を占めていますし、なによりHobbyKingに支持されておりハード入手が容易です。


ただ、ヘリコプターを飛ばすとなると情報が少なく敷居はけっして低くありません。

2012年にPatricさんがコードをモディファイして初めてヘリを浮かせて以降、公式ページへの記載はほとんど変化が無い、というほどマイナー扱いです。


が公式docからもリンクされていますが、ボードタイプも汎用の古いものですし、今となってはあまり参考にできる部分がありません。(ヘリコプターフォーラムはそれなりに活発なので読むだけでもためになります)



まず、MultiWiiのつらいところは、サーボとモーターの番号が謎のマジックナンバーで管理されてるところです。各コプタータイプごとにどの番号がどんな役割かがハードコードで決められており、ヘリコプターは
  • HELI: 4,6,7 - swashplate servos, 5-rear servo or rear motor (MOTOR2 output can be used too for rear motor)
だそうです。サーボ1,2,3はマルチコプターでジンバル用に使われる習慣があるので遠慮したようです。

rear motorという記載があるように、一応YAWMOTORというオプションがあり、テールモーターのヘリに対応した形跡が見られます。しかしこのオプションはnanoWii等の小型コントローラでは機能しないように見える上に、どんなハードウェアでサポートされているか情報がありません。

では、サーボ4,5,6,7を使うことはわかった。そのサーボ1~8とやらはどのピンに割り当てられているのか? というとこれもまたボードによってばらばらでろくにルールがありません。しかも同じボードでもハードウェアPWMのオプションの選び方しだいで変化するという有様です。

ハードウェアPWMは本当にCPUのレベルでピン番号に制限が付いちゃうので仕方ないんですが、それならちゃんと各ボードごとにプロジェクトを管理しないと、一部のボードでしか使えない機能がいろいろできてしまって共通ソースにしている価値が薄くなってきています。

(実際にforkしてしまったプロジェクトもたくさんあります。まあ最初からそれを許容してるので文句を言われる筋合いは無いんですけどね。)


ピン番号に関して公式docでは
For promini:
  • Motors : 9,10,11,3,6,5,A2,12
  • Servos : A0,A1,A2,12,11,3,10,9
For Mega:
  • Motors: 3,5,6,2,7,8,9,10
  • Servos SW_PWM : 34+44 , 35+45 , 33+46 , 37,6,2,5,3
  • Servos HW_PWM : 44,45,46,11,12,6,7,8
For promicro m32u4:
  • ...
と書かれていて、nanoWii基板に乗っているm32u4の情報はありません! (9,10,11がスワッシュサーボで5,6がメインモーター、テールサーボのようです)

なお、もう一つ紹介したMINI MWC with DSM2ボードのほうはATMega328Pなのでpromini系だと思うんですが、サーボ4,5,6,7はピン12,11,3,10と上記に書かれており、MINI MWC基板では12番ピンがサーボヘッダに出ていないのでそのままではヘリに使えません。

まあ、そんなげっそり状態から始めるわけですが、少なくともnanoWiiの方はソースコードを見る限りこれでヘリを飛ばしてる人がコントリビュータの中に実際にいるようなのでまだマシです。今後はまずnanoWiiを動かしていこうと思います。




なお、RC入力や各センサーの現在状態を見たりPID設定を変更したりするには何かしらGUIが必要ですが、最初はやっぱりパソコンが便利だと思います。

オフィシャルにmultiwii2.3のソースコードを拾ってくると同梱されているMultiWiiConfでもいいですし、



windowsの.NETで作られたWinGUIでもいいと思います。


ただMultiWiiConfはJavaでできていて、JavaのVMバージョンによってはウィンドウが出るにもかかわらずちゃんと情報が更新されなかったり一部画面が崩れたりしますので、一発でうまく動かなかったら問題きりわけのためにWinGUIを試すことをお勧めします。