【Raspberry Pi Pico入門 – 13】外部入力割り込みをしてみる

2023年10月13日Raspberry Pi Pico入門,基本編Arduino,Raspberry Pi Pico

概要

前回に引き続き割り込み処理について解説します。今回は前回の概要で書いていた「ボタンを押された」ことをトリガーに処理を行う機能「外部入力割り込み」を試してみます。一般的には外部割り込みと呼ばれることが多いです。

前回と同じ注意点となりますが、割り込み処理はコントロールが難しく、はじめは予想外の動作をしてしまうことが多いです。次回以降の解説でも割り込み処理は極力入れないようにしますので、興味がなければ飛ばしても構いません。
ただ、自分でプログラムを書いてみたときに上から順番に処理する形では上手くいかない、と思った時に使ってみてください。

実行環境

IDE:Arduino IDE 2.2.1
MCU:Raspberry Pi Pico

回路

下記リンク先の回路と同じものを使います。

コーディング

新しくスケッチを作成し、以下の内容をコピペしてください。

const int SW_PIN = 16;
bool interrupt_flag = false;

void Interrupt() {
  interrupt_flag = true;
}

void setup() {
  pinMode(SW_PIN, INPUT_PULLUP);
  pinMode(LED_BUILTIN, OUTPUT);
  attachInterrupt(SW_PIN, Interrupt, FALLING);
}

void loop() {
  if (interrupt_flag) {
    interrupt_flag = false;
    digitalWrite(LED_BUILTIN, HIGH);
    delay(200);
  } else {
    digitalWrite(LED_BUILTIN, LOW);
  }
}

動作確認

スイッチを押すたびにLEDがチカッと一瞬光れば成功です。(長押しするとボタンを離したときにチャタリングでLEDが付くかもしれません)

解説

外部割込みについて

タイマー割り込みのようにマイコンによって設定方法が異なることは少ないのですが、外部割り込みが使えるピンが限られているマイコンもあるので、使う前にググって調べるようにしてください。ちなみにRaspberry Pi Picoは全てのピンが外部割り込みに対応しています。

外部割り込みをシーケンス図で表すと下図のようになります。タイマー処理とは割込み処理にジャンプするときの条件が異なっています。

外部割り込み時の処理内容の設定

まずはボタンが押された時の処理内容を書きます。以下の〇〇以外はライブラリ側で決められている形なので変更するとエラーになります。

void 〇〇〇〇() {
  〇〇〇〇〇〇〇〇;
  〇〇〇〇〇〇〇〇;
}

void型の関数であればどのような書き方でも大丈夫です。
タイマー割り込みの時と同じく、割り込み処理では一部の機能がストップしていることに注意してください。サンプルコードでは今回も下のようにフラグを操作するだけの内容にしています。

void Interrupt() {
  interrupt_flag = true;
}

初期設定

以下のプログラムを実行すると外部割り込み機能が起動し、設定したピンの電圧の監視を始めます。

attachInterrupt(〇〇〇〇, 〇〇〇〇, 〇〇〇〇);

第1引数は監視したいピンの番号を代入します。
第2引数は割り込みが発生した際に実行する関数の名前を代入します。
第3引数はどのような条件で割り込みを発生するかを設定します。設定できる条件は以下です。(他にもLOW・HIGHがありますが、ほとんど使わないので割愛します)

RISING立ち上がり(電圧がLowからHighに変わる)で割り込み発生
FALLING立ち上がり(電圧がHighからLowに変わる)で割り込み発生
CHANGE立ち上がり・立ち上がりで割り込み発生

今回の回路ではボタンを押すと電圧がHigh→Lowに変わるのでFALLINGに設定しています。逆にボタンを離したときに実行したいときや、正論理(ボタンを押すとHighとなるよう回路を作っている)の場合は下のようにRISINGに設定します。

attachInterrupt(SW_PIN, Interrupt, RISING);

loop()内の構造

前回と全く同じ構造なので割愛します。以下、前回の解説のリンクです。