goo blog サービス終了のお知らせ 

Like The Wind

「メモ程度に。」な趣味ブログです

まさかの Microsoft FlightSimulator

2019年06月10日 | フライトシム
突然 Microsoftが FlightSimulatorをE3で発表したようです

Microsoft Flight Simulator - E3 2019 - Announce Trailer


いや、正直 Microsoft Flightでコケてしまったので
もうやらないだろうと思っていたら、まさかの再始動(?)
カジュアル路線で失敗したので、今回はガッツリ シミュレーターとして仕上げてくるのか・・・
動画を見る限りは、かなりグラフィックが強化されているみたいですね
空港内部の建物等を見る限りは、UE4まではいかないまでも、今どきのシェーダーが入ってるみたいです

一番の問題は、P3DやX-Planeに舵を切ったサードパーティが、果たして再び戻ってくるのかじゃないでしょうか?
ただ、そうは言っても FSXの互換性は P3Dが引き継いでいるのだから、そこはもう次世代のプラットフォームを
作ってほしいという気持ちもあるんですけどね

ソフトウェアの価格も、前回みたいに月額いくら・・・みたいな課金制にすると、ユーザーも戻ってこない可能性もあるし
ちょっと期待しつつも、不安要素がいっぱいですね

SimVim Cockpits

2018年12月16日 | フライトシム
以前ブログで紹介した ArdSimXですが、現在新しいプロジェクトとして SimVim Cockpitの開発が進んでいます
以前はプロジェクトへの寄付により限定参加ができるようになっていましたが、現在は安定板のみ無料でダウンロードができるようになりました
(現在の開発バージョンは 0.9.28 です)

ArdSimXとの違い
従来の ArdSimXと SimVimCockpitの違いは、大きく2つあります

ArdSimXは、複数の Arduinoを使って入出力をコントロールするという考え方ですが、SimVim Cockpitは 1個の Arduinoをホストコントローラーにして
可能な限りの入出力をコントロールしようという考え方で作られています

画像:SimVimCockpit

Arduino本体には入出力I/Oの数に限りがあるため、ArdSimXでは入出力に必要な個数分 Arduinoを用意する必要がありましたが
Arduinoも1個あたり数千円するので結構なコストになってしまいます
反面、SimVimCockpitで推奨されているI/Oを拡張するマルチプレクサICは基板込みで 1個数百円程度で入手することも可能なので
大幅なコスト削減が可能です

画像:SimVimCockpit


もう一つの違いは、WEB上のコンフィグツールのみで全ての設定を行うという部分です

ArdSimXでもWEB上のコンフィグツールを利用して ある程度設定を行う仕組みですが、複雑なデバイスの動きは ユーザーが
独自に Arduinoにスケッチを書き加えてカスタマイズする必要がありました

前回 ArdSimXを使って製作中だった ElectricPanelも、DC/ACセレクタースイッチの条件によって表示内容を変える必要があったため
独自にプログラムを書いていましたが、SimVim Cockpitではこの行程が削除されており、複雑な動きも含めて全てWEB上のコンフィグだけで
完結させるということになっています
なので、手作業で Arduinoにスケッチをコンパイルして書き込むという作業がなくなり、Arduinoへのファームウェアの書き込みは
X-Plane11を起動後、SimVimCockpitプラグイン上から直接行われるようになりました


また、ver0.9.18で Arduinoとのシリアル通信ドライバが更新され、各パラメーターの更新の際にプラグインを再読み込みする必要がなくなりました
ver0.9.17以前かなり不安定で、コンフィグデータの再読み込み中に Arduinoが反応しなくなったりしていたのですが、現在はかなり安定しています


制作中のElectricPanelについて・・
SimVimCockpitのWEBコンフィグツールでは、まだ全ての航空機のパラメータは実装されていませんが
B737をはじめ、いくつかの機体専用のパラメータが徐々に追加されています(パラメータの実装状況は、こちらのページで確認できます)
バージョンアップ毎に対応するパラメータは増えてきていますが、Ver0.9.23で ElectricPanel回りのパラメータが追加されました

SimVimでは、基本的に X-Plane11の Datarefsパラメータに対応するのですが、一部の機体(特に B737 ZiboMOD)や
ElectricPanelのような一部特殊なパラメータは、専用のSimVimカスタムパラメータが提供されています


今のところまだ完全に動作しきれていない(ゲーム内のElectricPanelの表示と相違がある)のですが、バージョンアップ毎に
良くなってきているので、これまで ArdSimX用に合わせて制作していた ElectricPanelは、SimVim用に仕様を変更しようと思います

X-Plane11で使用している B737

2018年07月15日 | フライトシム

X-Plane11で利用できるBoeing 737の機体は、最初から入っているデフォルトの B737の他に
x737project
B737-800X ZIBO mod

また、有料では
IXEG 737 Classic

などが有名どころかと思います

最近自分が使用しているのは、Ziboさんという方が製作している B737-800X Zibo mod が中心なのですが
この機体、Ziboさんの活動がすさまじく、だいたい 3日に1回アップデートしてるんじゃないかというくらいのペースで
新しいバージョンがアップデートされてきます

気が付けば、X-Plane11を起動するたびにアップデートしてるんじゃないかというくらいで
自動更新ではないので手動での作業になるのですが、とても更新が追いつきません(苦笑

そんな Ziboさんの B737 ですが、ここで初回のインストール手順とアップデート手順をまとめておこうかと思います




◆Zibo Mod B737のダウンロード

Ziboさんの フォーラムページ に記載があるように、modのアップデートファイルは
こちら の Google Docsにアップロードされているので、最新のバージョンをダウンロードします

Google Docsには、常にいくつかのバージョンがアップロードされているので、最新のファイルをクリック


ファイルの詳細が表示されたら、画面右上のダウンロードアイコンをクリック


ウイルススキャンが出来ない旨の告知が出ますが
「エラーを無視してダウンロード」をクリックするとPCにダウンロードされます

※ ダウンロード後、個別にウイルスチェックを行って、ファイルに問題がないか確認してください


◆FMODのダウンロード

上記のフォーラムでも案内されている、Zibo Mod で利用するサウンドファイルをダウンロードします
FMODも ZiboMod同様、こちらのGoogle Docsにアップロードされています

フォルダがいくつか表示されますが、「RCOMENDED ST...」をクリックします


ファイルは1個だけですが「AXP IMMERSION PA...」をクリック


ファイルの詳細が表示されたら、ZiboMod同様右上のダウンロードボタンをクリックします


こちらもウイルススキャンが出来ない旨表示されますが、そのままダウンロードしてください



◆Zibo Mod B737のインストール

インストールはとても簡単です
ダウンロードした Zibo Modの圧縮フォルダを展開し、出来た「B737-800X」フォルダを X-Plane11の Aircraftフォルダにコピーします
「\X-Plane 11\Aircraft」


続けて、FMODファイルを展開して、中にある「fmod」というフォルダを、Zibo Modフォルダの中にコピーします
「\X-Plane 11\Aircraft\B737-800X」


これでインストールは完了です!

後は、X-Plane11を起動して、航空機の中に新しいB737-800Xが表示されているので、選択して開始します


コックピットが表示されたら、FMCの画面を拡大して Zibo Modと FMODが正しく読み込まれたかを確認します



◆Zibo Mod B737のアップデート

Zibo Modは、アップデートの度にフルバージョンで提供されているので
新しいバージョンへアップデートするときは、Aircraftフォルダの「B737-800X」を削除(または退避)して
新規インストールと同じ手順で新しいフォルダをコピーするだけです


12月26日追記:
現在は、アップデートポリシーが変更されており
フルバージョンで提供さるのは、マイナーバージョンのリリース時のみとなっており
hotfixバージョンは修正差分のみの提供となっているようです
そのため、最新版を再現したい場合はマイナーバージョンのフルバージョンをダウンロードした後
同バージョンの修正内容をすべて含んだ fixバージョンをダウンロードして上書きする必要があります

例: ZiboMOD ver3.31の最新版を構築したい場合
・Release 3.31 (full package)をダウンロード
・Release 3.31z (fix only)をダウンロードして、上記フォルダへ上書き

上記 3.31z には、リリースノートに「include fixies 3.31a..3.31y」という記載があり
過去の全ての修正を含んでいることを表しているので、それ以前のファイルは必要ありません
しかし、パッチにっては過去の修正差分を含んでいない物があります
・Release 3.31g2 (hotfix only)
 You need installed correctly release 3.31g before install this hoitfix (3.31 full + 3.31g fix)

この場合は、記載通りの構成を構築した後で上書きするものとなっているのでご注意ください


※ZiboMod737を構築後、独自にカスタマイズしたファイルや Plugin等がある場合は、あらかじめそのファイルを退避して
新しいフォルダへコピーするのを忘れないようにしてください
せっかくカスタマイズした設定等が消えてしまうので・・・

Electric Panel の製作 その8

2018年06月19日 | フライトシム
ロータリースイッチ用の固定版の制作です

最初にバックパネルに固定用のネジ穴を開けるのですが、アクリル板なので強力な助っ人を用意しました!

・・さすがにこのパネルを割るわけにはいかないので、かなり慎重になってます(苦笑

実際削り始めると、鉛筆削りのような削りカスが出てきて面白いですね!
切削面も普通のドリルビットで開けるより綺麗な断面になります

さらに、バックパネルはフロントパネルとピッタリ重なるので、ネジ頭がパネルに埋まるように
リューターでザグリ(?)を作りました

写真の角度だとわかりづらいですが、パネルの面にネジの頭が埋まってます

次にロータリースイッチの固定版ですが、バックパネルに開けた穴の位置に合わせて同じ穴を開け
アクリルカッターでガリガリ削って不要な部分を切り落とします

3mmのアクリル板でしたが、30回くらい削ったところでバリっと切り離せました

固定版をバックパネルに取り付けるとこんな感じです

この角度で見ると違和感ないですが、実は正面から見ると微妙に傾いてます(汗

アクリル用ビットが 6mまでしかなかったので、そこからロータリースイッチのネジ部の軸が通るまで
リューターで削って広げました(若干いびつな形状になりましたが・・・)

角はヤスリで削って丸めて、まあまあうまくできた感じです

バックパネルに取り付けて・・


フロントパネルを合わせてみたところです

スイッチの軸が結構長いので、切断しようかと思ったんですが
間に 2cmのスペーサーを入れて取り付けたところ、ちょうどいい長さになりました

あとは、ロータリースイッチをスイッチ(つまみ)に固定するだけですが
スイッチにあらかじめ埋め込まれている 2個のイモネジを締めることで軸に固定することができます
ただこれ盲点というか、このイモネジをきつく締めた状態のまま使用すると
数年後にスイッチが割れるかもしれません

下の写真は、2012年に制作した DUパネルで使ったスイッチですが、久しぶりに棚から出してみたら見事に割れてました

完成した後、ほとんど使わずに保管していたのですが・・・
左右両方ともほぼ同じ位置で同じ割れ方をしてるので、なにか特性みたいなのがあるんでしょうね

そんなわけで、今回はスイッチの軸に若干穴をあけてイモネジを緩めに締めてみました

他のスイッチ類も取り付けて、やっと本来の ElectricPanelらしくなってきました!

ロータリースイッチ 8接点スイッチ

2018年06月09日 | フライトシム
OpenCockpitより、8接点のロータリースイッチが届きました

ついでに、スイッチキャップも注文しました

色は青ではなくて黒一色になってました


この 8接点スイッチは、持っていた 12接点スイッチとほぼ同じ大きさ・・・というより
まんま 12接点のスイッチと同じですね、寸法やラッチのキツさも同じです

端子部を見ると・・・

え、12接点?

この8接点スイッチは、12接点のロータリースイッチと全く同じハウジングを使っているみたいです
端子は最初から 4本を折った状態になっていて、有効な接点は 1,2,4,5,7,8,10,11 の 8端子
ツマミを回すとちゃんと 45度回転しているので、確かに合ってます。


そんなわけで、これを使っていこうと思うのですが、このロータリースイッチを固定するための板ですね・・

ElectricPanelのバックパネルにあるネジ穴に合わせると、かなり微妙な形状の板を作ることになりそうです


上部2か所のネジ穴と、真ん中に1つネジ穴を増やして3点止めで固定すればよさそうですが
上部のスペースが狭すぎて割れそうな予感しかしません(汗

もとからあるネジ穴は使わず、新規に固定用の穴を3つ開けて
シンプルに固定する感じでもいいかもしれません

文字が来ない位置にネジ穴をあければ、バックライトも当てられそうです

Fuji3さん案のボックスもありですよね

ちょっとイメージに沿っているかわかりませんが、接着すればネジ穴を意識せずに固定できるので
自由度は高いかもしれません

さて、どうするか・・・

Electric Panel の製作 その7.1

2018年05月20日 | フライトシム

LEDの表示はだいたい上手くいったので
次はセレクタースイッチのコントロールをやってみようと思います


ElectricPanelのセレクタースイッチは、角度 45度の 8ポジションスイッチなのですが
1回路 8接点のロータリースイッチってあまりないんですね

1回路12接点だとどこでもあるのですが、ぱっと探してみたところ手軽なものは無く
見つかったのは、基板実装タイプのミニロータリースイッチでした

画像:スイッチサイエンス

以前、Hispapanelsで取り扱ってた同系統モデルを購入して DUパネルを作るときに使用したのですが
ラッチが甘めで、くるくる回してるとさらに甘くなってくる感じだったのであまり好きじゃありません

今のところ見つけられたのは OpenCockpitsで扱ってる青軸のスイッチだけのようなので
とりあえずいくつか発注してみました

画像: OpenCockpit

さて到着まで時間があるので、手元にある 12接点のスイッチで一度スイッチの動きを
試してみようかと思ったのですが・・・

改めて見ると、Sismoのバックパネルには、ロータリースイッチを固定できませんでした(汗
通常のトグルスイッチはパネルに固定できるようになっているんですが、ロータリースイッチは固定できないみたいです

スイッチ部分の軸だけが通るようになっていて、ネジ部は入らないので本体が固定できません

パネルに取り付ける方法としては、パネルの穴を大きくしてロータリースイッチのネジ部分ごと貫通させればと考えましたが
パネルはバックパネルとフロントパネルの2枚あるので、そもそもネジ部の長さが足りず表面まで出てこないのと、
スイッチ本体をパネルに密着させてしまうと、あとでバックライトをつけることが出来なくなりそうなんですよね

となると隙間を開けて別の板に固定するしかなさそうですが、ネジの位置が微妙でどうするか悩み中です。。

Electric Panel の製作 その6

2018年05月17日 | フライトシム

X-Plane11の内部パラメータの取得方法が分かったので、本題の Electric Panelに表示されるパラメータについて調べてみます

今回対象にしているのは「B737 ZIBO MOD ver3.26I」ですが
この機体には、今のところ Electric Panelの DCセレクタに「AUX BAT」がありません

  X-Plane11 ZIBO MOD v3.26I        PMDG 737NGX

Sismoのパネルや PMDG737NGXにはあるので、もしかしたら今後追加されるかもしれませんが
とりあえず今回は、無い状態で進めていきます

まずは DCセレクタで表示す「DC VOLTS」の値を DataRefsToolで探します


最初は「dc_voltmeter_value」が そのままパネルに表示されるのかと思いましたが、そうでもないようです
このパラメータの値が一致するのは、DCセレクタが TR1、TR2、TR3 の時だけでした
DCセレクタを回して、メインバッテリースイッチをON/OFFしたり、STANDBY POWERスイッチをON/OFFに切り替えながら
変化する値を調べて、どのパラメータの数値が表示されているのか探ってみました

DC VOLTS
STBY PWRsim/cockpit2/electrical/battery_voltage_indicated_volts[2]
BAT BUSsim/cockpit2/electrical/battery_voltage_indicated_volts[1]
BATsim/cockpit2/electrical/battery_voltage_indicated_volts[1]
TR1sim/cockpit2/electrical/dc_voltmeter_value
TR2sim/cockpit2/electrical/dc_voltmeter_value
TR3sim/cockpit2/electrical/dc_voltmeter_value
TEST

「BAT BUS」と「BAT」の値が同じでいいのかイマイチ微妙ですが、だいたいこんな感じだと思います
「battery_voltage_indicated_volts」は配列データになっているので、パラメータの後ろの [n] は、カラム番号です

同じように他の数値も順番に調べてみました

DC AMPS
STBY PWR
BAT BUS
BATsim/cockpit2/electrical/battery_amps
TR1sim/cockpit2/electrical/bus_load_amps[1]
TR2sim/cockpit2/electrical/bus_load_amps[2]
TR3sim/cockpit2/electrical/bus_load_amps[3]
TEST

「STBY PWR」「BAT BUS」の時は何も表示されないので、とりあえず割り当て無しにしています

AC VOLTS
STBY PWR不明
GRD PWRlaminar/B738/ac_volt_mode1
GEN1laminar/B738/ac_volt_mode2
APU GENlaminar/B738/ac_volt_mode3
GEN2laminar/B738/ac_volt_mode4
INVlaminar/B738/ac_volt_mode5
TEST

「STBY PWR」にセットした時の AC VOLTSのパラメータは今のところ見つけられていません
「laminar/B738/ac_volt_mode0」というパラメータが無いので、別の値だと思うのですが・・・

AC AMPS
STBY PWR
GRD PWRsim/cockpit/electrical/gpu_amps
GEN1sim/cockpit2/electrical/generator_amps[1]
APU GENsim/cockpit2/electrical/APU_generator_amps
GEN2sim/cockpit2/electrical/generator_amps[2]
INV
TEST

地上電源を接続した状態で、ACセレクタを「GRD PWR」にしたときの「AC AMPS」表示は
現在のバージョンのB737 ZIBO MODでは表示されないようです

ちなみに PMDG737NGXの場合、同じ状態で ACセレクタを「GRD PWR」の位置にすると電流が表示されます

PMDG737NGX

ただ DataRefsの中に「gpu_amps」というパラメータがあり、[GRD PWR]スイッチを ONにすると数値が上がり
[GRD PWR]をOFFにすると 0 になるため、内部的にはこの値が該当すると予想して一応割り当ててみました


CPS FREQ
STBY PWRlaminar/B738/ac_freq_mode0
GRD PWRlaminar/B738/ac_freq_mode1
GEN1laminar/B738/ac_freq_mode2
APU GENlaminar/B738/ac_freq_mode3
GEN2laminar/B738/ac_freq_mode4
INVlaminar/B738/ac_freq_mode5
TEST

「CPS FREQ」はそのままのパラメータが用意してあるので、これを割り当てるだけで良さそうです


次に、スイッチ類のパラメータです
AC、DC各セレクタがどの位置にあるかで表示する値を変化させる必要があるので、これらの数値も必須です
DC SELECTlaminar/B738/knob/dc_power
AC SELECTlaminar/B738/knob/ac_power

最後にMAINTボタンのパラメータもありました
この機体では MAINTボタンを押したときの動きは再現されませんが、ボタンを押したことが分かれば
Arduino側でそれっぽい動きはできそうです
MAINTlaminar/B738/push_button/acdc_maint


まだ「STBY PWR」時の「AC VOLTS」のみまだわかっていませんが
とりあえず現状わかっているパラメータのみで、ArdSimXで使えるようにしてみます

ArdSimX側のコンフィグですが、今回も ArdSimXのWEBサイトは使わず、
直接コンフィグファイル「data.cfg」を書き換えます
@ ================= CONFIG =================

*1-0U
[O]
1 3 laminar/B738/knob/dc_power
2 3 sim/cockpit2/electrical/battery_voltage_indicated_volts 1
3 3 sim/cockpit2/electrical/battery_voltage_indicated_volts 2
4 3 sim/cockpit2/electrical/dc_voltmeter_value
5 3 sim/cockpit2/electrical/battery_amps
6 3 sim/cockpit2/electrical/bus_load_amps 1
7 3 sim/cockpit2/electrical/bus_load_amps 2
8 3 sim/cockpit2/electrical/bus_load_amps 3
10 3 laminar/B738/knob/ac_power
11 3 laminar/B738/ac_freq_mode0
12 3 laminar/B738/ac_freq_mode1
13 3 laminar/B738/ac_freq_mode2
14 3 laminar/B738/ac_freq_mode3
15 3 laminar/B738/ac_freq_mode4
16 3 laminar/B738/ac_freq_mode5
17 3 laminar/B738/ac_volt_mode0
18 3 laminar/B738/ac_volt_mode1
19 3 laminar/B738/ac_volt_mode2
20 3 laminar/B738/ac_volt_mode3
21 3 laminar/B738/ac_volt_mode4
22 3 laminar/B738/ac_volt_mode5
23 3 sim/cockpit2/electrical/APU_generator_amps
24 3 sim/cockpit2/electrical/generator_amps 1
25 3 sim/cockpit2/electrical/generator_amps 2
26 3 sim/cockpit/electrical/gpu_amps


Arduinoに、これに対応したスケッチを書いていきます
//---------------------------------------------
// ardSimX and MAX7219
//---------------------------------------------

#include < LedControl.h >
#include < ArdSimX.h >

// Arduino I/Oピン定義
// 12: DataIn(DIN)
// 11: CLK
// 10: LOAD(CS)

// 2個のMAX7219を使用
LedControl lc = LedControl(12, 11, 10, 2);

int ELEC_DC_SELECT = 0;
int ELEC_AC_SELECT = 0;
float ELEC_DC_AMPS[6] = {0,0,0,0,0,0};
float ELEC_DC_VOLTS[6] = {0,0,0,0,0,0};
float ELEC_CPS_FREQ[6] = {0,0,0,0,0,0};
float ELEC_AC_VOLTS[6] = {0,0,0,0,0,0};
float ELEC_AC_AMPS[6] = {0,0,0,0,0,0};


void setup() {

  // MAX7219 初期設定
  for (int index=0; index < lc.getDeviceCount(); index++) {
    lc.shutdown(index, false);
    lc.setIntensity(index, 4);
    lc.clearDisplay(index);
  }
  
  // ardSimX 初期設定
  BoardNumber 1;
}

void loop() {
  ArdSimScan;
}

// Electric Panel LED表示
void ElecPanelDigit(int digit, float value) {
  char characters[3];

  // "value" が 999 ならブランク
  if ( value == 999 ) {
    characters[2] = " ";
    characters[1] = " ";
    characters[0] = " ";
  } else {
    // 整数のみ Char型に変換
    dtostrf(value, 3, 0, characters);    
  }

  int dan = 0;
  if ( digit > 5 ) {
    dan = 1;
    digit = digit-6;
  }

  lc.setChar(dan, digit,       characters[2], false);
  lc.setChar(dan, (digit + 1), characters[1], false);
  lc.setChar(dan, (digit + 2), characters[0], false);

}

// ArdSimX Option
void ProgOut(byte id, float val) {
  switch (id) {
    case 1:
      ELEC_DC_SELECT = val;

      // DC SELECT is "STBY PWR"
      if ( ELEC_DC_SELECT == 0 ) {
        ElecPanelDigit( 3, 999 );
        ElecPanelDigit( 12, ELEC_DC_VOLTS[0] );

      // DC SELECT is "BAT BUS"
      } else if ( ELEC_DC_SELECT == 1 ) {
        ElecPanelDigit( 3, 999 );
        ElecPanelDigit( 12, ELEC_DC_VOLTS[1] );

      // DC SELECT is "BAT"
      } else if ( ELEC_DC_SELECT == 2 ) {
        ElecPanelDigit( 3, ELEC_DC_AMPS[2] );
        ElecPanelDigit( 12, ELEC_DC_VOLTS[1] );

      // DC SELECT is "TR1"
      } else if ( ELEC_DC_SELECT == 3 ) {
        ElecPanelDigit( 3, ELEC_DC_AMPS[3] );
        ElecPanelDigit( 12, ELEC_DC_VOLTS[3] );

      // DC SELECT is "TR2"
      } else if ( ELEC_DC_SELECT == 4 ) {
        ElecPanelDigit( 3, ELEC_DC_AMPS[4] );
        ElecPanelDigit( 12, ELEC_DC_VOLTS[3] );

      // DC SELECT is "TR3"
      } else if ( ELEC_DC_SELECT == 5 ) {
        ElecPanelDigit( 3, ELEC_DC_AMPS[5] );
        ElecPanelDigit( 12, ELEC_DC_VOLTS[3] );

      // DC SELECT is "TEST"
      } else if ( ELEC_DC_SELECT == 6 ) {
        ElecPanelDigit( 3, 999 );
        ElecPanelDigit( 12, 999 );
      }
      break;
    case 2:
      ELEC_DC_VOLTS[1] = val;
      if ( ELEC_DC_SELECT == 1 || ELEC_DC_SELECT == 2 ) {
        ElecPanelDigit( 12, ELEC_DC_VOLTS[1] );
      }
      break;
    case 3:
      ELEC_DC_VOLTS[0] = val;
      if ( ELEC_DC_SELECT == 0 ) {
        ElecPanelDigit( 12, ELEC_DC_VOLTS[0] );
      }
      break;
    case 4:
      ELEC_DC_VOLTS[3] = val;
      if ( ELEC_DC_SELECT == 3 || ELEC_DC_SELECT == 4 || ELEC_DC_SELECT == 5 ) {
        ElecPanelDigit( 12, ELEC_DC_VOLTS[3] );
      }
      break;
    case 5:
      ELEC_DC_AMPS[2] = val;
      if ( ELEC_DC_SELECT == 2 ) {
        ElecPanelDigit( 3, ELEC_DC_AMPS[2] );
      }
      break;
    case 6:
      ELEC_DC_AMPS[3] = val;
      if ( ELEC_DC_SELECT == 3 ) {
        ElecPanelDigit( 3, ELEC_DC_AMPS[3] );
      }
      break;
    case 7:
      ELEC_DC_AMPS[4] = val;
      if ( ELEC_DC_SELECT == 4 ) {
        ElecPanelDigit( 3, ELEC_DC_AMPS[4] );
      }
      break;
    case 8:
      ELEC_DC_AMPS[5] = val;
      if ( ELEC_DC_SELECT == 5 ) {
        ElecPanelDigit( 3, ELEC_DC_AMPS[5] );
      }
      break;
    case 10:
      ELEC_AC_SELECT = val;

      // AC SELECT is "STBY PWR"
      if ( ELEC_AC_SELECT == 0 ) {
        ElecPanelDigit( 0, ELEC_CPS_FREQ[0] );
        ElecPanelDigit( 6, ELEC_AC_VOLTS[0] );
        ElecPanelDigit( 9, 999 );

      // AC SELECT is "GRD PWR"
      } else if ( ELEC_AC_SELECT == 1 ) {
        ElecPanelDigit( 0, ELEC_CPS_FREQ[1] );
        ElecPanelDigit( 6, ELEC_AC_VOLTS[1] );
        ElecPanelDigit( 9, ELEC_AC_AMPS[1] );

      // AC SELECT is "GEN1"
      } else if ( ELEC_AC_SELECT == 2 ) {
        ElecPanelDigit( 0, ELEC_CPS_FREQ[2] );
        ElecPanelDigit( 6, ELEC_AC_VOLTS[2] );
        ElecPanelDigit( 9, ELEC_AC_AMPS[2] );

      // AC SELECT is "APU GEN"
      } else if ( ELEC_AC_SELECT == 3 ) {
        ElecPanelDigit( 0, ELEC_CPS_FREQ[3] );
        ElecPanelDigit( 6, ELEC_AC_VOLTS[3] );
        ElecPanelDigit( 9, ELEC_AC_AMPS[3] );

      // AC SELECT is "GEN2"
      } else if ( ELEC_AC_SELECT == 4 ) {
        ElecPanelDigit( 0, ELEC_CPS_FREQ[4] );
        ElecPanelDigit( 6, ELEC_AC_VOLTS[4] );
        ElecPanelDigit( 9, ELEC_AC_AMPS[4] );

      // AC SELECT is "INV"
      } else if ( ELEC_AC_SELECT == 5 ) {
        ElecPanelDigit( 0, ELEC_CPS_FREQ[5] );
        ElecPanelDigit( 6, ELEC_AC_VOLTS[5] );
        ElecPanelDigit( 9, 999 );

      // AC SELECT is "TEST"
      } else if ( ELEC_AC_SELECT == 6 ) {
        ElecPanelDigit( 0, 999 );
        ElecPanelDigit( 6, 999 );
        ElecPanelDigit( 9, 999 );
      }
      break;
    case 11:
      ELEC_CPS_FREQ[0] = val;
      if ( ELEC_AC_SELECT == 0 ) {
        ElecPanelDigit( 0, ELEC_CPS_FREQ[0] );
      }
      break;
    case 12:
      ELEC_CPS_FREQ[1] = val;
      if ( ELEC_AC_SELECT == 1 ) {
        ElecPanelDigit( 0, ELEC_CPS_FREQ[1] );
      }
      break;
    case 13:
      ELEC_CPS_FREQ[2] = val;
      if ( ELEC_AC_SELECT == 2 ) {
        ElecPanelDigit( 0, ELEC_CPS_FREQ[2] );
      }
      break;
    case 14:
      ELEC_CPS_FREQ[3] = val;
      if ( ELEC_AC_SELECT == 3 ) {
        ElecPanelDigit( 0, ELEC_CPS_FREQ[3] );
      }
      break;
    case 15:
      ELEC_CPS_FREQ[4] = val;
      if ( ELEC_AC_SELECT == 1 ) {
        ElecPanelDigit( 0, ELEC_CPS_FREQ[4] );
      }
      break;
    case 16:
      ELEC_CPS_FREQ[5] = val;
      if ( ELEC_AC_SELECT == 1 ) {
        ElecPanelDigit( 0, ELEC_CPS_FREQ[5] );
      }
      break;
    case 17:
      ELEC_AC_VOLTS[0] = val;
      if ( ELEC_AC_SELECT == 0 ) {
        ElecPanelDigit( 6, ELEC_AC_VOLTS[0] );
      }
      break;
    case 18:
      ELEC_AC_VOLTS[1] = val;
      if ( ELEC_AC_SELECT == 1 ) {
        ElecPanelDigit( 6, ELEC_AC_VOLTS[1] );
      }
      break;
    case 19:
      ELEC_AC_VOLTS[2] = val;
      if ( ELEC_AC_SELECT == 2 ) {
        ElecPanelDigit( 6, ELEC_AC_VOLTS[2] );
      }
      break;
    case 20:
      ELEC_AC_VOLTS[3] = val;
      if ( ELEC_AC_SELECT == 3 ) {
        ElecPanelDigit( 6, ELEC_AC_VOLTS[3] );
      }
      break;
    case 21:
      ELEC_AC_VOLTS[4] = val;
      if ( ELEC_AC_SELECT == 4 ) {
        ElecPanelDigit( 6, ELEC_AC_VOLTS[4] );
      }
      break;
    case 22:
      ELEC_AC_VOLTS[5] = val;
      if ( ELEC_AC_SELECT == 5 ) {
        ElecPanelDigit( 6, ELEC_AC_VOLTS[5] );
      }
      break;
    case 23:
      ELEC_AC_AMPS[3] = val;
      if ( ELEC_AC_SELECT == 3 ) {
        ElecPanelDigit( 9, ELEC_AC_AMPS[3] );
      }
      break;
    case 24:
      ELEC_AC_AMPS[2] = val;
      if ( ELEC_AC_SELECT == 2 ) {
        ElecPanelDigit( 9, ELEC_AC_AMPS[2] );
      }
      break;
    case 25:
      ELEC_AC_AMPS[4] = val;
      if ( ELEC_AC_SELECT == 4 ) {
        ElecPanelDigit( 9, ELEC_AC_AMPS[4] );
      }
      break;
    case 26:
      ELEC_AC_AMPS[1] = val;
      if ( ELEC_AC_SELECT == 1 ) {
        ElecPanelDigit( 9, ELEC_AC_AMPS[1] );
      }
      break;
  }
}

ざっくりとこんな感じでしょうか
行頭のInclude分は、ブログ用にカッコにスペースを入れてますが実際は隙間なしで書きます

Arduinoに保存したら、早速 X-Plane11を起動し、接続してみました

とりあえず意図通りに数値が取得できたようです

一応、動画も撮ってみました

X-Plane11側の ElectricPanelに表示される数値は、小数点以下1桁で出るようですが
自作した ElectricPanelに表示される数値は、四捨五入した整数で出しています

ArdSimXで DataRefsの値を直接取ってみる

2018年05月11日 | フライトシム
前回、DataRefsの MCPの COURSEのパラメータが分かったので、これを ArdSimXから Arduino に渡してみようと思います
ついでに、ArdSimXと Electric PanelのLED表示のテストも兼ねて。

まずは DataRefsパラメータですが

キャプテン側 「laminar/B738/autopilot/course_pilot」
コパイロット側 「laminar/B738/autopilot/course_copilot」

ですね
この値を、ArdSimXのコンフィグ「data.cfg」に記述します

@ ================= INFO =================

Board #1 - Arduino (USB) -------------------------------------------------------

@ ================= CONFIG =================

*1-1U
[O]
1 0 laminar/B738/autopilot/course_pilot
2 0 laminar/B738/autopilot/course_copilot

コンフィグを直接書く方法は公式サイトでも解説されていないので、あくまで自分が調べた範囲ですが
今のところわかっているのは、左から

ID      : ArdSimXが、Arduinoに渡すパラメータID
データタイプ : データ型の区別のようです
パラメータ名 :
カラム    : パラメータの値が配列だった場合のカラム番号

という感じになっているようです

次に Arduino側の設定ですが、表示する LEDに MAX7219を使用しているため そのままでは動かせません
(74HC595(シフトレジスタ)には対応しているので、もしかしたら動くのかもしれませんが・・・)
そのため、Arduino側で MAX7219用のライブラリを使って独自にプログラムを書きます

まず LedControlというライブラリを GitHubから「LedControl-1.0.6.zip」をダウンロードして
ArduinoIDEを起動し、ArdSimX同様 Zip形式のライブラリをインストールします


インストールできたら、Arduinoのスケッチに独自のプログラムを書き足していきます
#include <LedControl.h>
#include <ArdSimX.h>

LedControl lc = LedControl(12, 11, 10, 2);

float COURSE_PILOT = -1;
float COURSE_COPILOT = -1;
char characters[3];

void setup() {
  for (int index=0; index < lc.getDeviceCount(); index++) {
    lc.shutdown(index, false);
    lc.setIntensity(index, 5);
    lc.clearDisplay(index);
  }

  BoardNumber 1;
}

void loop() {
  ArdSimScan;
}

void ProgOut(byte id, float val) {
  switch (id) {
    case 1:
      if ( COURSE_PILOT != val ) {
        COURSE_PILOT = val;
        ElecPanelDigit(3, val);
      }
      break;
    case 2:
      if ( COURSE_COPILOT != val ) {
        COURSE_COPILOT = val;
        ElecPanelDigit(0, val);
      }
      break;
  }
}

void ElecPanelDigit(int digit, float value) {
  dtostrf(value, 3, 0, characters);    
  if ( value < 100 ) { characters[0] = '0'; }
  if ( value < 10 ) { characters[1] = '0'; }
 
  lc.setChar(0, digit,       characters[2], false);
  lc.setChar(0, (digit + 1), characters[1], false);
  lc.setChar(0, (digit + 2), characters[0], false);
}

ArdSimXは、Arduino側で独自のプログラムを書けるように ProgOut関数が用意されているので
ここに data.cfgに記述したIDを書くだけで、ArdSimXから渡された値を取得できるようになっています

プログラムが書けたらコンパイルし、Arduinoに書き込んで準備完了です

初期設定時に MAX7219ライブラリの "clearDisplay" を呼び出しているので、最初はLEDは消灯します

ArdSimXと Arduinoをリンクすると LEDの表示が "000" になります。
この時点で、X-Plane11から Arduinoに COURSEデータが送られたことが分かります

ElectricPanelの「DC AMPS」がキャプテン側 COURSE、「CPS FREQ」がコパイロット側 COURSEの値です

あとは、MCPのキャプテン・コパイロットそれぞれの COURSEセレクトを回し、それぞれのCOURSEの値に連動して
ElectricPanelの LEDが変化すれば成功です!  ・・・とはいえ、ElecPanelに COURSEが出るのは変な感じですね(汗



今回も Youtubeに動画をアップしてみました

X-Plane11 内部パラメーターの入出力と 「DataRefs」

2018年05月09日 | フライトシム
ArdSimXは、公式WEBでコンフィグが作れるようになっていますが
ここで作成した「data.cfg」ファイルを見ると、中身はこんな感じになっています

@ ================= INFO =================

Board #1 - Arduino (USB) -------------------------------------------------------

---- Digital pins: ----

13 - Seatbelt Sign On



@ ================= CONFIG =================

*1-1U
[O]
13L 0 sim/cockpit2/annunciators/fasten_seatbelt 1

@ ====== CONFIG ・・ から下が実際のコンフィグになりますが
最終行の sim/cockpit2/annunciators/fasten_seatbelt という部分が、X-Plane11の内部パラメーターになっていて
もともと X-Plane11側でデータ入出力用に用意してあるパラメータを指定しているようです
P3D(FSX)でいうところの FSUIPCのような感じですね
この部分を直接編集できれば、公式WEBのコンフィグで選べない項目でもある程度自由に設定できると思います

まずは、X-Plane11が持っているパラメータにどんなものがあるのかを知る必要がありますが
このパラメータは出力用と入力用に分かれていて、それぞれ X-Plane11インストールフォルダ
\X-Plane 11\Resources\plugins の中にあります


出力用のパラメータが DataRefs.txt
入力用のパラメータが Commands.txt
に記述されています
しかし、これだとひたすらパラメーターが書かれているだけで、何を意味するのかが不明なものもあるかと思うので
X-Plane Dataref Search というWEBサイトで調べると、任意のパラメータが検索できたり、意味も書いてあるので便利です

DataRefToolについて
各パラメータの値が、シミュレーターの実行中どんな値になっているのかを調べたい場合
毎回 ArdSimXで出力させて調べるのはかなり困難なので、DataRefsの各パラメータを簡単に取得にできるものがないかを調べたところ
「DataRefTool」というプラグインが見つかりました

DataRefTool は、DataRefEditor というプラグインを改良したツールで、DataRefsパラメーターを X-Plane11の画面上に表示します
細かい色分けやフィルター機能があるので、パラメーターを調べるのにはかなり便利です

DataRefToolの利用方法
こちら のGitHubにアクセスして、README上部の「Download from GitHub」というリンクから最新のダウンロードページに飛ぶので
そこで「DataRefTool_2018_**_**.zip」というファイルをダウンロードして展開し、X-Plane11の Pluginフォルダにコピーします


X-Plane11を起動したら、メニューの「Plugins」から「DataRefTool」→「View DataRefs」をクリックします


DataRefsToolが起動し、画面にリアルタイムのDataRefsパラメータが一覧で表示されます


各パラメータの色は

水色・・・DataRefsパラメータ(リアルタイムに値が変更されたもの)
白色・・・DataRefsパラメータ(データに変更がないもの)
黄色・・・Command(リアルタイムに値が変更されたもの)
緑色・・・Command(データに変更がないもの)

水色、黄色のパラメータは、変更された瞬間にリストの色が変わりますが
その後変更がなければ、時間がたつにつれ徐々に白色、緑色に変色していきます(だいたい 10秒程度)


右側のバーはリストのスクロール、下側の各ボタンはクリックして緑色になると有効になります

[.*] 正規表現を使った検索を有効にする
[Aa] 大文字小文字判定を有効にする
[Ch] パラメータの値による表示フィルタ
  [ch](緑)・・値が変更されたパラメータのみ表示
  [CH](緑)・・値が変更されたパラメータのみ表示
  [Ch](灰)・・すべてのパラメータを表示
[d+c] パラメータの種類
  [dat](緑)・・DataRefsのみ
  [com](緑)・・Commandのみ
  [d+c](灰)・・両方を表示

上記ボタンの右側にある入力フィールドに検索キーワードを入力すると、即座にフィルタとして絞り込みができます

例えば MCPの COURSEの値を調べる場合、入力フィールドに "course"と入力します
すると、DataRefToolの画面上には、パラメータ名に "course" が含まれているものだけが表示されます

プラグインのタイトル欄に、検索結果の該当件数(28件)が表示されます

この状態で MCPのパイロット側 COURSEセレクタ を加算方向に回し「102」にセットすると
コマンドパラメータ「laminar/B738/autopilot/course_pilot_up」が緑色から黄色に変わり
DataRefsパラメータ「laminar/B738/autopilot/course_pilot」が白色から水色に変わり、値が「102」に変わります

このことから、COURSEセレクタを加算方向に動作させるための入力は「laminar/B738/autopilot/course_pilot_up」
現在の COURSEの値は「laminar/B738/autopilot/course_pilot」として出力されることが分かります

ちなみに DataRefsTool は、X-Plane11の標準的なパラメータ以外にも、Addonで追加した機体に DataRefs が含まれていれば
そのまま表示することができるようです
(有料の機体等意図的に暗号化してあるようなものは表示できないようです)

X-Plane11 と ArdSimX で Arduino を使ってみる

2018年05月06日 | フライトシム

フライトシム向けではないのですが、Arduinoという汎用電子インターフェースを使ってみます

SISMOの SimCard や、OpenCockpitの MasterCard 等いくつか所有していますが
これらはLEDやサーボ、ディスプレイ等目的に合った拡張ボードを接続してコントロールする仕組みなのに対し
Arduino は、様々な電子部品を単体でコントロールできるよう設計されたデバイスで
LEDやスイッチ、アナログ、モーター、LCD、ディスプレイ等プログラム次第で大抵のものは動かせます

公式製品以外に多数のメーカーから互換製品が販売されていて、大きさも小型の物から入出力の多いものまで多数種類があり
近年、Raspberry Pi等のワンボードマイコンブームなこともあってか、今はどこでも普通に買えるようになりました
価格も 1,000円~6,000円程度で結構お手軽で、2年ほど前に Arduino UNO R3 を購入したのですが
これだけで何でも出来てしまうので、結構面白くてIoTっぽくセンサーや制御デバイス等活用していました


そこで、Arduinoをコックピット作りに使えないかと思って調べてみると、いくつかのプロジェクトが見つかりました
さすがに Arduino単体では入出力端子の数が少ないので、これだけで全てのスイッチ類をコントロールすることは出来ませんが
汎用のIC等を使ってポートを増やせば、自由度は広がりそうです
(実は、今回製作している ElectricPanelもArduinoで動かすのを前提で作っていました)


そして、今回はX-Plane11と Arduinoを繋ぐために ArdSimX というプラグインを使用します

ArdSimXは、P3D(FSX)で言うところの FSUIPC+SIOC のようなイメージですね
SIOCは、OpenCockpitのメインボードや専用のインターフェースをコントロールできますが
ArdSimXは、Arduino という汎用ワンボードマイコンを利用して、各種デバイスをコントロールすることができます

画像:ArdSimX

ArdSimXは、X-Plane11上で動かすプラグインと、Arduinoに書き込むプログラムの2つを組み合わせて
任意に連動させたいデータを指定して動かします

X-Plane11(ArdSimX Plugin) <==> Arduino

他のプログラム等は一切起動する必要はないので、シンプルな構成になりますね
ちなみに ArdSimXは、現在 SimVimCockpitという新しいプロジェクトへ移行中です

画像:SimVimCockpit

ArdSimXが、基本的に複数の Arduinoを使って機器をコントロールする考え方なのに対して
SimVimCockpitは、できるだけ少ないArduinoで、大量の機器をコントロールしていこうという方向性で
作られているようなので、こちらがリリースされればかなり面白い使い方ができるんじゃないかと思います

また、こちらは有料ですが AirManagerというツールもあるようです
あまり詳しく調べていませんが、Arduinoを動かすだけでなく Rasberry-Piや、独自の計器パネルのUIを表示できるなど
どちらかというと Prosim737に近いパッケージじゃないかと思います

ちなみに、P3D(FSX)でも数年前から MobiFlight というプロジェクトが立ち上がっていて
このツールを利用すれば、同じようなことができます
こちらは FSUIPCが間に入るので、SIOCと同じような構成になります

P3D(FSUIPC) <==> MFConnecter <==> Arduino
(X-Planeでも MobiFlightを使えるらしいのですが、今のところ未調査です)

また、今は開発されていないようですが Link2FS や、直接PMDG737NGXと連動するように作られた
CockpitX というツールも FSUIPCを経由して Arduinoをコントロールすることができます


さて、ということで今回は ArdSimXを使って X-Plane11の アナウンシェーターと
LEDをリンクするところまでやってみようと思います

ArdSimX ダウンロード
公式サイト のサイトの右側のダウンロードリンクから「ArdSimX X-Plane Plugin」と
「ArdSimX Library」(Arduino用のライブラリ)をダウンロードします

Arduinのセットアップ
Arduino IDEを起動して、メニューの「スケッチ」→「ライブラリをインクルード」→「.ZIP形式のライブラリをインストール」で
ダウンロードした "ArdSimX_Library.zip" ファイルを読み込みます


Arduinのスケッチ
Arduino IDEで、以下のプログラムを書きます
#include <ArdSimX.h>

void setup() {
    BoardNumber 1;
}

void loop() {
     ArdSimScan;
}

void ProgOut(byte id, float val) {
}

基本的なI/O制御はライブラリで処理されるので、非常にシンプルです
をクリックしてコンパイルして、問題なければ をクリックして Ardinoに書き込みます

これで、Arduino の準備は完了です

ArdSimXプラグインの準備
ダウンロードした ArdSimXのプラグインファイル "ArdSimX_Plugin.zip" を展開して、できた "ArdSimX" フォルダを
X-Plane11のインストールフォルダ \X-Plane 11\Resources\plugins にコピーします


ArdSimX のコンフィグレーション
ArdSimXのコンフィグは、基本的には 公式WEBサイトのコンフィグレーションで作成するようになっています
(公式サイトに 設定ガイド があります)

最初に Arduinoのタイプ、USB接続かLAN接続かを選択し
次に、使用する Arduinoの基板のI/Oピンをクリックして目的のデバイスを選択します(ここでは 13番ピンを選択)


次に、使用したいモジュールの種類を選択(ここでは DIGITAL OUTPUTを選択)すると、出力データの選択欄が出てくるので
その中から、シュミレーターから出力したいデータデータを選択します


左のリストから「Seatbelt Sign On」を選択して「Write」ボタンを押すと、Arduinoのピンに出力が割り当てられます


割り当てが完了したら、「SAVE」ボタンを押してコンフィグファイルを保存します


PCに「data.cfg」というファイルが保存されるので、このファイルを先ほどの ArdSimXのプラグインフォルダの下に移動します
\X-Plane 11\Resources\plugins\ArdSimX


ここまでできたらほぼ準備完了です


LEDの接続
上で設定した Arduinoの13番ピンに、LEDのアノード(足の長いほう)を接続して
その隣の GNDにLEDのカソード(足の短いほう)を接続します
(LED保護のために、ブレッドボード等で保護抵抗を間に入れてください)

X-PlaneとArduinoの接続
ArduinoとPCを接続して X-Plane11を起動し、B737を呼び出します
メニューの「Plugins」→「ArdSimX」→「Status」をクリックして ArdSimXのステータス画面を開きます


Connection status のリストに「1 USB Arduino #1, 1 outputs」と表示されていれば
ArdSimXプラグインが Arduinoと接続されていることを表しています


おそらくX-Plane11を起動したての状態では、Arduinoと正しく接続できていないと思うので
「Enable USB」のチェックボックスをクリックしてチェックを外し、接続を解除してから
もう一度チェックボックスをクリックして接続してみてください

改めて、Connection status のリストに「1 USB Arduino #1, 1 outputs」が出てくれば接続成功です
この表示が出てこない場合、以下の項目をチェックしてみてください

・ArduinoがPCに接続できていない
・Arduinoにプログラムが正しく書き込まれていない
・Arduinoの状態がおかしい

Arduino本体のリセットボタンで、正常に戻る場合があるので、「Enable USB」のチェックを外し
リセットボタンを押してから、再び「Enable USB」にチェックしてみてください

動作確認
737のオーバヘッドの「FASTEN BELTS」スイッチを ONにして
Arduinoに接続した LEDが点灯すれば成功です!


スイッチ等の入力デバイスも、これと同じように割り当てるだけなので
そのままでも ArduinoのI/Oポートの数分は入出力をコントロールできると思います

また、公式サイトのコンフィグでは設定できない項目もあるので
慣れてくれば直接「data.cfg」ファイルを編集して書き換えたほうが早いかもしれません
そのあたりも今度やってみようと思います