attachInterrupt()
外部割り込みが発生したときに呼び出す関数を指定するために使用します。
書式
void attachInterrupt(uint8 pin, voidFuncPtr handler, ExtIntTriggerMode mode)
割り込みハンドラをピンに登録します。
割り込みは、モードパラメータで指定されているように、ピン上の所定の遷移でトリガされます。 ハンドラは割り込みコンテキストで実行されます。 新しいハンドラは、もしあれば、ピンに現在登録されているハンドラを置き換えます。
引数
pin :ピン番号 (※注意 Arduinoと仕様が異なります。Arduinoではinterrupt: 割り込み番号 を指定)
handler: 外部割り込みで実行する関数。引数を取らず、戻り値の型はvoidでなければなりません。
mode :割り込み発生条件のタイプ。ExtIntTriggerMode列挙型の値(RISING、FALLING、CHANGE)
ExtIntTriggerMode列挙型:割り込みをトリガする外部ピンの遷移の種類
RISING :ピンがLOWからHIGHに遷移したときに割り込み発生
FALLING :ピンがHIGHからLOWに遷移するときに割り込み発生
CHANGE :ピンがLOWからHIGHまたはHIGHからLOWに遷移するとき(ピンが変化するとき)に割り込み発生
ハンドラの型
typedef void(* voidFuncPtr)(void)
(注記)目的のピンのピンモードを入力モード(INPUT、INPUT_PULLUP、INPUT_PULLDOWNなど)に設定する必要があります。
解説
関数は割り込みコンテキストで実行されるため、その内部ではdelay()は機能せず、millis()によって返される値は増加しません。 機能中に受信したシリアルデータは失われる可能性があります。 あなたは、接続された関数内で変更するグローバル変数をvolatileとして宣言する必要があります。
複数のピンでattachInterrupt()を使用している場合、いくつかの制限があります。 外部割込みページには詳細な情報があります。 利用例
次の例では、ピン0がHIGHからLOWに、またはその逆に変わるたびにLEDを点滅させます。
code:sample.ino
volatile int state = LOW; // must declare volatile, since it's
// modified within the blink() handler
void setup() {
pinMode(BOARD_LED_PIN, OUTPUT);
pinMode(0, INPUT);
attachInterrupt(0, blink, CHANGE);
}
void loop() {
digitalWrite(BOARD_LED_PIN, state);
}
void blink() {
if (state == HIGH) {
state = LOW;
} else { // state must be LOW
state = HIGH;
}
}
この例では、関数blink()は割り込みハンドラです。 ピン0の状態が変化するたびに、blink()が呼び出されます。 それは、状態変数をHIGHであればLOW、LOWであればHIGHに変化させることによって変化に反応する。 それから、ボードを呼び出しloop()に戻すようにして終了します。 loop()はLEDピンをどのような状態にも設定するので、ピン0の電圧を変更するとLEDがトグルします。
Arduinoとの互換性
ほとんどのArduinoボードには、0(デジタルピン2)と1(デジタルピン3)の2つの外部割り込みがあります。 Arduino Megaには、2番ピン(21番ピン)、3番ピン(20番ピン)、4番ピン(19番ピン)、5番ピン(18番ピン)の4つがあります。
Arduinoではピン番号ではなく、割り込み番号0、1を指定する仕様であることに注意して下さい。
Mapleでは、どの割り込み番号がどのピンに接続されているかを覚えておく必要はありません。あなたが望むピンをattachInterrupt()で利用してください。
関連項目
このドキュメントはleafLabs, LLC.が執筆し、たま吉が翻訳・一部加筆修正したものです。