ESP32のMicroPythonで割り込み処理を使う方法(基礎)【初心者向け完全解説】
この記事では、ESP32とMicroPythonを使って割り込み処理を使う方法を解説します。
結論
ESP32 の MicroPython では、GPIO の割り込み(IRQ)を使うことで、ボタン入力や外部イベントを即座に検知できます。ポーリング処理よりも効率的で、実用的な IoT アプリケーションには欠かせない仕組みです。
この記事で学べること
- 割り込み(IRQ)の基本的な考え方が分かる
- ESP32 の GPIO 割り込みを MicroPython で実装できる
- よくある失敗と注意点を理解できる
割り込みとは何か?
割り込みとは、通常のプログラム処理とは別に、特定のイベントが発生した瞬間に処理を実行する仕組みです。
例えば、
- ボタンが押された
- センサーの信号が変化した
といったイベントが起きた瞬間に、CPUが即座に対応できます。
ポーリングとの違い
|
方法 3651_f7989a-60> |
特徴 3651_8c179f-0c> |
|
ポーリング 3651_b5cd25-ae> |
一定間隔で状態を確認する(無駄な処理が増える) 3651_6735e4-fa> |
|
割り込み 3651_e88b9e-e2> |
必要なときだけ処理される(効率的) 3651_0d74cb-95> |
ESP32 では、低消費電力・即応性の点で割り込みが非常に有効です。
GPIO 割り込みの基本
MicroPython では、Pin.irq() を使って GPIO 割り込みを設定します。
from machine import Pin
def callback(pin):
print("Interrupt detected")
btn = Pin(0, Pin.IN, Pin.PULL_UP)
btn.irq(trigger=Pin.IRQ_FALLING, handler=callback)
コード解説
trigger:割り込み条件(立ち上がり/立ち下がり)handler:割り込み発生時に呼ばれる関数
割り込み処理での注意点(重要)
割り込みハンドラ内では、重い処理を行ってはいけません。
NG例:
- 長時間処理
time.sleep()- ファイルアクセス
理由:
- システムが不安定になる
- 他の割り込みを妨げる
基本は フラグを立てるだけ にします。
安全な割り込み処理の例
from machine import Pin
import time
flag = False
def callback(pin):
global flag
flag = True
btn = Pin(0, Pin.IN, Pin.PULL_UP)
btn.irq(trigger=Pin.IRQ_FALLING, handler=callback)
while True:
if flag:
print("Button pressed")
flag = False
time.sleep(0.1)
チャタリング対策について
物理ボタンでは、チャタリングと呼ばれる誤動作が発生します。
簡易的な対策
- 割り込み後に一定時間無視する
- フラグ制御で対応
実運用では、ソフトウェア・ハードウェア両面での対策が必要です。
よくあるトラブルと対処法
割り込みが発生しない
- GPIO 番号の指定ミス
- プルアップ設定不足
割り込みが多重発生する
- チャタリング未対策
- trigger 設定ミス
割り込みはどんな場面で使う?
- ボタン入力
- センサーの状態変化検知
- 省電力モードとの組み合わせ
IoT デバイスでは 必須の技術です。
まとめ
- 割り込みはイベント駆動型処理の基本
- MicroPython でも簡単に実装できる
- ハンドラ内は最小限の処理にする
本記事を参考に、ESP32 の割り込み処理を安全に活用してください。
