電子工作 27 – 4入力対応音声メッセ−ジ発生装置の製作

概要

  今回は、前回の電子工作26 しゃべる火災報知器の製作で用いた音声チップAPR9600をもう少し複雑な目的に応用してみようというものである。すなわち、4つの入力に対応させて4つのメッセージを発生させることができる。 またアンプを導入してはっきり、十分聞き取れるようにした。

 

回路図および実験ボード

  システムの全体をコントロールするため、今回は12F675の代わりにI/Oポートの数が多い18ピンのPIC16F628Aを使った。 4つの入力を外部センサなどから読み込んで、対応するAPR9600の4つのピンに出力し、違った4つの音声メッセージを発生させる。またNJM386Dというアンプの使用によって、約8秒間の音声メッセージの音量、音質が実用的なレベルになった。 全体の回路図(4入力対応音声メッセージ発生装置)は以下に示す。入力として後述するように3つのセンサと1つの指入力SWを組込んである。 音声チップAPR9600への録音/再生の仕方は、電子工作26の場合と全く同じである。 この回路では、16F628Aより完全に切り離してAPR9600側において単独で録音や再生のテストができるようにSlide SW1−4を設けてある。

  

左側のボードの真ん中に12F628Aが、右側のボードの真ん中にはAPR9600が見える。

 

使用した3つのセンサの特性と実験結果

1)    温度センサ(TC622EPA)

+ IC本体が温度を検知する。

+ 外付け抵抗1本で設定温度(T-set、反転温度)が決まる。外気温が上がってIC出力OUTがLowからHighになる。やがて外気温が下がって、設定温度T-set−2°Cになると、出力OUTはHighからLowになる。つまりヒステリシス特性があるという。

+ 駆動には+5V, GND、それに出力OUTのために3本の線が必要。

 

2)    磁気センサ(DN6851-A591)

+ センサの番号印字面(S極)に外部磁石(例えばフェライト磁石)のN極を近づけると、一定の接近距離以内(例えば10mm)で、センサ出力がLowからHigh(5V)になる。そして磁石を離すと、同じ距離で出力がHighからLow (ほぼ0V)になる。 離す時、磁石を番号印字面(S極)に向かって横方向に動かすと、比較的短い移動距離で出力がHighからLow になる。

  + 駆動には+5V, GND、それに出力OUTのために3本の線が必要。

 

3)    反射型フォトセンサ(GP2S05)

+ 反射型フォトレフレクターで、赤外線ダイオードと赤外フォトトランジスタを組み合わせたもので、焦点距離は約4mm。

+ センサの検知面近くに黒い物体(例えば導電性スポンジ)を近づけると、センサからの出力OUTは0.38V位になり、また白い紙を近づけると、出力OUTは2.2V位になる。紙を離すと、遠ざかるにつれ出力は低下し、最終的には0.4V位になる。2.2VはPICがHighと検知する電圧である。

+ 外光の影響も多少受ける。

+ 駆動には+5V, GND、それに出力OUTのために3本の線が必要。

 

Memo SWについて

また、センサではないがMemo SWという通常OFF、押してONなるスイッチを設けている。これは個人的に大切なことを予め録音しておいて、外出時などに押すと音声で教えてくれるようにしたものである。いわば物忘れを教えてくれる備忘録みたいなものに使うためである。

 

下の図に上記3つのセンサの配線法や特性・テスト結果などを示す。

 

プログラム

  まだ意図したようにプログラムが出来ていないので、以下のものは暫定的なものである。 それでも、センサに熱い半田ごてをつけたり、磁石を近づけるとちゃんとメッセージを発します。 

 

1)     割り込みを使っている。入力ポートの変化(L->H or H->L)があると割り込みがかかる、を利用。

2)     温度と磁気センサそれにMemo SWの入力のみ使い、フォトセンサの入力は除いた。

 

