Menu
CoddyTech

FALLING、RISING、CHANGE

CoddyのArduinoジャーニー「delayを使わないタイミング制御」セクションの一部。レッスン 13/18。

Uno には割り込みをトリガーできるピンが2つあります。ピン2とピン3です。割り込みが必要なボタンは、いずれか一方に配線する必要があります。チップ内部ではそれぞれ割り込み0と割り込み1なので、digitalPinToInterrupt()を使ってピンを番号に変換します。attachInterrupt(3, ...)は割り込み3を指定しますが、Unoには存在しないため、何も起こりません。

attachInterrupt()の最後の部分では、どの変化に反応するかを指定します。

  • FALLING:ピンがHIGHからLOWに変わる(プルアップの場合、ボタンを押したとき)
  • RISING:ピンがLOWからHIGHに変わる(ボタンを離したとき)
  • CHANGE:どちらの変化にも反応

CHANGEを使うと、ISRはボタンを押したときと離したときの両方で実行されます。どちらが起きたかを確認するため、ピンを読み取ります。

void onChange() {
  if (digitalRead(buttonPin) == LOW) {
    // ボタンが押された
  } else {
    // ボタンが離された
  }
}

attachInterrupt(digitalPinToInterrupt(buttonPin), onChange, CHANGE);
challenge icon

チャレンジ

簡単

ボタンはピン 3 に接続されており、loop() は時間のかかる処理で動作中です。ピン 13 の LED がボタンに即座に追従するようにしてください。

  • onChange() でボタンを読み取ります。LOW なら LED を点灯し、HIGH なら消灯します
  • CHANGE を指定して、ボタンのピンに onChange() を割り当てます

Run を押し、ボタンを押したままにしてから離し、その後 Check を押してください。

自分で試してみよう

const int ledPin = 13;
const int buttonPin = 3;

// ボタンのピンの状態が変わるたびに実行されます。
void onChange() {
  // ボタンが押されているときはLEDを点灯し、離されているときは消灯する
}

void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(buttonPin, INPUT_PULLUP);
  Serial.begin(9600);
  // ここでonChange()をボタンのピンに割り当てる
}

void loop() {
  // 時間のかかる処理:そのままにしておく
  Serial.println("working");
  delay(2000);
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

delayを使わないタイミング制御のすべてのレッスン

自分で練習してみよう: Arduinoプレイグラウンド