電子工作42 – 超音波のパターンを読込ませる試み

 

概要

   今回は前の電子工作41でのブザー音パターンの代わりに超音波パターンを送って、それを受信・解読してスイッチをON/OFFさせる実験を試みた。 

 

実験の目的は:

(1) 超音波なので無音であり、人様の迷惑にならない。

(2)     音の場合に比べ通信距離が延びるのではないか。

(3)     超音波のこと、超音波センサのことをもっと知る。

 

超音波センサ: T40-16 (送信用)、R40-16 (受信用) (秋月で¥600で購入)。両者とも40KHzで動作。極性がありピンの付け根が黒い方がプラスである。20Vまで電圧がかけられるようである。

 

回路

 発信器

  下に超音波パターン発生器の回路を示す。 この超音波センサT40-16は40KHzで動作するので、その周波数を発生できるPWM(Pulse Width Modulation機能を持つ16F628Aを使った。また、T40-16のパワーを上げるため9Vの電池を別電源として用いトランジスタで駆動した。Input SWを押しとT40-16から超音波パターン発生が発生する。

 

受信器

  この回路は電子工作40や41で使われているものと原則同じである。ただマイクを超音波センサR40-16に代えてある。

 

実験中―左のボードが発信側、右が受信側。 一番下に送信と受信用の超音波センサが向かい合って定規の上に乗っているのが見える。

      上の回路では、SSRやLED(Green)は便宜上点滅型LEDに代えてある。発信側からの信号を正しく受け取る毎に、Toggle機能でこのLEDは点滅と消灯を繰り返す。

 

 波形の解析

(波形1) プログラムの中で赤外線搬送波の38KHzをハードウエアPWMを使って出力するための設定値を一部変えることによって、以下のような40KHz+aを出力できるようになった(電子工作33参照)。具体的にはPR2=25(for38KHz)からPR2=24に変えた。この値は大きくすると出力周波数が小さくなる。人間の耳に聞こえない40.81KHzのこの波形パターンを出すと受信側のセンサR40-16が反応するのである。

 

(波形2) これは超音波パターン発生器Input SWを押すと内蔵プログラムに基づいて発生する3つの疑似方形波の連続パターンを拡大したもので、送信側の超音波センサ(T40-16)の+端子とGND間をオシロのAC出力モード測ったものである。40KHz波の部分の幅は約100msで、その間の空白部分の幅は約200msである。プログラムで設定したPause 100, Pause 200 に対応する。

 

(波形3)  上と同じ要領で、ただし、この場合はオシロのDC出力モードで測定したものである。

 

(波形4) 上に示したような3つ山の方形波パターンが送信側の超音波センサT40-16から、一定距離だけ離れて置かれた受信側の超音波センサR40-16に入りと下に示すような方形波パターンになり12F629で処理される。 このパターンは超音波パターンを受けてON/OFFするスイッチのポイント(C)で計測した。 3つの方形波の各幅は135−155msで、2つの方形波間の幅もほぼ同じ値である。この図はInput SWを適当な間隔で3度押した場合である。

 

プログラム

 超音波パターン発生器用プログラム

  16F628Aに備わっているハードウエアPWM機能を使って40KHzを出力するにはプログラムの中で関連する設定値を以下のように決めてやる必要がある。ここでPR2=25にすると赤外線リモコンで使用する搬送波38KHzが出力される。

CMCON=7

VRCON=0

TRISB=%11110110

PR2=24

CCPR1L=13

CCP1CON=%00001100

T2CON=%00000100

コンパレータ不使用

A/D 参考電圧不使用

PWM (RB3)を出力ポートに設定

PWM を 40.KHzに設定

PWMのduty cycleを 50%に設定

PWMモードの選択(ON/OFF)

Timer2 ON + 1:1 プリスケーラ

 

上に示した波形4のようなパターンを受け取る側の12F629のGP0(Pin7)に入力できるようにするには、送り手側のこのプログラムで下のような手順が必要である。

1)     Input SWからの入力があったら次の2)に進み、なければ待つ。

