室内用の小型ドローンを設計していると,ドローンの小型化や軽量化において市販のフライトコントローラーのサイズや重量がネックになってきます. 受信機,分電盤,UBEC (定電圧レギュレータ)など他の周辺モジュールもフライトコントローラーに組み込んで一体化できれば,重量を減らせるだけではなく不用な配線を減らしてシンプルでコンパクトな機体にできます. ブラシレスモーターを使った1S (LiPoバッテリー3.7Vを1つ使用)のクアッドコプターを設計している時に推量が小さくできるだけ機体重量を減らす必要があったため,これらの周辺装置を組み込んだフライトコントローラーを自作することにしました. (2021年4月追加: 後継機としてSTM32を使ったフライトコントローラーのハードとソフトを自作しました).
フライトコントローラーは,主にマイコンとIMU (Inertial Measurement Unit; ジャイロ・加速度センサー)からなっていて,現在の機体の姿勢をセンサー情報を使って計算するとともに操縦者から送られてくる情報を受信機から入力し,機体を適切な状態にするためにモーターを制御する情報をESC (Electronic Speed Controller)に送ります. マイクロコントローラーにはAVRを使用することにしてMultiWiiとほぼ互換の仕様にしました. MultiWiiはかなり古いフライトコントローラーであり,最近はARM Cortex-M4 (STM32 F3/F4)などが使われるようです. しかしながらAVRには慣れていて開発が楽なのと,オートパイロット等は不用な室内用ドローンではFPU無しの8bitマイコンでも計算能力は十分なのでこのような仕様としました. そしてフライトコントローラーの他に以下の機能を組み込むことにしました:
今回自作したフライトコントローラー(以下AVRFC)はいくつかバージョンがあり,まずユニバーサル基板でプロトタイプを作り,その後専用基板を作って標準的なサイズとやや小型のサイズのものを作成しました. 完成したコントローラーの重量は下記のとおりになりました:
フライトコントローラー | 重量 (g) |
AVRFC ユニバーサル基板バージョン(電源ケーブルあり) | 11.26 |
AVRFC 専用基板外部アンテナ版(電源ケーブルあり) | 4.21 |
AVRFC 専用基板小型版(電源ケーブルなし,コネクタあり) | 3.38 |
AVRFC 専用基板小型版(電源ケーブルなし,コネクタなし) | 2.18 |
(参考) | |
CRIUS MultiWii SE V2.6 | 9.57 |
GY-521ジャイロ・加速度センサーモジュール | 1.26 |
nRF24L01+無線モジュール | 0.53 |
ATMega328P-AU (TQFP-32) | 0.14 |
XY7000S受信機(ケースあり) | 10.48 |
XY7000S受信機(ケースなし) | 4.87 |
これはユニバーサル基板(0.3mm厚)とDIPパッケージのATMega328Pを使って一番最初に作ったもので,基板サイズは46x47mmでネジの位置は市販のMultiWiiと同じ40x40mmとなっています. この最初のバージョンの目的は,自作のフライトコントローラーがちゃんと動くかどうか確認することと,2S (7.4V)用の比較的推力に余裕があるミニドローンに搭載して機体をシンプルにすることだったので,既存の無線・IMUモジュールやDIP部品をそのまま使い重量にはこだわっていません. 実際に最初に示した表のとおり,このコントローラーの重量(電源ケーブルを含む)は市販のMultiWiiよりも重たくなっています. しかしながらこの基板は受信機や分電盤の機能も統合しているので,それらを合わせた重量を考えるとかなり軽量化と小型化に役立っています.
ESCに電源を供給する端子は軽くて入手が容易なピンヘッダを使いました. モーターには最大で3Aほど流れるのでピンヘッダの定格ぎりぎりですが,メンテナンスが楽になるのでESCから直に配線をハンダ付けするのではなくコネクタを使うことにしました. バッテリーにつなぐコネクタは,秋葉原の千石電商で売っていたMolex 51006コネクタに20AWGのシリコンワイヤーを圧着しています. IMUには入手が容易で安価なGY-521を,無線モジュールにはnRF24L01+を使用したものをそのまま使っています. nRF24L01+のモジュールにはいくつか種類があるようですが,ここで使ったものはチップ部品の水晶を使ったピン間隔が1.27mmの小型のものです. 定電圧レギュレータがメインの基板上にありませんが,GY-521にSOT-23-5のレギュレータICをのせるパターンがあるのでそこに実装しています. もともとこのモジュールについていたレギュレータICはS2PCという刻印で,これはME6211C33M5Gという3.3V/500mA出力のICのようですが,最大入力電圧が6.5Vで2Sには耐えられないようなので後述するNJM2866F33に交換しました.
ユニバーサル基板を使ったプロトタイプで動作確認できたので,KiCadで基板レイアウトを作ってFusion PCBに基板を発注しました. 基板厚さは0.6mmです. これまでは回路図や基板レイアウトの設計にはgEDAを使ってきましたが,今回初めて業者に基板を発注するのを機にKiCadに乗り換えました. 自動配線(freerouting)が非常に便利で今回の基板作成に役立ちました.
定電圧レギュレータには,1SではSi91841DT-285 (出力2.85V/150mA,最大入力電圧6.0V)を,2SではNJM2866F33 (出力3.3V/100mA,最大入力電圧14V)を使うことを想定しています(ともにSOT-23-5パッケージ). 前者は2Sの電圧に耐えられず,また後者は1Sではバッテリーの電圧が低下してくると安定してた出力ができないためです. ジャイロ・加速度センサーと無線モジュールの耐電圧の都合で2S以上でも出力電圧はこれ以上上げられません. なお,1S用には最初は2.5Vの定電圧用レギュレータを使ってテストしましたが,使用したESCが2.65V以下だと動作しないことが分かったため電圧を上げました. FETをつけてブラシモーターに対応した基板も作成しましたが,まだ部品の実装とテストは行っていません.
これは,nRF24L01+無線モジュールに内蔵されたアンテナをそのまま使うもので,次に紹介する外部アンテナ版に問題があった場合に備えて用意したものですが,外部アンテナ版の動作が確認できたので基板は作ったものの部品の実装はしていません. 基板のサイズはNAZE32と同じ36x36mm (ネジ穴位置は30.5x30.5mm)ですが,無線モジュールが大きくスペースが足りないため,ジャイロ・加速度センサーを基板中心からずれた場所に配置しています. フライトコントローラーというかドローン本体のできるだけ中心部にジャイロ・加速度センサーを置くことは重要で,そうしないと機体を回転させたときに回転の中心がずれてしまいます. 前述のユニバーサル基板バージョンを使って飛行している時にこのずれが結構気になったので,専用基板バージョンでは少なくとも左右の中心に置くようにしています.
これは内部アンテナ版とほとんど同じですが,無線モジュールのアンテナ部分を切り取って小さくして,かわりに基板外周部にアンテナパターンを設けてそちらを使うようにしています. 波長やインピーダンスマッチングは考慮していませんが,とりあえずテストした限り問題は見られませんでした. 基板のサイズはやはり36x36mmで,ジャイロ・加速度センサーは基板中心に配置しています.
AVRは当然TQFP-32パッケージのものを使い,抵抗やコンデンサは1608サイズを使っています. Arduinoでファームウェアを開発することにしていましたが,AVRを基板に実装してしまうとブートローダーを書き込めないので,上の写真のようにTQFPパッケージ用のISP書き込みソケットを作ってあらかじめブートローダーを書き込んでおきました. ジャイロ・加速度センサーICのMPU-6050は単体では入手しにくかったので,完成品のGY-521モジュールから取り出して使いました. このICは裏面に端子がついているQFNパッケージで半田ごてで扱うのは無理なので,基板からの取り外しや基板への実装にはヒートガンを購入して使いました. ヒートガンでもQFNパッケージが扱えるのか不安だったのですが,基板からの取り外しは非常に簡単で,また基板へのハンダ付けも,あらかじめ基板パターンにハンダを盛ってフラックスを塗ってから部品を置いて加熱することで,きれいにハンダ付けできました. 無線ICについては,直接フライトコントローラーの基板に実装するのではなく無線モジュールのままで扱うことにしました. 理由としては,設計段階ではQFNパッケージのハンダ付けに自信がなくできれば避けたかったこと,最初の表のとおりIMUモジュールに比べて無線モジュールは比較的軽かったこと,さらに無線モジュールにはインピーダンス整合の回路などもあり自作基板で高周波関係のトラブルが発生することを懸念したことなどがあります. しかしながらハンダ付けが思ったよりも簡単だったので,IC単体を使っていればもっと軽くなり設計の自由度も上がったと思います. 電源を通すパターンは表裏両面を使い太くしています. このフライトコントローラーはモーターをつないでテストをしてGUI (MultiWiiConf.exe)で動作確認はしましたが,まだ実機では飛ばしていません. そのうちこのコントローラーを使った機体を作る予定です.
これは上記の2つのバージョンを小型化して基板サイズを30x25mmにして,主に推力にもスペースにも余裕がない1Sの機体で使うことを想定したものです. 他のバージョンには搭載していた拡張用の端子を省略して,無線モジュールはベタアース面のアンテナへの影響が気になるものの基板の裏面に配置しています.
本来はファームウェアも1から自作したかったのですが,まずは既存のMultiWii 2.4を変更して使いました. 以下のような変更を加えました:
バッテリー電圧の検出に関して,config.h中のVBATSCALEの値は,"<分圧比率> / <ADC基準電圧> * 1024 * 16 / 10"で求めます.分圧比率は今回の回路では(10/(10+27)),ADC基準電圧はAVRに入力される定電圧レギュレータの電圧(2.85Vまたは3.3V)です.
ATMega328Pのポートの使用状況は次のようになっています:
ピン番号 (TQFP-32) |
ピン機能 | ArduinoピンID | CRIUS MultiWii |
AVRFC (ユニバーサル基板) | AVRFC (専用基板) |
1 | PD3/PCINT19/OC2B/INT1 | D3 | MOTOR (front-left) | FLASHER | - |
2 | PD4/PCINT20/XCK/T0 | D4 | RX | - | FLASHER |
9 | PD5/PCINT21/OC0B/T1 | D5 | RX | MOTOR (front-left) | MOTOR (front-left) |
10 | PD6/PCINT22/OC0A/AIN0 | D6 | RX | MOTOR (real-left) | MOTOR (real-left) |
11 | PD7/PCINT23/AIN1 | D7 | - | - | - |
12 | PB0/PCINT0/CLKO/ICP1 | D8 | - | - | - |
13 | PB1/PCINT1/OC1A | D9 | MOTOR (rear-right) | MOTOR (rear-right) | MOTOR (rear-right) |
14 | PB2/PCINT2/SS/OC1B | D10 | MOTOR (front-right) | MOTOR (front-right) | MOTOR (front-right) |
15 | PB3/PCINT3/OC2A/MOSI | D11 | MOTOR (rear-left) | nRF24L01 | nRF24L01 |
16 | PB4/PCINT4/MISO | D12 | FLASHER | nRF24L01 | nRF24L01 |
17 | PB5/SCK/PCINT5 | D13 | LED | nRF24L01 | nRF24L01 |
23 | PC0/ADC0/PCINT8 | A0 | nRF24L01 | nRF24L01 | |
24 | PC1/ADC1/PCINT9 | A1 | nRF24L01 | nRF24L01 | |
25 | PC2/ADC2/PCINT10 | A2 | LED | LED | |
26 | PC3/ADC3/PCINT11 | A3 | BAT | BAT | BAT |
27 | PC4/ADC4/SDA/PCINT12 | A4 | IMU | IMU | IMU |
28 | PC5/ADC5/SCL/PCINT13 | A5 | IMU | IMU | IMU |
29 | PC6/RESET | RESET | RESET | RESET | RESET |
30 | PD0/RXD/PCINT16 | D0 | RXD | RXD | RXD |
31 | PD1/TXD/PCINT17 | D1 | TXD | TXD | TXD |
32 | PD2/INT0/PCINT18 | D2 | RX | - | - |
完成したファームウェアは次のとおりです: