説明
attachInterrupt()の最初のパラメータは割込み番号です。通常、digitalPinToInterrupt(pin)を使用して、実際のデジタルピンを特定の割り込み番号に変換する必要があります。例えば、ピン3に接続する場合は、digitalPinToInterrupt(3)をattachInterrupt()の最初のパラメータとして使用します。
Board | Digital Pins Usable For Interrupts |
---|---|
Uno, Nano, Mini, other 328-based |
2, 3 |
Uno WiFi Rev.2, Nano Every |
全てのデジタルピン |
Mega, Mega2560, MegaADK |
2, 3, 18, 19, 20, 21 (20番ピンと21番ピンは、I2C通信に利用されているときは、割り込みには利用不可) |
Micro, Leonardo, other 32u4-based |
0, 1, 2, 3, 7 |
Zero |
4番ピン以外の全てのデジタルピン |
MKR Family boards |
0, 1, 4, 5, 6, 7, 8, 9, A1, A2 |
Nano 33 IoT |
2, 3, 9, 10, 11, 13, A1, A5, A7 |
Nano 33 BLE, Nano 33 BLE Sense |
全てのピン |
Due |
全てのデジタルピン |
101 |
全てのデジタルピン(2、5、7、8、10、11、12、13はCHANGEだけ動作する) |
注意と警告
添付の関数内では、delay()は動作せず、millis()が返す値は増加しません。関数内で受信したシリアルデータは失われる可能性があります。付属関数内で変更する変数は揮発性であることを宣言してください。詳しくは後述の「ISR」の項をご覧ください。
注割り込みの使用
割り込みは、マイコンのプログラムで自動的に動作させたり、タイミングの問題を解決するのに便利です。割り込みを使用するのに適したタスクは、ロータリーエンコーダの読み取りや、ユーザーの入力の監視などです。
プログラムがロータリー・エンコーダからのパルスを常にキャッチし、パルスを見逃さないようにしようとすると、他のことをするプログラムを書くのが非常に困難になります。例えば、クリック音をキャッチするサウンドセンサーや、コインの落下をキャッチする赤外線スロットセンサー(フォトインタラプタ)など、他のセンサーも同じようなインターフェースを持っています。これらの状況では、割り込みを使用することで、マイコンは入力を逃さずに他の作業を行うことができます。
ISR(割り込みサービスルーチン)について
ISRは、他の関数にはない独自の制限を持つ特別な種類の関数です。ISRはパラメータを持つことができず、何も返してはいけません。
一般的に、ISRはできるだけ短く、高速でなければなりません。スケッチが複数のISRを使用する場合、一度に実行できるのは1つだけで、他の割り込みは、現在の割り込みが終了した後、優先順位に応じた順序で実行されます。 millis()は割り込みに依存してカウントするので、ISR内でインクリメントすることはありません。micros()は最初は動作しますが、1~2ms後に不規則な動作を始めます。delayMicroseconds()はカウンタを使用していないので、通常通り動作します。
通常、グローバル変数は、ISRとメインプログラムの間でデータを渡すために使用されます。ISRとメインプログラムの間で共有される変数が正しく更新されるようにするには、変数をvolatileとして宣言します。
割り込みの詳細については、Nick Gammon氏のメモを参照してください。
構文
attachInterrupt(digitalPinToInterrupt(pin), ISR, mode) (推奨)
attachInterrupt(interrupt, ISR, mode) (非推奨)
attachInterrupt(pin, ISR, mode) (推奨しません。また、この構文は、Arduino SAMDボード、Uno WiFi Rev2、Due、および101でのみ動作します。)
interrupt: 割り込みの番号。許可されるデータ型:int.
pin: Arduinoのピン番号。
ISR: 割り込みが発生したときに呼び出すISR。この関数はパラメータを取らず、何も返さないこと。この関数は、割り込みサービスルーチンと呼ばれることもあります。
mode: 割り込みがいつ発生するかを定義します。有効な値として4つの定数があらかじめ定義されています。
LOW:ピンがLowのときに割り込みを発生させます。
CHANGE:ピンの値が変化したときに割り込みを発生させます。
RISING:ピンがローからハイになったときにトリガします。
FALLINGは、ピンがハイからローになったときにトリガします。
また、Due、Zero、MKR1000ボードでは、以下のような設定も可能です。
HIGH:ピンがHighになったときに割り込みを発生させます。
戻り値
無
プログラム例
const byte ledPin = 13; const byte interruptPin = 2; volatile byte state = LOW; void setup() { pinMode(ledPin, OUTPUT); pinMode(interruptPin, INPUT_PULLUP); attachInterrupt(digitalPinToInterrupt(interruptPin), blink, CHANGE); } void loop() { digitalWrite(ledPin, state); } void blink() { state = !state; }
割り込み番号
通常、スケッチに直接割り込み番号を入れるのではなく、digitalPinToInterrupt(pin)を使うべきです。割り込みを持つ特定のピンとその割り込み番号へのマッピングは、ボードの種類によって異なります。割り込み番号の直接使用は簡単なように見えますが、あなたのスケッチが別のボードで動作するときに互換性の問題を引き起こす可能性があります。
しかし、古いスケッチでは割込み番号を直接使用していることが多いです。多くの場合、0番(デジタルピン2用)または1番(デジタルピン3用)が使われていました。下の表は、さまざまなボードで利用可能な割り込みピンを示しています。
以下の表では、割り込み番号はattachInterrupt()に渡される番号を指していることに注意してください。歴史的な理由により、この番号はATmegaチップ上の割り込み番号に直接対応しているとは限りません(例:int.0はATmega2560チップ上のINT4に対応しています)。
Board | int.0 | int.1 | int.2 | int.3 | int.4 | int.5 |
---|---|---|---|---|---|---|
Uno, Ethernet |
2 |
3 |
||||
Mega2560 |
2 |
3 |
21 |
20 |
19 |
18 |
32u4 based (e.g Leonardo, Micro) |
3 |
2 |
0 |
1 |
7 |
Uno WiFiRev.2、Due、Zero、MKR Family、101ボードでは、割り込み番号=ピン番号です。