2)     CCP1CON=%00001100 (PWM発生ON)にして40KHz波を100ms発生させる。

3)     次にCCP1CON=%00000000 (PWM発生OFF)にして40KHz波の発生を200ms停止させる。

4)     上の2)、3)の過程を3回繰り返して3つの方形波を発生させる。

 

'********* プログラム ************

'UltraSoundPWM40KHz1.bas     2010.5.30 works OK!

'PIC16F628A

'******** ピン接続 ************

'Pin 14 - Vdd (5V)

'Pin 5 - Vss (GND)

'Pin 4 - /MCLR (Reset) connected to Vdd via 4.7K

'Pin 7 - RB1 connected to Input SW

'Pin 9 - RB3 connected to TR driving a ultrasonic sensor (T40-16)

'******** プログラム本体 ********

CMCON=7              'No comparator  以下7行の設定が40KHz波発生の要

VRCON=0              'A/D voltage reference disabled

TRISB=%11110110       'RB3 - PWM output

PR2=24                'Set PWM for 40 KHz

CCPR1L=13             'Set PWM for 50% duty cycle

CCP1CON=%00001100    'PWM mode selection

T2CON=%00000100       'Timer2 ON + 1:1 prescale

InputSW var PORTB.1    'Input SW

 

InputSWLoop:

CCP1CON=%00000000 'PWM OFF

If InputSW=0 then Loop   ‘Input SWの入力を待つ

Goto InputSWLoop

 

Loop:

CCP1CON=%00001100 'PWM ON 40KHz波を100ms発生させる

Pause 100

CCP1CON=%00000000 'PWM OFF 40KHz波の発生を200ms停止させる。以下3回繰り返す。3つの方形波が発生する。

Pause 200

CCP1CON=%00001100 'PWM ON

Pause 100

CCP1CON=%00000000 'PWM OFF

Pause 200

CCP1CON=%00001100 'PWM ON

Pause 100

CCP1CON=%00000000 'PWM OFF

Pause 200

'GOTO InputSWLoop

'******** プログラムの終了 ********

'Note:

   'melabs U2 Programmer's configurations:

   'OSC - INTOSCIO; WDTE - Enable; Power-up Timer - Disable

   'MCLRpin – Reset ; BODEN - Enable; Low voltage Programming - Disable, Code – Not Protect, Data EEPROM- Not Protect

'

超音波パターンを受けてON/OFFするスイッチ用プログラム

  このプログラムは電子工作41の改良した'SoundSensorBuzzA1.basとほぼ同じである。12F629のGP0(Pin7)に入ってくる方形波の幅と2つの方形波間のの幅が多少異なるのでその部分を少し変えた。

 

'********* プログラム ************

'SoundSensorBuzzA1U.bas -  2010.5.31 Program to use the Ultrasound sensors!

'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 (TC4069)  ‘H or L data

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 50  '50ms待つ

D1=HorLdata ‘データ収集

Pause 50 '50ms待つ 

D2=HorLdata ‘データ収集

If D1=1 and D2=1 then Check1  'If both are H, go to Check1両者ともHなら最初の方形波と確認しCheck1へ

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づづ進めてL−sectionを探す 

Pause 10

If HorLdata=0 then Check2  ‘見つかったCheck2へ

Next I

Goto Start

 

Check2:

Pause 50  'Checking the L-section between A and B peaks 方形波AとB間のL−sectionで50ms間隔で2回チェックしている

D3=HorLdata

Pause 50

D4=HorLdata

If D3=0 and D4=0 then Check3  'If both are L, go to Check3 両者ともLならL-sectionと確認しCheck3へ

 

Goto Start

 

Check3:

For I=1 to 20  'Wait B peak 2番目の方形波Bを待つ

Pause 10

If HorLdata=1 then Check4

