迎え角30deg.

上向きでも飛んでいかない日々。前に進むだけで精一杯。

フライトシミュレータのコントローラを作った

発端

f:id:aoa30:20201128101030j:plain
▲Flight Simulator 2020のフライト環境。今回作ったコントローラは右上の銀色の箱。

MSFS2020の発売に合わせてPCを新たに組み、ウルトラワイドディスプレイを買い、Logicoolのフライトヨークとラダーペダルを揃えて楽しく空に浮かぶ生活をしていたのだが、徐々に改善したい部分が出てきた。じわじわたまった不満を整理すると以下の5点となった。

  1. ランディングギアの操作がスロットルユニット手前のボタン1つで上げ下げ切り替えとなっており、ボタンを押したことで上げたのか下げたのか分かりづらい。押し間違える。ギアの上下は大事なイベントなので実機のレバー操作のようにはっきりと操作したい。
  2. フラップの展開/格納がスロットルユニット手前の上下ボタンで操作となっており、展開と格納を押し間違える。
  3. スポイラの展開/格納がスロットルユニット手前のボタン1つで全展開⇄全格納となっており、開度を調整出来ない。全展開するとグランドスポイラまで展開されてしまい上空で使用しづらい。
  4. エレベータトリムの操作が右手親指の上下ボタンとなっており操作はしやすいが、操作しやすすぎて余りに実感がない。
  5. パーキングブレーキのセット/解除をアサインするのに適したボタンがない。

これらの不満を解消出来るコントローラを作ることにした。

部品

f:id:aoa30:20201128101236j:plain
▲用意した主要部品

  • HiLetgo Leonardo Pro Micro (写真上段左):メイン基板。Arduino Leonardoの互換でAmazonで安かった。今回HIDジョイスティックとして動作させたかったので、簡単にHIDに化けてくれるATmega32U4を搭載した物を選んだ。
  • スライド抵抗 (写真上段右):部品ガラクタ箱から発掘してきた。スポイラの無段階調整に使用。
  • ロック付きトグルスイッチ (写真下段1番左):つまみを引いてロックを解除すると切り替えが出来るトグルスイッチ。ランディングギアの上げ下げに使用。
  • ON-(OFF)-ONトグルスイッチ (写真下段左から2番目):左右に倒すとONとなりバネで中立OFFに戻るトグルスイッチ。フラップの展開・格納に使用。
  • ロータリーエンコーダ (写真下段左から3番目):エレベータトリムの操作に使用。クリック無しの物。
  • オルタネートプッシュスイッチ(写真下段一番右):パーキングブレーキのセット/解除に使用。

amzn.to

回路

f:id:aoa30:20201128101312j:plain
▲ブレッドボードで仮組み

内部プルアップを使えるのでスイッチを直接繋いでGNDに落とすだけである。簡単でありがたい。ランディングギアの状態を示す赤/緑の2色LEDと、パーキングブレーキの状態を示す赤LEDを追加した。大きなタクトスイッチはボードのリセット用。(ガラクタ箱にこれしかなかった)

後で気付いたのだが、ロック付きトグルとプッシュスイッチは、状態が変化したときにイベントが発生するだけなので両端子を接続する必要はなかった。

プログラム

Arduinoを簡単にジョイスティックに化けさせてくれるライブラリがあったので活用させていただいた。
github.com

  • 8ボタン(ランディングギア上/下・フラップ展開/格納・エレベータトリム上/下・パーキングブレーキセット/解除)
  • アナログ1軸(スポイラ位置)

のデバイスとして設定した。

割り込みとかチャタリング対策とかややこしいことが必要なロータリーエンコーダの読み取りにも、先人の作ったライブラリを活用させていただいた。助かる。
www.pjrc.com

自分で書いたのは、スイッチとアナログ入力の状態を読み取り、しかるべきタイミングでJoystickのボタンとLEDのON/OFFを発生させる処理だけで複雑なことはやっていない。

筐体

操作した実感のあるコントローラにしたいというところから始まったので、操作系はそれっぽい感じを目指すことにした。スイッチ類のつまみは3Dプリンタ(adventurer3)でABS材を出力して作った。

f:id:aoa30:20201128101650j:plain
▲エレベータトリムホイール3Dモデル

f:id:aoa30:20201128101719j:plain
▲出力したトリムホイールをエンコーダに固定

つまみに作った溝に四角ナットを埋め込み、イモネジを使用して固定することですっきりと収めることが出来た。特にランディングギアのレバーはロック解除のために手前に引く必要があるので、ネジによる固定は必須である。

f:id:aoa30:20201128101931j:plain
▲フラップレバー

f:id:aoa30:20201128102026j:plain
▲筐体内部
底部についている四角い枠は、本コントローラを固定するためのナットプレートである。つまみと同様に四隅に四角ナットが埋め込んであり、筐体底面にボルト穴が開いている。

f:id:aoa30:20201128102721j:plain
▲スロットルユニットに固定
スロットルユニットのクランプに拡張用のボルト穴が用意されているので、ここからボルトを入れて、先ほどのナットプレートに固定した。

動作

FSを起動して各機能を本コントローラのボタンにアサインする。

▲ランディングギア・フラップ・スポイラの操作の様子。

▲エレベータトリム・パーキングブレーキ

エレベータトリムはエンコーダ出力に応じてボタンを連打するような操作となっており、上動画では若干一致しないところがあったが、ボタンの連打・押しっぱなしを調整して使いやすく出来た。

まとめ

  • 意外と簡単に作れた。(大変だったのはアルミケースの加工)
  • 先人のライブラリは偉大。
  • それっぽい操作系があるとフライトが楽しい!