Like The Wind

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

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に表示される数値は、四捨五入した整数で出しています


最新の画像もっと見る

コメントを投稿