割り込みと ISR

ここでは Arduino のスケッチでのハードウェア割込み (hardware interrupt) の利用方法について説明します。

Arduino Uno では 2 個のピン (D2, D3) が割込みに利用できます。

D2 は割込み番号が 0 で、D3 は 1 です。

Arduino Mega2560 では 6 個 (D2, D3, D18, D19, D20, D21) が使えます。割込み番号は順番に、 0, 1, 5, 4, 3, 2 が設定されています。

割込みサービスルーチン (ISR, interrupt service routine) は引数なし、戻り値なし (void) の関数を割り当てられます。

attachInterrupt( 割込み番号, 関数名, モード) で ISR のセットをします。 attachInterrupt の引数にはピンの番号ではなく割込み番号を指定することに注意してください。

ピン番号から割込み番号の解決には、digitalPinToInterrupt が使えます。

次の例では toggle_led という名前の ISR を D2 ピンでの割込みの処理に指定しています。

const byte PIN_LED = 10;
const byte PIN_INTERRUPT = 2;
volatile byte state = LOW;

void setup() {
  pinMode( PIN_LED, OUTPUT );
  digitalWrite( PIN_LED, state );
  
  attachInterrupt(
    digitalPinToInterrupt(PIN_INTERRUPT), 
    toggle_led, FALLING );
}

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

void toggle_led(){
  state != state;
}

モードの FALLING は HIGH から LOW の状態へ遷移したことで割込みを発生させることを意味します。

上記のコードでは ISR で LED が接続されたピンの状態を表す変数を、 LOW または HIGH に変えています。そして loop にて、 その変数を digitalWrite に渡しています。

ビデオではボタンを押すと D2 ピンをグラウンドに落として、ISR を呼び出しています。その結果 LED が ON/OFF 切り替わります。

ISR で使う変数には volatile 修飾子をつけてください。

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 基礎からの IoT 入門