Dropbox

ひょんなことからTinySA Ultraという簡便なスペクトルアナライザーが6GHzまで対応しているらしいことを知りました。これならVTXの電波が見えるのではないかと思い試すことにしました。

詳細な情報はTinySA Wikiにまとまっています。

[ セルフテストとキャリブレーション ]
最初にテストと校正を行えとのことなのでやってみます。

まずは付属しているケーブルで上下のポートを接続します。画面をタップ(今時の静電式ではなく感圧式です)するとメニューが出ますのでCONFIG/SELF TESTを実行します。

続いてLEVEL CALを実行します。

こんなふうに5.34GHzを境に分かれています。CALIBRATE 100kHz to 5.340GHzを実行します。残念ながらVTXの周波数が含まれるCALIBRATE above 5.340GHzの方はTinySA単体では実行できないようです。まぁ精密な測定を行うわけではないので校正せずに進めます。

[ ENABLE ULTRA ]
6GHzまで測定するためにはCONFIG/->MORE/ENABLE ULTRAを有効にします。この時Unlock Codeを聞かれるので4321と入力します。

[ VTXの電波を見る ]
細かい設定はまだ良くわかっていませんが、とりあえずはVTXの電波は見ることが出来ました。

 下のポートに適当なアンテナを接続して周波数を設定しただけです。

トップメニューのFREQUENCYに入ります。STARTとSTOPの周波数を設定します。私はそれぞれ5.6GHzと6GHzにしてみました。

実際の電波を見たところです。F4(5800MHz)が見えています。ピークを検出して周波数を教えてくれるのが便利です。規定値ではひとつの周波数しか教えてもらえないので設定を変更します。トップメニューのMARKERに入ります。私は4 MARKERSにしてみました。

そしてE1, F1, F4の電波を同時に出してみました。

大体良い感じです。残念ながら毒電波を吐くVTXが手元にないので、悪い事例を紹介することはできませんでした。

[ 設定の保管 ]
ここまで行った設定をいつでも呼び出せるように保管しておきます。
トップメニューからPRESET/STORE/STORE 1にVTXという名前で保管しました。

これでいつでも設定が呼び出せます。また’STORE AS STARTUP’で起動時に読み込まれます。

[ SCREEN COPY ]
STORAGE/SAVE CAPTUREで画面のコピーがSDカードにBMPフォーマットで保管できます。いちいち名前を付けないと行けないのがちょっと面倒です。このブログにしようしている画面はWindowsのアプリから取り込んだものです。こちらはPNGフォーマットでした。このアプリ、すぐに接続は切れるし思うように動かないしで今ひとつですので詳しいことは省きます。

[ Water Fall表示 ]
トップメニュー/DISPLAY/WATER FALLをオンにすると時間経過とともに一定強度の信号を受信した記録が残ります。つまり少しだけ時間を遡って電波の状態を調べることが出来ます。

[ おまけ ]
HDZeroのNarrowモードが本当に17MHz帯域幅なのかどうかを調べてみました。

[ 関連記事 ]

ドローンにRGB LEDを搭載するもう一つの方法 <- 親記事です
ATtiny85によるLED制御 – ハードウェア実装編
ATtiny85によるLED制御 – BUZZパッドを利用した制御方法
ATtiny85によるLED制御 – UART/LEDパッドを利用した制御方法

注意 : Arduino IDEに組み込むFastLEDライブラリーをバージョン3.7.4以降に更新するとこの手順で作動しなくなりました。もし動かなくなった場合は3.7.3をインストールしてください。

[ 参考記事 ]
1. VTX周波数毎に決められた色にする
2. ミニAVRマイコン『ATtiny85』にブートローダーを書き込みArduinoとして使えるようにしてみる!ATtiny85の基本的な使い方!

この二つを読んで頂ければ、このプログラムの概要とATtiny85への書き込み方法が分かります。補足的な事柄を書いておきます。

[ ATtiny85について ]
ATtiny85にはいくつかのパッケージがあります。開発用、大きめのドローンに搭載するにはDIPバッケージ、Tinyに搭載するにはさらに小型のSOPパッケージが良いと思います。SOPにプログラムを書き込む時にはDIPへの変換ソケットがあると便利です。
10MHz動作版と20MHz動作版がありますが、どちらでも大丈夫と思います。

[ ツール類 ]
PCからATtiny85に接続するために何かしらツールが必要です。上のリンクでいくつか紹介されていますが、私は手元にあるArduino Nanoを使用しました。その他にブレッドボードがあると便利です。私はAmazonで色々と部品が付属したキットを購入しました。

