稼働中

マイクロビット(e_51)ノックセンサー モジュール KY-031

ノックセンサ KY-031

ノックを検出します。センサによる個体差はあると思いますが叩くと出力がHIGHからLOWレベルになります。

外観

ノックセンサーの外観です。
叩いたりするとスプリング状の金属が振動して、近接にある他方の電極と接触します。その瞬間の出力(S端子)がGNDレベルになります。103のチップ抵抗が接続されています。
ノックセンサ
センサ部分です。スプリングと上部に金属板が見えます。
センサ部

実体図

ノックセンサーのVCC(中央)、GND(-)、SIG(S)をmicro:bitに接続するだけです。そのため接続図は省略します。
VCCはDC 3.3Vで良いのでmicro:bitから供給します。
ただし、micro:bitのpin1からデジタル出力をHIGHにして供給することにしました。SIG(S)はmicro:bitのpin0と接続しました。以下は模式図です。
ノックセンサ図
以下は実体図です。
実体図

スクリプト

ノックを検出したらカウントアップします。カウントアップした値の1桁目(0~9)をmicro:bitのLEDディスプレイに表示させます。※動作はサウンドセンサー(記事e_50)とほとんど同じです。
ノックセンサの出力が衝撃を検知するとLOWレベル(GND)になるので、その時間を測る
machine.time_pulse_us(pins,0)
を使って検出することにしました。検出が無い時には-2が返ります。

スクリプトは以下のようにしました。※thonny-microbitのMicroPythonを使っています。


knock_01b.py
from microbit import *
import machine
import utime
# デジタル出力で電源供給するピン 
s_pin=pin1
# KY-031 Sと接続するピン
o_pin=pin0
o_pin.set_pull(o_pin.NO_PULL) #ピン予約

display.clear()
# 検知回数
cnt=0
# 検知時間(ms)
ms_dur=20000

s_pin.write_digital(1)          # 電源供給
start = utime.ticks_ms()        # 開始した稼働時間
while True:            
    d = machine.time_pulse_us(o_pin,0)  # Toff 時間測定(usec)
    if (d != -2) and (d != -1):
        cnt=cnt+1
        print(cnt,diff,d)
        display.show(str(cnt%10))

    current = utime.ticks_ms()
    diff=current-start  # 検知時間
    
    # 検知時間が設定を超えたら終了
    if diff >= ms_dur:        
        o_pin.set_pull(o_pin.NO_PULL)
        s_pin.write_digital(0)
        display.clear()
        print('break')
        break

実行結果

検知を20秒にして実行しました。ボールペンでセンサを叩いたりして見ました。
叩く角度によっては、強めに叩かないとカウントされないことがありましたが、検知動作には問題ないようです。
動画

Thonnyのshellに表示されたデータ


>>> %Run knock_01b.py
1 3997 72               # 検出回数  経過時間(msec)  Toff時間(usec)
2 5252 72
3 5529 251
4 7511 66
5 7517 66
6 15405 293
7 16178 152
8 16186 126

まとめ

micro:bitでノックセンサーKY-031の動作を確認しました。