電源が入ると、Mainというループに入り、PORTA.0につないだLEDが点滅を始める。例えは、ここで温度センサからの入力がLからHに変わると、割り込みがかかって Myintprogという割り込みルーチン入り、If PORTB.4=1 then で温度センサからの入力がHになったことが確認されれば、Tempmsgeに飛んで音声チップのM1のメッセージを発生させる。 終了後、またMainというループに戻る。

 

'****************** プログラミング備忘録 ******************** 

'Aud628c.bas  2007.12.14   This works but each port senses a change only when

'the change occurs. Anyway keep this program. Use this as one program.

'By receiving 4 input signals, this generates the 4 corresponding

'audio messages.

 

'--- Pin connection to sensors $ SW ---

'Pin 4 - MCLR Reset

'Pin 5 - Vss (GND)

'Pin 6 - RB0 (output to /M1)

'Pin 7 - RB1 (output to /M2)

'Pin 8 - RB2 (output to /M3)

'Pin 9 - RB3 (output to /M4)

'Pin 10 - RB4 (input from Temp sensor)

'Pin 11 - RB5 (input from Photo sensor)

'Pin 12 - RB6 (input from Magnet sensor)

'Pin 13 - RB7 (input from Memo SW)

'Pin 14 - Vdd (+5V)

'Pin 17 - RA0 (output to turn on LED via 470)

 

'*************** ここからがプログラム本体 ***************

On Interrupt goto Myintprog  'Temp/Photo/Magnet/Memo inputs

INTCON=%10001000 'Bit7: Interrupt->ON, bit1: port change interrupt->ON    キーポイントです。

 

TRISB=%11110000

TRISA=%00100000

 

Main:

Low PORTA.0  'LED -> ON/OFF

Pause 50     '0.1 sec

High PORTA.0

Pause 50

Goto Main

 

Disable

Myintprog:

PORTB.0=1   'essential

PORTB.1=1

PORTB.2=1

PORTB.3=1

 

If PORTB.4=1 then goto Tempmsge   'Temp output: L -> H      この3行でどのセンサ(Memo SWを含め)の入力が変化したを検知

IF PORTB.6=1 then Goto Magmsge    'Magnet output: L -> H

if PORTB.7=0 then Goto Memomsge   'Memo SW output: H -> L

goto Myintprog

 

Tempmsge:     'SW1 desu                     SW1です。

LOW PORTB.0   'Temp message -> ON

Pause 300     'Keep pressing M1 for 0.3 sec          M1キーを0.3秒間押す。

High  PORTB.0 '0.3 sec pulse completed

Pause 9500    'Wait 9.5 sec (for 8-sec message)      8秒間のメッセージ+1.5秒間待つ。

Goto Msgeend

 

Magmsge:      'SW3 desu

LOW PORTB.2   'Magnet message -> ON

Pause 300     'Keep pressing M3 for 0.3 sec

High  PORTB.2 '0.3 sec pulse completed

pause 9500

Goto Msgeend

 

Memomsge:    'SW4 desu

Low PORTB.3  'Memo SW message -> OFF

Pause 300    'Press M4 - Memo SW message -> ON

High PORTB.3 'Keep pressing M4 for 0.3 sec

Pause 9500   'Wait 9.5 sec (for 8-sec message)

 

Msgeend:

INTCON=%10001000

Resume

Enable

 

'********** プログラムの終わり ***************

'AKI Programer's configuration -

'FOFC; INTOSC_GPIO, WDTE; Enable, PWRTE; Disable, MCLRE; MCLRpin,

'BODEN; Enable, LVP; RB4:GPIO, CPD; Not Protect, CP; Not Protect

 

余談

  無知もいいとこ。小さく表示されて見難かった図や写真を拡大表示する方法を見つけた。 図を指定し、そのコーナーを伸ばしてやればよい。

   ガス栓や電気差込口の状態検知などに使いたいと思ったが、プログラムがうまく出来ない。 一応、基本的な動作はするのでまとめることにした。

 

Errata

上記2つの回路図中の磁気センサはDS6851-A591ではなくDN6851-A591でした(2008.3.27)。

 

Menu Pageへ戻る    

Topへ戻る