[ 接続 ]
上の参考記事2にある「ArduinoとATtiny85の接続」の通りに接続します。記事ではArduino Unoを使用していますが、Arduino Nanoでも全く同じです。ピンの名前を頼りに接続します。写真はDIP版ATtiny85にプログラムを書き込んでいる様子です。

[ 書き込みソフトウェアの準備 ]
ATtiny85をArduinoとして使用します。お馴染みArduino IDEを使ってソフトウェアを書き込みます。

– Arduino Nanoに書き込み用のソフトウェアを導入します。
わたしのArduino Nanoの設定はこんな感じです。

ExmapleからArduinoISPを書き込んで準備完了です。

– ATtiny85を使用するための準備
ATtiny85を使用するためにはPreference/Additional boards manager URL欄に”https://www.arduino.cc/en/software”を追加しました。参考記事2に書かれていたURLでは機能しませんでした。
Toolsメニューの設定を下のように行いBootloaderの書き込みが成功すればATtiny85がAuduinoとして使えるようになります。

[ ATtiny85へのプログラムの書き込み ]
あとはプログラムを作成し書き込むだけです。設定はBootloaderの書き込みと同じです。Sketch(プログラム)のUploadは通常の方法とは異なり”Sketch/Upload using programmer”を使用します。新しいチップに書き込む時はBootloaderの書き込みも忘れないようにしてください。

今回使用したソースコードです。ninjaMoonLightさんが書き始めて、途中から私も参加して共同作業で書いたコードです。条件コンパイルするようになっています。下の状態ではBUZZパッドもしくはスイッチを使用するプログラムになっています。7行目のコメントを外し”USE_LEDPORT”というマクロを有効にするとLEDパッドを使用するためのプログラムになります。setup()の最後にdelay(500)を入れています。これはある構成においてFCの信号が期待通りになるまでに時間がかかった時に入れたものです。現在の使用方法だと必要はないかも知れませんが安全を見込んで入れたままにしています。

// Pin assign
// arduino PIN 0,button = Attiny PIN 5
// arduino PIN 4,RGB LED = ATTiny PIN 3

// Uncomment following macro (USE_LEDPORT) defintion if use UART/LED_Strip as switch
// UART/LED_Stripをスイッチとして使う場合は以下のマクロを有効にする
//#define USE_LEDPORT

#include <EEPROM.h>
#include <FastLED.h>

//LEDの数
#define NUM_LEDS 80
//LED信号ピン
#define DATA_PIN 3
//ボタンのピン
#define myButton 0

#define NUM_COLORS 4
#define NUM_MODES 3

CRGB leds[NUM_LEDS];
CRGB color = CRGB::Black;

int currentColor = 0;
int currentMode = 0;
int prevColor = -1;
unsigned long prevTime = 0;

int flgTimer = 1;
unsigned long btnTimer;
const unsigned long shortPress = 30;
const unsigned long longPress = 800;

void blinking() {
  unsigned long time = millis() / 100;
  if (time != prevTime) {
    FastLED.setBrightness( 255 );
    for (int i = 0; i < NUM_LEDS; i++) {
      if((time % 2) == 0){
        if((i % 2) == 0){
          leds[i] = color;
        } else {
          leds[i] = CRGB::Black;
        }
      } else {
        if((i % 2) == 0){
          leds[i] = CRGB::Black;
        } else {
          leds[i] = color;
        }
      }
    }
    FastLED.show();
    prevTime = time;
  }
}

void heartBeat() {
  unsigned long time = millis() / 100;
  if (time != prevTime) {
    for (int i = 0; i < NUM_LEDS; i++) {
      leds[i] = color;
    }
    FastLED.setBrightness((7 - time % 7) * 255 / 7);
    FastLED.show();
    prevTime = time;
  }
}

void normal() {
  if (currentColor != prevColor) {
    FastLED.setBrightness( 255 );
    for (int i = 0; i < NUM_LEDS; i++) {
      leds[i] = color;;
    }
    FastLED.show();
    prevColor = currentColor;
  }
}

void setup() {
  currentColor = EEPROM.read(0);
  if (currentColor < 0 || NUM_COLORS <= currentColor) currentColor = 0;
    currentMode = EEPROM.read(1);
  if (currentMode < 0 || NUM_MODES <= currentMode) currentMode = 0;
#ifdef USE_LEDPORT
  pinMode(myButton, INPUT); // button
#else
  pinMode(myButton, INPUT_PULLUP); // button
#endif
  ///////LED
  FastLED.addLeds<WS2812B, DATA_PIN, GRB>(leds, NUM_LEDS); // GRB ordering
  // following delay may not be required
  delay(500);
}

