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

ここを参考にしました。ありがとうございます。

プッシュボタン @ 300% (CMYK_プレビュー) .png

プッシュスッチによる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);
    	}
  }
}
comments powered by Disqus
Contents