プログラミングの勉強から初め、レイアウト、パーツ集め等、2年位い開発にかかったパネルです。ほぼ完璧に動作します。X-Plane飛行中はモニタの横に置いて、ジョイスティックとこのパネルだけて快適に飛行することができます。
B737-800X_3_36_fullで動作確認している。
様式は少し違っていますが、実際に実行している状態をYouTubeに上げてみました。
目次
B737-800X_Zibo_7seg_Panel(1段目)
//4つの8桁LEDディスプレイモジュールMAX7219デジタル制御管を繋いだときのスケッチ
#include "LedControl.h"
/////////////////////////////////////////////////////////////////////////
/////////// 7セグメント表示 MAX7219経由 //////////////////
/////////////////////////////////////////////////////////////////////////
// ピン14をデータ入力DINに、13をCLKに、11をLOADに、デバイス数は3個
const int lc_DIN_Pin = 21; //7セグ、teensyピン位置141312
const int lc_CLK_Pin = 23;
const int lc_LOAD_Pin = 22;
LedControl lc = LedControl(lc_DIN_Pin, lc_CLK_Pin, lc_LOAD_Pin, 4); //カスケード接続の場合、最後の数字が接続したモジュールの数。
//==============================================================================================
/////////// COURSE 7セグメント表示 //////////////////
//==============================================================================================
FlightSimFloat Course_Val; //7セグ用
float Course_FloatValue;
int Course_IntValue;
//==============================================================================================
/////////// IAS/MACH(エアースピード)7セグメント表示 //////////////////
//==============================================================================================
FlightSimInteger AirSpeed_KnotMach_change; //ノットとマッハの切り替え用
FlightSimInteger Fms_Vnav;
FlightSimInteger AirSpeed_IntVal; //小数点以下のデータを取得、7セグ用
FlightSimFloat AirSpeed_FloatVal;
FlightSimFloat VNAV_Pos;
float kts_FloatValue; //不動小数点の数値を一時格納
int kts_IntValue; //不動小数点を整数に変換
float mach_FloatValue; //不動小数点の数値を一時格納
int mach_IntValue; //不動小数点を整数に変換
//===============================================================================================
/////////// HEADING 7セグメント表示 //////////////////
//===============================================================================================
FlightSimInteger Heading_Val;
//===============================================================================================
/////////// ALTITUDE 7セグメント表示 //////////////////
//===============================================================================================
FlightSimInteger Altitude_Val;
//===============================================================================================
/////////// VERT SPEED 7セグメント表示 //////////////////
//===============================================================================================
FlightSimInteger VertSpeed_Val;
FlightSimInteger VertSpeed_vs_pos;
void setup() {
pinMode(13, OUTPUT); //X-Planeの起動の有効・無効用
pinMode(lc_DIN_Pin, OUTPUT);
pinMode(lc_CLK_Pin, OUTPUT);
pinMode(lc_LOAD_Pin, OUTPUT);
// 4つのMAX7219デバイスを初期化する
for (int k = 0; k < 4; k++) { //4はモジュールの数
lc.shutdown(k, false); // 表示を有効にする
//lc.setIntensity(k, 5); // 全てのの明るさ(各7セグの明るさの調整をしないと1つだけしか点灯しない場合がある)
lc.clearDisplay(k); // 表示レジスタをクリア
scrollDigits(); //7セグメントテスト用
//===============================================================================================
/////////// setup内 1番 COURSE 7セグメント表示 //////////////////
//===============================================================================================
Course_Val = XPlaneRef("sim/cockpit2/radios/actuators/hsi_obs_deg_mag_pilot");
//===============================================================================================
/////////// setup内 2番 IAS/MACH(エアースピード)7セグメント表示 //////////////////
//===============================================================================================
// loop内で動作設定をしているので、他のように「onChange()」が入っていない。
AirSpeed_IntVal = XPlaneRef("laminar/B738/autopilot/mcp_speed_dial_kts_mach"); //X-Planeから浮動小数点の数値を取得 sim/cockpit/autopilot/airspeed
AirSpeed_FloatVal = XPlaneRef("laminar/B738/autopilot/mcp_speed_dial_kts_mach"); //sim/cockpit/autopilot/airspeed
AirSpeed_KnotMach_change = XPlaneRef("sim/cockpit/autopilot/airspeed_is_mach");
Fms_Vnav = XPlaneRef("laminar/B738/autopilot/altitude_mode");
VNAV_Pos = XPlaneRef("laminar/B738/autopilot/vnav_status1");
//===============================================================================================
/////////// setup内 3番 HEADING 7セグメント表示 /////////////////
//===============================================================================================
Heading_Val = XPlaneRef("laminar/B738/autopilot/mcp_hdg_dial");
//===============================================================================================
/////////// setup内 4番 ALTTUDE 7セグメント表示 //////////////////
//===============================================================================================
Altitude_Val = XPlaneRef("laminar/B738/autopilot/mcp_alt_dial");
//===============================================================================================
/////////// setup内 5番 VERT SPEED 7セグメント表示 //////////////////
//===============================================================================================
VertSpeed_Val = XPlaneRef("laminar/B738/autopilot/ap_vvi_pos");
VertSpeed_vs_pos = XPlaneRef("laminar/B738/autopilot/vvi_dial_show");
}
}
void loop() {
FlightSim.update();
if (FlightSim.isEnabled()) { //X-Planeが完全に起動し、データの出力が有効になったら。
digitalWrite(13, HIGH); //tensy1ピン
} else {
lc.setScanLimit(0, 5);
lc.setIntensity(0, 1);
lc.setDigit(0, 0, 0, false); //5桁目の値を表示
lc.setDigit(0, 1, 0, false); //5桁目の値を表示
lc.setDigit(0, 2, 0, false); //5桁目の値を表示
lc.setDigit(0, 3, 0, false); //5桁目の値を表示
lc.setDigit(0, 4, 0, false); //5桁目の値を表示
lc.setDigit(0, 5, 0, false);
lc.setDigit(0, 6, 0, false);
lc.setScanLimit(1, 5);
lc.setIntensity(1, 1);
lc.setDigit(1, 0, 0, false); //5桁目の値を表示
lc.setDigit(1, 1, 0, false); //5桁目の値を表示
lc.setDigit(1, 2, 0, false); //5桁目の値を表示
lc.setDigit(1, 3, 0, false); //5桁目の値を表示
lc.setDigit(1, 4, 0, false); //5桁目の値を表示
lc.setDigit(1, 5, 0, false);
lc.setDigit(1, 6, 0, false);
//lc.setScanLimit(2, 5);
lc.setIntensity(2, 2);
lc.setDigit(2, 1, 0, false); //5桁目の値を表示
lc.setDigit(2, 2, 0, false); //5桁目の値を表示
lc.setDigit(2, 3, 0, false);
lc.setDigit(2, 5, 0, false); //5桁目の値を表示
lc.setDigit(2, 6, 0, false); //5桁目の値を表示
lc.setDigit(2, 7, 0, false);
lc.setIntensity(3, 2);
lc.setDigit(3, 1, 0, false); //5桁目の値を表示
lc.setDigit(3, 2, 0, false); //5桁目の値を表示
lc.setDigit(3, 3, 0, false);
digitalWrite(13, HIGH);
delay(1000);
digitalWrite(13, LOW);
delay(1000);
}
//===============================================================================================
/////////// loop内 7セグメント COURSE //////////////////
//===============================================================================================
float Course_FloatValue = Course_Val; //ここは下のように小数点以上が3桁だからそのまま(107.974960)、下を見ると理解しやすい。
Course_FloatValue = round(Course_FloatValue); //ここで先頭から3番目の数値を四捨五入
Course_IntValue = (int) Course_FloatValue;
int Course_Val_keta1 = Course_IntValue % 10; //例えば123の数字の場合、123÷10=12.3で小数点以下の3が1桁の数字として表示
int Course_Val_keta2 = Course_IntValue / 10 % 10 ; //例えば123の数字の場合、、÷10=12.3、さらに10で割って、1.23で小数点以下の2が表示
int Course_Val_keta3 = Course_IntValue / 100; //例えば123の数字の場合、123÷100=1.23で1の整数が3桁目の数字として表示
lc.setIntensity(3, 5);
lc.setDigit(3, 1, Course_Val_keta1, false); //1桁目の値を表示、falseはドットを表示しない設定。
lc.setDigit(3, 2, Course_Val_keta2, false); //2桁目の値を表示
lc.setDigit(3, 3, Course_Val_keta3, false); //3桁目の値を表示
//===============================================================================================
/////////// loop内 7セグメント IAS/MACH(エアースピード) //////////////////
//===============================================================================================
if (VNAV_Pos == 0) { //vnav_posが0なら以下を実行
//起動したときは0(ノット表示)になっている。
if (AirSpeed_KnotMach_change == 0) {
float kts_FloatValue = AirSpeed_FloatVal; //ここは下のように小数点以上が3桁だからそのまま(107.974960)、下を見ると理解しやすい。
kts_FloatValue = round(kts_FloatValue); //ここで先頭から3番目の数値を四捨五入
kts_IntValue = (int) kts_FloatValue;
//下のコメントアウトは剰余の説明がちょっとおかしいが、これがわかりやすい。
int AirSpeed_keta1 = kts_IntValue % 10; //例えば123の数字の場合、123÷10=12.3で小数点以下の3が1桁の数字として表示
int AirSpeed_keta2 = kts_IntValue / 10 % 10 ; //例えば123の数字の場合、、÷10=12.3、さらに10で割って、1.23で小数点以下の2が表示
int AirSpeed_keta3 = kts_IntValue / 100; //例えば123の数字の場合、123÷100=1.23で1の整数が3桁目の数字として表示
lc.setDigit(2, 1, AirSpeed_keta1, false); //1桁目の値を表示
lc.setDigit(2, 2, AirSpeed_keta2, false); //2桁目の値を表示
lc.setDigit(2, 3, AirSpeed_keta3, false); //3桁目の値を表示
}
//マッハ表示(000と小数点以下3桁を表示)
if (AirSpeed_KnotMach_change == 1) { //1ということはマッハ表示ということである
//剰余の場合は浮動小数点が使えないので
float mach_FloatValue = AirSpeed_FloatVal * 1000; //所得した小数点を整数の位置にもっていく(0.163277を163.277に)
mach_FloatValue = round(mach_FloatValue); //ここで先頭から3番目の数値を四捨五入
mach_IntValue = (int) mach_FloatValue; //163.277にした分を完全な整数に変換(163にする)
int AirSpeed_keta1 = mach_IntValue / 10 % 10 ; //例えば123の数字の場合、123÷10=12.3で小数点以下の3が1桁の数字として表示(何故か1つ少ないので1をプラス)
int AirSpeed_keta2 = mach_IntValue / 100 ; //例えば123の数字の場合、、÷10=12.3、さらに10で割って、1.23で小数点以下の2が表示
lc.setDigit(2, 1, AirSpeed_keta1, false); //1桁目の値を表示
lc.setDigit(2, 2, AirSpeed_keta2, false); //2桁目の値を表示
lc.setDigit(2, 3, 0, true); //3桁目の値を表示
}
}
if (VNAV_Pos == 1) {
lc.setChar(2, 1, ' ', false);
lc.setChar(2, 2, ' ', false);
lc.setChar(2, 3, ' ', false);
}
//===============================================================================================
/////////// loop内 7セグメント HEADING //////////////////
//===============================================================================================
//lc.setScanLimit(2, 7);//2の中で1つだけ設定すればいいのでいらない
int Heading_Val_keta1 = Heading_Val % 10; //例えば123の数字の場合、123÷10=12.3で小数点以下の3が1桁の数字として表示
int Heading_Val_keta2 = Heading_Val / 10 % 10 ; //例えば123の数字の場合、、÷10=12.3、さらに10で割って、1.23で小数点以下の2が表示
int Heading_Val_keta3 = Heading_Val / 100; //例えば123の数字の場合、123÷100=1.23で1の整数が3桁目の数字として表示
lc.setIntensity(2, 5);
lc.setDigit(2, 5, Heading_Val_keta1, false); //1桁目の値を表示、falseはドットを表示しない設定。
lc.setDigit(2, 6, Heading_Val_keta2, false); //2桁目の値を表示
lc.setDigit(2, 7, Heading_Val_keta3, false); //3桁目の値を表示
//===============================================================================================
/////////// loop内 7セグメント ALTITUDE //////////////////
//===============================================================================================
//数値の回転制限(数字が止まるところ)はエンコーダ側で行う。但し、こちらで制限することもできるがX-Planeと違った数値になるので注意が必要。
//表示する桁数を変更する設定
//プラスの3桁表示用
if (Altitude_Val >= 0 && Altitude_Val <= 999) { //もし、999より小さいなら以下を実行
lc.setScanLimit(1, 2); // 3桁表示にする。(最初は行数、2番めが桁数、0が1桁、1が2桁…)本当は2だが、0を使っていないので3になっている
lc.setIntensity(1, 1); // ここだけ明るすぎるので特別に落とした。
//プラスの値の処理
//int Altitude_Val_keta1 = Altitude_Val % 10; //例えば123の数字の場合、123÷10=12.3で小数点以下の3が1桁の数字として表示
//int Altitude_Val_keta2 = Altitude_Val / 10 % 10 ; //例えば123の数字の場合、、÷10=12.3、さらに10で割って、1.23で小数点以下の2が表示
int Altitude_Val_keta3 = Altitude_Val / 100 % 10; //例えば123の数字の場合、123÷100=1.23で1の整数が3桁目の数字として表示
//int Altitude_Val_keta4 = Altitude_Val / 1000 % 10;
lc.setDigit(1, 0, 0, false); //1桁目の値を表示
lc.setDigit(1, 1, 0, false); //2桁目の値を表示
lc.setDigit(1, 2, Altitude_Val_keta3, false); //3桁目の値を表示
//lc4.setDigit(0, 3, Altitude_Val_keta4, false); //4桁目の値を表示
}
//プラスの4桁表示用
else if (Altitude_Val >= 1000 && Altitude_Val <= 9999) { //もし、999より小さいなら以下を実行
lc.setScanLimit(1, 3); // 1000以上、9999以下なら、4桁表示にする
lc.setIntensity(1, 2);
//lc4.setIntensity(0, 5); // 15 = brightest
//プラスの値の処理
//int Altitude_Val_keta1 = Altitude_Val % 10; //例えば123の数字の場合、123÷10=12.3で小数点以下の3が1桁の数字として表示
//int Altitude_Val_keta2 = Altitude_Val / 10 % 10 ; //例えば123の数字の場合、、÷10=12.3、さらに10で割って、1.23で小数点以下の2が表示
int Altitude_Val_keta3 = Altitude_Val / 100 % 10; //例えば123の数字の場合、123÷100=1.23で1の整数が3桁目の数字として表示
int Altitude_Val_keta4 = Altitude_Val / 1000 % 10;
lc.setDigit(1, 0, 0, false); //1桁目の値を表示(現在0の数字を表示するようにしている)
lc.setDigit(1, 1, 0, false); //2桁目の値を表示(現在0の数字を表示するようにしている)
lc.setDigit(1, 2, Altitude_Val_keta3, false); //3桁目の値を表示
lc.setDigit(1, 3, Altitude_Val_keta4, false); //4桁目の値を表示
}
//プラスの5桁表示用
else if (Altitude_Val >= 10000 && Altitude_Val <= 100000) {
lc.setScanLimit(1, 4); //10000以上、100000以下なら、5桁表示にする
lc.setIntensity(1, 4);
//int Altitude_Val_keta1 = Altitude_Val % 10; //例えば123の数字の場合、123÷10=12.3で小数点以下の3が1桁の数字として表示
//int Altitude_Val_keta2 = Altitude_Val / 10 % 10 ; //例えば123の数字の場合、、÷10=12.3、さらに10で割って、1.23で小数点以下の2が表示
int Altitude_Val_keta3 = Altitude_Val / 100 % 10; //例えば123の数字の場合、123÷100=1.23で1の整数が3桁目の数字として表示
int Altitude_Val_keta4 = Altitude_Val / 1000 % 10;
int Altitude_Val_keta5 = Altitude_Val / 10000 % 10;
lc.setDigit(1, 0, 0, false); //1桁目の値を表示(現在0の数字を表示するようにしている)
lc.setDigit(1, 1, 0, false); //2桁目の値を表示(現在0の数字を表示するようにしている)
lc.setDigit(1, 2, Altitude_Val_keta3, false); //3桁目の値を表示
lc.setDigit(1, 3, Altitude_Val_keta4, false); //4桁目の値を表示
lc.setDigit(1, 4, Altitude_Val_keta5, false); //5桁目の値を表示
}
else {
lc.setScanLimit(1, 4); //そうでないなら、5桁表示にする
}
//===============================================================================================
/////////// loop内 7セグメント VERT SPEED //////////////////
//===============================================================================================
//表示する桁数を変更する設定
if (VertSpeed_vs_pos == 0) { //もし、0と同じなら以下を実行
lc.setScanLimit(0, 0); // 1桁表示にする。(最初は行数、2番めが桁数、0が1桁、1が2桁…)
lc.setChar(0, 0, ' ', false); //0になったら数値を表示しないように空白を入れている
}
//プラスの値の処理
else if (VertSpeed_Val == 50 ) { //もし、999より小さいなら以下を実行
lc.setIntensity(0, 1);
lc.setScanLimit(0, 2); // 3桁表示にする。(最初は行数、2番めが桁数、0が1桁、1が2桁…)
int VertSpeed_Val_keta1 = VertSpeed_Val % 10; //例えば123の数字の場合、123÷10=12.3で小数点以下の3が1桁の数字として表示
int VertSpeed_Val_keta2 = VertSpeed_Val / 10 % 10 ; //例えば123の数字の場合、、÷10=12.3、さらに10で割って、1.23で小数点以下の2が表示
//int VertSpeed_Val_keta3 = VertSpeed_Val / 100 % 10; //例えば123の数字の場合、123÷100=1.23で1の整数が3桁目の数字として表示
lc.setDigit(0, 0, VertSpeed_Val_keta1, false); //1桁目の値を表示
lc.setDigit(0, 1, VertSpeed_Val_keta2, false); //2桁目の値を表示
lc.setChar(0, 2, ' ', false); //3桁目に空白を表示
}
//プラスの値の処理
else if (VertSpeed_Val >= 100 && VertSpeed_Val <= 999) { //もし、999より小さいなら以下を実行
//lc.setIntensity(0, 1);
lc.setScanLimit(0, 2);
int VertSpeed_Val_keta1 = VertSpeed_Val % 10; //例えば123の数字の場合、123÷10=12.3で小数点以下の3が1桁の数字として表示
int VertSpeed_Val_keta2 = VertSpeed_Val / 10 % 10 ; //例えば123の数字の場合、、÷10=12.3、さらに10で割って、1.23で小数点以下の2が表示
int VertSpeed_Val_keta3 = VertSpeed_Val / 100 % 10; //例えば123の数字の場合、123÷100=1.23で1の整数が3桁目の数字として表示 // 3桁表示にする。(最初は行数、2番めが桁数、0が1桁、1が2桁…)
lc.setDigit(0, 0, VertSpeed_Val_keta1, false); //1桁目の値を表示
lc.setDigit(0, 1, VertSpeed_Val_keta2, false); //2桁目の値を表示
lc.setDigit(0, 2, VertSpeed_Val_keta3, false); //3桁目の値を表示
}
else if (VertSpeed_Val >= 1000 && VertSpeed_Val <= 5000) { //X-Planeで扱えるプラス側は5000まで(エンコーダ側でこれ以上がらないようにストップさせる)
lc.setIntensity(0, 2);
lc.setScanLimit(0, 3);
//プラスの値の処理
int VertSpeed_Val_keta1 = VertSpeed_Val % 10; //例えば123の数字の場合、123÷10=12.3で小数点以下の3が1桁の数字として表示
int VertSpeed_Val_keta2 = VertSpeed_Val / 10 % 10 ; //例えば123の数字の場合、、÷10=12.3、さらに10で割って、1.23で小数点以下の2が表示
int VertSpeed_Val_keta3 = VertSpeed_Val / 100 % 10; //例えば123の数字の場合、123÷100=1.23で1の整数が3桁目の数字として表示
int VertSpeed_Val_keta4 = VertSpeed_Val / 1000 % 10;
lc.setDigit(0, 0, VertSpeed_Val_keta1, false); //1桁目の値を表示
lc.setDigit(0, 1, VertSpeed_Val_keta2, false); //2桁目の値を表示
lc.setDigit(0, 2, VertSpeed_Val_keta3, false); //3桁目の値を表示
lc.setDigit(0, 3, VertSpeed_Val_keta4, false); //4桁目の値を表示
}
//マイナスの数値表示
else if (VertSpeed_Val >= -50) { //もし、-999より下で-100より上なら以下を実行
lc.setIntensity(0, 1);
int VertSpeed_Val_keta_Minus1 = - VertSpeed_Val % 10; //例えば123の数字の場合、123÷10=12.3で小数点以下の3が1桁の数字として表示
int VertSpeed_Val_keta_Minus2 = - VertSpeed_Val / 10 % 10 ; //例えば123の数字の場合、、÷10=12.3、さらに10で割って、1.23で小数点以下の2が表示
//マイナスの値の処理
lc.setScanLimit(0, 3); // 4桁表示にする。(最初は行数、2番めが桁数、0が1桁、1が2桁…)
lc.setDigit(0, 0, VertSpeed_Val_keta_Minus1, false); //-の1桁目の値を表示
lc.setDigit(0, 1, VertSpeed_Val_keta_Minus2, false); //-の2桁目の値を表示
lc.setChar(0, 3, ' ', false); //5桁目に-空白を表示
lc.setChar(0, 3, '-', false); //5桁目に-を表示
}
//マイナスの数値表示
else if (VertSpeed_Val >= -999 && VertSpeed_Val <= -100) { //もし、-999より下で-100より上なら以下を実行
lc.setIntensity(0, 1);
int VertSpeed_Val_keta_Minus1 = - VertSpeed_Val % 10; //例えば123の数字の場合、123÷10=12.3で小数点以下の3が1桁の数字として表示
int VertSpeed_Val_keta_Minus2 = - VertSpeed_Val / 10 % 10 ; //例えば123の数字の場合、、÷10=12.3、さらに10で割って、1.23で小数点以下の2が表示
int VertSpeed_Val_keta_Minus3 = - VertSpeed_Val / 100 % 10; //例えば123の数字の場合、123÷100=1.23で1の整数が3桁目の数字として表示
//マイナスの値の処理
lc.setScanLimit(0, 3); // 4桁表示にする。(最初は行数、2番めが桁数、0が1桁、1が2桁…)
lc.setDigit(0, 0, VertSpeed_Val_keta_Minus1, false); //-の1桁目の値を表示
lc.setDigit(0, 1, VertSpeed_Val_keta_Minus2, false); //-の2桁目の値を表示
lc.setDigit(0, 2, VertSpeed_Val_keta_Minus3, false); //-の3桁目の値を表示
lc.setChar(0, 3, '-', false); //5桁目に-を表示
}
else if (VertSpeed_Val >= -5000 && VertSpeed_Val <= -1000) { //X-Planeで扱えるプラス側は-5000まで(エンコーダ側でこれ以上がらないようにストップさせる)
int VertSpeed_Val_keta_Minus1 = - VertSpeed_Val % 10; //例えば123の数字の場合、123÷10=12.3で小数点以下の3が1桁の数字として表示
int VertSpeed_Val_keta_Minus2 = - VertSpeed_Val / 10 % 10 ; //例えば123の数字の場合、、÷10=12.3、さらに10で割って、1.23で小数点以下の2が表示
int VertSpeed_Val_keta_Minus3 = - VertSpeed_Val / 100 % 10; //例えば123の数字の場合、123÷100=1.23で1の整数が3桁目の数字として表示
int VertSpeed_Val_keta_Minus4 = - VertSpeed_Val / 1000 % 10;
//マイナスの値の処理
lc.setScanLimit(0, 4); // 4桁表示にする。(最初は行数、2番めが桁数、0が1桁、1が2桁…)
lc.setDigit(0, 0, VertSpeed_Val_keta_Minus1, false); //-の1桁目の値を表示
lc.setDigit(0, 1, VertSpeed_Val_keta_Minus2, false); //-の2桁目の値を表示
lc.setDigit(0, 2, VertSpeed_Val_keta_Minus3, false); //-の3桁目の値を表示
lc.setDigit(0, 3, VertSpeed_Val_keta_Minus4, false); //-の4桁目の値を表示
lc.setChar(0, 4, '-', false); //5桁目に-を表示
}
else {
lc.setScanLimit(0, 2); //そうでないなら、3桁表示にする
}
}
//loop End
//7セグメント起動テスト用
void scrollDigits() {
//7から0までの数字
for (int a = 0; a < 8; a++) //0~7を順番に読み込む
{
lc.setDigit(0, a, a, false); //aの数の桁を読み込み、aの数を表示
lc.setDigit(1, a, a, false);
lc.setDigit(2, a, a, false);
lc.setDigit(3, a, a, false);
delay(100); //順番にこの時間間隔で7〜0を表示
}
//delay(1000);
//すべてのセグメントに8番を表示
for (int a = 0; a < 8; a++)
{
lc.setDigit(0, a, 8, false);
lc.setDigit(1, a, 8, false);
lc.setDigit(2, a, 8, false);
lc.setDigit(3, a, 8, false);
delay(100); //順番にこの時間間隔で8を表示
}
//delay(1000);
//明るさを段々暗くする
for (int a = 8; a >= 0; a--)
{
lc.setIntensity(0, a);
lc.setIntensity(1, a);
lc.setIntensity(2, a);
lc.setIntensity(3, a);
delay(200); //順番にこの時間間隔で7〜0を表
}
}
B737-800X_Zibo_Autopilot_Panel(2段目)
//B737-800X_3_36_full 専用
//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");
FD_SwLED.onChange(update_FD_SwLED);
//===============================================================================================
/////////// setup内 74HC595(LED表示)シフトレジスタ A/T ARM ランプ //////////////////
//===============================================================================================
AT_ARM_SwLED = XPlaneRef("laminar/B738/autopilot/autothrottle_status");
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); //点灯
}
}
B737-800X_Zibo_LowerPart_Panel(3段目)
B737-800X_3_36_fullで動作確認、LowerPart_Panel。このバージョンのZibo以外ではdatarefが変化したりしているので動作しないスイッチがある可能性がある。しかしプログラミングを学べば簡単に修正することは可能。
これに使っているTeensy++2.0は中国製の偽物のチップを搭載しているが、問題なく動作している。但し、プログラムを書き込む場合はWindowsから、Macの場合はエラーになってしまうので注意。
このチップの場合、リブートボタンを押すと以下のようにTeensyが認識され、書き込みを行うと「成功した」と出るが、最後に「ダウンロードエラー」がTeensy Loaderに表示されてTeensyが認識されなくなる。Windowsで書き込みを行うと問題なく実行できる。
Windowsでも最初認識されない場合がある。USBのハブに接続している場合はPCちょくのUSBポートに接続すると以下のようにチャント認識されると思う。Teensyのボタンを押して再起動が必要な場合もある。いずれにしても間違いなくWindows 11でも書き込みは可能である。
同じ中国製でも、もう一つのチップはMacからでも書き込みが出来る。どちらもシリアルポート名は同じになっている。HID=16c0:0488.ffc9.4 FlightSim (Teensy)
// B737-800X_3_36_fullでロータリースイッチ動作を確認した
#include
#include
#include
#include
#include //中国製I2C
#define BUTTON 22
const int ledPin = 5;
//------I2C & 7seg 共通--------------
enum pins {
ModeSwitchPin_A1 = 42, //I2C
ModeSwitchPin_A2 = 41, //I2C
ModeSwitchPin_B1 = 39, //7seg
ModeSwitchPin_B2 = 40, //7seg
ModeSwitchPin_B3 = 38, //7seg
Nav1_LED = 6, //7seg
Com1_LED = 7 //7seg
}; //最後の;は必要
//モードのこと
Bounce modeSwitch_A1 = Bounce (ModeSwitchPin_A1, 5); //I2C
Bounce modeSwitch_A2 = Bounce (ModeSwitchPin_A2, 5); //I2C
Bounce modeSwitch_A3 = Bounce (ModeSwitchPin_A2, 5); //I2C
Bounce modeSwitch_B1 = Bounce (ModeSwitchPin_B1, 5); //7seg
Bounce modeSwitch_B2 = Bounce (ModeSwitchPin_B2, 5); //7seg
Bounce modeSwitch_B3 = Bounce (ModeSwitchPin_B2, 5); //7seg
Bounce modeSwitch_B4 = Bounce (ModeSwitchPin_B3, 5); //7seg
FlightSimFloat Airspeed_kts; //Floatで小数点以下も扱える、本来フロート //I2C
FlightSimFloat Altitude_ft; //Floatで小数点以下も扱える、本来フロート //I2C
//FlightSimFloat Fuel_flow;
FlightSimInteger Fuel_Total;
FlightSimInteger Fuel_left;
FlightSimInteger Fuel_center;
FlightSimInteger Fuel_right;
FlightSimInteger Nav1_Val;
FlightSimInteger Com1_Val;
FlightSimInteger Transponder_Val;
//------I2C & 7seg end--------------
/////////////////////////////////////////////////////////////////////////
//--- i2C LCD1602 宣言 ----------------------------
/////////////////////////////////////////////////////////////////////////
LiquidCrystal_I2C lcd(0x27, 16, 2); // I2C: 0x3F, 16x2 LCDを16文字で2行表示。
enum Modes_A1 {
Mode_SwitchA1, // automatically = 0
Mode_SwitchA2, // automatically = 1
Mode_Count_A1 // automagically = 2, and we have 2 modes, that's convenient!
};
int mode_A1 = 0;
enum Modes_A2 {
Mode_Airspeed_kts, // automatically = 0
Mode_Altitude_ft, // automatically = 1
Mode_Count_A2 // automagically = 2, and we have 2 modes, that's convenient!
};
int mode_A2 = 0;
enum Modes_A3 {
Mode_Fuel_flow, // automatically = 0
Mode_Fuel_flow_2, // automatically = 1
Mode_Count_A3 // automagically = 2, and we have 2 modes, that's convenient!
};
int mode_A3 = 0;
//--------- i2C LCD1602 END ----------------
//--------- ロータリースイッチ ----------------
/////////////////////////////////////////////////////////////////////////
//--- CTR ロータリー SW(左側)宣言 ----------------------------
/////////////////////////////////////////////////////////////////////////
const int CTR_Rotary_firstPin = 8; //ロータリースイッチの最初のピン
const int CTR_Rotary_2Pin = 9;
const int CTR_Rotary_3Pin = 10;
const int CTR_Rotary_lastPin = 11; //ロータリースイッチの最後のピン
FlightSimInteger CTR_RangeSelector;
/////////////////////////////////////////////////////////////////////////
//--- TFC ロータリー SW(右側)宣言 ----------------------------
/////////////////////////////////////////////////////////////////////////
//8ピンもあるが実際のB737では動作していないので空スイッチになる
const int TFC_Rotary_firstPin = 12; //ロータリースイッチの最初のピン9-8
const int TFC_Rotary_2Pin = 13;
const int TFC_Rotary_3Pin = 14;
const int TFC_Rotary_4Pin = 15;
const int TFC_Rotary_5Pin = 16;
const int TFC_Rotary_6Pin = 17;
const int TFC_Rotary_7Pin = 18;
const int TFC_Rotary_lastPin = 19; //ロータリースイッチの最後のピン16-15
FlightSimInteger TFC_RangeSelector;
//--------- ロータリースイッチ END ----------------
/////////////////////////////////////////////////////////////////////////
//--- LED 74HC595 シフトレジスタ 共通 -------------------
/////////////////////////////////////////////////////////////////////////
int SER_dataPin = 43; //75HC595のピン14(SER)とUNOの8ピンを繋ぐ(DS-data)21
int RCLK_latchPin = 44; //75HC595のピン12(RCLK)とUNOの9ピンを繋ぐ(ST_CP-latch)24
int SRCLK_clockPin = 45; //75HC595のピン11(SRCLK)とUNOの10ピンを繋ぐ(SH_CP-clock)23
//How many of the shift registers - change this
#define number_of_74hc595s 2 //シフトレジスタの数(74HC595の設置数)
//do not touch
#define numOfRegisterPins number_of_74hc595s * 8 //ここは触れないでください
boolean registers[numOfRegisterPins]; //上のレジスタの数を反映させる
//--------- LED 74HC595 シフトレジスタ END ----------------------------------------------
/////////////////////////////////////////////////////////////////////////
//--- LED 74HC595 シフトレジスタ ----------------------------
/////////////////////////////////////////////////////////////////////////
/////////// 逆噴射 LED シフトレジスタ(74HC595) -----------
const int Reverser_74HC595_Pin = 0;
FlightSimInteger ReverserSwLED; //74HC595(LED)接続
/////////// スピードブレーキ LED シフトレジスタ(74HC595)-----------
const int SpeedBrake_74HC595_Pin = 1;
FlightSimInteger SpeedBrakeSwLED;
/////////// パーキングブレーキ LED シフトレジスタ(74HC595)-----------
const int ParkingBrake_74HC595_Pin = 2;
FlightSimFloat ParkingBrakeSwLED;
/////////// ギア LED シフトレジスタ(74HC595)-----------
const int GearHandole_74HC595_Pin = 3;
FlightSimInteger GearHandleLED;
//FlightSimInteger GearSwLED;
/////////// ビーコン ライト LED シフトレジスタ(74HC595)B777専用 -----------
const int BeaconBrightness_74HC595_Pin = 4;
FlightSimFloat BeaconBrightnessLED;
/////////// ストロボ ライト LED シフトレジスタ(74HC595)-----------
const int StorobeLight_74HC595_Pin = 5;
FlightSimInteger StorobeLightLED;
/////////// ウイング ライト LED シフトレジスタ(74HC595)-----------
const int WingLight_74HC595_Pin = 6;
FlightSimInteger WingLightLED;
/////////// ロゴ ライト LED シフトレジスタ(74HC595)-----------
const int LogoLight_74HC595_Pin = 7;
FlightSimInteger LogoLightLED;
/////////// ランディング ライト LED シフトレジスタ(74HC595)-----------
const int LandingLight_RETRACTABLE_74HC595_Pin = 8;
FlightSimInteger LandingLight_RETRACTABLE_LED;
/////////// Taxi ライト LED シフトレジスタ(74HC595)-----------
const int TaxiLight_74HC595_Pin = 10;
FlightSimFloat TaxiLightLED;
/////////// Runway Turnoff ライト LED シフトレジスタ(74HC595)-----------
const int RunwayTurnoff_Left_74HC595_Pin = 9;
FlightSimInteger RunwayTurnoff_LeftLightLED;
const int RunwayTurnoff_Right_74HC595_Pin = 11;
FlightSimInteger RunwayTurnoff_RightLightLED;
/////////// 7セグ切り替え用 LED シフトレジスタ(74HC595)-----------
const int LeftLED_74HC595_Pin = 12;
const int RightLED_74HC595_Pin = 13;
//--------- LED 74HC595 シフトレジスタ END ------------------------------------------------------------
/////////////////////////////////////////////////////////////////////////
//--- 7セグメント ----------------------------
/////////////////////////////////////////////////////////////////////////
const int lc_DIN_Pin = 2; //7セグ、teensyピン位置 18
const int lc_CLK_Pin = 4; //19
const int lc_LOAD_Pin = 3; //20
//入力:DINピン、CLK端子、LOAD端子、チップ数(MAX7219の数)
LedControl lc = LedControl(lc_DIN_Pin, lc_CLK_Pin, lc_LOAD_Pin, 1);
enum Modes_1 {
Mode_Switch1, // automatically = 0
Mode_Switch2, // automatically = 1
Mode_Count_1 // automagically = 2, and we have 2 modes, that's convenient!
}; //最後の;は必要
int mode_1 = 0;
enum Modes_2 {
Mode_Nav1, // automatically = 0
Mode_Com1, // automatically = 1
Mode_Count_2 // automagically = 2, and we have 2 modes, that's convenient!
}; //最後の;は必要
int mode_2 = 0;
enum Modes_3 {
Mode_Airspeed, // automatically = 0
Mode_Altitude, // automatically = 1
Mode_Count_3 // automagically = 2, and we have 2 modes, that's convenient!
}; //最後の;は必要
int mode_3 = 0;
//--------- 7セグメント END ------------------------------------------------------------
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(BUTTON, INPUT_PULLUP);
//------setup I2C & 7seg 共通--------------
pinMode(ModeSwitchPin_A1, INPUT_PULLUP); //I2C
pinMode(ModeSwitchPin_A2, INPUT_PULLUP); //I2C
pinMode(ModeSwitchPin_B1, INPUT_PULLUP); //7seg
pinMode(ModeSwitchPin_B2, INPUT_PULLUP); //7seg
pinMode(Nav1_LED, OUTPUT); //7seg
pinMode(Com1_LED, OUTPUT); //7seg
Airspeed_kts = XPlaneRef("sim/cockpit2/gauges/indicators/airspeed_kts_pilot"); //I2C
Altitude_ft = XPlaneRef("sim/cockpit2/gauges/indicators/altitude_ft_pilot"); //I2C
Fuel_Total = XPlaneRef("sim/flightmodel/weight/m_fuel_total"); //I2C datarefの数値はkg
Fuel_left= XPlaneRef("sim/flightmodel/weight/m_fuel1");
Fuel_center= XPlaneRef("sim/flightmodel/weight/m_fuel2");
Fuel_right= XPlaneRef("sim/flightmodel/weight/m_fuel3");
Nav1_Val = XPlaneRef("sim/cockpit2/radios/actuators/nav1_frequency_hz"); //7seg
Com1_Val = XPlaneRef("sim/cockpit2/radios/actuators/com1_frequency_hz"); //7seg
Transponder_Val = XPlaneRef("sim/cockpit2/radios/actuators/transponder_code"); //7seg
//------setup I2C & 7seg 共通 end--------------
/////////////////////////////////////////////////////////////////////////
//--- setup内 I2C LCD1602 ----------------------------
/////////////////////////////////////////////////////////////////////////
lcd.init();
lcd.backlight();
//lcd.noBacklight();
//--------- setup内 i2C LCD1602 END ------------------------------------------------------------
//--------- setup内 74HC595 シフトレジスタ 共通 END ------------------------------------------------------------
//--------- setup内 ロータリー SW ------------------------------------------------------------
//===============================================================================================
/////////// setup内 CTR ロータリー SW(左側)//////////////////
//===============================================================================================
pinMode(CTR_Rotary_firstPin, INPUT_PULLUP); // 接続モード
pinMode(CTR_Rotary_2Pin, INPUT_PULLUP);
pinMode(CTR_Rotary_3Pin, INPUT_PULLUP);
pinMode(CTR_Rotary_lastPin, INPUT_PULLUP);
CTR_RangeSelector = XPlaneRef("laminar/B738/EFIS_control/capt/map_mode_pos");
//===============================================================================================
/////////// setup内 TFC ロータリー SW(右側)//////////////////
//===============================================================================================
pinMode(TFC_Rotary_firstPin, INPUT_PULLUP); // 接続モード
pinMode(TFC_Rotary_2Pin, INPUT_PULLUP);
pinMode(TFC_Rotary_3Pin, INPUT_PULLUP);
pinMode(TFC_Rotary_4Pin, INPUT_PULLUP);
pinMode(TFC_Rotary_5Pin, INPUT_PULLUP);
pinMode(TFC_Rotary_6Pin, INPUT_PULLUP);
pinMode(TFC_Rotary_7Pin, INPUT_PULLUP);
pinMode(TFC_Rotary_lastPin, INPUT_PULLUP);
TFC_RangeSelector = XPlaneRef("laminar/B738/EFIS/capt/map_range");
//--------- setup内 ロータリー SW END ------------------------------------------------------------
/////////////////////////////////////////////////////////////////////////
//--- setup内 4HC595 LED シフトレジスタ ----------------------------
/////////////////////////////////////////////////////////////////////////
/////////// setup内 逆噴射 LED シフトレジスタ(74HC595)-----------
ReverserSwLED = XPlaneRef("laminar/B738/engine/prop_mode_sync");
ReverserSwLED.onChange(updateReverserSwLED);
/////////// setup内 スピードブレーキ LED シフトレジスタ(74HC595)-----------
SpeedBrakeSwLED = XPlaneRef("sim/cockpit2/controls/speedbrake_ratio");
SpeedBrakeSwLED.onChange(updateSpeedBrakeSwLED);
/////////// setup内 パーキングブレーキ LED シフトレジスタ(74HC595)-----------
ParkingBrakeSwLED = XPlaneRef("sim/cockpit2/controls/parking_brake_ratio");
ParkingBrakeSwLED.onChange(updateParkingBrakeSwLED);
/////////// setup内 ギア LED シフトレジスタ(74HC595)-----------
// ギアが動作している間のみ ON(1になる)
GearHandleLED = XPlaneRef("sim/cockpit/switches/gear_handle_status");
GearHandleLED.onChange(updateGearHandoleLED);
/////////// setup内 ビーコン ライト LED シフトレジスタ(74HC595)-----------
BeaconBrightnessLED = XPlaneRef("sim/flightmodel2/lights/beacon_brightness_ratio[0]");
BeaconBrightnessLED.onChange(updateBeaconBrightnessLED);
/////////// setup内 ストロボ ライト LED(74HC595)-----------
StorobeLightLED = XPlaneRef("sim/flightmodel2/lights/strobe_flash_now");
StorobeLightLED.onChange(updateStorobeLightLED);
/////////// setup内 ウイング ライト LED シフトレジスタ(74HC595)-----------
WingLightLED = XPlaneRef("sim/cockpit2/switches/generic_lights_switch[0]"); //間違いない
WingLightLED.onChange(updateWingLightLED);
/////////// setup内 ロゴ ライト LED シフトレジスタ(74HC595)-----------
LogoLightLED = XPlaneRef("sim/cockpit2/switches/generic_lights_switch[1]");
LogoLightLED.onChange(updateLogoLightLED);
/////////// setup内 ランディング ライト LED シフトレジスタ(74HC595)-----------
//実際は3つのスイッチがあるが1つのスイッチで全てを点灯
LandingLight_RETRACTABLE_LED = XPlaneRef("sim/cockpit2/switches/landing_lights_on");
LandingLight_RETRACTABLE_LED.onChange(updateLandingLight_RETRACTABLE_LED);
/////////// setup内 Taxi ライト LED シフトレジスタ(74HC595)-----------
TaxiLightLED = XPlaneRef("sim/cockpit2/switches/generic_lights_switch[4]");
TaxiLightLED.onChange(updateTaxiLightLED);
/////////// setup内 Runway Turnoff ライト LED シフトレジスタ(74HC595)-----------
RunwayTurnoff_LeftLightLED = XPlaneRef("sim/cockpit2/switches/generic_lights_switch[2]");
RunwayTurnoff_LeftLightLED.onChange(updateRunwayTurnoff_LeftLightLED);
RunwayTurnoff_RightLightLED = XPlaneRef("sim/cockpit2/switches/generic_lights_switch[3]");
RunwayTurnoff_RightLightLED.onChange(updateRunwayTurnoff_RightLightLED);
//--------- setup内 74HC595 シフトレジスタ END ------------------------------------------------------------
/////////////////////////////////////////////////////////////////////////
//--- setup内 7セグメント ----------------------------
/////////////////////////////////////////////////////////////////////////
lc.shutdown(0, false); // turns on display
lc.setIntensity(0, 5); // 15 = brightest
/////////////////////////////////////////////////////////////////////////
// setup内 74HC595 LED シフトレジスタ 共通
/////////////////////////////////////////////////////////////////////////
pinMode(SER_dataPin, OUTPUT);
pinMode(RCLK_latchPin, OUTPUT);
pinMode(SRCLK_clockPin, OUTPUT);
}
void loop() {
//--------- loop内共通----------------
FlightSim.update();
if (FlightSim.isEnabled()) { //X-Planeが完全に起動し、データの出力が有効になったら。
digitalWrite(ledPin, HIGH); //tensy1ピン
} else {
digitalWrite(ledPin, HIGH);
delay(1000);
digitalWrite(ledPin, LOW);
delay(1000);
}
//--------- loop内共通 END ------------------------------------------------------------
//モードを切り替えするときのLEDアクション
//digitalWrite(HdgModeLED, (mode == Mode_Heading));
//digitalWrite(ElevTrimLED, (mode == Mode_ElevTrim));
//writeRegisters(); //変更内容を表示するために呼び出さなければなりません
//必要な値が設定された後に一度だけ呼び出します。
//===============================================================================================
/////////// loop内 i2C LCD1602 //////////////////
//===============================================================================================
modeSwitch_A1.update();
modeSwitch_A2.update();
modeSwitch_A3.update();
// スイッチが押されたときにモードを変更する
if(modeSwitch_A1.fallingEdge()) {
++mode_A1;
if(mode_A1 >= Mode_Count_A1)
mode_A1 = 0;
}
if(modeSwitch_A2.fallingEdge()) {
++mode_A2;
if(mode_A2 >= Mode_Count_A2)
mode_A2 = 0;
}
if(modeSwitch_A3.fallingEdge()) {
++mode_A3;
if(mode_A3 >= Mode_Count_A3)
mode_A3 = 0;
}
//上のスイッチが最初に押されたら
if (mode_A1 == Mode_SwitchA1) {
if (mode_A3 == Mode_Fuel_flow) { //上のスイッチが最初に押されたら、これが表示される。
//1行目
lcd.setCursor(0, 0); //0は先頭から、2番目の0は1行目に表示
lcd.print(Fuel_left * 2.2046, 0); //最後の「1」は小数点以下の桁数である。この0は表示しないということになる。
lcd.print(" ");
lcd.setCursor(5, 0); //5は文字を先頭から6番目に表示、2番目の0は1行目に表示
lcd.print(Fuel_center * 2.2046, 0);
lcd.print(" ");
lcd.setCursor(11, 0); //11は文字を先頭から6番目に表示、2番目の0は1行目に表示
lcd.print(Fuel_right * 2.2046, 0);
lcd.print(" ");
//2行目
lcd.setCursor(0, 1); //0は先頭から、1は2行目に表示
lcd.print("Total:"); //先頭の文字
lcd.print(Fuel_Total * 2.2046, 0); //最後の「1」は小数点以下の桁数である。この0は表示しないということになる。
lcd.setCursor(14, 1); //11は文字を先頭から6番目に表示、2番目の0は1行目に表示
lcd.print("lb");
}
else if (mode_A3 == Mode_Fuel_flow_2) { //下のスイッチが押されたら
lcd.setCursor(0, 0); //0は先頭から、2番目の0は1行目に表示
lcd.print(Fuel_left, 1); //最後の「1」は小数点以下の桁数である。この0は表示しないということになる。
lcd.print(" ");
lcd.setCursor(5, 0); //5は文字を先頭から6番目に表示、2番目の0は1行目に表示
lcd.print(Fuel_center , 1);
lcd.print(" ");
lcd.setCursor(10, 0); //11は文字を先頭から10番目に表示、2番目の0は1行目に表示
lcd.print(Fuel_right , 1);
lcd.print(" ");
lcd.setCursor(0, 1); //0は先頭から、1は2行目に表示
lcd.print("Total:"); //先頭の文字
lcd.print(Fuel_Total, 1); //最後の「1」は小数点以下の桁数である。この0は表示しないということになる。
lcd.setCursor(14, 1); //11は文字を先頭から6番目に表示、2番目の0は1行目に表示
lcd.print("kg");
}
else{
lcd.clear(); //これで切り替えのとき、前のデータをクリアできるので文字が重ならない。
}
}
//これが起動画面。
if (mode_A1 == Mode_SwitchA2) { //下のスイッチが2番目に押されたら
if (mode_A2 == Mode_Airspeed_kts) {
//これが最初に表示される。
lcd.setCursor(0, 0); //0は先頭から、2番目の0は1行目に表示
lcd.print("ArSpd:"); //先頭の文字
lcd.print(Airspeed_kts, 1); //最後の「1」は小数点以下の桁数である。この0は表示しないということになる。
lcd.print(" ");
lcd.setCursor(12, 0); //13は先頭から12文字目から表示、2番目の0は1行目に表示
lcd.print(" knt");
lcd.setCursor(0, 1); //0は先頭から、1は2行目に表示
lcd.print("ALT:"); //先頭の文字
lcd.print(Altitude_ft, 1); //最後の「1」は小数点以下の桁数である。この0は表示しないということになる。
lcd.setCursor(14, 1); //0は先頭から、2番目の1は2行目に表示
lcd.print("ft");
}
//下のボタンを押したら最初に表示される(つまり2番目)。
else if (mode_A2 == Mode_Altitude_ft) {
lcd.setCursor(0, 0); //0は先頭から、2番目の0は1行目に表示
lcd.print("ArSpd:"); //先頭の文字
lcd.print(Airspeed_kts*1.8519984, 1); //最後の「1」は小数点以下の桁数である。この0は表示しないということになる。
lcd.print(" ");
lcd.setCursor(12, 0); //14は先頭から13文字目から表示、2番目の0は1行目に表示
lcd.print("km/h");
lcd.setCursor(0, 1); //0は先頭から、1は2行目に表示
lcd.print("ALT:"); //先頭の文字
lcd.print(Altitude_ft/3.2808, 1); //最後の「1」は小数点以下の桁数である。この0は表示しないということになる。
lcd.setCursor(14, 1); //14は先頭から13文字目から表示、2番目の1は2行目に表示
lcd.print("km");
}
else{
lcd.clear();
}
}
//--------- loop内 i2C LCD1602 END ------------------------------------------------------------
//--------- loop内 ロータリースイッチ ----------------
//===============================================================================================
/////////// loop内 CTR ロータリースイッチ(左側)//////////////////
//===============================================================================================
int CTR_RangeRotaryPos = getCTR_RangeRotaryValue(); //上で取得したスイッチの位置
if( CTR_RangeRotaryPos == 1 ) { //もしCTR_RangeRotaryPosが 1 なら
CTR_RangeSelector = 0; //CTR_RangeSelectorを 0 の位置にする(X-Planeスイッチの左位置)
}
if( CTR_RangeRotaryPos == 2 ) {
CTR_RangeSelector = 1;
}
if( CTR_RangeRotaryPos == 3 ) {
CTR_RangeSelector = 2;
}
if( CTR_RangeRotaryPos == 4 ) {
CTR_RangeSelector = 3;
}
//===============================================================================================
/////////// loop内 TFC ロータリースイッチ(右側)//////////////////
//===============================================================================================
int TFC_RangeRotaryPos = getTFC_RangeRotaryValue();
if( TFC_RangeRotaryPos == 1 ) {
TFC_RangeSelector = 0;
}
if( TFC_RangeRotaryPos == 2 ) {
TFC_RangeSelector = 1;
}
if( TFC_RangeRotaryPos == 3 ) {
TFC_RangeSelector = 2;
}
if( TFC_RangeRotaryPos == 4 ) {
TFC_RangeSelector = 3;
}
if( TFC_RangeRotaryPos == 5 ) {
TFC_RangeSelector = 4;
}
if( TFC_RangeRotaryPos == 6 ) {
TFC_RangeSelector = 5;
}
if( TFC_RangeRotaryPos == 7 ) {
TFC_RangeSelector = 6;
}
if( TFC_RangeRotaryPos == 8 ) {
TFC_RangeSelector = 7;
}
//--------- loop内 ロータリースイッチ END ------------------------------------------------------------
/////////////////////////////////////////////////////////////////////////
//--- loop内 74HC595 LED シフトレジスタ ----------------------------
/////////////////////////////////////////////////////////////////////////
writeRegisters(); //ディスプレイの変更に呼ばれる必要があります。
//必要な値が設定された後に一度だけ呼び出す。
//--------- loop内 74HC595 LED シフトレジスタ END ------------------------------------------------------------
/////////////////////////////////////////////////////////////////////////
//--- loop内 7セグメント ----------------------------
/////////////////////////////////////////////////////////////////////////
int status ;
status = digitalRead(BUTTON) ; //スイッチの状態を読む
modeSwitch_B1.update();
modeSwitch_B2.update();
modeSwitch_B3.update();
// スイッチが押されたときにモードを変更する
if(modeSwitch_B1.fallingEdge()) {
++mode_1;
if(mode_1 >= Mode_Count_1)
mode_1 = 0;
}
// スイッチが押されたときにモードを変更する
if(modeSwitch_B2.fallingEdge()) {
++mode_2;
if(mode_2 >= Mode_Count_2)
mode_2 = 0;
}
// スイッチが押されたときにモードを変更する
if(modeSwitch_B3.fallingEdge()) {
++mode_3;
if(mode_3 >= Mode_Count_3)
mode_3 = 0;
}
//light status LEDs
//digitalWrite(Nav1_LED, (mode_1 == Mode_Nav1));
//digitalWrite(Com1_LED, (mode_1 == Mode_Com1));
if(status == HIGH) { //ON/OFFトグルスイッチを押したときの処理
if (mode_1 == Mode_Switch1) { //mode_1はmodeSwitch_B1(左スイッチ)を押したときの最初のカウント
setRegisterPin(12, HIGH);
setRegisterPin(13, LOW);
int Nav1_Val_keta1 = Nav1_Val % 10; //例えば123の数字の場合、123÷10=12.3で小数点以下の3が1桁の数字として表示
int Nav1_Val_keta2 = Nav1_Val / 10 % 10 ; //例えば123の数字の場合、、÷10=12.3、さらに10で割って、1.23で小数点以下の2が表示
int Nav1_Val_keta3 = Nav1_Val / 100 % 10; //例えば123の数字の場合、123÷100=1.23で1の整数が3桁目の数字として表示
int Nav1_Val_keta4 = Nav1_Val / 1000 % 10;
int Nav1_Val_keta5 = Nav1_Val / 10000 % 10;
lc.setDigit(0, 0, Nav1_Val_keta1, false); //1桁目の値を表示、falseはドットを表示しない設定。
lc.setDigit(0, 1, Nav1_Val_keta2, false); //2桁目の値を表示
lc.setDigit(0, 2, Nav1_Val_keta3, true); //3桁目の値を表示
lc.setDigit(0, 3, Nav1_Val_keta4, false); //3桁目の値を表示
lc.setDigit(0, 4, Nav1_Val_keta5, false); //3桁目の値を表示
}
if (mode_2 == Mode_Switch2) {
setRegisterPin(12, LOW);
setRegisterPin(13, HIGH);
int Com1_Val_keta1 = Com1_Val % 10; //例えば123の数字の場合、123÷10=12.3で小数点以下の3が1桁の数字として表示
int Com1_Val_keta2 = Com1_Val / 10 % 10 ; //例えば123の数字の場合、、÷10=12.3、さらに10で割って、1.23で小数点以下の2が表示
int Com1_Val_keta3 = Com1_Val / 100 % 10; //例えば123の数字の場合、123÷100=1.23で1の整数が3桁目の数字として表示
int Com1_Val_keta4 = Com1_Val / 1000 % 10;
int Com1_Val_keta5 = Com1_Val / 10000 % 10;
lc.setDigit(0, 0, Com1_Val_keta1, false); //1桁目の値を表示、falseはドットを表示しない設定。
lc.setDigit(0, 1, Com1_Val_keta2, false); //2桁目の値を表示
lc.setDigit(0, 2, Com1_Val_keta3, true); //3桁目の値を表示
lc.setDigit(0, 3, Com1_Val_keta4, false); //3桁目の値を表示
lc.setDigit(0, 4, Com1_Val_keta5, false); //3桁目の値を表示
}
}
if(status == LOW) { //ON/OFFトグルスイッチを押したときの処理
setRegisterPin(12, HIGH);
setRegisterPin(13, LOW);
int Transponder_kts_keta1 = Transponder_Val % 10; //例えば123の数字の場合、123÷10=12.3で小数点以下の3が1桁の数字として表示
int Transponder_kts_keta2 = Transponder_Val / 10 % 10 ; //例えば123の数字の場合、、÷10=12.3、さらに10で割って、1.23で小数点以下の2が表示
int Transponder_kts_keta3 = Transponder_Val / 100 % 10; //例えば123の数字の場合、123÷100=1.23で1の整数が3桁目の数字として表示
int Transponder_kts_keta4 = Transponder_Val / 1000 % 10;
int Transponder_kts_keta5 = Transponder_Val / 10000 % 10;
lc.setDigit(0, 0, Transponder_kts_keta1, false); //1桁目の値を表示、falseはドットを表示しない設定。
lc.setDigit(0, 1, Transponder_kts_keta2, false); //2桁目の値を表示
lc.setDigit(0, 2, Transponder_kts_keta3, false); //3桁目の値を表示
lc.setDigit(0, 3, Transponder_kts_keta4, false); //3桁目の値を表示
lc.setDigit(0, 4, Transponder_kts_keta5, false); //3桁目の値を表示
}
}
//loop END-------------
//--------- 関数 ----------------
//--------- 関数 ロータリースイッチ ----------------
//===============================================================================================
/////////// 関数 CTR ロータリースイッチ //////////////////
//===============================================================================================
int getCTR_RangeRotaryValue() { //ロータリースイッチの位置(つまりはピンの位置)を取得する
for( int i=CTR_Rotary_firstPin; i<= CTR_Rotary_lastPin; i++) { //iは最初のピン、iは最後のピン以下の数になる、iにプラスしていく
int val = digitalRead( i ); // ロータリースイッチのピンを読む
if( val == LOW ) { // その読んだピンがLOWなら
return (i - CTR_Rotary_firstPin + 1); // 5 - 1の範囲の値を返す
}
}
return 0; // エラーの場合は0を返す
}
//===============================================================================================
/////////// 関数 TFC ロータリースイッチ //////////////////
//===============================================================================================
int getTFC_RangeRotaryValue() { //ロータリースイッチの位置(つまりはピンの位置)を取得する
for( int i=TFC_Rotary_firstPin; i<= TFC_Rotary_lastPin; i++) { //iは最初のピン、iは最後のピン以下の数になる、iにプラスしていく
int val = digitalRead( i ); // ロータリースイッチのピンを読む
if( val == LOW ) { // その読んだピンがLOWなら
return (i - TFC_Rotary_firstPin + 1); // 5 - 1の範囲の値を返す
}
}
return 0; // エラーの場合は0を返す
}
//--------- 関数 ロータリースイッチ END ------------------------------------------------------------
/////////////////////////////////////////////////////////////////////////
//--- 関数 74HC595 LED シフトレジスタ 共通 ----------------------------
/////////////////////////////////////////////////////////////////////////
// すべてのレジスタの端子をLOWに設定
void clearRegisters(){
for(int i = numOfRegisterPins - 1; i >= 0; i--){
registers[i] = LOW;
}
}
//Set and display registers
//Only call AFTER all values are set how you would like (slow otherwise)
//セットとディスプレイレジスタ
//すべての値がご希望の方法を設定した後にのみ呼び出す(そうでないとくないとゆっくりになる)
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);
}
//set an individual pin HIGH or LOW
//個々のピンを高いか低いか設定
void setRegisterPin(int index, int value){
registers[index] = value;
}
//--------- 関数 74HC595 LED シフトレジスタ 共通 END ------------------------------------------------------------
/////////////////////////////////////////////////////////////////////////
//--- 関数 74HC595 LED シフトレジスタ ----------------------------
/////////////////////////////////////////////////////////////////////////
/////////// 関数 逆噴射 LED Lamp -----------
void updateReverserSwLED(long value) {
if (value == 1) {
setRegisterPin(Reverser_74HC595_Pin, HIGH); //消灯
} else {
setRegisterPin(Reverser_74HC595_Pin, LOW); //点灯
}
}
/////////// 関数 スピードブレーキ LED シフトレジスタ(74HC595)-----------
void updateSpeedBrakeSwLED(long value) {
if (value == 0) {
setRegisterPin(SpeedBrake_74HC595_Pin, LOW); //消灯
} else {
setRegisterPin(SpeedBrake_74HC595_Pin, HIGH); //点灯
}
}
/////////// 関数 パーキングブレーキ LED シフトレジスタ(74HC595)-----------
void updateParkingBrakeSwLED(float value) {
if (value > 0.289626) {
setRegisterPin(ParkingBrake_74HC595_Pin, HIGH); //消灯
} else {
setRegisterPin(ParkingBrake_74HC595_Pin, LOW); //点灯
}
}
/////////// 関数 ギア LED シフトレジスタ(74HC595)-----------
void updateGearHandoleLED(long value) {
if (value == 0) {
setRegisterPin(GearHandole_74HC595_Pin, LOW); //消灯
} else {
setRegisterPin(GearHandole_74HC595_Pin, HIGH); //点灯
}
}
/////////// 関数 ビーコン ライト LED シフトレジスタ(74HC595)-----------
void updateBeaconBrightnessLED(float value) {
if (value == 1) { //ビーコンは0.000000〜0.900000の間で明るさを調整してあるので複雑である。
setRegisterPin(BeaconBrightness_74HC595_Pin, HIGH); //点灯 ややタイミングずれている
} else {
setRegisterPin(BeaconBrightness_74HC595_Pin, LOW); //消灯
}
}
/////////// 関数 ストロボ ライト LED シフトレジスタ(74HC595)-----------
void updateStorobeLightLED(long value) {
if (value == 1) {
setRegisterPin(StorobeLight_74HC595_Pin, HIGH); //消灯
} else {
setRegisterPin(StorobeLight_74HC595_Pin, LOW); //点灯
}
}
/////////// 関数 ウイング ライト LED シフトレジスタ(74HC595)-----------
void updateWingLightLED(long value) {
if (value == 1) {
setRegisterPin(WingLight_74HC595_Pin, HIGH); //点灯
} else {
setRegisterPin(WingLight_74HC595_Pin, LOW); //消灯
}
}
/////////// 関数 ロゴ ライト LED シフトレジスタ(74HC595)-----------
void updateLogoLightLED(long value) {
if (value == 1) {
setRegisterPin(LogoLight_74HC595_Pin, HIGH); //点灯
} else {
setRegisterPin(LogoLight_74HC595_Pin, LOW); //消灯
}
}
/////////// 関数 ランディング ライト LED シフトレジスタ(74HC595)-----------
void updateLandingLight_RETRACTABLE_LED(long value) {
if (value == 1) {
setRegisterPin(LandingLight_RETRACTABLE_74HC595_Pin, HIGH); //点灯
} else {
setRegisterPin(LandingLight_RETRACTABLE_74HC595_Pin, LOW); //消灯
}
}
/////////// 関数 Taxi ライト LED シフトレジスタ(74HC595)-----------
void updateTaxiLightLED(float value) {
if (value == 1) {
setRegisterPin(TaxiLight_74HC595_Pin, HIGH); //点灯
} else {
setRegisterPin(TaxiLight_74HC595_Pin, LOW); //消灯
}
}
/////////// 関数 Runway Turnoff ライト LED シフトレジスタ(74HC595)-----------
void updateRunwayTurnoff_LeftLightLED(long value) {
if (value == 1) {
setRegisterPin(RunwayTurnoff_Left_74HC595_Pin, HIGH); //点灯
} else {
setRegisterPin(RunwayTurnoff_Left_74HC595_Pin, LOW); //消灯
}
}
void updateRunwayTurnoff_RightLightLED(long value) {
if (value == 1) {
setRegisterPin(RunwayTurnoff_Right_74HC595_Pin, HIGH); //点灯
} else {
setRegisterPin(RunwayTurnoff_Right_74HC595_Pin, LOW); //消灯
}
}
//--------- 関数 74HC595 LED シフトレジスタ END ------------------------------------------------------------
void updateNav1_Val(long value) {
if (value == HIGH) {
//setRegisterPin(LeftLED_74HC595_Pin, HIGH); //点灯
} else {
//setRegisterPin(LeftLED_74HC595_Pin, LOW); //消灯
}
}
void updateCom1_Val(long value) {
if (value == HIGH) {
//setRegisterPin(RightLED_74HC595_Pin, HIGH); //点灯
} else {
//setRegisterPin(RightLED_74HC595_Pin, LOW); //消灯
}
}
電源入力コネクタ
5Vの電源を設置します。
Teensyを複数同時に使用することにより、USBから電流を保持するのが難しくなるので、外部電源を設置します。電源は5V-2Aで問題なく動作しています。
Teensy|外部電源とUSB電源の使い分け
- 3つのパネル合計1Aあれば充分の電流を確保できる。(うまく点灯しないときは電源を入れ直すと良い)
- 上段:7セグメントは普通に使用した場合5V/60mAで動作している。8の文字を全部表示すると100mA程度になる。この3つではこれが一番電力を必要としている。
- 中断:オートパイロットは起動状態(LED点灯無し)で30mA、使用した状態で80mA程度になる。
- 下段:未検証
Teensyを使っていて動作が安定しない場合は電流不足になっている可能性が高い、そういうときは外部電源が必要になる。
以下はPJRCサイトの説明をわかりやすく書いてみた。ここでは電池で説明してある。
方法1:5Vと3Vパッドを切り離す
デフォルト状態のTeensyはVcc(または+ 5V)ピンとグラウンドに印加された電力で動作しています。
この状態のTeensyで外部電源を導入するには、USBケーブルで供給されている電力と外部電源を分離する必要があります。
※つまり、普通状態はUSBから5Vの電源を得ているが、外部電力を使うにはそれを切り離す必要がある。
以下がTeensyをデフォルトの状態で、3Vの電源を直接繋いだ例です。USB電源5Vと乾電池3Vの並列電源になっています。電圧的には3.6V位になるのかもしれませんね。
回路図を参照してください。矢印のある赤丸のところ5Vと3Vの間が繋がっている状態。右に3Vの外部電源があり、左にUSBの5V電源が同時にある状態になっている。
ただし、実行電源を3.6ボルト以上で駆動しないでください! 電源が3.6V以上になる場合は、3Vパッドを短絡させないで、切り離して使用してくださいと言うことです。
色んなサイトではこのような電源の並列繋ぎは危険なので止めましょうとあるのだが、この場合はどうなんだろう。わからないなら、ハッキリと分けた方が無難ということで完全に分離して使用することにします。
そこで5Vの外部電源を使うのでTeensyに細工が必要になります。安全で安定した電源を確保するためにはこの作業が欠かせなくなります。
Teensyは5Vと3Vのパッドの間に細い線で繋がった状態がデフォルトの状態です。パッドの位置はTeensyによって違います。パッドの横に5Vと3Vの文字が記述されているので分かると思います。
その繋がった細いライン(下図の矢印部分)を切断します。するとTeensyの14番ピン(VCC)とUSBからの電源5Vが繋がっていた電源が切れることになるので、外部電源を繋ぐまではTeensyが使えなくなります。
方法2:USBコードの赤線をカットする
別のオプションは、USBケーブル内の赤い線を切断することです。
これにより電源がこなくなることになるのでTeensyの5Vと3Vのパッド間を切断する必要がなくTeensyにそのまま外部電源を繋いで使うことができるようになります。
赤線が金属シールドと短絡しないように注意してください。
しかし注意が必要!これ以外のUSBコードは絶対に使えません。間違って使う可能性があるのであまりお勧めできないですね。
方法3:2個の1N5817ダイオードを使う
2つのダイオードを使用すると、自動的に高い方の電圧に切り替えることができます。
まず、上記の「方法1」の説明と同じように、 “5V”パッドを切り離す必要があります。 次に、1N5817ダイオードをパッド間に半田付けします。 陰極(ストライプのある側)はセンターパッドに面していなければなりません。
また電池はダイオードと接続される必要があります。カソード側(ストライプ)はTeensyのVcc(+ 5V)ピンに接続します。
このダイオードは、バッテリが逆方向に接続されている場合でもTeensyを保護します。
1N5817ダイオードは、一般的には約0.3ボルトを失うので、 電池を使う場合の最もよい実行のためには、単三電池3本(4.5V)を使用してください。
実際の配線図
以下のように使っています。スイッチを使ってどちらを選択するかハッキリさせています。3台のTeensyを使っているのでUSBからでは電力不足になるので外部電力を使用するように設定しています。
これまでは電池を使っての説明でしたが、実際は5V-2Aの電源アダプターを外部電源として使いました。
ダイオード1N5817は電源の「+」と「-」を間違いなく繋ぐなら必要ありません。万一のために付けています。ダイオードは方向性があるので注意する必要があります。
上図ではスイッチによって3.3Vのパッドに両方の電源が入るようになっているが、直接Teensyの5Vに繋いでも構わない、何故なら3.3VパッドとTeensy5Vは内部で繋がっているから。
1段目の電源回路
Teensy 3.2を使用している配線図
これが実際の電源周辺の画像になる。
基盤を作成しないで線だけで繋ぐとこのようになる。考えながらやらないと半田付けが出来なくなるところが出たりするので結構大変な作業になる。しかし、基盤を作成するよりは安価で作業的にはこれが早い。
Teensy 3.2の場合は外部電源を使用するので、以下のところを切り離す必要がある。
パッドには直接ラインが入っていないが、右上のVinのピンに5Vが入っている。Teensy内部でVinパッドと接続されていることになるので問題ない。
Teensy 3.2のVinには外部電源またはUSB電源の切り替えスイッチによる5V電源が入ることになる。
2段目の電源回路
Teensy++2.0を使用している配線図
以下の左ややしたにあるのがTeensy++2.0(コネクタから外して裏返し)ですが「5V」と「3.3V」と書いてある四角のパッドの間に細い線が繋がっています。これを切断する必要があります。細かい作業ですので注意して行いましょう。
作業終了時にはテスターで切断されていることを確認すること。
この回路では外部電源は3.3Vでなくて、直接Teensyの5Vに入っているがどちらでも同じラインなので問題は無い。
1N5817ダイオードを外部電源のイン側に入れていないので「+」「−」の入力に注意が必要。
このバックに使われている緑色の基盤は中国の会社で格安のキャンペーンをやっているときに発注して作成したもので、配線が飛躍的に楽になるのだが、現在は普通に作成すると値段が高いのでやはりユニバーサル基板で沢山のコードを使って作成することになる。
3段目の実際の電源回路
Teensy++2.0を使用している配線図
以下はTeensy++2.0ですが「5V」と「3.3V」と書いてある四角のパッドの間に細い線が繋がっています。これを切断する必要があります。細かい作業ですので注意して行いましょう。
作業終了時にはテスターで切断されていることを確認すること。
下図の「電源IN」から5V-2Aの電源を入れています。
以下の画像にはダイオードがありませんが、この撮影後「外部電源IN」の赤線を外して「1N5817」に変えて繋いでいます。これで電流の逆流を防ぐことができるので安心です。