void loop() {
#ifdef USE_LEDPORT
  if (digitalRead(myButton) == HIGH) {
#else
  if (digitalRead(myButton) == LOW) {
#endif
    if (flgTimer) {
      btnTimer = millis();
      flgTimer = 0;
    }
  } else {
    if (!flgTimer) {
      unsigned long diffTime = millis() - btnTimer;
      if (diffTime > longPress) { // Long pressed
        currentMode++;
        if (currentMode >= NUM_MODES) currentMode = 0;
          EEPROM.write(1, currentMode);
      } else if (diffTime > shortPress) {
        currentColor++;
        if (currentColor >= NUM_COLORS) currentColor = 0;
        EEPROM.write(0, currentColor);
      }
      flgTimer = 1;
    }
  }

  switch (currentColor) {
    case 0: color = CRGB::Red; break;
    case 1: color = CRGB::Green; break;
    case 2: color = CRGB::Blue; break;
    case 3: color = CRGB::White; break;
  }
  switch (currentMode) {
    case 0: normal(); break;
    case 1: blinking(); break;
    case 2: heartBeat(); break;
  }
}

Insta360 GO 3のカメラ本体は小型でFPVドローンに搭載するのに適しています。ただし初代Insta360 GOに比べるとだいぶ大きくなり、重量も35gほどあり超小型のドローンには少々重くなっています。
そこで試しに100g未満の2S FPV機に載せて飛ばしてみました。重さは感じますが、慣れてしまえば軽いアクロバティクな動作も可能でした。ということで、GO 3をFPV機に載せて撮影する時のわたしの設定や気がついた事柄をつらつらと書いておきます。

[ ビデオモード ]
動画の撮影には二つのモードがあります。撮影時に縦横比やスタビライズの掛け方を決めておく「動画」、撮って出しが可能な簡便な撮影モードです。もうひとつは「FreeFrame動画」で初代GOからある縦横比もスタビライズも後から携帯電話アプリもしくはPC上のアプリで決定を行うモードです。これはカメラのセンサーをフルに活用し真四角くかつ丸い動画を記録します。四角で丸いという意味は下の写真をご覧ください。これをアプリケーションで加工します。最近の流行りの縦長動画も後から作れます。またスタビライズは同時に記録されているジャイロデータを使用します。スタビライズの掛け方も後から選択できます。
FPVドローンではFreeFrame一択とわたしは考えます。

[ 録画可能時間の謎 ]
わたしのGO 3は64GBモデルです。これで実際のところどれくらいの動画が撮影できるのかが気になるところです。本体のプレビュー画面の左上に残り時間らしきものが表示されています。そこにはFreeFrame動画の場合は1h37mと出ています。FreeFrame動画もプレビュー画面で縦横比、解像度、フレーム数を選択することが出来ます。ところがどの設定を選んでも残り時間が変わりません。そこで実験です。

[ FreeFrame動画の実験 ]
まずは1440P/50FPSにして実際に録画をしてみたところ1時間35分ほど録画出来ました。表示されていた残り時間は正しいようです。次に各設定で録画したデータの検証です。結論から言うと、どの設定にしてもビットレートは約80Mb/sと変わりませんでした。つまりストレージの消費は設定に関わらず同じですので残り時間が同じになるのは当然です。

もう少し掘り下げてみます。画面上の選択肢は三種類あります。縦横比が16:9と9:16です。これはプレビュー表示の変更だけであることは容易に想像出来ました。解像度は1440Pと1080Pが選択できますが、実際に録画されたデータを検証するとどちらも2688×2688の動画になっています。動画を再生してみても差があるように思えません。もしかすると将来的には差が出るような計画なのかもしれません。フレームレートは50, 30, 25, 24が選べます。これは正しく録画されたデータに反映されていました。ただしビットレートはどれも同じです。画質に差が出ているかテストしてみましたが、ほとんど同じに見えます。1440P 50FPSがやや荒いようにも感じますが、ほぼ気のせいレベルです。静止した対象物でのテストしか行っていませんので、動きがある場合は何か違う可能性もあります。とりあえずは好みのフレームレートを選択すれば良いと思います。もしかするとこれも将来のファームウェア更新で変わってくるのかもしれません。

[ ISO/シャッタースピード/WB ]
お手軽撮影が売りのInsta360 GOシリーズですし、ISO, シャッタースピード, ホワイトバランスを自動で撮影しました。私的には概ね問題無しです。

木陰を通り過ぎる時にじわっと画面の明るさが変化しています。GoPro Hero6で同じことをすると急激にかくっと感度が変化してしまうと思います。それを経験して以来、GoProではISO固定で使用していますので、最近のモデルで何か変わったかどうかはわかりません。

じわっとした感度変化も嫌う場合はISO, シャッタースピードを手動設定するしかありません。プレビューが簡単に出来るので手動でも失敗がないのは大きな利点です。

[ スタビライズ ]
Gyroflowを使用しています。同期ポイントの手動設定は必要ありません。FOVやスタビライズの強さなど自由に変更出来るのが魅力ですが、規定値のままで問題無しです。画面の補正はリニアな感じになります。縦長の動画やワイドレンズっぽい湾曲した画面が欲しい時にはInsta360 Studioを使用すると良いでしょう。

[ カラー・プロファイル ]
シーンに合わせた多彩なフィルターが用意されていますが、わたしはFlatを使用しています。これは画像編集ソフトで色の調整が必要になります。どのLUTを使うべきか情報が見当たりませんがCaddx Peanutと同様にInsta360 X2用のLUT、ONE-X2-LUTを適用すると良い感じにノーマライズされます。X3-LUTでも良いかもしれません。X2用もX3用も、どちらもほぼ同じに見えます。

LUTファイルはInsta360のダウンロードページにあります。

[ アクションポッド ]

液晶の付いたポッドは特別なことをしなくても常にカメラ本体と接続されています。ドローンを離陸位置にセットしてからポッドでプレビューを確認し録画をスタートする。また着陸したらポッドから録画を停止する。という使い方が出来ます。FPVドローンの使用シーンにおいて完璧なリモコン装置です。

[ 風切り音 ]
動画の中にプロペラ音を取り込むのが好きなので録音機能が搭載されているのはとてもありがたいです。
音声設定は3通りあります。「風切り音低減」「ステレオ」「方向性強調」です。「風切り音低減」を使用したところ、今まで試したどんなHDカムより優秀でした。ほぼ風切り音のない動画が出来上がりました。

[ NDフィルター ]
購入時にはレンズ保護のための透明なフィルターが装着されています。まだ公式なNDフィルターは発表されていないと思います。サイズ的にはCaddx Peanut用のNDフィルターが装着可能でした。ただし、このNDフィルターは色温度が変わってしまうことが分かっています。当面、NDフィルターは使用せずに撮影することにします。

[ マウント ]

Insta360 GO 3マウント(GoPro互換)

Insta360 GO 3マウント(RunCam Thumb Pro共通)

Insta360 GO 3をsub100なドローンに載せるべくマウントを作成しました。RunCam Thumb Proのマウントと互換性を持たせて現在RunCam Thumb Proを載せているドローンにそのまま搭載できるようにしました。

やや重いですが、何とか飛べます。リカバリー失敗して接地したりもしましたが、アクロバティックな飛び方も出来ました。

この動画は3SなGG BONE FIVE F/Sですが2Sで飛ばしているTinyAPEでも同様に飛ばせました。実はかなりダメダメなフライトでしたがスタビライズでスムースになりました。

Insta360 GO 3をFPVで使ってみた感想をいくつか書いておきます。
– 初代と同じく後から縦横比やスタビライズの掛け方を変更できるようにするためにはFreeFrame動画で撮影する。FPVにはFreeFrameが適しています。これだとGyroflowも使えます。
– GO3本体のボタンにFreeFrame動画を割り当てましたがポッド(液晶の付いた部分)とは常に接続されているのでドローンを地面に置いたあとにポッドからプレビュー画面を確認の上でポッドから録画スタートする方が便利だと思いました。
– 64GBモデルでバッテリー4本飛ばしてストレージ使用量20%でした。十分とは言えますが、128GBにしておけば良かったかなと少し思います。

マウントのSTLファイルはThingiverseにて公開しています。
https://www.thingiverse.com/thing:6123410

またマウントの販売も行なっています。
https://dskozak.stores.jp/items/64b21ef5e29535006d3865bd

いずれFPVドローンに載せるつもりのInsta360 GO 3を取り急ぎ車に載せて運転の様子を撮影してみました。

入手したのは64GBの標準キットです。GoPro標準マウントが必要な場合は別売のマウントが必要ですが、一般的な用途であれば標準キット(通常版)で十分です。すでに紹介動画も多数ありますし、ここでは詳細は省き使ってみた感想的なことを書いておきます。

GO 3の今までになかった特徴は液晶パネル付きのポッドに取り付けると一般的なアクションカメラ的に使えるところです。まずはアクションカメラ的な使い方を試してみます。

車のダッシュボード上にキット付属のスティキーパッドで良い具合に固定できます。簡単に剥がすことが出来るのですが、普通に運転していて動いてしまうようなことはないという絶妙な粘着力です。また車のUSB充電コネクターから給電しながら録画すれば電池切れの心配はありません。

最初はFreeFrame動画で撮影しました。これは最初のInst360 GOと同じで、センサー全体を生かした四角い動画を収録して、ポストプロセスにて16:9, 9:16など画像縦横比の変更や手ブレ補正をかけるモードです。2688×2688 50FPS、約80Mb/sで録画するため64GBの内蔵ストレージは1時間30分ほどで一杯になってしまいました。iPhoneにデータを吸い上げてから続きのテストを行いました。iPhoneにコピーしたデータはiPhone上のアプリケーションで処理することも出来ますし、生データをiPhoneからPCにコピーしてPC上のアプリケーションで処理することも簡単に行えます。

64GBのストレージでは長時間ドライブの記録は無理かとも思いましたが、今回のGO 3ではアプリケーションによるポストプロセスが必要のない撮って出しの出来る動画撮影も出来ます。解像度を低めにすれば大幅に記録容量を節約できます。64GBでも1080P/30FPSなら4時間以上、1440P/30FPSならば3時間弱の録画が可能です。ということで1440P 30FPSでも録画してみました。

録画した結果はYouTubeにアップロードしています。

ISO/シャッタースピード全て自動にセットしています。トンネルの出入りでの明るさ調整も滑らかで好印象です。FPVドローンでのGoPro撮影では少なくともISOを固定しています。そうしないと木陰から陽の当たるところに出る時などに不自然な明るさの変化がありました。GO 3はもしかすると自動のままでも大丈夫かもしれません。夜間の撮影はややノイズが多いような気もします。

色々なメカなどとても良く出来ていて所有するだけでも満足感が得られます。唯一、後悔しているのは128GBにしておけば良かったなということくらいです。

2020年に剥きプロとInsta360GOが登場し小さいFPV機にも録画用のカメラを載せることが普通になりました。それ以来、わたしのFPVドローンには何かしらカメラを搭載しています。マウントは既製品がほとんど存在せず3Dプリンターで部品を作ってきました。ドローンに付属しているマウント部品があれば、それに合わせてカメラ側のマウントを作るし、カメラに良いマウントが付いていればそちらに合わせたてドローン側を作ります。問題は互換性のないマウントを複数持つことになり、カメラを別のドローンと入れ替えることが簡単ではないことです。

大きいものならばGoProマウントというディファクトスタンダードがあります。小型機用も独自にマウントを共通化したいという思いはいつも頭のどこかにありました。

最近RunCam Thumb Proを活用することが増えてきて、その付属マウントがちょうど良い大きさで作られていることが分かりました。RunCamのサイトには図面もありますし、これを活用することにしました。

[ 継ぎ手部分のモデル ]
 

STEPファイル
機体ベースのSTLファイル
カメラ側のSTLファイル
RunCamの図面は余裕が考慮されていないので少し隙間を与えています。PLAで出力して軽く噛み合わせることが出来ます。

とりあえず成果物は二つあります。

[ RunCam Thumb ]

STLファイルはThingiversにあります。
https://www.thingiverse.com/thing:6074400
出力品の販売もあります。
https://dskozak.stores.jp/items/6486d2ef7e9540002bfca556

[ Caddx Peanut ]

STLファイルはThingiversにあります。
https://www.thingiverse.com/thing:5012350
出力品の販売もあります。
https://dskozak.stores.jp/items/648aba1183d26a002e8d3ef6

どちらも過去に紹介したRunCam Thumb Pro用のマウントを搭載した機体にそのまま搭載できます(電源ケーブルは別の話しになりますけど)。
TinyApe用RunCam Thumb Proマウントの作成
GG BONE FIVE F/S用のRunCam Thumb Proマウントの作成

信奉するChris RosserさんのビデオBetaflight 4.4 Tuning Guide + Tips and Tricks for the BEST tune!で室内でもPIDチューニングが可能であることが紹介されていました。最近の小型AIO FCにはブラックボックスが搭載されるようにもなりましたし、室内機でも本格的なPIDチューニングを試してみるしかないです。

手順についてはChris Rosserさんのビデオを見ていただくのが間違いが無くてよいのですが、実際にわたしが試したチューニングの様子を紹介します。

チューニングを行ったのはSub250 Whoopfly16です。75サイズの1Sドローンで屋外でも軽快に飛行できます。

チューニングはPIDtoolboxを使用してブラックボックスログを確認して行います。

[ RPMフィルター設定 ]
 
双方向DSHOTを使用しRPMフィルターを有効にしておきます。モーター極数の設定も忘れずに変更しておきます。ざっくり言うと小型モーターは12, 大きいのは14ですが、実際にモーターベルに付いている磁石の数を数えるのが確実です。

[ RC_LINKプリセット ]

RC Linkに合わせたプリセットを適用します。これによってRCスムージングとFFが適切な値にセットされるはずです。

[ ブラックボックスの設定 ]
ブラックボックスログレートを2KHz, デバックモードにGYRO_SCALEDを指定しておきます。

[ フィルターの設定 ]

RPMフィルターを使用した場合のChris Rosserさんのオススメにしました。Betaflightの規定値よりだいぶ軽くなっています。ジャイロの静的フィルターは使わずRPMフィルターと動的ノッチフィルターだけを使用します。D値ローパスフィルター1は画面のように変更します。周波数は機体サイズによって変わります。詳細は最初に紹介したビデオの12:28にあります。D値フィルターはこのひとつだけです。
フィルターは効果さえあれば軽い方が良いです。余談ですが軽いというのはプロセッサー負荷よりもジャイロデータのフィルターによる遅延の少なさという意味合いが大きいです。軽くするためにはフィルターの種類を少なく、かつカットオフ周波数を可能な限り高くすることが必要です。

[ ジャイロノイズの確認 ]
ジャイロノイズを確認するためのテスト飛行はスロットルを滑らかに最小から最大まで動かし様々なモーター回転値でのデータを取得するのが理想です。屋外ならば100%スロットルまで試します。室内テストではなかなか最大値は難しいので可能な範囲でスロットルを動かします。
取得したブラックボックスログをPIDtoolbox/Spectral Analyzer/Freq x Throttleで解析します。

左からフィルター前のジャイロ値、フィルター後のジャイロ値、D値のフィルター前と後です。一番左のグラフの取得にはブラックボックスデバッグモードのGYRO_SCALEDが必要です。ジャイロの下の方で光っている部分は実際の機体の姿勢を表す真のジャイロデータです。100Hzより上に現れるデータはノイズと考えて良いです(クラッシュした時は別ですけど)。フィルター前のジャイロデータで右上がりの濃いデータがあります。これはモーターからくる振動です。横軸のスロットル位置、すなわちモーターの回転数に比例してノイズの周波数が上がっていることを示します。これを効果的に取り除くのがRPMフィルターです。
このグラフを見る限りフィルターはうまく働いているようです。D値の方は詳しくありませんが、 他の機体のデータと比較しても悪く無い方と思います、機体の固有振動などがあるとスロットル位置に関係なく一定の周波数のノイズが現れることがあるかもしれません、その場合は静的ノッチフィルターで対処する必要があります。

テスト飛行後に念の為、モーターが加熱していないかどうかも確認しておきます。

[ PIDチューニング ]
いよいよPIDチューニングです。室内でアングルモードで行います。PID値の変更はスライダーで行います。Betaflight ConfiguratorでもOSDメニューでもどちらでも調整出来ます。まず最初にI強度を0にします。もしアクロモードでチューニングを行う場合はFF値も0にします。

まずは現状の確認です。なるべく色々とスティックを動かし20秒ほど飛行します。ブラックボックスデータを所得しPIDtoolbox/Step Resp Toolで解析します。

このままでも普通に飛ばせそうにも思えますが、ややオーバーシュートして、その後に波打っているのを直していきます。

最初に見出すのはPDバランスです。調整するスライダーはP&I強度です。実際のところD値を固定してP値を探る作業になります。現状ではオーバーシュート気味なのでP値を小さくする方向で素直に収束するところを見つけます。P&I強度を徐々に下げて行って取得したデータをひとつのグラフで表現しました。

本来は1に収束するはずですが、1より少し大きいところで収束しているのは謎ですが、軌跡の形状だけで判断してみます。なかなか微妙ですが水色(RollのP値が22のもの)が一番理想に近いように見えます。これはP&I強度が0.5のものです。

次に基準値倍率設定の最適値を探ります。上の設定でP値がだいぶ小さくなったのでレスポンスがかなり遅くなっています。倍率設定でPDバランスを変えることなく両方の値を変更出来ます。軌跡が乱れることなく素早く立ち上がるように設定します。目安としては規定値のPに近くなるところが良いのではないかと思います。

赤が基準値倍率を2.0にしたものです。YAWをみるとちょっと強めすぎにも思えますが、このまま進めます。もし基準値倍率が2.0では足りない場合の調整方法についてはビデオの23:31からご覧ください。

I値(アクロの場合はFF値も)を元に戻して最終確認です。

3軸ともなかなか良い感じになりました。ややオーバーシュートしてすぐに安定しているのが良い設定と思います。

PIDスライダーの最終的な状態は以下の通りです。

[ 動的アイドル値の設定 ]
Chris Rosserを信用して1.6インチでのおすすめ値の94を設定しました。28:41に解説があります。ここで各プロペラサイズと推奨値が書かれています。1.2インチについては推奨値がありません。室内飛行では必要ないからかもしれません。もし設定するとすれば1.6インチと同じにしておけば良いのではないかと思います。

以上でチューニングは完了です。正直なところわたしの飛ばし方ではチューニング前と後で変化を感じることはありませんでした。

機体の設定をDump/Diffのテキストファイルから読み解きたいことがまれにあります。大部分は意味のある文字列が書いてありますし、受信機の種類などは記憶していたりするので良いのですがConfiguratorのPortページのデータが曲者です。どのUARTが受信機だったとか、VTXのプロトコルがIRC TrampだったかSmartAudioだったとか重要な項目ですが、記憶するのは難しいですしDump/Diffデータも意味不明の数字でしかありません。ということで、これについて調べたことを書いておきます。タイトルはSerial編として続きがあるように見えますが、次に何かDump/Diffで困ったことが見つからない限り書く予定はありません。

上はとある機体のPortsタブです。これに対応するDumpデータは以下のようになっています。
# serial
serial 20 1 115200 57600 0 115200
serial 0 8192 115200 57600 0 115200
serial 1 64 115200 57600 0 115200

最初のserial 20で始まる行はdiffの出力には現れません。これはUSB VCPに相当すると容易に想像が付きます。またserial 0がUART1でserial 1であるというのもほぼ確信を持って言えるでしょう。それに続く数値もPortsタブの設定を変化させて探っていけば自分が必要な項目は拾い出せるとは思いますが、今ひとつスマートではありませんし確信を持って語ることは出来ません。

正しい情報を得るべくソースコードを読んで探していたのですが、結局ドキュメントにまとめて書かれていることが分かりました。ということでbetaflight/docs/Serial.mdを読んでいただければ全ては解明します。

それだけではつれないので簡単に説明を加えておきます。serialに続く最初の数字がポートでUART番号から1を引いたものです。またUSBは20、softserialは30から始まります。
その次の数字がFunctionで、これが今回知りたかったものです。その後にボーレート(シリアルインターフェースの速度)がいくつか続きます。Ports画面には速度はひとつしか表示されていないのが謎ですが、とりあえずあまり変更するものではないので置いておきます。

Functionについては次のように定義されています。

2. Serial Port Function

Function Value
FUNCTION_NONE 0
FUNCTION_MSP 1
FUNCTION_GPS 2
FUNCTION_TELEMETRY_FRSKY_HUB 4
FUNCTION_TELEMETRY_HOTT 8
FUNCTION_TELEMETRY_LTM 16
FUNCTION_TELEMETRY_SMARTPORT 32
FUNCTION_RX_SERIAL 64
FUNCTION_BLACKBOX 128
FUNCTION_TELEMETRY_MAVLINK 512
FUNCTION_ESC_SENSOR 1024
FUNCTION_VTX_SMARTAUDIO 2048
FUNCTION_TELEMETRY_IBUS 4096
FUNCTION_VTX_TRAMP 8192
FUNCTION_RCDEVICE 16384
FUNCTION_LIDAR_TF 32768
FUNCTION_FRSKY_OSD

IT屋さんにはおなじみの数字が書かれています。これは10進数ですが、バイナリーにするとひとつのビットになります。これはひとつのポートに複数のFunctionをもたせることが出来るようにしているからです。現実性は無視して例を上げるとUART1にGPSとFRSKY Telemetryの機能を持たせた場合は2+4で6にセットされます。

最初にあげた例に戻ってみます。

serial 0 8192

はUART1がFUNCTION_VTX_TRAMP、また

serial 1 64

はUART2がFUNCTION_RX_SERIALであることが分かります。ということでPorts画面と一致していることがわかります。

前回の飛行で折れてしまったフレームを交換するのと同時にキャノピーをHappymodel Trashcanのものに変更しました。これでカメラアングルを浅くできます。ただ見た目もSAILFLYというよりRedDevilになってしまいました。

カメラアングルを25度ほどにして試しにマンションの庭で飛ばしてみましたが、やはりパワーがありすぎて狭いところでまったりとは飛ばせません。

ということで公園で飛ばしました。

いきなりデスロールです。予備に買った赤いプロペラが外れやすいです。フロスという歯間ブラシをモーター軸とプロペラの間に挟み込む技を使っていても時々はずれます。ロックタイトというネジの緩み止めが有効かもしれませんが、現場に持っていくのはフロスの方が手軽です。

 

この投稿をInstagramで見る

 

Sailfly X death roll again😩 #fpv #toothpick

Nobumichi Kozawaさん(@nkozawa)がシェアした投稿 –

ゆっくり飛ばそうと思っていても、パワーウェイトレシオが高いためかすぐに速度が出てしまいます。それなりの広さがあれば、それも楽しいです。

この投稿をInstagramで見る

Sailfly-X eights around points #fpv #toothpick

Nobumichi Kozawaさん(@nkozawa)がシェアした投稿 –

あまり深く考えずにリラックスして飛ばすのが楽しいです。いろいろと技の練習することを考えて出かけたのですが、すっかり忘れて飛ばしていました。

快適に飛ばしていましたが最後にまたフレームを壊してしまいました。本格的に対策を考えねばなりません。

BetaFPV Beta85X用のフレームを利用したブラシレス機にハマっています。そのために幾つかのFC (Flight Controller)試してきましたので、それらについてつらつらと書いていきます。

BetaFPV F4 Brushless Flight Controller and ESC
Beta65X, Beta75X, Beta85Xに使われているFCです。Xシリーズでも新しいものはFCとESCが一枚に収まったもの(AIO)に変わっていますが、ここで紹介するのはFCとESCが2階建てになったものです。
ESCに幾つかの種類があります。最終版はBLHeli_32 16Aのものです。当初は4Sで稼働できるとアナウンスされていましたが、問題があり2Sもしくは3Sで使用します。BetaFPV 1105 6000KVモーターを使用しての3Sフライトは快適です。
ただし2階建て構造による問題もよく発生します。FCとESCは2つのコネクターのみで固定されています。コネクターの接触不良でモーターが回らなくなったり、墜落や度重なるメインテナンスによりコネクター自体が破壊されることもあります。信頼性は他のAIOボードには劣ると言わざるを得ません。

Crazybee F4 Pro V1.0
Eachine Trashcanに使用されているFCで1S,2S対応です。FCとESCがひとつのボードに収められています。ESC部分はBLHeli_S 5Aです。何故か入手したCrazybeeのFCはすべてBetaflight 4.0の開発版が搭載されています。それ故、最新のBeatflight Configuratorとの組み合わせで問題が出たりします。
色々とハードウェア的な問題も報告されていて、わたしも経験しています。ひとつはバッテリーを接続する部分の半田パッドが簡単に剥がれてしまうことです。ハードランディングで剥がれたり、単純に作業中に剥がしたこともあります。リカバリー出来ないことが多いので、かなり致命的です。もう一つはボード上で5Vを作り出すレギュレーターが故障してしまうことです。バッテリーを接続してもFCが起動しないがUSBケーブルをバソコンに接続すると正しくFCが認識される場合は、この問題である可能性があります。外付けの5Vレギュレーターを追加して修復することは可能です。わたしも、その状態でしばらく飛ばしましたがなんとなく気持ちよくないので使用するのはやめました。

キャノピーの後ろに載っているのがあと付けの5Vレギュレーター

Crazybee F4 Pro V2.0
Happymodel Mobule7 HDに使用されているFCで2S,3S対応です。V1.0の弱点であったバッテリーを接続する部分が改良されてスルーホールになっているのでかなり安心です。5Vレギュレーターの故障がどうなったのかは良くわかりませんが対策として電解コンデンサー付きのXT30バッテリーケーブルが販売されています。

最近流行りのSailfly-XにはCrazybee F4 Pro V2.1が搭載されています。VTXもコネクター接続になっていたりとV2.0からかなり変わっているようです。気になっていますが未入手です。

HBS-F405 2S
使用例が見つからないのですが、お気に入りのFCです。全てのハンダ付けポートがスルーホールになっていて工作の信頼性を高くできます。予備も購入するくらい気に入っています。

GEPRC GEP-12A F4 Flight Controller 12A ESC
BetaFPVからもほぼ同じFCが販売されています。ただしBetaFPVの方はブザーポートがありません。ワタシ的には外で飛ばすのにブザー必須ですのでGEPRCの製品を選択しました。このボードもバッテリー接続部分はスルーホールになっているので安心です。
期待の4S対応品です。ただし4Sで飛ばすためにはKV値の小さなモーターを使用しなければなりません。BetaFPVのサイトに詳細が書かれています。それによると4S用のモーターは1105 5000KVとなっています。モーターも4Sバッテリーも入手済みですが、まだテスト出来ていません。