Next I

Goto Start

 

Check4:

Pause 50  'Checking B peak

D5=HorLdata

Pause 50

D6=HorLdata

If D5=1 and D6=1 then Check5

Goto Start

 

Check5:

For I=1 to 20  'Wait the L-section

Pause 10

If HorLdata=0 then Check6

Next I

Goto Start

 

Check6:

Pause 50  'Checking the L-section between B and C peaks

D7=HorLdata

Pause 50

D8=HorLdata

If D7=0 and D8=0 then Check7

Goto Start

 

Check7:

For I=1 to 20  ''Wait C peak

Pause 10

If HorLdata=1 then Check8

Next I

Goto Start

 

Check8:

Pause 50  'Checking C peak

D9=HorLdata

Pause 50

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

Pause 10

If HorLdata=0 then Check10

Next I

Goto Start

 

Check10:

Pause 50  'Checking the L-section after C peak 3番目の方形波Cの後のL−sectionを待つ

D11=HorLdata

Pause 50

D12=HorLdata

If D11=0 and D12=0 then Jump  'If both are L, go to Jump.  D11とD12ともLならL−sectionと確認しJumpへ飛ぶ、そうでなければStartへ戻る

Goto Start

 

Jump:  ‘以下でLEDを点灯したりSSRを駆動したりする

High LED 'Turn on LED データが受け入れられた時LED(Red)が200ms間一時的に点灯する

Toggle LEDorSSR ‘データが受け入れられる毎にLED(Green) またはSSR出力が反転する

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)     プログラムで作成した方形波パターンを送受信用超音波センサを使って送り、スイッチをON/OFFすることができた。

2)     2つの送受信用超音波センサ間の送受信距離は比較的短く、センサを駆動する電圧によっても変化する。下表に測定結果をまとめた。例えば、9Vで1.5−10cmの間に送受信超音波センサ間が向かい合って置かれている場合に通信が可能になる。指向性が高く、方向に非常に敏感である。センサ間に指など入れると一瞬にして通信は遮断される。

3)     今回使った送受信用超音波センサは超音波を発射しその反射をとらえて利用するのが普通のようで、自動ドアの来客検知、距離測定などに応用されているようだ。したがってこの実験のような使い方は珍しいかもしれない。

駆動電圧(V)

最小距離(cm)

最大距離(cm)

9(電池)

1.5

10

12

3

15

15

4

20

18

5

23

 

4)     さて何に使えるだろうか。しばらく考えてみたい。

5)     超音波の挙動はオシロ無しで全く分からず、オシロの有難味が良くわかった。

6)     超音波のいろんな波形パターンを組み合わせれば赤外線通信と似たようなことが出来そう。ただその場合のメリットは?

7)     とにかくハードウエアPWMの設定値を操作していろんな周波数の波を自由に出せることが分かったこと、波形パターンを読むプログラムロジックがよく動作することを確信出来たなどジジイには大変良い勉強になった。 完

 

 

改良したプログラム(2010.6.3)

  上記(波形4)の3つの方形波のパターン幅が150msx3+150msx2=750msほどある。それだけ送信に時間がかかることになる。それを短くすることが出来ないか検討した。回路にCdS−LEDアナログ・フォトカプラを使っているので速度が遅く応答出来ないことが懸念された。いろいろ試した結果、送信プログラムの中の40KHz波の送信時間をPause5(=5ms)とし、40KHz波を送信しない時間をPause70(=70ms)と設定することによって受信側の回路図のポイント(C)で計測した波形パターンがほぼ理想に近いものとなった。すなわち、各方形波の幅と方形波間の幅が35−36ms前後で、3つの方形波のパターン幅が200ms弱でできた。つまり、750msの約4分の1の時間で1つの信号が送れる。これは1度に送れる方形波の数を増やせることを意味し、方形波の山とL−sectionの谷を組み合わせていろんな信号を送れるようになる。

 

