いそぷろのブログ

おもしろいことを考えていきたい

【Arduino電子工作】タクトスイッチでダブルクリック判定

目的

タクトスイッチを素早く二回押した際、それをダブルクリックとして認識する

また、一回しか押さなかった場合、シングルクリックとして認識するプログラム

今回使うもの

  • Arduino Micro
  • タクトスイッチ
  • ブレッドボード
  • ジャンパワイヤ

回路

【Arduino電子工作】タクトスイッチでダブルクリック判定

f:id:isopro:20150724133323p:plain

f:id:isopro:20150724133334p:plain

プログラム

//目的:タクトスイッチのダブルクリック&シングルクリック判定
/*前提条件として
スイッチはプルアップ方式で抵抗を繋げた状態でデジタルピン9番に接続している
スイッチが押されていると、1
スイッチが押されていない場合は、0
がそれぞれ9番ピンに入力される

ダブルクリックはスイッチが一回押された後、離し、コンマ数秒後にもう一度押された場合のことを指す
シングルクリックはスイッチが一回押された後、離し、コンマ数秒たっても再び押されなかった場合のことを指す
*/

//click_flag_1は一回目のクリック判定に使う、click_flag_2は二回目のクリック判定に使う
int click_flag_1 = 1 , click_flag_2 = 1;
int switch_pin = 9;

void setup() {
 pinMode(switch_pin, INPUT);
 Serial.begin(9600);
}

void loop() {
//一回目のクリック確認 ONの時0 OFFの時1が入力される
 click_flag_1 = digitalRead(switch_pin);

//一回目のクリックがされた場合
 if(click_flag_1 == 0){

//0.2秒内にスイッチが離された場合、click_flag_1==1の状態でループから出る
  for(int i=0; i<10; i++){
   click_flag_1 = digitalRead(switch_pin);
   if(click_flag_1 == 1)break;
   delay(20);
  }

//もしスイッチが離されたならダブルクリックか
//シングルクリックなのかを確認するループに入る
  if(click_flag_1 == 1){

//0.2秒内にスイッチが押された場合、clck_flag_2==0の状態でループから出る
   for(int i=0; i<10; i++){
    click_flag_2 = digitalRead(switch_pin);
    if(click_flag_2==0)break;
    delay(20); //20ms
   }

//click_flag==0であればそれをダブルクリックとする
   if(click_flag_2 == 0){
    Serial.println("Double");
    click_flag_2 = 1;
    delay(50);

//もしclick_flag==0でない場合はシングルクリックとする
   }else{
    Serial.println("Single");
   }
  }
 }
delay(100); //ここの数値を小さくすると上手く動かなくなるので注意
}

プログラムのポイントになりそうなことは、プログラム内のコメントに書いてあります。

今回のプログラムで悩んだのは、シングルとダブルクリックの見分け方をどうするかです。

for文でコンマ数秒のループをつくり、その間にスイッチが押されるか、押されないかで判断することにしました

実際の動作

カメラ撮影と、PC画面キャプチャそれぞれ撮って編集するのが結構面倒だったので、今回は手抜きのカメラ撮影のみです。

 

もっとスマートなプログラムが書けないのかと思いましたが、最初に思いついたのがこれなので一応記事にしておきます。

なにか思いついたらまたつくってみようと思います

 

おわり