Mobiflight と Arduino を使って
私のコックピット機材の製作記録です。
フライトシミュレーターから飛行データを取り出したい
フライトシミュレーターFSXで飛行させるとき、機体の高度や進んでいる方位、スピードなどをPC画面上ではなく、もっと見やすいものが作れないかと考えて いろいろ製作を行ってきました。これらの機器は現在はMSFS2020で使っています。
自分で速度計や高度計などのコックピット機材を少しずつ作っていける 楽しい時間になっています。
まず初めに、飛行高度や速度のデータを取り出して、PCのディスプレイではない 別のところに 7セグLEDなどで表示できれば見やすいのにと、その方法がないか調べました。どうやら
FSUIPC を使えば フライトシュミレーターからいろいろな飛行データが得られそうだとわかりました。さっそく FSUIPCを導入したのですが、ほとんど データの取得については簡単な説明だけで 詳しい解説が見つけられず、また 日本語で書かれた解説のサイトもなくて 困っていました。
そんな時、いろいろ相談して教えてもらっている FS先輩のKinoさんから 'Mobiflight を使ってみては' とアドバイスしていただきました。そのサイトを見てみると、私のやりたかったこと そのものでした。
Mobiflight
Mobiflightは FSX/MSFS2020などからの飛行データをUSBを通してArduinoに渡し、接続されたデバイスへコントロール出力すると共に、デバイスからのコントロール入力をFSX/MSFS2020へ伝えるソフトウエアです。Sebastian Möbius氏が中心となって開発を続けています。
Mobiflight Project のサイト
https://www.mobiflight.com には導入手引Tutorialもあって 初めの一歩から くわしく解説されています。英語とドイツ語のサイトなので わかりにくいところもありましたが、しっかり書かれていて ほしい情報が得られます。また、MSFS2020、P3D、X-Planeにも対応しています。また、
Github にはMobiflightの構成について詳しい説明があります。
まず最初に、パーキング ブレーキランプLEDの点灯を試されるのがわかりやすいです。Tutorial_ LED-Parking Brake (Your 1st LED) ここでMobiflight の基本的な進め方がわかるように解説されています。
Mobiflight を使えば 飛行データを 7セグLEDやLCDディスプレイで表示するだけでなく、ステッピングモーターを使って アナログメーターの指針を動かし表示させることもできます。画面上のシミュレーションだったものから 自分の机の上で実際に動作する計器が作れるのです。また、スイッチ類やスロットル・フラップコントロールなどの自作コントロール機器も製作・接続できます。
Mobiflight>Forumのところで検索をして、自分と同じような疑問に対する回答や、いろいろな使い方のヒントを見つけられます。フォーラムはもう書き込みができなくなって、この機能は
discordへ移行していますが Forumを検索して過去の回答なども役立ちます。なお、Tutorialの解説で使われているMobiflightのバージョンが以前のままなのです。どんどんプログラムが改良されているために、ちょっと解説とは違う設定画面になっていることがありますが、基本は同じです。(私のconfig設定例でも製作した時期によって、ver8.1~10.2の違いがあり、少しずつ更新しています)
Mobiflight の設定は数学の応用というほどではないのですが、私がとくに迷った設定を ConfigWizardの記録でたくさん載せておきます。
Arduino
WindowsPCには外部機器を接続するのにUSBポートがありますが、シリアル通信手順がとても難しく、そのままUSB接続で自作機器を構成することは困難です。
ArduinoはPCにUSBで接続できるワンボードマイコンであり、多くのI/Oポートを備えています。ここに自作機器を接続するのが簡単です。
Arduino MEGA 2560 を使っています。最初は小さい
Arduino Pro Microで始めました。でも これは I/Oの数がやや少ないので しっかり使うなら 初めからI/O数の多いMEGA2560 がいいと思います。なお、Arduino Mini/Micro や Leonardo には対応していません。Arduino UNO はサポートが始まったようですが、使えるメモリ量が少ないので制限があるようです。
PCとUSBでArduinoを接続して Mobiflightを動作させると、FSXやMSFS2020から FSUIPCを通して 飛行中のデータを入出力できます。また、SimConnectWASMオフセットを使えば FSUIPC を使わない方法も選べますが、コントロールの選択肢を広げるためにも FSUIPCも導入しておいたほうがいいでしょう。
Mobiflight 9.1からは Analog input ができるようになりました。可変抵抗器を接続して 0~5Vの電圧の変化を 0~1024の値として入力できます。 出力は Shift Register (Output Shifter)が増えました。74HC595などを使って シリアルーパラレル変換を行い、
出力ポートの数を増やすことができます。 (Enhance the number of I/Os by using a Shift Register)
Mobiflight 9.3 から Input Shiftregister (Input Shifter) が加わりました。入力ポートを増やすことができ、スイッチをたくさん接続するときに便利です。スイッチパネルなどに使っています。
using 74HC165
Mobiflight 9.4から 増えたのは Input Multiplexers です。74HC4067 を使って 16個の入力を4ビットで時分割して受け付けるものです。
Mobiflight10.0.2 になって LED7セグドライバに MAX7219だけでなく、TM1637も使えるようになりました。
FSUIPC の Offset
FSUIPC(Flight Simulator Universal Inter-Process Communication)はフライトシミュレーターのデータを私たちが扱えるように取り出してくれます。
そのデータはメモリ上に置かれます。そのメモリのアドレスは意識しなくてもいいのですが、並んでいる必要なデータがどこにあるか 示してくれるのが オフセットoffset です。基準点からの距離で表した位置(相対的なアドレス)といってもいいと思います。その相対アドレスにアクセスすることでデータを読み出します。データの種類によって1byteのデータから 8byteのデータまでその大きさsizeが違います。また、データは読み出すだけでなく、ここへ書き込むことで フライトシミュレーターへコントロールデータを送ることもできます(すべてではありませんが)。
FSUIPC Offset一覧
ステッピングモーター
高度計などのメーター類の作成に使ったのは 小さなステッピングモーター 28BYJ-48 です。静かに力強く しっかり回転してくれます。
動作電圧5Vのものを使いましたが、電流がやや多いことに注意が必要です。実測してみると ステッピングモーターを5個接続したときに、1.3Aの電流がモーターの止まっている状態でも流れていました。モーター1個あたり250mAくらいです。USBから取り出せるのは 500mAまでですが、Arduinoの端子から取り出せるのは 40mAまでが定格です。なので 別に電源が必要です。
また、これだけの電流のエネルギーは発熱にもつながりますので モーターの放熱にも留意がいります。
ULN2003 を使ったドライバボードが付属していました。このICは出力を大きくするトランジスタアレイです。 7個入っていますが、ステッピングモーター1台には4つ使うだけなのでトランジスタが3つ余っています。また、この小型のドライバボードをたくさん並べるのは配線接続も不安定になるので、ひとつにまとめたボードに作りかえました。デュポンワイヤー(ブレッドボード用のジャンパ線)での接続は試作やテスト以外は避けるべきです。接触不良や配線の間違いの原因になります。