X-Plane コクピットの自作に挑戦!
Hightのときに単純にLEDを点灯する方法は色々記述したサイトは多いが、プッシュボタンのように一度押して離すとOnからOffになる、Offになっっても、そのままLEDを点灯させる方法が仲々見つからなかったがありました。
ここを参考にしました。ありがとうございます。

プッシュスッチによるtoggle動作のプログラム
これは、2つのピンが必要になる。入力ピン(プッシュボタン)と出力ピン(LED等)。
時々、やはりチャタリングが起きているのか、押しても点灯しないなど反応しないときもあります。
// Filename:SW03
const int led=7; //LEDピン
const int sw=15; //プッシュボタンのピン
int currentState, previousState=LOW; //現在の状態、以前の状態
int ledState=LOW; //最初のLEDの状態
void setup(){
pinMode(led, OUTPUT); //LEDは出力
pinMode(sw, INPUT); //スイッチは入力
}
void loop(){
currentState=digitalRead(sw);
if(currentState != previousState){ //エッジ検出
previousState=currentState;
if(currentState == HIGH) {
ledState = !ledState; // トグルアクション
digitalWrite(led, ledState);
}
}
}
LED点灯をトグルにする方法がもう一つあります。これも時々反応しないときがあり、押し直しが必要なときがあるが、大体トグルで点灯、消灯を行うことができます。
//Example 03A: ボタンを押すとLEDが点灯し、
//ボタンを離したあとも点いたままにする。
//バウンジングを解消する簡単な方法を取り入れた改良版
#define LED 11
#define BUTTON 10
int val = 0; //入力ピンの状態がこの変数(val)に記憶される
int old_val = 0; //valの前の値を保存しておく変数
int state = 0; //LEDの状態(0ならオフ、1ならオン)
void setup() {
pinMode(LED, OUTPUT); //ArduinoにLEDが出力であると伝える
pinMode(BUTTON, INPUT); //BUTTONは入力に設定
}
void loop() {
val = digitalRead(BUTTON); //入力を読み取りvalに格納
//入力がHIGH(ボタンが押されている)なら状態(state)を変更
if((val == LOW) && (old_val == HIGH)) { //LOW、HIGHを逆にすると押上たときに点灯するようになる
state = 1 - state;
delay(10); //この位がチャタリングが起きない(10だと時々起きる)
}
old_val = val; //valはもう古くなったので保持しておく
if(state ==1){
digitalWrite(LED, HIGH); //最初をHIGHにすると最初から点灯する
}
else {
digitalWrite(LED, LOW);
}
}
実際のX-Planeの場合です
例としてB747-400のF/Dスイッチでやってみました。プッシュボタンでは、一般的なスケッチでいくとON-OFFになってしまって、ONの状態OFFの状態を保持できませんが、下のスケッチでそれが実現できます。1回押したらON、もう一回押したらOFFになります。
const int sw=10; //プッシュボタンのピン //LEDピン(X-Planeに出力)
int currentState, previousState=LOW; //現在の状態、以前の状態
//最初のLEDの状態(X-Planeに出力の状態)
FlightSimInteger AutothrottleEngage;
void setup(){
pinMode(sw, INPUT);
AutothrottleEngage = XPlaneRef("sim/cockpit/autopilot/autopilot_mode");
}
void loop(){
FlightSim.update();
currentState=digitalRead(sw);
if(currentState != previousState){ //エッジ検出
previousState=currentState;
if(currentState == HIGH) {
AutothrottleEngage = !AutothrottleEngage; // ここがトグルアクション
digitalWrite(sw, AutothrottleEngage);
}
}
}