X-Plane B737-800X
自作オートパイロットパネルの作成

2022年2月16日

このパネルは上のB737-800X Ziboこの部分を作成したものです。飛行する上で殆どの時間このオートパイロットのスイッチを操作していると思います。これを手元で操作できるようになるとどんなに飛行が楽になるか多分多くのシュミレーター愛好者は感じていると思います。

色んなプラグインがあります。すべてマウスかジョイスティック、キーボードを使ってやっているとおもいますが、X-Planeとはこれらを通して間接的にやっているわけですね。この作成したパネルは直接スイッチを操作するので直感的で抜群の操作感があります。皆さんも一度作成に挑戦してみませんか?

といいたいのですが、そのためにはこの開発にはお金と時間を費やしてきました。スイッチ類、その他の部品は最安値の商品ばかりを使っています。
一度に全ての部品を揃えたわけではないので、そんなに大変だったという感じはないのですが、しかし部品点数が多くなるのでトータルすると結構な値段になったということになります。

定年退職後の趣味として初めたので時間はありました。仕事をしながらやるというのはかなりキビシイでしょう。プログラミングの勉強から初め、電子の勉強、半田付けから基盤の制作まで色々と試しながらやってみました。時間は正確にはどのくらいかかったか把握はしていないですが2~3年、全くの独学で初めたので時間だけがどんどん進んでいった感じです。

今の時代、ネットワークがあるからできることだと思います。日本ではまったく制作に関して情報が得られませんでしたが、外国のサイト情報には本当に助かりました。感謝の気持ちで一杯です。それとともに、今の時代に生まれていて本当に良かったと思っています。

上が実物、下が基本的なスイッチの配線図になる。他のスイッチは下の図と同じでTeensyのピン位置が違うだけである。

このプロジェクトは、ArduinoによるX-Plane B737-800X のオートパイロットパネルのプログラムです。
このまま、コピーしてArduinoに貼り込んだら使えます。
ただし、TeensyControlsプラグインとArduinoにTeensyduinoをインストールが完了していることが必要です。

このプラグラムはX-Plaenのコマンドを使用して作成していますのでほとんど完全に動作します。しかし完璧でない部分もあるかもしれません。是非皆さんもこのコードを基準に自分用のパネルを作成してみて下さい。勉強のための時間とお金がやはり多少はかかりますが、使い心地は申し分ありません。

X-Plane B737-800X Arduinoプログラミング

Arduinoを使っています。Teensy++2.0にインストールしています。


