つれづれなる備忘録

日々の発見をあるがままに綴る

TinkercadによるArduinoシミュレーション10 ~ 外部割り込み処理

1. 外部割込み処理

 今回は外部割り込み処理について取り上げてみたい。センサやスイッチ、ボタンなど何か検出や操作などのイベントがあったときだけ処理を実行したい場合に用いる。割り込み処理を用いることでloop関数内で入力の監視をする場合(例えばif内でデジタル入力のLOW/HIGH判定)と比較して、イベントが発生すると直に所定の関数を呼び出すことができる。

2. ボタン操作による割り込み処理

 外部割り込みを実行するにはattachInterrupt()を用いる。ボタンが押されるたびにオンボードLEDの点灯と消灯させるArduino 日本語リファレンスのスケッチ例を少し改造して、ボタンが押されたタイミングとボタンを離したタイミングでLEDの点灯/消灯する2つのパターンによる割り込み処理を示す。接続図は下の通りで、デジタル入出力ピンの2番と3番を外部割り込みの入力端子として用いる。押しボタンを押すと入力ピンの状態はHIGHからLOWあるいは押したボタンを離すとLOWからHIGHに変化することで割り込みを発生させる。割り込みが発生したら、オンボードLED(13ピン)の状態を反転(初期状態LOWからHIGH)させ、シリアルモニタにどちらのパターンの割り込み(ボタンを押したタイミング;FALLING、離したタイミング:RISING)か表示させる。

外部割込み
外部割込み

3. スケッチと動作

 スケッチを下に示す。外部割り込みを実行するにはsetup関数内でattachInterrupt(interrupt, function, mode);を宣言する。attachInterruption関数の1番目の引数は割り込み番号でArduino Unoの場合は0と1が指定できる。割り込み番号0のときはピン2を入力に用い、割り込み番号1のときはピン3を入力に用いる。2番目の引数は割り込みが発生したときに呼び出す関数名を指定する。呼び出される関数は別途定義しておく。3番目の引数は割り込みが発生する条件を設定で、RISING,FALLING,CHANGE,LOWがある。RISINGは入力がLOWからHIGHに変化したとき、FALLINGはHIGHからLOWに変化したとき、CHANGEはHIGH-LOW,LOW-HIGHいずれも入力が変化したとき、LOWは入力がLOWのときに割り込みが発生する。

int pin = 13;
volatile int state = LOW; // LEDの状態

void setup() {
  pinMode(pin, OUTPUT);
  pinMode(2,INPUT_PULLUP); //割り込み番号0用の入力ピン
  pinMode(3,INPUT_PULLUP);//割り込み番号1用の入力ピン
  Serial.begin(9600);
  attachInterrupt(0, blink, RISING); //ボタンを離して割り込み
  attachInterrupt(1, blink2, FALLING); //ボタンを押して割り込み
}

void loop() {
  digitalWrite(pin, state); // stateをオンボードLEDに出力

}

void blink() {
  state = !state; //状態を反転させる
  Serial.println("RISING"); //モニタにRISINGと表示
}

void blink2() {
  state = !state;//状態を反転させる
  Serial.println("FALLING"); //モニタにFALLINGと表示
}

(右の)ボタンを離したときに割り込み処理はattachInterrupt(0, blink, RISING);とすることでピン2の入力がLOWからHIGHに変化したときに関数blink()が実行される。blink()ではオンボードLEDの状態をあらわす変数statestate=state!;とすることで反転させ、さらに"RISING"とシリアルモニタに表示する。同様に(左の)ボタンを押したときの割り込み処理はattachInterrupt(1, blink2, FALLING);としてピン3の入力がLOWからHIGHに変化したときに関数blink2()が実行される。loop関数内はオンボードLEDの点灯・消灯を行うためにdigitalWrite(pin,state);のみ記述しておく。loopによりstateに応じて常時LED(ピン13)へ出力を繰り返しているところに、ボタン操作があったときにstateが反転することで点灯、または消灯が行われる。

4. まとめ

 今回は外部割込み処理について取り上げた。割り込み処理によりloop関数内のコードをよりシンプルにすると同時に、割り込み発生と同時に指定の関数(処理)が実行できるというメリットがある。