概要
今回は、前回の電子工作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)。