電子工作41 - ブザー音のパターンを読込ませる試み

 

概要

   前の電子工作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.

 

Menu Pageへ戻る

Topへ戻る