稼働中

Raspberry Pi Pico(s_27)Sound センサー 用モジュール

Soundセンサー Soundc.py

Soundセンサーはモジュールは音を検出します。
外部の周囲音が設定されたしきい値を超えるとGNDレベルを出力します。
Raspberry Pi PicoでSoundセンサーモジュールを使う自作の’Soundc.py’を作成しました。記事d_30を元に作成しています。’Soundc.py’は末尾にあります。使い方だけを記載します。

使い方

■ ファイル転送
Raspberry Pi Picoへ’Soundc.py’を送った後でimportして使います。
※Soundc.pyの末尾に、使用例(Soundc_ex.py)の## example以降をコピペ追加しても動作確認できます。
■ メソッド
‘Soundc’をimportすると「hold_on」のメソッドが使えるようになります。
Sound(d=22,lo=21)で初期化します。
d :SoundセンサーOUTを接続するGPIOの番号です。デフォルトはGP22です。
lo:音検知後の出力ピンです。デフォルトはGP21です。

(01)hold_on(t_out=950000,h_time=5000)
音検知後、一定時間出力を保持します。
t_out :machine.time_pulse_usのタイムアウトの時間です。音検知が無ければタイムアウトして再測定になります。デフォルトは950msecです。
h_time:検知後の出力保持時間です。デフォルトは5secです。

使用例

Soundセンサーで音検知し、出力ピンを’H’にします。
検知すると hold —-、hold timeを表示して動作を確認しています。


Soundc_ex.py
from Soundc import Sound
# Sound senser  hold timer LM339

## example
a=Sound(d=22,lo=21)         #初期化
# hold_on(timeout_usec,holdtime_msec)
a.hold_on(450000,3000)

実行結果

実行すると以下のようになりました。※Thonnyのshellに表示されます。


>>> %Run -c $EDITOR_CONTENT
hold ----
hold time=3201          #検知から約3000msec保持
hold ----
hold time=3267
hold ----
hold time=3355

Soundセンサーモジュール用


Soundc.py
from machine import Pin, Timer
import machine
import time
# Sound senser  hold timer LM339
class Sound:
    def __init__(self,d=22,lo=21):
        self.d_Pin=Pin(d, Pin.IN)             #SOUND-OUT '0'
        self.lo_Pin=Pin(lo, Pin.OUT, value=0) #OUT-Pin
        self.tim=Timer()     # machine.Timer class
        self.hold=0          # 保持フラグ
        
    #callback hold-off  hold(d_out)
    def hold_of(self, t):
        self.hold=0                  #hold clear
        self.lo_Pin.low()            #lo_Pin='0'
        wt=time.ticks_ms()
        print('hold time=%4d' %(wt-self.dt))    # hold時間確認用
        time.sleep_ms(10)

    def hold_on(self,t_out=950000,h_time=5000):
        while True:
            self.st=time.ticks_ms()   # 時間確認用
            #timeout(usec) 950000usec=950msec
            d=machine.time_pulse_us(self.d_Pin, 0, t_out) #'L'時間測定(usec)
            if d == -1:
                print('timeout during measurement')
            if (d != -2) & (self.hold==0):
                self.dt=time.ticks_ms()   # 時間確認用
                print('hold ----')              # hold時間確認用
                self.hold=1           #hold set
                self.lo_Pin(1)        #lo_Pin='1'
                #保持時間 period(msec) hold_ofをcallback
                self.tim.init(period=h_time, mode=Timer.ONE_SHOT, callback=self.hold_of)
            time.sleep_ms(50)         # 検知確認周期 ≒ t_out + 50msec