//B737-800X 専用
  //2018年5月24日 作製開始
  //daataref は void setup() に記述されている。

  /* Teensy2.0使用ピン番号------------------
   * 0:F/D プッシュスイッチ(コマンド)
   * 1:A/T ARM プッシュスイッチ(コマンド)
   * 2:N1 プッシュスイッチ(コマンド)
   * 3:SPEED プッシュスイッチ(コマンド)
   * 4:VNAV プッシュスイッチ(コマンド)
   * 5:LVL CHG プッシュスイッチ(コマンド)
   * 6:SPD INTV プッシュスイッチ(コマンド)。このピンは、Temmsy++2.0のLED表示ピン 、動作がおかしい場合、プルアップ抵抗を入れること。
   * 7:COURSE エンコーダ(FlightSimInteger)
   * 8:COURSE エンコーダ(FlightSimInteger)
   * 9:AirSeed エンコーダ(FlightSimInteger)
   * 10:AirSeed エンコーダ(FlightSimInteger)
   * 11:HDG SEL プッシュスイッチ(コマンド)
   * 12:LNAV プッシュスイッチ(コマンド)
   * 13:VCR LOC プッシュスイッチ(コマンド)
   * 14:APP プッシュスイッチ(コマンド)
   * 15:BANK ANGLE 5モード切り替え スイッチ(up用)
   * 16:HEADING エンコーダ(FlightSimInteger)
   * 17:HEADING エンコーダ(FlightSimInteger)
   * 18:ALT HOLD プッシュスイッチ(コマンド)
   * 19:V/S プッシュスイッチ(コマンド)
   * 20:A/P ENGAGE CMD プッシュスイッチ(コマンド)
   * 21:DISENGAGE プッシュスイッチ(コマンド)
   * 22:
   * 23:
   * 24:VERT SPEED エンコーダ(FlightSimInteger)
   * 25:VERT SPEED エンコーダ(FlightSimInteger)
   * 26:C/O プッシュスイッチ(コマンド)
   * 27:BANK ANGLE 5モード切り替え スイッチ(down用)
   * 28:ALT INTV プッシュスイッチ(コマンド)
   * 29:ALTITUDE エンコーダ(FlightSimInteger)
   * 30:ALTITUDE エンコーダ(FlightSimInteger)
   * 31:
   * 32:
   * 33:
   * 34:
   * 35:ledPin X-Planeとの接続を確認するLED
   * 36:
   * 37:
   * 38:
   * 39:
   * 40:
   * 41:
   * 42:、
   * 43:74HC595(LED表示)シフトレジスタ、data
   * 44:74HC595(LED表示)シフトレジスタ、lach
   * 45:74HC595(LED表示)シフトレジスタ、clock
   */
 
  #include 
  #include 
  #include 
  #include 
  #undef round   //なくても動作する
  
  const int ledPin = 35;
  
  /////////////////////////////////////////////////////////////////////////
  // 74HC595(LED表示)シフトレジスタ 共通スクリプト //
  /////////////////////////////////////////////////////////////////////////
  int SER_dataPin = 43;   //pin 14(DS-data) on the 75HC595
  int RCLK_latchPin = 44;  //pin 12(ST_CP-latch) on the 75HC595
  int SRCLK_clockPin = 45; //pin 11(SH_CP-clock) on the 75HC595

  #define number_of_74hc595s 3    //シフトレジスタ74HC595の数
  #define numOfRegisterPins number_of_74hc595s * 8    //ここは変更しないこと
  boolean registers[numOfRegisterPins];  //上のレジスタの数を反映させる共通スクリプト
  
  void clearRegisters(){
    for(int i = numOfRegisterPins - 1; i >=  0; i--){
       registers[i] = LOW;  //最初にLEDを全消灯(LOW)、LED点灯確認はHIGHにするとわかる(X-Planeは起動しないこと)
                           //確認の為にスタート時にLEDをON,完全にX-Planeが起動したらOFFになる。
    }
  }

  void writeRegisters(){
    digitalWrite(RCLK_latchPin, LOW);
    for(int i = numOfRegisterPins - 1; i >=  0; i--){
      digitalWrite(SRCLK_clockPin, LOW);
      int val = registers[i];
      digitalWrite(SER_dataPin, val);
      digitalWrite(SRCLK_clockPin, HIGH);
    }
    digitalWrite(RCLK_latchPin, HIGH);
  }
  // 個々のピンをHIGかLOWに設定する
  void setRegisterPin(int index, int value){  //indexでピン位置、valueでLOWかHIGH
    registers[index] = value;
  }
  // 74HC595(LED表示)シフトレジスタ共通ここまで ///////////////////////////////
  
  elapsedMillis inactivityTimeout;// 無活動タイムアウト
  
  
  
  
  /////////////////////////////////////////////////////////////////////////
  /////////// スイッチ Teensy++2.0 直結ピン //////////////////
  /////////////////////////////////////////////////////////////////////////
  //===============================================================================================
  /////////// 0番 F/D プッシュスイッチ(コマンド)//////////////////
  //===============================================================================================
  const int FDSwPin = 0;                    //teensy 0ピン
  Bounce FDSwitch = Bounce (FDSwPin, 100);    //チャタリング除去のためここだけ数値を上げている
  FlightSimCommand FD_Sw;
  //===============================================================================================
  /////////// 1番 A/T ARM プッシュスイッチ(コマンド)//////////////////
  //===============================================================================================
  const int ATarmSwPin = 1;                  //teensy 1ピン
  Bounce ATarmSwitch = Bounce(ATarmSwPin, 5);
  FlightSimCommand AutoThrottleARM_Sw;
  //===============================================================================================
  /////////// 2番 N1 プッシュスイッチ(コマンド)//////////////////
  //===============================================================================================
  const int N1SwPin = 2;                     //teensy 2ピン
  Bounce N1Switch = Bounce(N1SwPin, 5);        
  FlightSimCommand N1_Sw;
  //===============================================================================================
  /////////// 3番 SPEED プッシュスイッチ(コマンド)//////////////////
  //===============================================================================================
  const int SPEEDSwPin = 3;                     //teensy 3ピン
  Bounce SPEEDSwitch = Bounce(SPEEDSwPin, 5);        
  FlightSimCommand SPEED_Sw;
  //===============================================================================================
  /////////// 4番 VNAV プッシュスイッチ(コマンド)//////////////////
  //===============================================================================================
  const int VNAVSwPin = 4;                     //teensy 4ピン
  Bounce VNAVSwitch = Bounce(VNAVSwPin, 5);        
  FlightSimCommand VNAV_Sw;
  //===============================================================================================
  /////////// 5番 LVL CHG プッシュスイッチ(コマンド)//////////////////
  //===============================================================================================
  const int LVL_CHGSwPin = 5;                     //teensy 5ピン
  Bounce LVL_CHGSwitch = Bounce(LVL_CHGSwPin, 5);        
  FlightSimCommand LVL_CHG_Sw;
  //===============================================================================================
  /////////// 26番 C/O プッシュスイッチ(コマンド)//////////////////
  //===============================================================================================
  //6番ピン(Teensy++2.0 LED点滅用)の動作がおかしいので26ピンに変更した。
  const int COSwPin = 26;                     //teensy 14ピン
  Bounce COSwitch = Bounce(COSwPin, 5);        
  FlightSimCommand CO_Sw;
  //===============================================================================================
  /////////// 26番 SPD INTV プッシュスイッチ(コマンド)//////////////////
  //===============================================================================================
  //6番ピン(LED点滅)の動作がおかしいので26ピンに変更した。
  const int SPD_INTVSwPin = 6;                     //teensy 14ピン
  Bounce SPD_INTVSwitch = Bounce(SPD_INTVSwPin, 5);        
  FlightSimCommand SPD_INTV_Sw;
  //===============================================================================================
  /////////// 11番 HDG SEL プッシュスイッチ(コマンド)//////////////////
  //===============================================================================================
  const int HDG_SELSwPin = 11;                     //teensy 6ピン
  Bounce HDG_SELSwitch = Bounce(HDG_SELSwPin, 5);        
  FlightSimCommand HDG_SEL_Sw;
  //===============================================================================================
  /////////// 12番 LNAV プッシュスイッチ(コマンド)//////////////////
  //===============================================================================================
  const int LNAVSwPin = 12;                     //teensy 7ピン
  Bounce LNAVSwitch = Bounce(LNAVSwPin, 5);        
  FlightSimCommand LNAV_Sw;
  //===============================================================================================
  /////////// 13番 VOR LOC プッシュスイッチ(コマンド)//////////////////
  //===============================================================================================
  const int VOR_LOCSwPin = 13;                     //teensy 8ピン
  Bounce VOR_LOCSwitch = Bounce(VOR_LOCSwPin, 5);        
  FlightSimCommand VOR_LOC_Sw;
  //===============================================================================================
  /////////// 14番 APP プッシュスイッチ(コマンド)//////////////////
  //===============================================================================================
  const int APPSwPin = 14;                     //teensy 9ピン
  Bounce APPSwitch = Bounce(APPSwPin, 5);        
  FlightSimCommand APP_Sw;
  //===============================================================================================
  /////////// 15、27番 BANK ANGLE 5モード切り替え スイッチ(コマンド)//////////////////
  //===============================================================================================
  int BankAngle_up_SwPin = 15;
  Bounce BankAngle_up_SwitchPin = Bounce (BankAngle_up_SwPin, 5);
  FlightSimCommand BankAngle_up;
  
  int BankAngle_dn_SwPin = 27;
  Bounce BankAngle_dn_SwitchPin = Bounce (BankAngle_dn_SwPin, 5);
  FlightSimCommand BankAngle_dn;
  //===============================================================================================
  /////////// 18番 ALT HOLD プッシュスイッチ(コマンド)//////////////////
  //===============================================================================================
  const int ALT_HOLDSwPin = 18;                     //teensy 10ピン
  Bounce ALT_HOLDSwitch = Bounce(ALT_HOLDSwPin, 5);        
  FlightSimCommand ALT_HOLD_Sw;
  //===============================================================================================
  /////////// 19番 V/S プッシュスイッチ(コマンド)//////////////////
  //===============================================================================================
  const int VSSwPin = 19;                     //teensy 11ピン
  Bounce VSSwitch = Bounce(VSSwPin, 5);        
  FlightSimCommand VS_Sw;
  //===============================================================================================
  /////////// 20番 A/P ENGAGE CMD プッシュスイッチ(コマンド)//////////////////
  //===============================================================================================
  const int AP_ENGAGE_CMDSwPin = 20;                     //teensy 12ピン
  Bounce AP_ENGAGE_CMDSwitch = Bounce(AP_ENGAGE_CMDSwPin, 5);        
  FlightSimCommand AP_ENGAGE_CMD_Sw;
  //===============================================================================================
  /////////// 21番 DISENGAGE プッシュスイッチ(コマンド)//////////////////
  //===============================================================================================
  const int DISENGAGESwPin = 21;                     //teensy 13ピン
  Bounce DISENGAGESwitch = Bounce(DISENGAGESwPin, 5);        
  FlightSimCommand DISENGAGE_Sw;
  //===============================================================================================
  /////////// 26番 ALT INTV プッシュスイッチ //////////////////
  //===============================================================================================
  //6番ピン(LED点滅)の動作がおかしいので26ピンに変更した。
  const int ALT_INTVSwPin = 28;                     //teensy 14ピン
  Bounce ALT_INTVSwitch = Bounce(ALT_INTVSwPin, 5);        
  FlightSimCommand ALT_INTV_Sw;
  
  
  
  
  
  /////////////////////////////////////////////////////////////////////////////
  /////////// 74HC595(LED表示)Teensy++2.0 〜シフトレジスタ経由 //////////////////
  /////////////////////////////////////////////////////////////////////////////
  //番号は74HC595シフトレジスタの出力ピン番号
  //==============================================================================================
  /////////// 74HC595(LED表示)シフトレジスタ F/D ランプ //////////////////
  //==============================================================================================
  const int FD_74HC595_Pin = 5;  //74HC595ピン番号
  FlightSimInteger FD_SwLED;     //データはフロートだが「FlightSimInteger」で大丈夫。
  //==============================================================================================
  /////////// 74HC595(LED表示)シフトレジスタ A/T ARM ランプ//////////////////
  //==============================================================================================
  const int AT_ARM_74HC595_Pin = 4;    //74HC595ピン番号
  FlightSimInteger AT_ARM_SwLED;        //データはフロートだが「FlightSimInteger」で大丈夫          
  //==============================================================================================
  /////////// 74HC595(LED表示)シフトレジスタ N1 ランプ//////////////////
  //==============================================================================================
  const int N1_74HC595_Pin = 3;  //74HC595ピン番号
  FlightSimInteger N1_SwLED;     //データはフロートだが「FlightSimInteger」で大丈夫  
  //==============================================================================================
  /////////// 74HC595(LED表示)シフトレジスタ SPEED ランプ //////////////////
  //==============================================================================================
  const int SPEED_74HC595_Pin = 2;  //74HC595ピン番号
  FlightSimInteger SPEED_SwLED;     //データはフロートだが「FlightSimInteger」で大丈夫。
  //==============================================================================================
  /////////// 74HC595(LED表示)シフトレジスタ VNAV ランプ //////////////////
  //==============================================================================================
  const int VNAV_74HC595_Pin = 1;  //74HC595ピン番号
  FlightSimInteger VNAV_SwLED;     //データはフロートだが「FlightSimInteger」で大丈夫。
  //==============================================================================================
  /////////// 74HC595(LED表示)シフトレジスタ LVL CHG ランプ //////////////////
  //==============================================================================================
  const int LVL_CHG_74HC595_Pin = 0;  //74HC595ピン番号
  FlightSimInteger LVL_CHG_SwLED;     //データはフロートだが「FlightSimInteger」で大丈夫。
  //==============================================================================================
  /////////// 74HC595(LED表示)シフトレジスタ HDG SEL ランプ //////////////////
  //==============================================================================================
  const int HDG_SEL_74HC595_Pin = 6;  //74HC595ピン番号
  FlightSimInteger HDG_SEL_SwLED;     //データはフロートだが「FlightSimInteger」で大丈夫。
  //==============================================================================================
  /////////// 74HC595(LED表示)シフトレジスタ LNAV ランプ //////////////////
  //==============================================================================================
  const int LNAV_74HC595_Pin = 7;  //74HC595ピン番号
  FlightSimInteger LNAV_SwLED;     //データはフロートだが「FlightSimInteger」で大丈夫。
  //==============================================================================================
  /////////// 74HC595(LED表示)シフトレジスタ VOR LOC ランプ //////////////////
  //==============================================================================================
  const int VOR_LOC_74HC595_Pin = 8;  //74HC595ピン番号
  FlightSimInteger VOR_LOC_SwLED;     //データはフロートだが「FlightSimInteger」で大丈夫。
  //==============================================================================================
  /////////// 74HC595(LED表示)シフトレジスタ APP ランプ //////////////////
  //==============================================================================================
  //8ピンが動作しないので13ピンを使っている。
  const int APP_74HC595_Pin = 9;  //74HC595ピン番号
  FlightSimInteger APP_SwLED;     //データはフロートだが「FlightSimInteger」で大丈夫。
  //==============================================================================================
  /////////// 74HC595(LED表示)シフトレジスタ ALT HLD ランプ //////////////////
  //==============================================================================================
  const int ALT_HLD_74HC595_Pin = 10;  //74HC595ピン番号
  FlightSimInteger ALT_HLD_SwLED;     //データはフロートだが「FlightSimInteger」で大丈夫。
  //==============================================================================================
  /////////// 74HC595(LED表示)シフトレジスタ V/S ランプ //////////////////
  //==============================================================================================
  const int VS_74HC595_Pin = 11;  //74HC595ピン番号
  FlightSimInteger VS_SwLED;     //データはフロートだが「FlightSimInteger」で大丈夫。
  //==============================================================================================
  /////////// 74HC595(LED表示)シフトレジスタ A/P ENGAGE CMD ランプ //////////////////
  //==============================================================================================
  const int AP_ENGAGE_CMD_74HC595_Pin = 12;  //74HC595ピン番号
  FlightSimInteger AP_ENGAGE_CMD_SwLED;     //データはフロートだが「FlightSimInteger」で大丈夫。
  
  
  
  //-----------エンコーダ-------------------------
  //===============================================================================================
  /////////// 7-8番 COURSE エンコーダ //////////////////
  //===============================================================================================
  const int COURSE_EncR_pin = 8;//8
  const int COURSE_EncL_pin = 7;//7

  Encoder COURSE_Enc(COURSE_EncR_pin, COURSE_EncL_pin);
  short COURSE_EncPrev = 0;  //エンコーダの逆回転
  FlightSimInteger COURSE_Encoder;
  //===============================================================================================
  /////////// 9-10番 AirSeed エンコーダ //////////////////
  //===============================================================================================
  const int AirSp_EncR_pin = 10;    //10
  const int AirSp_EncL_pin = 9;    //9
  
  Encoder AirSp_Enc(AirSp_EncR_pin, AirSp_EncL_pin);      //エンコーダピン
  short AirSp_EncPrev = 0;
  FlightSimFloat AirSpeed;
  FlightSimInteger AirSpeed_is_mach;
  FlightSimInteger Autopilot_mode;
  //===============================================================================================
  /////////// 16-17番 HEADING エンコーダ //////////////////
  //===============================================================================================
  const int HDG_SEL_EncR_Pin = 17;  //17
  const int HDG_SEL_EncL_Pin = 16;  //16
  
  Encoder HDG_SEL_Enc(HDG_SEL_EncR_Pin, HDG_SEL_EncL_Pin);
  short HDG_SEL_EncPrev = 0;  //エンコーダの逆回転
  FlightSimInteger HDG_SEL_Encoder;
  //===============================================================================================
  /////////// 29-30番 ALTITUDE エンコーダ //////////////////
  //===============================================================================================
  const int ALT_HLD_EncR_Pin = 29;
  const int ALT_HLD_EncL_Pin = 30;
  
  Encoder ALT_HLD_Enc(ALT_HLD_EncR_Pin, ALT_HLD_EncL_Pin);
  short ALT_HLD_EncPrev = 0;  //エンコーダの逆回転
  FlightSimInteger ALT_HLD_Encoder;
  //===============================================================================================
  /////////// 24-25番 VERT SPEED エンコーダ //////////////////
  //===============================================================================================
  const int VS_EncR_Pin = 25;
  const int VS_EncL_Pin = 24;
  
  Encoder VS_Enc(VS_EncR_Pin, VS_EncL_Pin);
  short VS_EncPrev = 0;  //エンコーダの逆回転
  FlightSimInteger VS_Encoder;
  
  
  
  
  
  
   
  
   

