概要
前の電子工作25の味気無いブザーによる警報音の代わりに、今回は音声(しゃべる)機能を付けてみようということになった。 たまたま、秋月電子のHPで60秒間録音/再生できる¥380の音声チップAPR9600 (Aplus Integrated Circuits Inc.製) を見つけたのがきっかけである。
APR9600とシステム回路の製作
インターネット上では、このチップを使った、アマによる製作例など、まだ殆んど見当らない。そこで、まずデータシートを頼りにテストボード上で組上げ、何とか、自分の声を録音し、再生できることを確かめた。 ただ、音声が小さく、実用目的にはアンプで増幅する必要があり、音質もイマイチであることが分かった。
マニュアルから、APR9600について以下のようなことが分かった。
1) このチップには、ランダムアクセスモード(他にテープモードあり)で、最大8個のメッセージを録音/再生できるが、今回は、4メッセージを録音/再生する設定を選んだ。 したがって、各メッセージ当たりの録音/再生時間は、最長の60秒間設定(あまり音質は良くない)では、60/4=15秒ということになる。
2) 録音/再生時間は、チップのOscRに接続する抵抗の値によって変わり、84Kで60秒、38Kで40秒、24Kで32秒である。そして、時間が短いほど、高音質である。今回は、47Kの抵抗を使った。 実際に録音/再生時間を測ってみたら、約11秒/メッセージであった。
3) ピン19 (AGC) に接続される抵抗の値も録音される音質に関係するらしく、英語圏の人々には220Kが最適だという、ここでも、この値を選択した。
ランダムアクセスモード(/M1-/M4の各キーをGNDに落とすと、対応するメッセージが、そのつど先頭から再生される)で、
1) 4メッセージ設定にするには、ピン25と24を、それぞれMsel-1=1、Msel-2=0にする。 しかし、実際には、前者を0、後者を1と逆にしないと4メッセージ設定にはならなかった。理由は不明。 そして、4個のキーを接続した。
2) 録音するには、2-way SWをRec側に倒し、各キーを押して、/BusyのLEDが点灯し、/StrobeのLEDが点滅したら、マイクから音声を入れる。 録音時間が終わると、両LEDは消える。
3) 再生するには、2-way SWをPlay側に倒し、各キーを押す。 録音時間だけ再生される。 この間/BusyのLEDが点灯し、/StrobeのLEDは点滅する。
さて、前回製作した火災報知器を、いかにしてこの音声システムと組合るか。
火災報知器の12F675のGP5から接続していたブザーを除いて、その代わりにAPR9600のピン1(/M1)に接続した。そして、新たに、GP4をピン2(/M2)に接続した。これで、前者のピン1が、12F675からの信号でLowになると、メッセージ1が再生され、後者のピンがLowになると、メッセージ2が再生される。
メッセージ1の録音内容(約11秒): “火事だ、火事だ、起きろ、逃げろ ….”
メッセージ2の録音内容(約11秒): “輝度電圧が下がり過ぎ、0.5V以上に上げろ …” とこんな具合。
新しく導入したBSch3Vを使って作成した回路図と、実験の様子を示す写真を下に示す。
回路図で、火災報知器の煙感知のための光源に高輝度LEDが使われているが、観察の結果、輝度が徐々に低下することが分かった。 したがって、GP0に入る電圧も低下する。そこで、約0.5V以下に下がるとメッセージ2が発生し、輝度調整を促すようにした。 写真では、左に火災報知器、中央にテストボード、それに、右にアンプ入りスピーカが見える。 テストボードの中央部には28ピンのAPR9600が、その左手に4個のプッシュボタン式のキーが見える。マイクは極性のあるエレクトレットコンデンサ式を使用。 5V電源は、ACアダプタ+7805でつくりだしている。 このアンプ入りスピーカ(¥650)につなぐと、こもり音だが、十分聞き取れる程度の音質で、音量も大きくできる。
プログラム
APR9600チップを載せたテストボード上で、キーを押して録音/再生を繰返すうち、火災報知器のGP5とGP4からの信号を使って、/M1と/M2をLowにする場合、先ず、0.3秒間程度のLowパルスをトリガー信号として/M1や/M2に送って録音内容を再生させ、その後Highの状態を約13秒間(1メッセージの再生時間約11秒+2秒)保つと、うまい具合に再生動作をすることを見出した。 このことを以下のプログラムの中で行っている。 煙の濃度や温度が設定値(>1.0V)以上、また、輝度レベルが設定値(<0.5V)以下であり続ける限り、各メッセージは15.5秒間(実測値)毎に繰返し発生し続ける(最下部の図参照)。
'************ プログラミング備忘録 *************
‘AudFAL.bas 2007.11.1 for audio fire alarm project Succeeded!
‘Based
on FAL675c.bas 2007.9.7
'*************** プログラム本体 ******************
ANSEL=%00010011 'GP0 and GP1 pins -> analog, Fosc/8
TRISIO=%001011 'GP0, GP1 and GP3 -> Inputs, others Outputs
CMCON=7 'turns off comparator function
Define ADC_BITS 10 '10-bit ADC used
Define ADC_CLOCK 3 'Internal clock used
Define ADC_SAMPLEUS 50 'Sample timing
Vin0 var word 'Vin0 - smoke voltage input storage
Vin1 var word 'Vin1 - temp. voltage input storage
ADCloop:
'Smoke sensing (煙検知ルーチン)
ADCON0=%10000011
Pause 20
GPIO.5=1 'sets ToM1pin to High (to drive M1pin in APR9600 board)
GPIO.4=1 'sets ToM2pin to High (to drive M2pin in APR9600 board)
Vin0=0
Pause 20
ADCIN 0, Vin0 'reads ADC ch-0 and save in Vin0
'(range 0-1024)
Pause 50 'allows time for ADC conversion
If Vin0>200 then '200 equal to about 1.0V analog input V: 煙が検知された!
Goto ToM1pin 'To drive M1pin in APR9600 board(V=5.0 x 200/1024=0.98V)
Endif
IF Vin0<100 then '100 equal to about 0.5V analog input V: 輝度レベルが低すぎる!
Goto ToM2pin 'Drive M2pin in APR9600 board
Endif
'Temperature sensing (温度検知ルーチン)
ADCON0=%10000111 '=135(decimal)
Pause 20
GPIO.5=1 'turns on ToM1pin to High
Vin1=0
Pause 20
ADCIN 1, Vin1 'reads ADC ch-1 and save in Vin1
'(range 0-1024)
Pause 50 'allows time for ADC conversion
If Vin1>200 then '200 equal to about 1.0V analog input V: 高い温度が検知された!
Goto ToM1pin '(V=5.0 x 200/1024=0.98V)
Endif
Goto ADCloop
ToM1pin: 'lowers M1pin to activate M1 message (煙、または、高い温度が検知された)
Low GPIO.5
Pause 300 '0.3 sec - triggering pulse for /M1pin キーセッテング
High GPIO.5
Pause 13000 '13 sec - (1 message=11 sec + 2 sec in 4-fixed message mode) キーセッテング
Goto ADCloop
ToM2pin: 'lowers M2pin to activate M2 message (輝度レベルが低すぎる)
Low GPIO.4
Pause 300 '0.3 sec
High GPIO.4
Pause 13000 '13 sec
Goto ADCloop
End
'********** プログラムの終わり ***************
'Note:
'AKI Programmer's configurations:
'FOSC- INTOSC (GP4:I/O); WDTE - Enable; PWRTE - Enable
'MCLR -MCLRPin;
BODEN - Enable; CD - Disable; CDP – Disable
余談
何とか火災報知器にしゃべらす機能を付けることが出来た。 前から気になっていた音声ICの使い方や、PICとのインターフェイスの仕方が曲がりなりにも理解できたのは収穫であった。今回製作したシステムでは、まだ2個の各11秒間のメッセージ枠が残っているので、いろいろな目的に使えそう。 上記回路より分かるように、APR9600回りの配線も結構大変なので、キット(¥1000)を購入して、改造するのも良いかも知れない。
後で分かったこと(’07.11.6)
火災報知器側からの信号で、音声のメッセージ1や2が再生されている時、/Busy(Pin10)のLEDは点灯し続け、下図のように、/Strobe (Pin22)のLEDは約0.5秒の間隔で点滅を続ける。そして、4.66+10.93=15.59秒毎に再生が繰返される。マイコンで制御する場合、これらの情報が使えそうだ。例えば、/BusyのLEDが点灯中は再生中と判断するとか、また、/StrobeのLEDの点滅回数をカウントして、ある回数に達したら、再生が終了したと判断するとか。余っている12F675のGP3とPicBasic ProのコマンドCountの組合せが、それらの目的に使える可能性あり。
メッセージ再生中に、繰返し/Strobe (Pin22)から出る信号