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 PWR | sim/cockpit2/electrical/battery_voltage_indicated_volts[2] |
BAT BUS | sim/cockpit2/electrical/battery_voltage_indicated_volts[1] |
BAT | sim/cockpit2/electrical/battery_voltage_indicated_volts[1] |
TR1 | sim/cockpit2/electrical/dc_voltmeter_value |
TR2 | sim/cockpit2/electrical/dc_voltmeter_value |
TR3 | sim/cockpit2/electrical/dc_voltmeter_value |
TEST |
「BAT BUS」と「BAT」の値が同じでいいのかイマイチ微妙ですが、だいたいこんな感じだと思います
「battery_voltage_indicated_volts」は配列データになっているので、パラメータの後ろの [n] は、カラム番号です
同じように他の数値も順番に調べてみました
DC AMPS
STBY PWR | |
BAT BUS | |
BAT | sim/cockpit2/electrical/battery_amps |
TR1 | sim/cockpit2/electrical/bus_load_amps[1] |
TR2 | sim/cockpit2/electrical/bus_load_amps[2] |
TR3 | sim/cockpit2/electrical/bus_load_amps[3] |
TEST |
「STBY PWR」「BAT BUS」の時は何も表示されないので、とりあえず割り当て無しにしています
AC VOLTS
STBY PWR | 不明 |
GRD PWR | laminar/B738/ac_volt_mode1 |
GEN1 | laminar/B738/ac_volt_mode2 |
APU GEN | laminar/B738/ac_volt_mode3 |
GEN2 | laminar/B738/ac_volt_mode4 |
INV | laminar/B738/ac_volt_mode5 |
TEST |
「STBY PWR」にセットした時の AC VOLTSのパラメータは今のところ見つけられていません
「laminar/B738/ac_volt_mode0」というパラメータが無いので、別の値だと思うのですが・・・
AC AMPS
STBY PWR | |
GRD PWR | sim/cockpit/electrical/gpu_amps |
GEN1 | sim/cockpit2/electrical/generator_amps[1] |
APU GEN | sim/cockpit2/electrical/APU_generator_amps |
GEN2 | sim/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 PWR | laminar/B738/ac_freq_mode0 |
GRD PWR | laminar/B738/ac_freq_mode1 |
GEN1 | laminar/B738/ac_freq_mode2 |
APU GEN | laminar/B738/ac_freq_mode3 |
GEN2 | laminar/B738/ac_freq_mode4 |
INV | laminar/B738/ac_freq_mode5 |
TEST |
「CPS FREQ」はそのままのパラメータが用意してあるので、これを割り当てるだけで良さそうです
次に、スイッチ類のパラメータです
AC、DC各セレクタがどの位置にあるかで表示する値を変化させる必要があるので、これらの数値も必須です
DC SELECT | laminar/B738/knob/dc_power |
AC SELECT | laminar/B738/knob/ac_power |
最後にMAINTボタンのパラメータもありました
この機体では MAINTボタンを押したときの動きは再現されませんが、ボタンを押したことが分かれば
Arduino側でそれっぽい動きはできそうです
MAINT | laminar/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に表示される数値は、四捨五入した整数で出しています