NOBのArduino日記!

NOBのArduino日記!

趣味は車・バイク・自転車・ラジコン・電子工作です。

Arduino IDE(attachInterrupt関数の使い方)

attachInterrupt関数
 Arduino IDEで使用するattachInterrupt関数は、外部割込みと言ってイベントが発生した時にメインループから抜け、指定した別のコードを実行できます。
 
 以下attachInterrupt関数の使用例です。
 二番ピンの電圧の変化を監視し、変化を確認するとLEDを消灯し、さらに変化するとLEDを点灯します。
 
volatile int TOGGLE = LOW;
//並行して動作するコード用変数にLEDをトグルする値を格納

void setup() {                        //一回だけ実行
  pinMode(13, OUTPUT);                //LEDが接続された13番ピンを出力に設定
  pinMode(2, INPUT_PULLUP);           //外部割込みを監視する2番ピンをプルアップし入力に設定
  attachInterrupt(digitalPinToInterrupt(2), blink, CHANGE);
                                      //2番ピン(割り込み番号0)の電圧に変化があったらblink関数を実行
}

void loop() {                         //{}内を無限ループで実行
  digitalWrite(13, TOGGLE);           //LEDが接続された13番ピンをトグルする
}

void blink(void) {                    //割り込み番号0(2番ピン)の電圧に変化があった時のみ実行される
  if (digitalRead(2) == LOW) {        //もし2番ピンがLOWなら{}内を実行する
    TOGGLE = LOW;                     //LEDトグル変数をLOWにする
  }
  else {                              //もし2番ピンがLOWでなかったら(HIGHなら)以下の{}内を実行する
    TOGGLE = HIGH;                    //LEDトグル変数をHIGHにする
  }
}
イメージ 1
図1:プログラム例

 

 試しに上記プログラムをArduino UNOで実行させた様子が図1,2です。
イメージ 2
図1:2番ピンをどこにも接続しない:13ピンのLEDが点灯
 
イメージ 1
図2:2番ピンとGNDを接続:13ピンのLEDが消灯
 
attachInterrupt(interrupt, function, mode)関数のパラメータ詳細
○interrupt:ArduinoUNOでは割り込み番号0か1
※図3よりピンクの「INT0,1」と書かれている2,3番ピンが利用できます。
割り込み番号とピン番号は違うので、上のスケッチの例の様に「digitalPinToInterrupt(pin番号)」を使うとpin番号を割り込み番号に変換してくれるので理解しやすいプログラムとなります。※ちょっとした事ですが分かり易いのは大事です。

function:割り込み発生時に呼び出す関数
※上のプログラム例ではメインループとは違う別のコード(blink)を指定
注意点1
 あえて「void blink(void)」とプログラム中に書きましたがvoid blink()でも良い」、割り込み関数では決して戻り値(1つ目のvoid)も引数(2つ目のvoid)も登録してはいけません!
int blink(int A)」等として実行すると「attachInterrupt(digitalPinToInterrupt(2), blink(1)CHANGE)」の部分でinvalid use of void expression」とエラーが表示されます。
割り込み関数はその性質上元の仕事からは連続して移行出来なくなっており、戻り値にも引数にも「void」を指定し「何もない」と宣言する必要が有ります。

注意点2
 プログラム内に複数の割り込みがあっても、同時には一つだけが実行されます。他の割り込みは現在の割り込みが終了後、優先度に応じた順序で実行されます。
 millis()の計測は割り込みに依存しているので、割り込みの実行中には増加しません。
 delay()の動作には割り込みが必要なので、割り込みの中から呼ばれても動作しません。
 micros()は、最初は動作するが、1~2秒後には乱れてしまいます。
 delayMicroseconds()は割り込みに依存しないので、通常通り動作します。

注意点3
 一つのピンに設定出来る割り込みのmodeは一つだけです。例えばRISINGとFALLINGは条件が重ならない為、同じピンに二回割り込みが設定出来そうですが出来ません。
 その場合はCHANGEによって呼び出すサブルーチン内でif文などによって処理を振り分けます。
 
注意点4
 割り込みによって呼び出すサブルーチンの処理は特に気を使って最小限のコードになる様に気を付けましょう、注意点2にも書きましたが計算負荷が大きいとタイミングが重要な処理、例えばPWM信号が乱れるなどの影響が出ます。

mode:割り込みを発生させるトリガー
 LOW:ピンがLOWの時発生※LOWの間無限に実行
 CHANGE:ピンの状態が変化したときに発生 ※上のプログラム例で使用
 RISING:ピンの状態がLOWからHIGHに変わったときに発生
 FALLING:ピンの状態がHIGHからLOWに変わったときに発生
 
イメージ 1 イメージ 3
励みになりますのでよければクリック下さい(^o^)/

↩【ArduinoIDE reference】目次に戻る