概要
前の電子工作40の手を叩いてON/OFFさせるスイッチをそのまま使い、手を叩く代わりにブザー音のパターンを発生してスイッチをON/OFFさせる実験をしてみた。
回路
作成した音パターン発生器の回路図を下に示す。ブザーの駆動電圧が9Vなので9Vの電池を使った。また、12F629のために5Vが必要なるので低電流消費型の三端子レギュレータで降圧した。Reset
SWを押すと内蔵されているプログラムに従ってブザー音のパターンが発生する。メカニカルブザーなので電源ONで“ビー”という連続音が鳴る。点滅LEDはPower SWの消し忘れ防止のために使用した。
左のボードが音発生装置、右が音受信装置(電子工作40のもの) メカニカルブザーの写真
プログラム
音パターン発生装置用プログラム
下に示す波形パターン図に見られるように、このプログラムではReset SWを押すと3つの方形波を発生する。
'********* プログラム ************
'SoundGeneratorBuzz.bas Driving a buzzer 2010.5.18
‘'12F629.
'******** ピン接続 ************
'Pin 1: Vdd (5.0V)
'Pin 8: Vss (GND)
'Pin 7: GPIO.0: output - drive Tr/function as SW
'Pin 4: GPIO.3: input - Reset/MCLR/starting SW
'******** プログラム本体 ********
CMCON=7 'Comparator off
TRISIO=%001000 'all outputs except GPIO.3
TrONOFF var GPIO.0 ‘トランジスタのON/OFF
Low TrONOFF ‘以下でL−500ms、H-300ms (A-peak)、L-300ms, H-300ms (B-peak)、L-300ms, H-300ms (C-peak)、L-500msの様にA,B,C3つの方形波を作成している
Pause 500 '500 ms
High TrONOFF ‘方形波A
Pause 300 '300 ms
Low TrONOFF
Pause 300 '300 ms
High TrONOFF ‘方形波B
Pause 300
Low TrONOFF
Pause 300
High TrONOFF ‘方形波C
Pause 300
Low TrONOFF
Pause 500 '500 ms
End
'******** プログラムの終了 ********
'Note:
'melabs U2 Programmer's
configurations:
'FOSC - INTOSC; WDTE - Enable;
Power-up Timer - Disable
'MCLRpin – Reset ; BODEN -
Enable; CD - Disable; CDP - Disable.
下図は上記のプログラム(幅300msのA, B, Cの3個の方形波が300msの間隔をあけて出るように設定)によって発生するブザー音の典型的パターンである。ブザーを音を拾う受信側のマイクに5cmほどの距離に接近させてブザー音を発生させて、電子工作40の回路図のポイント“C”でオシロを使って測定したものである。方形波の幅(120−250ms)や3個の方形波を含む部分の長さ(1200−1300ms)がブザーとマイクとの間の距離で微妙に変化する。
音パターン受信装置用プログラム(電子工作40の“手を叩いてON/OFFさせるスイッチ”回路図中の12F629に導入するもの)
このプログラムでは、送信側のブザーからマイクを介して入ってくる3個の方形波のパターンを読込んで確認し、LEDを点灯させたりSSRを駆動させたりするものである。次のような考え方に従った。
1) (上図参照)12F629のGP0を通して入ってくる最初の方形波Aの端が検知されたら、その後50ms間隔で合計30個のH (1) or L(0) データを1個づつ保存する。
2) 次いで方形波Aの存在を確認するため、最初の5個のデータ(D1+D2+D3+D4+D5)の和(TotalA)を計算し、その和が 0=<TotalA<5の条件を満たす時だけ次のステップに進め、そうでない場合は前に戻す。
3) 次のステップでは方形波AとBの間のL-sectionを確認する。その辺をカバーする6個のデータD6+D7+D8+D9+D10+D11の和(TotalAFS)を計算し、その和をが 0=<TotalAFS<4の条件で分岐させる。
4) 同様に方形波BとCと、その間のL-sectionも上記と同じように処理し、次のステップに移る。
5) 結局、合計6つの選択条件を通過出来た時だけ、受け取ったブザーの音パターンを正しいものと認め、LEDを点灯させたりSSRを駆動する。
'********* プログラム ************
'SoundSensorW4Buzz1.bas - 2010.5.20 Program to
sense the buzzer sound
'12F629.
'******** ピン接続 ************
'Pin 1: Vdd (5V)
'Pin 8: Vss (GND)
'Pin 7:
GPIO.0: input
'Pin 4: input - MCLR
'Pin 2: output - to LED (R) via R
'Pin 3: output - to LED (G) via R or SSR (Solid State Relay)
'******** プログラム本体 ********
CMCON=7 'Comparator off
TRISIO=%001001 'all outputs except GPIO.0 & 3
D1 var byte 'declaring
variable D1 (1 or 0) 30個分のデータ記録スペースの確保
D2 var byte
D3 var byte
D4 var byte
D5 var byte
D6 var byte
D7 var byte
D8 var byte
D9 var byte
D10 var byte
D11 var byte
D12 var byte
D13 var byte
D14 var byte
D15 var byte
D16 var byte
D17 var byte
D18 var byte
D19 var byte
D20 var byte
D21 var byte
D22 var byte
D23 var byte
D24 var byte
D25 var byte
D26 var byte
D27 var byte
D28 var byte
D29 var byte
D30 var byte
TotalA var byte 'declaring variable for Apeak data データ記録スペースの確保
TotalAFS var byte 'storage for flat-section data between A and B
TotalB var byte 'storage for Bpeak data
TotalBFS var byte 'storage for flat-section data between B and C
TotalC var byte 'storage for Cpeak data
TotalCFS var byte 'staorage for flat-section data after Cpeak
HorLdata var GPIO.0 'Input from inverter
LED var GPIO.5 'Indicator when a pulse is accepted
LEDorSSR var GPIO.4 'For driving LED or SSR
LED=0
LEDorSSR=0
Start:
If HorLdata=1 then ReadData ‘if GPIO.0=1, go to ReadDat; if not,
back to Start 最初のHデータが来るまでここで待つ
Goto Start
ReadData: ‘ここから50ms間隔でデータを集め保存する。全部で30個のデータを集める。
Pause 50
D1=HorLdata
Pause 50
D2=HorLdata
Pause 50
D3=HorLdata
Pause 50
D4=HorLdata
Pause 50
D5=HorLdata
Pause 50
D6=HorLdata
Pause 50
D7=HorLdata
Pause 50
D8=HorLdata
Pause 50
D9=HorLdata
Pause 50
D10=HorLdata
Pause 50
D11=HorLdata
Pause 50
D12=HorLdata
Pause 50
D13=HorLdata
Pause 50
D14=HorLdata
Pause 50
D15=HorLdata
Pause 50
D16=HorLdata
Pause 50
D17=HorLdata
Pause 50
D18=HorLdata
Pause 50
D19=HorLdata
Pause 50
D20=HorLdata
Pause 50
D21=HorLdata
Pause 50
D22=HorLdata
Pause 50
D23=HorLdata
Pause 50
D24=HorLdata
Pause 50
D25=HorLdata
Pause 50
D26=HorLdata
Pause 50
D27=HorLdata
Pause 50
D28=HorLdata
Pause 50
D29=HorLdata
Pause 50
D30=HorLdata
Pause 50
TotalA=D1+D2+D3+D4+D5 ‘方形波Aに関し最初の5個のデータの和をとる
If 1=<(TotalA) and (TotalA)<5 then Jump1 'if OK, go to Jump1 Parentheses essential! その和が選択条件に合っているか検討。Yesなら次のステップへ進む。
Goto Start ‘If 1=<(TotalA) and (TotalA)<5
then Jump1、ここで If 1=<(TotalA)<5 then Jump1 では動作しなかったので要注意(不等号表示)!!
Jump1:
TotalAFS=D6+D7+D8+D9+D10+D11 ‘方形波AとBの間のL-sectionの検討
If 0=<(TotalAFS) and (TotalAFS)<4 then Jump2
Goto Start
Jump2:
TotalB=D12+D13+D14+D15+D16 ‘方形波Bの検討
If 1<(TotalB) and (TotalB)<4 then Jump3
Goto Start
Jump3:
TotalBFS=D17+D18+D19+D20+D21+D22 ‘方形波BとCの間のL-sectionの検討
If 0=<(TotalBFS) and (TotalBFS)<3 then Jump4
Goto Start
Jump4:
TotalC=D23+D24+D25+D26+D27 ‘方形波Cの検討
If 1<(TotalC) and (TotalC)<4 then Jump5
Goto Start
Jump5:
TotalCFS=D28+D29+D30 ‘方形波C後のL部分の検討
If 0=<(TotalCFS) and (TotalCFS)<4 then Jump
Goto Start
Jump: ‘以下でLEDを点灯したりSSRを駆動したりする
High LED 'Turn on LED ‘このLEDは音パターンが受け入れらた時一瞬(200ms)点灯して消える
Toggle LEDorSSR ‘このLEDあるいはSSR出力は音パターンが受け入れられる毎にToggleの機能により反転する
Pause 200 'Wait 200ms
Low LED 'Turn off LED
Goto Start
End
'******** プログラムの終了 ********
'Note:
'melabs U2 Programmer's
configurations:
'FOSC - INTOSC; WDTE - Enable;
Power-up Timer - Disable
'MCLRpin – Reset
; BODEN - Enable; CD - Disable; CDP - Disable.
結論など
1) 手を叩く代わりになるのではと考えて製作、実験してみたがあまり実用になりそうでない。実際に試してみて分かった。
2) ブザーとマイクの間の距離が厳しく。5cmで動作するが、それより±2cm位動かすと動作しなくなる。ソフトは初めて動作した状態から全く改良していないので直せば良くなる可能性あり。とくに不等式の範囲を決める数字の設定が重要なようだ。
3)
音の性質から音発生器でブザーの通電時間を200ms位以下にするときちんと連続音にならなくなることがある。つまり、方形波の体をなさなくなる。
4)
ブザーとマイクの間の距離が離れるにつれ方形波の幅が次第に狭くなり、やがて細い槍状になり、そして消滅する。減衰が大きい。
5)
手叩き音には全く反応しない。アーアーという音声には稀に反応する。つまり、選択性は悪くない。
6)
何に使えるだろう。ブザー付き遠隔スイッチ?
7)
ブザーとマイクを超音波センサに代えたらどうなるのだろう。無音でスイッチをON/OFF出来るようになるかも?
8)
音の方形波パターンを読込むプログラムロジックが試せ、かつとにかく動作することが分かったのは収穫であった。波幅が狭ければ(<65ms)PICBasic Pro の Pulsinコマンドが使えるのだが。
9)
分岐コマンドIFをもっと使って、3つの方形波をスマートに読込むプログラムロジックを考えよ。他でも応用できる可能性があるので。案:1)最初の方形波の端(H)を読む、2)50ms後にHであることを確認する、3)次にLの部分の端を探す、4)100ms、100ms後にLであることを確認する、5)2番目の方形波の端(H)が来るのを待つ……..と言った風に出来ないか。
改良した音パターン受信装置用プログラム(電子工作40の“手を叩いてON/OFFさせるスイッチ”回路図中の12F629に導入するもの)(2010.5.23)
プログラムのロジックを変えて新たに作成した。その結果応答性が格段に向上した。その概要は以下の通りである。
1) (上のブザー音のパターン参照)方形波A(H)が来るのを待つ。
2) 到着を確認したら、30ms間隔で2回待って2回ともHなら次に進む。
3) 次の段階でL-sectionを待つ。For I=1 to 20 … Next I では一度に10msづつ進めてL-sectionに当たったら次に進む。当たらない場合でも10x20=200msすると抜け出しStartへ戻る。
4) L-sectionに入ったら100ms間隔で2回待って2回ともLなら次に進む。
5) 次に方形波B(H)を待つ。Hに当たったら次に進む。当たらない場合でも最大で10x30=300msでStartへ戻る。 I=20、30は適当な値で小さすぎてもいけない。
6) 以下同様に処理する。 このようにして3個の方形波A,B,C(H)とそれらの間のL−section、さらに方形波Cの後のL−sectionをチェックして選択条件に合致すれば、受け取ったブザーの音パターンを正しいものと認め、LEDを点灯させたりSSRを駆動する。
結果
1) ブザーとマイク間距離0−10cmでほぼ100%ブザー音パターンにきびきびと応答する。ちなみのブザー音の大きさは測定計器(MASTECH MS8209)から約2cmの距離で70dBほどであった。
2) 手叩き音には全く反応しない。 アーアーという音声には稀に反応する。
3) とにかく幅の広い方形波のパターンを読むロジックを案出出来たのが最高の収穫である。
'********* プログラム ************
'SoundSensorBuzzA1.bas - 2010.5.22 Program to sense the buzzer sound, more logical than SoundSensorBuzzA.bas
'12F629.
'******** ピン接続 ************
'Pin 1: Vdd (5V)
'Pin 8: Vss (GND)
'Pin 7: GPIO.0: input
'Pin 4: input - MCLR
'Pin 2: output - to LED (R) via R
'Pin 3: output - to LED (G) via R or SSR (Solid State Relay)
'******** プログラム本体 ********
CMCON=7 'Comparator off
TRISIO=%001001 'all outputs except GPIO.0 & 3
D1 var byte 'declaring variable D1 (1 or 0)
D2 var byte
D3 var byte
D4 var byte
D5 var byte
D6 var byte
D7 var byte
D8 var byte
D9 var byte
D10 var byte
D11 var byte
D12 var byte
HorLdata var GPIO.0 'Input from invertor
LED var GPIO.5 'Indicator when a pulse is accepted
LEDorSSR var GPIO.4 'For driving LED or SSR
I var byte 'I is used for FOR .. NEXT
.
I=0
HorLdata=0
LEDorSSR=0
LED=0
Start:
If HorLdata=1 then ReadData 'Wait A peak 最初の方形波A(H)データが来るまでここで待つ
Goto Start
ReadData:
Pause 30 '30ms
D1=HorLdata ‘データ収集
Pause 30
D2=HorLdata ‘データ収集
If D1=1 and D2=1 then Check1 'If both are H, go to Check1 両者ともHなら方形波Aと確認
Goto Start
Check1:
For I=1 to 20 'Wait the L-section while moving 10ms per I cycle. 10x20=200ms-this value must be sufficiently large ここが要。10msづtづ進めてL−sectionを探すロジック.
Pause 10 任意値20はLが見つからなければ最大10x20=200msで抜けStartへ戻す役目。Lが見つかればCheck2にすぐ飛ぶ
If HorLdata=0 then Check2
Next I
Goto Start ‘For I=1 to 20 …. Next (10x20ms)が終了したら、L−sectionが見つからなかったとしてStratに戻る
Check2:
Pause 100 'Checking the L-section between A and B peaks 方形波AとB間のL−sectionで200ms間隔で2回チェックしている
D3=HorLdata
Pause 100
D4=HorLdata
If D3=0 and D4=0 then Check3 'If both are L, go to Check3 両者D3,D4ともLならL−sectionと確認、そうでないならStartに戻る
Goto Start
Check3:
For I=1 to 30 'Wait B peak 方形波Bを待つ
Pause 10
If HorLdata=1 then Check4
Next I
Goto Start
Check4:
Pause 30 'Checking B peak 方形波Bをチェックする
D5=HorLdata
Pause 30
D6=HorLdata
If D5=1 and D6=1 then Check5
Goto Start
Check5:
For I=1 to 30 'Wait the L-section L−sectionを待つ
Pause 10
If HorLdata=0 then Check6
Next I
Goto Start
Check6:
Pause 100 'Checking the L-section between B and C peaks 方形波BとC間のL−sectionをチェック
D7=HorLdata
Pause 100
D8=HorLdata
If D7=0 and D8=0 then Check7
Goto Start
Check7:
For I=1 to 30 ''Wait C peak 方形波Cを待つ
Pause 10
If HorLdata=1 then Check8
Next I
Goto Start
Check8:
Pause 30 'Checking C peak 方形波Cをチェック
D9=HorLdata
Pause 30
D10=HorLdata
If D9=1 and D10=1 then Check9
Goto Start
Check9:
For I=1 to 20 'Wait the L-section after C peak 方形波Cの後のL−sectionを待つ
Pause 10
If HorLdata=0 then Check10
Next I
Goto Start
Check10:
Pause 30 'Checking the L-section after C peak方形波Cの後のL−sectionをチェック
D11=HorLdata
Pause 30
D12=HorLdata
If D11=0 and D12=0 then Jump 'If both are L, go to Jump. 2つの値D11とD12がLならL−sectionと確認しJumpへ飛ぶ、そうでなければStartへ戻る
Goto Start
Jump: ‘以下でLEDを点灯したりSSRを駆動したりする
High LED 'Turn on LED
Toggle LEDorSSR
Pause 200 'Wait 200ms
Low LED 'Turn off LED
GOTO Start
End
'******** プログラムの終了 ********
'Note:
'melabs U2 Programmer's
configurations:
'FOSC - INTOSC; WDTE - Enable;
Power-up Timer - Disable
'MCLRpin – Reset ; BODEN - Enable; CD - Disable; CDP - Disable.