Arduinoリファレンス

Arduinoリファレンスの日本語訳のページです
garretlab
attachInterrupt()

名称

attachInterrupt()

説明

attachInterruptの1番目の引数は割り込み番号である。通常、デジタルピンを割り込み番号に変換するには、digitalPinToInterrupt(pin)を利用する必要がある。例えば、3番ピンを利用するときには、digitalPinToInterrupt(3)を、attachInterrupt()の1番目の引数に指定する。

ボード 割り込みに利用可能なデジタルピン
Uno、Nano、Mini、他の328ベースのボード 2、3
Mega、Mega2560、MegaADK 2、3、18、19、20、21
Micro、Leonardo、他の32u4ベースのボード 0、1、2、3、7
Zero 4番ピン以外のすべてのデジタルピン
Due すべてのデジタルピン

注意

指定した関数の中では、delay()は動作せず、また、millis()によって返却される値も増加しない。その関数の実行中に受信したシリアルデータはなくなる可能性がある。指定した関数の中で変更する変数は、volatile変数として宣言するべ きである。下記のISRを参照のこと。

割り込みの利用

マイクロコントローラのプログラム中で自動的に何かを行おうとしたときに、割り込みは有用であり、タイミング問題のを容易に解決する。割り込みを使うよい例には、ロータリーエンコーダの読み込みや、ユーザ入力の監視などがある。

プログラムが、ロータリーエンコーダからの信号を欠落することなく常に補足することを保証したいと思ったら、発生した信号を捕捉するためにプログラムは常にエンコーダがつながっているセンサーを監視しなければならないので、(割り込みを使わない場合は)何をするにもとても巧妙なプログラムを書く必要がある。クリックを捕捉するための音センサや硬貨が落ちるのを捕捉する赤外線センサといった、他のセンサーもインタフェースに関する同様の問題をもっている。これらの全ての状況において、割り込みを利用することで、呼び鈴が鳴ったことの検出を失敗することな く、他の作業をマイクロコントローラに自由に実行させることができる。

ISR(Interrupt Service Routine: 割り込みサービスルーチン)について

ISRは、他の多くの関数が持っていない特徴を持つ特別な関数である。ISRは、引数をとることができず、戻り値もない。

一般に、ISRはできる限り短くかつ速くなければならない。スケッチ内に複数のISRがあっても、同時には一つだけが実行される。他のISRは現在のISRの終了後、優先度に応じた順序で実行される。millis()の計測は割り込みに依存しているので、他のISRの実行中には増加しない。delay()の動作には割り込みが必要なので、ISRの中から呼ばれても動作しない。micros()は、最初は動作するが、1~2秒後には乱れてしまう。delayMicroseconds()は(割り込みに依存する)カウンタを利用しないので、通常通り動作する。

一般的に、ISRとメインプログラムとのデータのやり取りにはグローバル変数を利用する。ISRとメインプログラムで共有する変数が確実に更新されるためには、その変数をvolatileとして宣言する必要がある。

割り込みについては、Nick Gammon's notesを参照のこと(英語ページです)。

書式

void attachInterrupt(uint8_t interrupt, void (*function)(void), int mode);

void attachInterrupt(uint32_t pin, void (*callback)(void), uint32_t mode) ; (Arduino Due、Zero 専用)

引数

interrupt 割り込みの番号。digitalPinToInterrupt()を利用する。
pin ピン番号(Arduino Due、Zero専用)
function/callback 割り込みが発生したときに呼び出す関数へのポインタ。この関数は引数も返り値も持たない。割り込みサービスルーチンと呼ばれることもある。
mode いつ割り込みサービスルーチンを呼び出すかを指定する。以下に示す4つの定数が定義されている。
LOW ピンがLOWのときに割り込みサービスルーチンを呼び出す
CHANGE ピンの値が変わった時に割り込みサービスルーチンを呼び出す
RISING ピンがLOWからHIGHになった時に割り込みサービスルーチンを呼び出す
FALLING ピンがHIGHからLOWになった時に割り込みサービスルーチンを呼び出す
HIGH ピンがHIGHのときに割り込みサービスルーチンを呼び出す。(Arduino Due、Zero専用)

戻り値

なし

使用例

int pin = 13;
volatile int state = LOW;

void setup()
{
  pinMode(pin, OUTPUT);
  attachInterrupt(0, blink, CHANGE);
}

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

void blink()
{
  state = !state;
}

割り込み番号

通常、割り込み番号を直接スケッチに記述するのではなく、digitalPinToInterrupt(pin)を利用すべきである。ピン番号と割り込み番号のマッピングはボードにより異なる。割り込み番号を直接書くのは簡単に見えるが、他のボードで利用するときの互換性に問題がある。

しかし、古いスケッチではしばしば割り込み番号を直接記述している。0(デジタルピン2番)と1(デジタルピン3番)がよく使われている。以下の表に各ボードでのピンと割り込み番号の関係を示す。

ボード int.0 int.1 int.2 int.3 int.4 int.5
Uno, Ethernet 2 3
Mega2560 2 3 21 20 19 18
32u4ベース(Leonard、Microなど) 3 2 0 1 7
Due、Zero (下記参照)

Arduino Dueは強力な割り込み能力を持っている。すべてのピンに割り込みサービスルーチンを割り当てることができる。attaachInterrupt()でピン番号を直接指定可能である。

Arduino Zeroでは、4番ピン以外のピンに割り込みサービスルーチンを割り当てることができる。attaachInterrupt()でピン番号を直接指定可能である。

バージョン

Arduino 1.8.3



メニューを表示するためにJavaScriptを有効にしてください。

inserted by FC2 system