##はじめに
はじめましてT-Aと申します。
初のQiita投稿ということで緊張しております。
皆様、MicroPythonでの割込み処理をご存知でしょうか?
簡単そうに見えて複雑な割込み処理ですが、
今回は人を検知したらカウントされていくプログラムをご紹介致します
この記事では以下の環境で動作確認をしております。
MicroPython:v1.14
ハードウェア:ESP-WROOM-32
2台のセンサを動かすプログラム
from machine import Pin
motion = False
def handle_interrupt(pin):
global motion
motion = True
global interrupt_pin
interrupt_pin = pin
sensor1 = Pin(35, Pin.IN)
sensor2 = Pin(34, Pin.IN)
sensor1.irq(trigger=Pin.IRQ_RISING, handler=handle_interrupt)
sensor2.irq(trigger=Pin.IRQ_RISING, handler=handle_interrupt)
num = 0
while True:
if motion:
num = num + 1
if num <= 50:
state = machine.disable_irq()
print(num)
motion = False
machine.enable_irq(state)
else:
break
このプログラムについて説明致します。
##割り込みの紹介
割り込みが発生すると、メインプログラムの実行を停止して割込みを実行し、その後メインプログラムに戻ります。ようするに変更が検出されると、関数が呼び出されます。
割り込みは、プログラムで物事を自動的に動かすのに活用しやすく、プログラムが実行されるタイミングの問題などを解決することが出来ます。割り込みを使用すると、現在のピン値を常にチェックする必要はありません。
#プログラムの解説
def handle_interrupt(pin):
global motion
motion = True
global interrupt_pin
interrupt_pin = pin
ここがメインの割込み処理部分になります。
簡潔にいうと動きを検知した時に呼び出されるのがこの関数に当たります。
sensor1 = Pin(35, Pin.IN)
sensor2 = Pin(34, Pin.IN)
sensor1,2は何でも構いません。ここで入力ピンの設定をしています。
今回は35番と34番で設定していますので使っているESP32に合わせてピンを設定し直してください。
sensor1.irq(trigger=Pin.IRQ_RISING, handler=handle_interrupt)
sensor2.irq(trigger=Pin.IRQ_RISING, handler=handle_interrupt)
PIN.IRQ_RISINGはピンがLOWからHIGHになるたびに割り込みを行うという意味です。
他にもピンがHIGHからLOWになるたびに割り込みを行うPin.IRQ_FALLINGや、
両端で割り込み(変更が検出された場合)には3を指定します。
while True:
if motion:
num = num + 1
if num <= 50:
state = machine.disable_irq()
print(num)
motion = False
machine.enable_irq(state)
else:
break
今回は動きを検知したら50回まで計測できるプログラムになっています。
ここでstate = machine.disable_irq()とmachine.enable_irq(state)で囲むことをお忘れなく!
これがないと割り込みが終了せず、片方のpinしか動きません。
##終わりに
今回はESP32を用いてこの実験を行いました。
myclopythonはどうしてもpythonとの違いが分かりにくいところではありますが、
是非このプログラムを参考にして割込み処理をやってみましょう!
最後まで見ていただきありがとうございました。
参考になりましたら、LGTMを押していただけるとうれしいです(^▽^)/
参考文献
https://micropython-docs-ja.readthedocs.io/ja/latest/reference/isr_rules.html