void setup() {
  pinMode(ledPin, OUTPUT);
  
  /////////////////////////////////////////////////////////////////////////
  /////////// setup内 スイッチ Teensy 直結ピン //////////////////
  /////////////////////////////////////////////////////////////////////////
  //===============================================================================================
  /////////// setup内 0番 F/D トグルスイッチ teensy 0ピン //////////////////
  //===============================================================================================
  pinMode (FDSwPin, INPUT_PULLUP);
  FD_Sw = XPlaneRef("laminar/B738/autopilot/flight_director_toggle");
  FDSwitch.rebounce(500);   //あったほうがいいかも、ご動作するから。
  //===============================================================================================
  /////////// setup内 1番 A/T ARM トグルスイッチ teensy 1ピン //////////////////
  //===============================================================================================
  pinMode(ATarmSwPin, INPUT_PULLUP);                  
  AutoThrottleARM_Sw = XPlaneRef("laminar/B738/autopilot/autothrottle_arm_toggle");
  ATarmSwitch.rebounce(500);
  //===============================================================================================
  /////////// setup内 2番 N1 プッシュスイッチ teensy 2ピン//////////////////
  //===============================================================================================
  pinMode(N1SwPin, INPUT_PULLUP);
  N1_Sw = XPlaneRef("laminar/B738/autopilot/n1_press");
  //===============================================================================================
  /////////// setup内 3番 SPEED プッシュスイッチ teensy 3ピン//////////////////
  //===============================================================================================
  pinMode(SPEEDSwPin, INPUT_PULLUP);
  SPEED_Sw = XPlaneRef("laminar/B738/autopilot/speed_press");
  //===============================================================================================
  /////////// setup内 4番 VNAV プッシュスイッチ teensy 4ピン//////////////////
  //===============================================================================================
  pinMode(VNAVSwPin, INPUT_PULLUP);
  VNAV_Sw = XPlaneRef("laminar/B738/autopilot/vnav_press");
  //===============================================================================================
  /////////// setup内 5番 LVL CHG プッシュスイッチ teensy 5ピン//////////////////
  //===============================================================================================
  pinMode(LVL_CHGSwPin, INPUT_PULLUP);
  LVL_CHG_Sw = XPlaneRef("laminar/B738/autopilot/lvl_chg_press");
  //===============================================================================================
  /////////// setup内 14番 C/O プッシュスイッチ teensy 14ピン//////////////////
  //===============================================================================================
  pinMode(COSwPin, INPUT_PULLUP); 
  CO_Sw = XPlaneRef("laminar/B738/autopilot/change_over_press");
  //===============================================================================================
  /////////// setup内 14番 SPD_INTV プッシュスイッチ teensy 14ピン//////////////////
  //===============================================================================================
  pinMode(SPD_INTVSwPin, INPUT_PULLUP); 
  SPD_INTV_Sw = XPlaneRef("laminar/B738/autopilot/spd_interv_pos");
  //===============================================================================================
  /////////// setup内 14番  プッシュスイッチ teensy 14ピン//////////////////
  //===============================================================================================
  pinMode(COSwPin, INPUT_PULLUP); 
  CO_Sw = XPlaneRef("laminar/B738/autopilot/change_over_press");
  //===============================================================================================
  /////////// setup内 6番 HDG SEL プッシュスイッチ teensy 6ピン//////////////////
  //===============================================================================================
  pinMode(HDG_SELSwPin, INPUT_PULLUP);
  HDG_SEL_Sw = XPlaneRef("laminar/B738/autopilot/hdg_sel_press");
  //===============================================================================================
  /////////// setup内 Part-B LNAV プッシュスイッチ teensy 7ピン//////////////////
  //============================================================================================
  pinMode(LNAVSwPin, INPUT_PULLUP); 
  LNAV_Sw = XPlaneRef("laminar/B738/autopilot/lnav_press");
  //===============================================================================================
  /////////// setup内 Part-B VOR LOC プッシュスイッチ teensy 8ピン//////////////////
  //============================================================================================
  pinMode(VOR_LOCSwPin, INPUT_PULLUP); 
  VOR_LOC_Sw = XPlaneRef("laminar/B738/autopilot/vorloc_press");
  //===============================================================================================
  /////////// setup内 Part-B APP プッシュスイッチ teensy 9ピン//////////////////
  //============================================================================================
  pinMode(APPSwPin, INPUT_PULLUP); 
  APP_Sw = XPlaneRef("laminar/B738/autopilot/app_press");
  //===============================================================================================
  /////////// setup内 Part-B HDG BANK ANGLE 切り替えスイッチ //////////////////
  //===============================================================================================
  pinMode(BankAngle_up_SwPin, INPUT_PULLUP);
  BankAngle_up = XPlaneRef("laminar/B738/autopilot/bank_angle_up");
  pinMode(BankAngle_dn_SwPin, INPUT_PULLUP);
  BankAngle_dn = XPlaneRef("laminar/B738/autopilot/bank_angle_dn");
  //===============================================================================================
  /////////// setup内 10番 ALT HOLD プッシュスイッチ teensy 10ピン//////////////////
  //==============================================================================================
  pinMode(ALT_HOLDSwPin, INPUT_PULLUP);
  ALT_HOLD_Sw = XPlaneRef("laminar/B738/autopilot/alt_hld_press");
  //===============================================================================================
  /////////// setup内 11番 V/S プッシュスイッチ teensy 11ピン//////////////////
  //===============================================================================================
  pinMode(VSSwPin, INPUT_PULLUP); 
  VS_Sw = XPlaneRef("laminar/B738/autopilot/vs_press");
  //===============================================================================================
  /////////// setup内 12番 A/P ENGAGE CMD プッシュスイッチ teensy 12ピン//////////////////
  //===============================================================================================
  pinMode(AP_ENGAGE_CMDSwPin, INPUT_PULLUP); 
  AP_ENGAGE_CMD_Sw = XPlaneRef("laminar/B738/autopilot/cmd_a_press");
  //===============================================================================================
  /////////// setup内 13番 DISENGAGE プッシュスイッチ teensy 13ピン//////////////////
  //===============================================================================================
  pinMode(DISENGAGESwPin, INPUT_PULLUP); 
  DISENGAGE_Sw = XPlaneRef("laminar/B738/autopilot/disconnect_toggle");
  //===============================================================================================
  /////////// setup内 14番 ALT_INTV プッシュスイッチ teensy 14ピン//////////////////
  //===============================================================================================
  pinMode(ALT_INTVSwPin, INPUT_PULLUP); 
  ALT_INTV_Sw = XPlaneRef("laminar/B738/autopilot/alt_interv_pos");
  
  
  
  
  
  
  /////////////////////////////////////////////////////////////////////////
  // setup内 LEDピン Teensy++2.0 〜 74HC595 シフトレジスタ 経由 /////////////
  /////////////////////////////////////////////////////////////////////////
  //setup内LEDランプ共通---------74HC595のピン設定
  pinMode(SER_dataPin, OUTPUT);
  pinMode(RCLK_latchPin, OUTPUT);
  pinMode(SRCLK_clockPin, OUTPUT);
  //setup内LEDランプ共通---------すべてのレジスタピンをリセット
  clearRegisters();
  writeRegisters();
  //===============================================================================================
  /////////// setup内 74HC595(LED表示)シフトレジスタ F/D MAランプ //////////////////
  //===============================================================================================
  FD_SwLED = XPlaneRef("laminar/B738/autopilot/flight_director_pos");  //laminar/B738/autopilot/flight_director_pos
    FD_SwLED.onChange(update_FD_SwLED);
  //===============================================================================================
  /////////// setup内 74HC595(LED表示)シフトレジスタ A/T ARM ランプ //////////////////
  //===============================================================================================
  AT_ARM_SwLED = XPlaneRef("laminar/B738/autopilot/autothrottle_status1");
    AT_ARM_SwLED.onChange(update_AT_ARM_SwLED);
  //===============================================================================================
  /////////// setup内 74HC595(LED表示)シフトレジスタ N1 ランプ //////////////////
  //===============================================================================================
  N1_SwLED = XPlaneRef("laminar/B738/autopilot/n1_status");
    N1_SwLED.onChange(update_N1_SwLED);
  //===============================================================================================
  /////////// setup内 74HC595(LED表示)シフトレジスタ SPEED ランプ //////////////////
  //===============================================================================================
  SPEED_SwLED = XPlaneRef("laminar/B738/autopilot/speed_status1");
    SPEED_SwLED.onChange(update_SPEED_SwLED);
  //===============================================================================================
  /////////// setup内 74HC595(LED表示)シフトレジスタ VNAV ランプ //////////////////
  //===============================================================================================
  VNAV_SwLED = XPlaneRef("laminar/B738/autopilot/vnav_status1");
    VNAV_SwLED.onChange(update_VNAV_SwLED);
  //===============================================================================================
  /////////// setup内 74HC595(LED表示)シフトレジスタ LVL CHG ランプ //////////////////
  //===============================================================================================
  LVL_CHG_SwLED = XPlaneRef("laminar/B738/autopilot/lvl_chg_status");
    LVL_CHG_SwLED.onChange(update_LVL_CHG_SwLED);
  //===============================================================================================
  /////////// setup内 74HC595(LED表示)シフトレジスタ HDG SEL ランプ //////////////////
  //===============================================================================================
  HDG_SEL_SwLED = XPlaneRef("laminar/B738/autopilot/hdg_sel_status");
    HDG_SEL_SwLED.onChange(update_HDG_SEL_SwLED);
  //===============================================================================================
  /////////// setup内 74HC595(LED表示)シフトレジスタ LNAV ランプ //////////////////
  //===============================================================================================
  LNAV_SwLED = XPlaneRef("laminar/B738/autopilot/lnav_status");
    LNAV_SwLED.onChange(update_LNAV_SwLED);
  //===============================================================================================
  /////////// setup内 74HC595(LED表示)シフトレジスタ VOR LOC ランプ //////////////////
  //===============================================================================================
  VOR_LOC_SwLED = XPlaneRef("laminar/B738/autopilot/vorloc_status");
    VOR_LOC_SwLED.onChange(update_VOR_LOC_SwLED);
  //===============================================================================================.
  /////////// setup内 74HC595(LED表示)シフトレジスタ APP ランプ //////////////////
  //===============================================================================================
  APP_SwLED = XPlaneRef("laminar/B738/autopilot/app_status");
    APP_SwLED.onChange(update_APP_SwLED);
  //===============================================================================================
  /////////// setup内 74HC595(LED表示)シフトレジスタ ALT HOLD ランプ //////////////////
  //===============================================================================================
  ALT_HLD_SwLED = XPlaneRef("laminar/B738/autopilot/alt_hld_status");
    ALT_HLD_SwLED.onChange(update_ALT_HLD_SwLED);
  //===============================================================================================
  /////////// setup内 74HC595(LED表示)シフトレジスタ V/S ランプ //////////////////
  //===============================================================================================
  VS_SwLED = XPlaneRef("laminar/B738/autopilot/vs_status");
    VS_SwLED.onChange(update_VS_SwLED);
  //===============================================================================================
  /////////// setup内 74HC595(LED表示)シフトレジスタ A/P ENGAGE CMD ランプ //////////////////
  //===============================================================================================
  AP_ENGAGE_CMD_SwLED = XPlaneRef("laminar/B738/autopilot/cmd_a_status");
    AP_ENGAGE_CMD_SwLED.onChange(update_AP_ENGAGE_CMD_SwLED);
    
  
  
  
  //-----------エンコーダ-------------------------
  //===============================================================================================
  /////////// setup内 15-16番 COURSE エンコーダ  //////////////////
  //===============================================================================================
  pinMode(COURSE_EncR_pin, INPUT_PULLUP);  //エンコーダ
  pinMode(COURSE_EncL_pin, INPUT_PULLUP);  //エンコーダ
  COURSE_Encoder = XPlaneRef("sim/cockpit2/radios/actuators/hsi_obs_deg_mag_pilot");
  //===============================================================================================
  /////////// setup内 17-18番 IAS/MACH(AirSpeed) エンコーダ  //////////////////
  //===============================================================================================
  pinMode(AirSp_EncR_pin, INPUT_PULLUP);  //エンコーダ
  pinMode(AirSp_EncL_pin, INPUT_PULLUP);  //エンコーダ
  AirSpeed = XPlaneRef("laminar/B738/autopilot/mcp_speed_dial_kts_mach");//sim/cockpit/autopilot/airspeed
  //AirSpeed_is_mach = XPlaneRef("laminar/B738/autopilot/mcp_speed_dial_kts_mach");//sim/cockpit/autopilot/airspeed_is_mach
  Autopilot_mode = XPlaneRef("sim/cockpit/autopilot/autopilot_mode");
  //===============================================================================================
  /////////// setup内 19-20番 HEADING エンコーダ  //////////////////sim/cockpit/autopilot/heading_mag
  //=============================================================================================== 
  pinMode(HDG_SEL_EncR_Pin, INPUT_PULLUP);  //エンコーダ
  pinMode(HDG_SEL_EncL_Pin, INPUT_PULLUP);  //エンコーダ
  HDG_SEL_Encoder = XPlaneRef("laminar/B738/autopilot/mcp_hdg_dial");
  //===============================================================================================
  /////////// setup内 21-22番 ALTTUDE エンコーダ //////////////////
  //===============================================================================================
  pinMode(ALT_HLD_EncR_Pin, INPUT_PULLUP);  //エンコーダ
  pinMode(ALT_HLD_EncL_Pin, INPUT_PULLUP);  //エンコーダ
  ALT_HLD_Encoder = XPlaneRef("laminar/B738/autopilot/mcp_alt_dial");
  //===============================================================================================
  /////////// setup内 23-24番 VERT SPEED エンコーダ //////////////////
  //===============================================================================================
  pinMode(VS_EncR_Pin, INPUT_PULLUP);  //エンコーダ
  pinMode(VS_EncL_Pin, INPUT_PULLUP);  //エンコーダ
  VS_Encoder = XPlaneRef("sim/cockpit/autopilot/vertical_velocity");
  
  
  
  
  
}





