最近マイブームのmultiwiiヘリ作成レシピを書いておきます。
必要なもの
その他必要に応じて
- (サテライトRXをバインドする環境が無い人は) なんでもいいからサテライトコネクタ付きRX なんならKbarでもOK。
- (メインESCに5VBEC出力が無い人は)5Vが出力できるBEC
今回うちの作例では、miniCP機体とサーボ、バッテリーは2S-240mAhでメインモーターはHP06v2とESCがXP-12A。テールモーターはHP03Tの8000kVとESCがPlush6Aを使います。
まず、サテライトRXを何か適当な受信機につなぎ、送信機とバインドしておきます。このバインド機能をmultiwiiにやらせるオプションもあるんですが、私自身はRX620でバインドしてしまったので未確認です。
そして、バインドしたサテライトRXをnanoWiiにつないで動作確認します。
このときソースコードのconfig.h内でサテライトRXを使うオプションを指定する必要がありますが、うちと同じボード、受信機で行く場合は
multiwii-helimod置き場からソースを拾ってきてarduino IDEからnanoWiiコントローラに書き込めば即動作します。
サーボ配線とモーター信号の取り出しですが、nanowii基板でハードウェアPWMを使う設定 (
#define A32U4_4_HW_PWM_SERVOS を有効) にした場合、ピン番号は以下のパターンになります。
* 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
うちの場合サーボコネクタのピンヘッダを全て除去して、以下のようにwalkeraコネクタ(molex picoblade 1.25mm 3ピンハウジング)を瞬着固定してハンダ付けしました。
3ピンのうち、シグナルピンが一番基板に近い側に来るように着けるのがポイントです。
うちの場合は2Sで飛ばすので、XP-12AのBECからの5Vをサーボ電源入力に入れて、そこからMWCの制御部の電源入力までワイヤーで分配しました。
MWC基板は5Vを食べることになっています。実際はもうすこし低い電圧でも動きますが、1S機の場合はリポ直結だとモーターが回って降圧したときにリセットがかかります。1Sで飛ばす場合は昇圧コンバータを通すか、またはMWCboard5Vの入力にモーターとは場別系統の1Sリポを繋ぐのが現実的です。モーターと共用さえしなければ、サーボとコントローラの電源を共用するくらいなら1Sで問題ありません。
基板の置き方はいろいろ選べて、ソースコード内の
#define FORCE_GYRO_ORIENTATION という行が存在しなければ、デフォルトの向き、すなわちnanoWii基板に書いてあるでっかい矢印が機体前方向を向くように水平マウントします。
しかしminiCPをはじめとして最近の小型機フレームは基板を垂直マウントする設計のものが多いです。その場合、
#define FORCE_GYRO_ORIENTATION(X, Y, Z) {imu.gyroADC[ROLL] = Z; imu.gyroADC[PITCH] = Y; imu.gyroADC[YAW] = X;}
と書いてやれば以下の写真のように垂直マウントできます。
miniCPの場合機体への固定は、まずプラ板を純正RXの位置にネジ止めして、その上にnanowii基板を強力両面テープで固定します。
これで振動的には苦しいんですがまあ飛びます。
ESCは普通のブラシレス機と同じように配線しますが、nanowiiから出てくる信号についてコメントしておきます。
メインモーターは、nanowii内でもモーターと扱われていまして、その場合
- nanowiiがアーミングしてない場合、出力は常に0V
- nanowiiがアーミング(スロットル最低で右フルラダー)すると、490hzでduty50%~99%くらい(幅にして1000~1950usくらい)のPWMが出てきます。この490hzは固定です。
これをESCに食べさせると、BLHeliファームなんかは超高速リフレッシュレートのサーボ信号だと認識して、ちゃんと0~100%のモーター出力に翻訳して動作します。サーボ信号だと思ってるわけなので、スロットルを0まで下げた場合でも50%幅のパルスを出し続けていないとESCのシグナル監視がロストしてしまって再始動できません。
multiwiiには
MOTOR_STOPというオプションがあるのですが、これをONにするとスロットルを最低に下げた時にディスアーム時のようにモーター出力が0V固定になるようになります。これは上のPWM出力をESCではなく、FET経由で無理やりブラシモーターに繋いだ場合を想定しているようです。
ブラシモーターに繋いで
MOTOR_STOPをONにすれば、スロットルに応じて、0または50~100%の出力でモーターが回るので、まあ実用上は遊べるようになります。ただブラシモーターを使う場合はさらに
EXT_MOTOR_RANGEというオプションもあり、PWMパルス幅の下限が50%じゃなくて0%まで連続的に繋がり、完全に0~100%幅出力のPWM信号が出てきます。
注意点は、モーター信号のPWM周波数はとにかく490Hz固定なので、BLHeliはこれを絶対にデューティPWMと解釈してくれず、うまく動作しないことです。EXT_MOTOR_RANGEとMOTOR_STOPはブラシモーター専用だよ!と覚えておいてください。
テール信号もまた悩ましくて、miniCPのように2モーター機なので、テール出力もmultiwii内でモーターと扱って欲しい・・・と思います。そのためのオプションYAWMOTORというのがあるんですが、ピン配置の関係で今回のようにハードウェアPWMをONにしている環境では、こいつはうまく機能しません。とにかくテール信号はサーボ信号として出すしかないです。
ただまあ、メインモーターの信号で説明したように、multiwiiの場合実はモーター信号だろうがサーボ信号だろうが、リフレッシュレートを変えて間をつめてるかどうかの違いだけで、どちらも1000~1950usのパルス信号が出てくるというのは同じです。
だからテールサーボのリフレッシュレートを
#define SERVO_PIN5_RFR_RATE オプションで高めに設定(150Hzとか)しておけばメインモーターの信号と大差ありません。どうせBLHeliはサーボ信号として解釈しますし。
ただ、サーボ出力にはメインのところで出てきたようなブラシモーター用オプションは効果ありませんので、テールPWMをブラシモーター用のデューティ0~100%出力にすることは用意されたオプションだけではできません。
話が長くなりましたが、multiwii-helimodを拾ってくればそれだけでメイン、テールモーターともBLHeli-ESCでちゃんと動きます。
あとはセッティングだけですが、まずヘリコプターにはオートレベリング(自動的に加速度センサの値を使って水平に戻る機能)は相性が悪いです。
加速度センサのキャリブレーションは地面に置いた水平時しかできませんし、それが完全にできたとしても、フライト時にはヘリコプターが安定するのは水平ではなく微妙に右に傾いた状態です。
そのための専用パラメータレベルトリムをちまちま設定して空中で微妙に傾いた状態をデフォルトにすることも可能ではありますが、お手軽に安定するんじゃないのならオートレベリングの機能自体が要らないと思います。
というわけで、加速度センサの情報を全く使わないようにレベリング関連のパラメータは全て0にしておきます。マルチローター用語ではアクロモードと呼んだりします。
以下がうちのminiCP-nanowiiの設定です。
あ、サーボリバースの設定だけ説明しておきます。
上記の真ん中のサーボ画面で、謎の四角いタイルが9個並んでいます。これがリバース設定です。
これの列(COLL NICK ROLL)はスティック入力のコレクティブ、エレベータ、エルロンに対応していて、行(NICK LEFT RIGHT)はそれぞれのサーボがスティック入力に対してどちらに動くか、という方向を表しています。単にサーボの回転を逆転するだけではなくて、傾き方向の反応は同じでコレクティブ入力の場合だけ逆にサーボが動く、みたいな設定も自在にできます。V120D02みたいにコレクティブでスワッシュが下がる機種もOKですね。
あとは飛ばしてパラメータを追い込むだけです。