ESP32の割込みには、ハードウェア割込み(GPIO割込みとタッチ割込み)とソフトウェア割込み(タイマー割込みとウォッチドックタイマ割込み)があります。
今回は、GPIO割込みのテストをします。
GPIO割込みでは、GPIOピンの信号値が変化したときに割込みが発生し、割込みサービスルーチン(ISR)が実行されます。この割込みはすべてのGPIOピンで利用できます。
書式は、attachInterrupt(GPIOPin, ISR, Mode); です。
Modeは、LOW,HIGH,CHANGE,FALLING,RISING が使えます。
割込みを停止するには、
detachInterrupt(GPIOPin); とします。
「Arduinoをはじめよう」の本の外部割込みのスケッチを参考に、簡単なスケッチを作りました。
-------------------------------------------
/*
* ESP32 GPIO interrupt test
* 2020.1.28
* JH7UBC Keiji Hata
*/
#define LED_Pin 27
#define SW_Pin 33
volatile int state = LOW;
void setup() {
pinMode(SW_Pin, INPUT_PULLUP);
pinMode(LED_Pin, OUTPUT);
attachInterrupt(SW_Pin, LED_blink, FALLING);
}
void loop() {
digitalWrite(LED_Pin, state);
}
void LED_blink(){
delay(10);
state = !state;
}
----------------------------------------------
配線回路図です。
ブレッドボードです。
タクトスイッチにチャタリングがあるため、押し方によっては、誤動作しますが、スイッチを押すたびに点灯・消灯を繰り返し、GPIO割込みを確認することができました。
ただ、入力専用のピンA0,A3,A6,A7を割込み入力に設定するとうまくいきません。
どうして?
1月29日追記
入力専用ピンでの内部プルアップしたGPIO割込みが不安定なことについて、今朝実験をしてみました。
10kΩの外付け抵抗で入力専用ピンをプルアップしたら、正常に動作しました。
入力専用ピンは、内部プルアップ(ソフトウェアプルアップ)ができないのかもしれません。(コンパイルではエラーは出ませんが)
※コメント投稿者のブログIDはブログ作成者のみに通知されます