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