🖱️

Arduinoで早押しボタンを作る 【その2 ボタン検知】

2022/10/10に公開

はじめに

前提知識として、プログラムの書き込みやボードの準備はこちらをご覧ください

目標

  • ボタンが押されたことを検知して、それに応じてLEDを点灯させる
  • ボタンが押されたことを検知して、それに応じてLEDを消灯させる

方法

回路図


配線図
図中には示していませんがArduinoボードの右側の端子にはCH340Eを接続しています

プログラム

割り込みかポーリングか

簡単に言うと
OS等がボタンが押されたことを勝手に教えてくれるか(割り込み)
時間を見計らって自分で聞きにいくか(ポーリング)
の違いです

割り込みかポーリングか
ポーリングではタイマーなどの実装をしなければいけないなど手間がかかる分、監視のタイミングや入力の優先度を自分で決めることができるなどメリットもあります
しかし、今回は通信などは行わず入力はボタンしかないことから割り込みで良いと思います

ソースコード

int BUTTON_PIN = 2;
int RESET_PIN = 3;
int LED_PIN = 4;
int buttonPushed = 0;
  
void setup() {
  // put your setup code here, to run once:
  // 結果を表示する用のLEDのピンを設定します
  pinMode(LED_PIN, OUTPUT);
  
  // 入力ボタンのピンとリセットボタンのピンをそれぞれ設定します
  attachInterrupt(digitalPinToInterrupt(BUTTON_PIN), buttonPushed, FALLING);
  attachInterrupt(digitalPinToInterrupt(RESET_PIN), resetPushed, FALLING);
}

void loop() {
  // put your main code here, to run repeatedly:
  switch(buttonPushed){
    case 1:
      // 入力ボタンが押されているのでLEDを点灯します
      digitalWrite(LED_PIN, HIGH);
      // ボタンが押されたことは忘れます
      buttonPushed = 0;
    break;
    case 2:
      // リセットボタンが押されているのでLEDを点灯します
      digitalWrite(LED_PIN, LOW);
      // ボタンが押されたことは忘れます
      buttonPushed = 0;
    break;    
  }
}

// 入力ボタンが押された時に呼ばれる関数
void buttonPushed(){
  // 入力ボタンが押されたことを記憶しておきます
  buttonPushed = 1;
}

// リセットボタンが押された時に呼ばれる関数
void resetPushed(){
  // リセットボタンが押されたことを記憶しておきます
  buttonPushed = 2;
}

結果

https://www.youtube.com/watch?v=hLNRmh-yEMY&mute=1
入力ボタンが押されるとLEDが点灯、リセットボタンが押されるとLEDが消灯しています

まとめ

意図したとおりの動作を実現することができました

「ボタンを押したらランプが点灯する」もうほぼ早押しボタンみたいなもんじゃないですか?
もうできたも同然です。あとはボタンの数を増やすだけじゃん楽勝ー

と、ここで問題が起こります
増やせないんです、ボタンが…

たとえば上のプログラムのコードのボタンの部分を以下の様に変更して、
ジャンパーとプルアップ抵抗も5, 6ピンに挿し替えます

- int BUTTON_PIN = 2;
- int RESET_PIN = 3;

+ int BUTTON_PIN = 5;
+ int RESET_PIN = 6;

すると、、、動きません…

こちらのブログ[1]、Arduinoの公式リファレンス[2]によるとNanoやMini系のボードで割り込みが設定できるのは2, 3ピンだけとのこと…
なんてこった…Arduino Pro Miniで作る早押しボタンはひとり用…ってコト?

とういうわけで、次回「ボード買い替え?割り込みが増やせない」

脚注
  1. Arduinoで外部(ピン変化)割り込み ↩︎

  2. Arduino Reference attachInterrupt() ↩︎

Discussion