1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

割込み処理を使ってESP32と人感センサで人数を計測する

Last updated at Posted at 2021-12-23

##はじめに
はじめましてT-Aと申します。
初のQiita投稿ということで緊張しております。

皆様、MicroPythonでの割込み処理をご存知でしょうか?

簡単そうに見えて複雑な割込み処理ですが、
今回は人を検知したらカウントされていくプログラムをご紹介致します

この記事では以下の環境で動作確認をしております。
MicroPython:v1.14
ハードウェア:ESP-WROOM-32

2台のセンサを動かすプログラム

sample.py
    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

このプログラムについて説明致します。

##割り込みの紹介
割り込みが発生すると、メインプログラムの実行を停止して割込みを実行し、その後メインプログラムに戻ります。ようするに変更が検出されると、関数が呼び出されます。
割込み.png

割り込みは、プログラムで物事を自動的に動かすのに活用しやすく、プログラムが実行されるタイミングの問題などを解決することが出来ます。割り込みを使用すると、現在のピン値を常にチェックする必要はありません。

#プログラムの解説

sample.py
    def handle_interrupt(pin):
      global motion
      motion = True
      global interrupt_pin
      interrupt_pin = pin

ここがメインの割込み処理部分になります。
簡潔にいうと動きを検知した時に呼び出されるのがこの関数に当たります。

sample.py  
    sensor1 = Pin(35, Pin.IN)
    sensor2 = Pin(34, Pin.IN)

sensor1,2は何でも構いません。ここで入力ピンの設定をしています。
今回は35番と34番で設定していますので使っているESP32に合わせてピンを設定し直してください。

sample.py 
    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を指定します。

sample.py 
    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

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?