Arduino 日本語リファレンス


気をつけてほしいのは、この関数はパラメータとしてピン番号ではなく割り込み番号を必要とする点です。たとえば、Unoのピン2は割り込み番号0(int0)ですから、2ではなく0が正しいパラメータです。この変換は煩雑なので、digitalPinToInterrupt(pin)という専用の関数を使用しましょう。この関数はピン番号を割り込み番号に変換してくれます。

【パラメータ】

interrupt: 割り込み番号
function: 割り込み発生時に呼び出す関数
mode: 割り込みを発生させるトリガ

LOW ピンがLOWのとき発生
CHANGE ピンの状態が変化したときに発生
RISING ピンの状態がLOWからHIGHに変わったときに発生
FALLING ピンの状態がHIGHからLOWに変わったときに発生

【戻り値】

なし

【補足】

attachInterruptで指定した関数のなかでは次の点に気をつけてください。

・delay関数は機能しません
・millis関数の戻り値は増加しません
・シリアル通信により受信したデータは、失われる可能性があります
・割り当てた関数のなかで値が変化する変数にはvolatileをつけて宣言すべきです

【割り込みの使い方】

割り込みはプログラムのなかで物事が自動的に発生するようにしたいときに便利です。また、タイミングの問題を解決してくれます。割り込みに適したタスクは、ロータリエンコーダの読み取りやユーザーからの入力の監視などです。

割り込みを使わずにロータリエンコーダからのパルスを漏らさず受け取ろうとすると、入力を監視するトリッキーな処理が必要です。サウンドセンサでクリック音を検知したり、フォトインタラプタでコインが落ちるのを検出するときも同様です。そうした処理を実装するとき、割り込みを使えば、他の処理を実行しながら突然発生するイベントを処理することができます。


【例】

ピン2の状態の変化に合わせてLEDを点滅させます。

const byte ledPin = 13;
const byte interruptPin = 2;
volatile byte state = LOW;      // volatileをつけて宣言

void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(interruptPin, INPUT_PULLUP);
  // ピン番号から割り込み番号への変換には専用の関数を使用
  attachInterrupt(digitalPinToInterrupt(interruptPin), blink, CHANGE);
}

void loop() {
  digitalWrite(ledPin, state);
}

// 割り込みサービスルーチン(ISR)
void blink() {
  state = !state;
}



[目次へ戻る]

Creative Commons Attribution-ShareAlike 3.0 License.
このドキュメントはArduino Teamにより執筆され、Takumi Funadaが翻訳し、一部加筆修正したものです
ご意見はtf at musashinodenpa.comまでお送りください [Arduino wiki]