結果など

1)     送信時間が4分の1に短縮され、きびきび応答する。

2)     送信側に複数個のSWを設けて、干渉なく複数個の信号が送れる。

3)     CdS−LEDアナログ・フォトカプラが数ms単位の信号にも応答することが分かった。

4)     二つの送受信超音波センサ間の応答可能な距離に関しては微妙な結果が出た。大型のプラスチックトレーの1辺(長さ50cm、深さ1.5cm)の端内面に沿って2個のセンサを相対応させ応答可能な距離を測った場合と両者とも空間に浮かした状態で測った場合とで応答可能な距離が大きく違うのである。前者の場合が大きい値がでた。反響とか反射とかの要因が関わっているようだ。二つの送受信超音波センサを筒状のもので包んだら距離が延びるかも知れない。実験用に別途購入してあった超音波帯域用トランスデューサーAT40−10PB3(送受信兼用、秋月で1個¥150)をT40−16とR40−16に代えてテストしてみた。空間に浮かした状態で測った場合わずか1.5cmが応答可能な距離であった。

駆動電圧(V)

最小距離(cm)

最大距離(cm)*

9(電池)

0.6

14(5)

12

0.8

22(8.5)

15

1.5

28(12)

18

33(14)

* 括弧内の値は2個の送受信センサを空間に浮かした状態で測った場合

5)     40KHz波の送信時間をPauseX(=Xms)とし、40KHz波を送信しない時間をPauseYした場合のX,Yの設定は、途中にいろんなデバイスが入るのでイメージ通りにはいかなかった。下の(波形7)のような受け側で処理し易い波形を得るために、X=5−60(ms)、Y=60−120(ms)の範囲で動かして実験し、今回の値を決めた。

6)     プログラムは前のものからわずかに変えた。 送信側: Pause 500導入, Pause 100 -> 5, Pause 200 ->70, 受信側: Pause 50 -> 10, Pause 10 -> 5

 

(波形5)これは超音波パターン発生器Input SWを押した時に発生する3つの疑似方形波の連続パターンを拡大したもので、送信側の超音波センサ(T40-16)の+端子とGND間をオシロのDC出力モード測ったものである。40KHz波の部分の幅は約5−7msで、その間の空白部分の幅は約70msである。プログラムで設定したPause 5, Pause 70 に対応する。

 

(波形6) 上記(波形5)40KHz波の送信時の5ms区間をオシロのスケールを細かくして拡大したものである。オシロのDC出力モード測った。4950ms=4.95msとほぼ5msになっている。この部分の中にある各方形波の波幅は25msである。この区間に5,000m/25ms=200個存在する。

 

(波形7) これらのパターンは超音波パターンを受けてON/OFFするスイッチのポイント(C)で計測した。 3つの方形波の各幅は35−36msで、2つの方形波間の幅もほぼ同じ値である。この図はInput SWを適当な間隔で3度押した場合である。 なお、Input SWを押し続けた場合は3つの方形波のパターンが500ms間隔で出現するようにしたある。

 

プログラム

 超音波パターン発生器用プログラム

'UltraSoundPWM40KHz2.bas   2010.6.2  The width between Peaks A and C was shortened to around 200ms. Works OK!

'PIC16F628A

'****** Pin connection ******

'Pin 14 - Vdd (5V)

'Pin 5 - Vss (GND)

'Pin 4 - /MCLR (Reset) connected to Vdd via 4.7K

'Pin 7 - RB1 connected to Input SW

'Pin 9  - RB3 connected to Tr driving a ultrasonic sensor (T40-16)

'******* Program ******         

CMCON=7              'No comparator

VRCON=0              'A/D voltage reference disabled

TRISB=%11110110      'RB3 - PWM output

PR2=24               'Set PWM for 40 KHz (25:38KHz)

CCPR1L=13            'Set PWM for 50% duty cycle

CCP1CON=%00001100    'PWM mode selection