void loop() {
  FlightSim.update();
  
  if (FlightSim.isEnabled()) {          //X-Planeが完全に起動し、データの出力が有効になったら。
    digitalWrite(ledPin, HIGH);  //tensy1ピン
  } else {
    digitalWrite(ledPin, HIGH);
     delay(1000); 
    digitalWrite(ledPin, LOW);
     delay(1000); 
  }
  
  /////////////////////////////////////////////////////////////////////////
  // loop内 74HC595 シフトレジスタ 共通 //
  /////////////////////////////////////////////////////////////////////////
  writeRegisters();  //変更内容を表示するために呼び出さなければなりません
                     //必要な値が設定された後に一度だけ呼び出します。
  //////// loop内 シフトレジスタ 共通 END ///////////////////////////////////
  
  //ループ内には74HC595 シフトレジスタに関して、これ以外の設定項目は無い、全て関数設定になっている。
  
  
  
  
  /////////////////////////////////////////////////////////////////////////
  /////////// loop内 スイッチ Teensy 直結ピン //////////////////
  /////////////////////////////////////////////////////////////////////////
  //==============================================================================================
  /////////// loop内 0番 FlightDirector トグルスイッチ(コマンド)//////////////////
  //============================================================================================== 
  FDSwitch.update();
  if (FDSwitch.fallingEdge()) {
    FD_Sw = 1;        //押し下げしたときを検出してONにする
    inactivityTimeout = 0;
  }
  if (FDSwitch.risingEdge()) {
    FD_Sw = 0;        //押し上げしたときを検出状態(プッシュボタンは1にしてONを保つ必要がある)
  }
  //==============================================================================================
  /////////// loop内 1番 A/T ARM (AutoThrottle ARM) トグルスイッチ(コマンド)//////////////////
  //==============================================================================================
  ATarmSwitch.update();
  if (ATarmSwitch.fallingEdge()) {
    AutoThrottleARM_Sw = 1;        //押し下げしたときを検出してONにする
    inactivityTimeout = 0;
  }
  if (ATarmSwitch.risingEdge()) {
    AutoThrottleARM_Sw = 0;        //押し上げしたときを検出状態(プッシュボタンは1にしてONを保つ必要がある)
  }
  //==============================================================================================
  /////////// loop内 2番 N1 プッシュスイッチ(コマンド) //////////////////
  //==============================================================================================
  N1Switch.update();
  if (N1Switch.fallingEdge()) {
    N1_Sw = 1;        //押し下げしたときを検出してONにする
    inactivityTimeout = 0;
  }
  if (N1Switch.risingEdge()) {
    N1_Sw = 0;        //押し上げしたときを検出状態(プッシュボタンは1にしてONを保つ必要がある)
  }
  //==============================================================================================
  /////////// loop内 3番 SPEED プッシュスイッチ(コマンド) //////////////////
  //==============================================================================================
  SPEEDSwitch.update();
  if (SPEEDSwitch.fallingEdge()) {
    SPEED_Sw = 1;        //押し下げしたときを検出してONにする
    inactivityTimeout = 0;
  }
  if (SPEEDSwitch.risingEdge()) {
    SPEED_Sw = 0;        //押し上げしたときを検出状態(プッシュボタンは1にしてONを保つ必要がある)
  }
  //==============================================================================================
  /////////// loop内 4番 VNAV プッシュスイッチ(コマンド) //////////////////
  //==============================================================================================
  VNAVSwitch.update();
  if (VNAVSwitch.fallingEdge()) {
    VNAV_Sw = 1;        //押し下げしたときを検出してONにする
    inactivityTimeout = 0;
  }
  if (VNAVSwitch.risingEdge()) {
    VNAV_Sw = 0;        //押し上げしたときを検出状態(プッシュボタンは1にしてONを保つ必要がある)
  }
  //==============================================================================================
  /////////// loop内 5番 LVL CHG プッシュスイッチ(コマンド) //////////////////
  //==============================================================================================
  LVL_CHGSwitch.update();
  if (LVL_CHGSwitch.fallingEdge()) {
    LVL_CHG_Sw = 1;        //押し下げしたときを検出してONにする
    inactivityTimeout = 0;
  }
  if (LVL_CHGSwitch.risingEdge()) {
    LVL_CHG_Sw = 0;        //押し上げしたときを検出状態(プッシュボタンは1にしてONを保つ必要がある)
  }
  //==============================================================================================
  /////////// loop内 14番 C/O プッシュスイッチ(コマンド) //////////////////
  //==============================================================================================
  COSwitch.update();
  if (COSwitch.fallingEdge()) {
    CO_Sw = 1;        //押し下げしたときを検出してONにする
    inactivityTimeout = 0;
  }
  if (COSwitch.risingEdge()) {
    CO_Sw = 0;        //押し上げしたときを検出状態(プッシュボタンは1にしてONを保つ必要がある)
  }
  //==============================================================================================
  /////////// loop内 14番 SPD_INTV プッシュスイッチ(コマンド) //////////////////
  //==============================================================================================
  SPD_INTVSwitch.update();
  if (SPD_INTVSwitch.fallingEdge()) {
    SPD_INTV_Sw = 1;        //押し下げしたときを検出してONにする
    inactivityTimeout = 0;
  }
  if (SPD_INTVSwitch.risingEdge()) {
    SPD_INTV_Sw = 0;        //押し上げしたときを検出状態(プッシュボタンは1にしてONを保つ必要がある)
  }
  //==============================================================================================
  /////////// loop内 6番 HDG SEL プッシュスイッチ(コマンド) //////////////////
  //==============================================================================================
  HDG_SELSwitch.update();
  if (HDG_SELSwitch.fallingEdge()) {
    HDG_SEL_Sw = 1;        //押し下げしたときを検出してONにする
    inactivityTimeout = 0;
  }
  if (HDG_SELSwitch.risingEdge()) {
    HDG_SEL_Sw = 0;        //押し上げしたときを検出状態(プッシュボタンは1にしてONを保つ必要がある)
  }
  //==============================================================================================
  /////////// loop内 Part-B LNAV プッシュスイッチ(コマンド) //////////////////
  //==============================================================================================
  LNAVSwitch.update();
  if (LNAVSwitch.fallingEdge()) {
    LNAV_Sw = 1;        //押し下げしたときを検出してONにする
    inactivityTimeout = 0;
  }
  if (LNAVSwitch.risingEdge()) {
    LNAV_Sw = 0;        //押し上げしたときを検出状態(プッシュボタンは1にしてONを保つ必要がある)
  }
  //==============================================================================================
  /////////// loop内 Part-B VOR LOC プッシュスイッチ(コマンド) //////////////////
  //==============================================================================================
  VOR_LOCSwitch.update();
  if (VOR_LOCSwitch.fallingEdge()) {
    //VOR_LOC_Sw = 1;        //押し下げしたときを検出してONにする
    inactivityTimeout = 0;
  }
  if (VOR_LOCSwitch.risingEdge()) {
    //VOR_LOC_Sw = 0;        //押し上げしたときを検出状態(プッシュボタンは1にしてONを保つ必要がある)
  }
  //==============================================================================================
  /////////// loop内 Part-B APP プッシュスイッチ(コマンド) //////////////////
  //==============================================================================================
  APPSwitch.update();
  if (APPSwitch.fallingEdge()) {
    APP_Sw = 1;        //押し下げしたときを検出してONにする
    inactivityTimeout = 0;
  }
  if (APPSwitch.risingEdge()) {
    APP_Sw = 0;        //押し上げしたときを検出状態(プッシュボタンは1にしてONを保つ必要がある)
  }
  //==============================================================================================
  /////////// loop内 Part-B BANK ANGLE 6モード切り替え スイッチ //////////////////
  //==============================================================================================
  BankAngle_up_SwitchPin.update();
  if (BankAngle_up_SwitchPin.fallingEdge()) {
    BankAngle_up = 1;        //押し下げしたときを検出してONにする
    inactivityTimeout = 0;
  }
  if (BankAngle_up_SwitchPin.risingEdge()) {
    BankAngle_up = 0;        //押し上げしたときを検出状態(プッシュボタンは1にしてONを保つ必要がある)
  }
  
  BankAngle_dn_SwitchPin.update();
  if (BankAngle_dn_SwitchPin.fallingEdge()) {
    BankAngle_dn = 1;        //押し下げしたときを検出してONにする
    inactivityTimeout = 0;
  }
  if (BankAngle_dn_SwitchPin.risingEdge()) {
    BankAngle_dn = 0;        //押し上げしたときを検出状態(プッシュボタンは1にしてONを保つ必要がある)
  }
  //==============================================================================================
  /////////// loop内 10番パネル ALT HOLD プッシュスイッチ(コマンド) //////////////////
  //==============================================================================================
  ALT_HOLDSwitch.update();
  if (ALT_HOLDSwitch.fallingEdge()) {
    ALT_HOLD_Sw = 1;        //押し下げしたときを検出してONにする
    inactivityTimeout = 0;
  }
  if (ALT_HOLDSwitch.risingEdge()) {
    ALT_HOLD_Sw = 0;        //押し上げしたときを検出状態(プッシュボタンは1にしてONを保つ必要がある)
  }
  //==============================================================================================
  /////////// loop内 11番 V/S プッシュスイッチ(コマンド) //////////////////
  //==============================================================================================
  VSSwitch.update();
  if (VSSwitch.fallingEdge()) {
    VS_Sw = 1;        //押し下げしたときを検出してONにする
    inactivityTimeout = 0;
  }
  if (VSSwitch.risingEdge()) {
    VS_Sw = 0;        //押し上げしたときを検出状態(プッシュボタンは1にしてONを保つ必要がある)
  }
  //==============================================================================================
  /////////// loop内 12番 A/P ENGAGE CMD プッシュスイッチ(コマンド) //////////////////
  //==============================================================================================
  AP_ENGAGE_CMDSwitch.update();
  if (AP_ENGAGE_CMDSwitch.fallingEdge()) {
    AP_ENGAGE_CMD_Sw = 1;        //押し下げしたときを検出してONにする
    inactivityTimeout = 0;
  }
  if (AP_ENGAGE_CMDSwitch.risingEdge()) {
    AP_ENGAGE_CMD_Sw = 0;        //押し上げしたときを検出状態(プッシュボタンは1にしてONを保つ必要がある)
  }
  //==============================================================================================
  /////////// loop内 12番 DESENGADE プッシュスイッチ(コマンド) //////////////////
  //==============================================================================================
  DISENGAGESwitch.update();
  if (DISENGAGESwitch.fallingEdge()) {
    DISENGAGE_Sw = 1;        //押し下げしたときを検出してONにする
    inactivityTimeout = 0;
  }
  if (DISENGAGESwitch.risingEdge()) {
    DISENGAGE_Sw = 0;        //押し上げしたときを検出状態(プッシュボタンは1にしてONを保つ必要がある)
  }
  //==============================================================================================
  /////////// loop内 14番 ALT_INTV プッシュスイッチ(コマンド) //////////////////
  //==============================================================================================
  ALT_INTVSwitch.update();
  if (ALT_INTVSwitch.fallingEdge()) {
    ALT_INTV_Sw = 1;        //押し下げしたときを検出してONにする
    inactivityTimeout = 0;
  }
  if (ALT_INTVSwitch.risingEdge()) {
    ALT_INTV_Sw = 0;        //押し上げしたときを検出状態(プッシュボタンは1にしてONを保つ必要がある)
  }
  
  
  
  
  
  
  //-----------エンコーダ-------------------------
  //==============================================================================================
  /////////// loop内 15-16番 COURSE エンコーダ //////////////////
  //==============================================================================================
  // 1クリックで4つ変化するので4で割って1つずつカウントするようにする
  short COURSE_EncDiff = (COURSE_Enc.read() - COURSE_EncPrev) / 4;
   
  if (COURSE_EncDiff) {
    // only update prev when we've reached a detent!
    //戻り止めに達した場合にのみPREVを更新!
    COURSE_EncPrev = 0;
    COURSE_Enc.write(0);
   
    // datarefを一時的な値にコピー
    float Course_tmp = COURSE_Encoder;
 
    // 一時的な値に変更を適用
    Course_tmp += COURSE_EncDiff;
    
    // do range checking(範囲チェックを行う)
    while (Course_tmp < 0.0) Course_tmp += 360.0;
    while (Course_tmp >= 360.0) Course_tmp -= 360.0;
 
    // datarefへ検証された新しいエアースピードの数値を書く
    COURSE_Encoder = Course_tmp;
  }
  
  //==============================================================================================
  /////////// loop内 17-18番 IAS/MACH エンコーダ //////////////////
  //==============================================================================================
  // エンコーダの動きを見る
  short AirSp_EncDiff = AirSp_Enc.read() /4;  //粗いの変更したエンコーダを読む- 変更前のエンコーダの値
     
  // それらが移動した後のエンコーダをリセット
  if (AirSp_EncDiff) {
    AirSp_EncPrev = 0;
    AirSp_Enc.write(0);
  }
   
  // encDiffは20にmyEncDiffの値(1カウント)を掛ける値になる
  int AirSpeed_mach_encDiff = 20 * AirSp_EncDiff;  //20 ✕ 1 で encDiff は20になる
   
  //ノットは、autopilot_modeが「0」で000〜392とautopilot_modeが「1」で114〜392の範囲、マッハは0.00〜0.84の範囲で動作するように設定する必要がある。
  //ノット表示
  if (AirSpeed_is_mach == 0 && (Autopilot_mode == 0 || Autopilot_mode == 1)) { 
      //小数点以下2桁からカウントアップ/ダウンを行う  
      if (AirSpeed_mach_encDiff) {      //もし20なら  
          float tmp = AirSpeed;  //tmpはX-Planeからの周波数の値を取得
           
          // encDiffは20だから ✕ 0.05で1ずつカウント(1桁からカウント)となり、その値を周波数にプラスする
          tmp += AirSpeed_mach_encDiff * 0.05; 
          while (tmp < 0) tmp += 1;  //エアスピードが 100 より小さい場合は 1 をプラスする(つまり100で止まる)
          while (tmp >= 392) tmp -= 1;  //エアスピードが 400 より大きい場合は 1 をマイナスする(つまり399で止まる) 
          AirSpeed = tmp;
          //数値の範囲はX-Plane側で処理しているのでいらない
      }
  }
  //ノット表示
  
  if (AirSpeed_is_mach == 0 && (Autopilot_mode == 0 || Autopilot_mode == 2)) {   //&& = 両方同じなら
      //小数点以下2桁からカウントアップ/ダウンを行う  
      if (AirSpeed_mach_encDiff) {      //もし20なら  
          float tmp = AirSpeed;  //tmpはX-Planeからの周波数の値を取得
           
          // encDiffは20だから ✕ 0.05で1ずつカウント(1桁からカウント)となり、その値を周波数にプラスする
          tmp += AirSpeed_mach_encDiff * 0.05; 
          while (tmp < 100) tmp += 1;  //エアスピードが 100 より小さい場合は 1 をプラスする(つまり100で止まる)
          while (tmp >= 392) tmp -= 1;  //エアスピードが 400 より大きい場合は 1 をマイナスする(つまり399で止まる) 
          AirSpeed = tmp;
          //数値の範囲はX-Plane側で処理しているのでいらない
      }
  }
 
  //マッハ表示
  if (AirSpeed_is_mach == 1) { 
      //小数点以下2桁からカウントアップ/ダウンを行う  
      if (AirSpeed_mach_encDiff) {      //もし20なら  
          float tmp = AirSpeed;  //tmpはX-Planeからの周波数の値を取得
           
          // encDiffは20だから ✕ 0.00005で0.01ずつカウント(小数点以下2桁からカウント)となり、その値を周波数にプラスする
          tmp += AirSpeed_mach_encDiff * 0.0005;  
          while (tmp < -0.01) tmp += 0.01;  //tmpが0より小さくなった場合、8をプラスする(つまり7になる)
          while (tmp >= 0.84) tmp -= 0.01;  //tmpが8以上になった場合、8を引く(つまり0になる)
          AirSpeed = tmp;
          //数値の範囲はX-Plane側で処理しているのでいらない
      }
  }
  

  

  //==============================================================================================
  /////////// loop内 19-20番 HEADING エンコーダ //////////////////
  //==============================================================================================
  // 1クリックで4つ変化するので4で割って1つずつカウントするようにする
  short HDG_SEL_EncDiff = (HDG_SEL_Enc.read() - HDG_SEL_EncPrev) / 4;
  
  if (HDG_SEL_EncDiff) {
    // only update prev when we've reached a detent!
    //デテントに到達したときにのみprevを更新します。
    HDG_SEL_EncPrev = 0;
    HDG_SEL_Enc.write(0);
  
    // datarefを一時的な値にコピーします
    float HDG_SEL_tmp = HDG_SEL_Encoder;
  
    // 一時的な値に変更を適用する
    HDG_SEL_tmp += HDG_SEL_EncDiff;
  
    // 範囲チェックを行う(359以上になったら0に戻す動き、またその逆の動きを実現)
    while (HDG_SEL_tmp < 0.0) HDG_SEL_tmp += 360.0;
    while (HDG_SEL_tmp >= 360.0) HDG_SEL_tmp -= 360.0;
  
    // 検証されてものを書き込む
    HDG_SEL_Encoder = HDG_SEL_tmp;
  }
  //==============================================================================================
  /////////// loop内 21-22番パネル ALTITUDE エンコーダ //////////////////
  //==============================================================================================

  // 1クリックで4つ変化するので4で割って1つずつカウントするようにする
  short ALT_HLD_EncDiff = (ALT_HLD_Enc.read() - ALT_HLD_EncPrev) *100 / 4;
  if (ALT_HLD_EncDiff) {
    ALT_HLD_EncPrev = 0;
    ALT_HLD_Enc.write(0);
    
    float ALT_HLD_tmp = ALT_HLD_Encoder;
    ALT_HLD_tmp += ALT_HLD_EncDiff;
    while (ALT_HLD_tmp < -1000) ALT_HLD_tmp += 1;    //エンコーダの回転による数値を-1000以上にならないように制限する。
    while (ALT_HLD_tmp >= 99900) ALT_HLD_tmp -= 1;  //エンコーダの数値を99900までに制限する(実際は000000になるので7セグの方で000000になるように設定する必要がある)。
    ALT_HLD_Encoder = ALT_HLD_tmp;
  }
  //==============================================================================================
  /////////// loop内 23-24番 VERT SPEED エンコーダ //////////////////
  //==============================================================================================
  // 1クリックで4つ変化するので4で割って1つずつカウントするようにする
  short VS_EncDiff = (VS_Enc.read() - VS_EncPrev) *100 / 4;
  if (VS_EncDiff) {
    VS_EncPrev = 0;
    VS_Enc.write(0);
    
    float VS_tmp = VS_Encoder;
    VS_tmp += VS_EncDiff;
    VS_Encoder = VS_tmp;
  }
  
  
  
  

    

}
// ループEND



  ////////////////////////////////////////////////////////////////////////////////
  /////////// 関数 LEDピン Teensy++2.0 〜 74HC595(出力)シフトレジスタ経由 ///////////
  ////////////////////////////////////////////////////////////////////////////////
  //==============================================================================================
  /////////// 関数 74HC595(LED表示)シフトレジスタ F/D ランプ //////////////////
  //==============================================================================================
  void update_FD_SwLED(long value) {
    if (value == 1)  {
      setRegisterPin(FD_74HC595_Pin, HIGH);    //消灯
    } else {
      setRegisterPin(FD_74HC595_Pin, LOW);    //点灯
    }
  }
  //==============================================================================================
  /////////// 関数 74HC595(LED表示)シフトレジスタ A/T ARM ランプ //////////////////
  //==============================================================================================
  void update_AT_ARM_SwLED(long value) {
    if (value == 1)  {
      setRegisterPin(AT_ARM_74HC595_Pin, HIGH);    //消灯
    } else {
      setRegisterPin(AT_ARM_74HC595_Pin, LOW);    //点灯
    }
  }
  //==============================================================================================
  /////////// 関数 74HC595(LED表示)シフトレジスタ  N1 ランプ //////////////////
  //==============================================================================================
  void update_N1_SwLED(long value) {
    if (value == 1)  {
      setRegisterPin(N1_74HC595_Pin, HIGH);    //消灯
    } else {
      setRegisterPin(N1_74HC595_Pin, LOW);    //点灯
    }
  }
  
  //==============================================================================================
  /////////// 関数 74HC595(LED表示)シフトレジスタ SPEED ランプ //////////////////
  //==============================================================================================
  void update_SPEED_SwLED(long value) {
    if (value == 1)  {
      setRegisterPin(SPEED_74HC595_Pin, HIGH);    //消灯
    } else {
      setRegisterPin(SPEED_74HC595_Pin, LOW);    //点灯
    }
  }
  //==============================================================================================
  /////////// 関数 74HC595(LED表示)シフトレジスタ VNAV ランプ //////////////////
  //==============================================================================================
  void update_VNAV_SwLED(long value) {
    if (value == 1)  {
      setRegisterPin(VNAV_74HC595_Pin, HIGH);    //消灯
    } else {
      setRegisterPin(VNAV_74HC595_Pin, LOW);    //点灯
    }
  }
  //==============================================================================================
  /////////// 関数 74HC595(LED表示)シフトレジスタ LVL CHG ランプ //////////////////
  //==============================================================================================
  void update_LVL_CHG_SwLED(long value) {
    if (value == 1)  {
      setRegisterPin(LVL_CHG_74HC595_Pin, HIGH);    //消灯
    } else {
      setRegisterPin(LVL_CHG_74HC595_Pin, LOW);    //点灯
    }
  }
  //==============================================================================================
  /////////// 関数 74HC595(LED表示)シフトレジスタ HDG SEL ランプ //////////////////
  //==============================================================================================
  void update_HDG_SEL_SwLED(long value) {
    if (value == 1)  {
      setRegisterPin(HDG_SEL_74HC595_Pin, HIGH);    //消灯
    } else {
      setRegisterPin(HDG_SEL_74HC595_Pin, LOW);    //点灯
    }
  }
  //==============================================================================================
  /////////// 関数 74HC595(LED表示)シフトレジスタ LNAV ランプ //////////////////
  //==============================================================================================
  void update_LNAV_SwLED(long value) {
    if (value == 1)  {
      setRegisterPin(LNAV_74HC595_Pin, HIGH);    //消灯
    } else {
      setRegisterPin(LNAV_74HC595_Pin, LOW);    //点灯
    }
  }
  //==============================================================================================
  /////////// 関数 74HC595(LED表示)シフトレジスタ VOR LOC ランプ //////////////////
  //==============================================================================================
  void update_VOR_LOC_SwLED(long value) {
    if (value == 1)  {
      setRegisterPin(VOR_LOC_74HC595_Pin, HIGH);    //消灯
    } else {
      setRegisterPin(VOR_LOC_74HC595_Pin, LOW);    //点灯
    }
  }
  //==============================================================================================
  /////////// 関数 74HC595(LED表示)シフトレジスタ APP ランプ //////////////////
  //==============================================================================================
  void update_APP_SwLED(long value) {
    if (value == 1 || value == 2)  {
      setRegisterPin(APP_74HC595_Pin, HIGH);    //消灯
    } else {
      setRegisterPin(APP_74HC595_Pin, LOW);    //点灯
    }
  }
  //==============================================================================================
  /////////// 関数 74HC595(LED表示)シフトレジスタ ALT HOLD ランプ //////////////////
  //==============================================================================================
  void update_ALT_HLD_SwLED(long value) {
    if (value == 1)  {
      setRegisterPin(ALT_HLD_74HC595_Pin, HIGH);    //消灯
    } else {
      setRegisterPin(ALT_HLD_74HC595_Pin, LOW);    //点灯
    }
  }
  //==============================================================================================
  /////////// 関数 74HC595(LED表示)シフトレジスタ V/S ランプ //////////////////
  //==============================================================================================
  void update_VS_SwLED(long value) {
    if (value == 1)  {
      setRegisterPin(VS_74HC595_Pin, HIGH);    //消灯
    } else {
      setRegisterPin(VS_74HC595_Pin, LOW);    //点灯
    }
  }
 //===============================================================================================
  /////////// 関数 74HC595(LED表示)シフトレジスタ A/P ENGAGE CMD ランプ //////////////////
  //==============================================================================================
  void update_AP_ENGAGE_CMD_SwLED(long value) {
    if (value == 1)  {
      setRegisterPin(AP_ENGAGE_CMD_74HC595_Pin, HIGH);    //消灯
    } else {
      setRegisterPin(AP_ENGAGE_CMD_74HC595_Pin, LOW);    //点灯
    }
  }