T2CON=%00000100      'Timer2 ON + 1:1 prescale

InputSW var PORTB.1  'Input SW

 

InputSWLoop:

Pause 500  'Giving 500ms-space between 3-peak pulses when Input SW was kept pressed 出力される3つの方形波パターン間に500msのスペースを入れInputSWを押し続けた時の干渉を防ぐ

CCP1CON=%00000000 'PWM OFF

If InputSW=0 then Loop

Goto InputSWLoop

 

Loop:             'Produce 3 peakes

CCP1CON=%00001100 'PWM ON for 5ms

Pause 5 ‘今回新たに設定 (was 100)

CCP1CON=%00000000 'PWM OFF for 70ms. These two values 5ms and 70ms were decided on a trial and error basis.

Pause 70  ‘今回新たに設定 (was 200)

CCP1CON=%00001100 'PWM ON

Pause 5

CCP1CON=%00000000 'PWM OFF

Pause 70

CCP1CON=%00001100 'PWM ON

Pause 5

CCP1CON=%00000000 'PWM OFF

Pause 70

GOTO InputSWLoop

'****** End of program ******

'Note:

   'melabs U2 Programmer's configurations:

   'OSC - INTOSCIO; WDTE - Enable; Power-up Timer - Disable

   'MCLRpin – Reset ; BODEN - Enable; Low voltage Programming - Disable, Code – Not Protect, Data EEPROM- Not Protec

 

超音波パターンを受けてON/OFFするスイッチ用プログラム

'SoundSensorBuzzA1U1.bas -  2010.6.2  The width between Peaks A and C was shortened to around 200ms. Works well! 

'12F629.

'********Pin connections************

'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)

'****** Program ********

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 (TC4069)

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

Goto Start

ReadData:

Pause 10  '10ms 今回波幅が狭まったので小さくした (was 50ms)

D1=HorLdata

Pause 10

D2=HorLdata

If D1=1 and D2=1 then Check1  'If both are H, go to Check1

Goto Start

 

Check1:

For I=1 to 20  'Wait the L-section while moving 5ms per I cycle. 5x20=100ms-this value must be sufficiently large.

Pause 5  '5ms 今回波幅が狭まったので小さくした (was 10ms)

If HorLdata=0 then Check2

Next I

Goto Start

 

Check2:

Pause 10  'Checking the L-section between A and B peaks

D3=HorLdata

Pause 10

D4=HorLdata

If D3=0 and D4=0 then Check3  'If both are L, go to Check3

Goto Start

 

Check3:

For I=1 to 20  'Wait B peak

Pause 5

If HorLdata=1 then Check4

Next I

Goto Start

 

Check4:

Pause 10  'Checking B peak

D5=HorLdata

Pause 10

D6=HorLdata

If D5=1 and D6=1 then Check5

Goto Start

 

Check5:

For I=1 to 20  'Wait the L-section

Pause 5

If HorLdata=0 then Check6

Next I

Goto Start

 

Check6:

Pause 10  'Checking the L-section between B and C peaks

D7=HorLdata

Pause 10

D8=HorLdata

If D7=0 and D8=0 then Check7

Goto Start

 

Check7:

For I=1 to 20  'Wait C peak

Pause 5

If HorLdata=1 then Check8

Next I

Goto Start

 

Check8:

Pause 10  'Checking C peak

D9=HorLdata

Pause 10

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

Pause 5

If HorLdata=0 then Check10

Next I

Goto Start

 

Check10:

pause 50  'Checking the L-section after C peak, which must be at least 100ms

D11=HorLdata

Pause 50

D12=HorLdata

If D11=0 and D12=0 then Jump  'If both are L, go to Jump.

Goto Start

 

Jump:

High LED 'Turn on LED

Toggle LEDorSSR

Pause 200 'Wait 200ms

Low LED 'Turn off LED

GOTO Start

End

'****** End of program ******

'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へ戻る