電子工作37 – しゃべる機能付き集電型赤外線LEDセンサライトの製作
概要
今回は上記電子工作35と36のまとめとして赤外線センサに反応してLEDランプが点灯する外に、予め録音した音声が再生するような回路を製作した。電池で動作させるため省電型の電子工作35のNaPiOn AMN31111センサと外付け型ボイスレコーダモジュールを使い、それらをI/Oポートの多い16F628Aで制御した。20秒間の録音・再生が出来るので差し当たって外出時に持参すべき物を自動的に教えてくれるような目的に使ってみたい。“財布、部屋のカギ、薬 ・・・ 持ったか、ジイサン”といった具合に。
実験ボード: 沢山のスイッチ(SW1-6)が見える ボイスレコーダモジュール: まずまずの音質
回路
下に示す回路図のように16F628AのRB0からRB7までの全8ポートの内RB1以外の7ポートを使っている。
以下の4つのスイッチ設定で動作条件を任意に選択できる。
スイッチ |
L (GND) の位置 |
H (Vdd) の位置 |
SW1 |
Instantly人体の検知をすぐに行う |
X-sec wait しばらくセンサの前に居ないと検知しない |
SW2 |
LEDランプが10秒間点灯する |
LEDランプが30秒間点灯する |
SW3 |
LEDランプのみ点灯する |
LEDランプが点灯し音声も発生する |
SW4 |
(CdS接続)夜(暗い時)だけ動作する |
昼も夜も動作する |
NaPiOnセンサからの出力はポートRB7より入り割込み信号となる。割込が発生するとプログラムが動き始め、LEDランプはポートRB0からの出力を“H”にして点灯させる。またポートRB2からの出力を0.5秒間“H”にしてPhoto relayをONにしボイスレコーダの起動スイッチを導通させて音声を再生させる。SW5は通常Closedで、音声をボイスレコーダに録音する時だけOpenにする。SW6は音声だけ再生しLEDランプを消したい場合にOpenにする。なおボイスレコーダはVOICE-REC-M20 (CoCoNet液晶工房で¥900で入手)というもので、内臓のボタン電池3個4.5Vで20秒間録音・再生できる。音質、音のレベルとも今回の目的には十分であった。 省電流のためRB7につながれているLED(赤)(センサの出力を示す表示灯)は除いても良い。電池駆動で問題になる消費電流は電源4.5Vで以下の様であった。
待機時(Sleep時): 0.18−0.30mA (電池駆動で十分長持ちする電流消費レベル−電子工作35参照)
ボイスレコーダ動作時: 4.5mA
ボイスレコーダ+LEDランプ動作時: 15−16mA
CdS明暗センサに接続しているSW4についてちょっと説明。上表のようにSW4のH (Vdd) の位置でRB3には常に“H”が入力される。一方、SW4がCdS側のL(GND)の位置では明るい時はRB3には低い電圧がかかり“L”(実測で約1V以下)と見なされ、暗くなるにつれて電圧が上がり“H”(約1V以上)と見なされるようになる。このレベルはVR=20Kで多少調整できる。これによって暗い時だけ動作するようにすることができる。
プログラム
プログラムの作成に役立つのでフローチャートを作成した。センサから割込が入ると初期設定の下のReactMode=0?より流れが始まる。“N”と“Y”に分岐する項目は4つのスイッチに対応し、“H”(Vdd)と“L”(GND)のいずれかに選択される。そしてそれらはプログラムの初期設定でRB6、RB5,RB4,RB3の各ポートに割り当てられている。HexプログラムをPICに焼き込む際にConfigurations: (BODEN−Disableなど)を正しく設定しないとプログラムは動かないので注意。
'********************** プログラミング備忘録 ******************************
'LampSound2.bas 16F628A 2009.7.27 This program worked!!
‘プログラム中で太字で表わされている部分は“割込み”と“省電流待機”を設定する最重要部分である
'******* Pin connection *******
'Pin 14: Vdd (battery 4.5-6V)
'Pin 5: GND
'Pin 4: input - MCLR (Reset) connected to Vdd via 10K and to GND via Reset SW
'Pin 13 (RB7): input - connected to Sensor, GND via 33K and LED & 2K to GND
'Pin 12 (RB6): input - connected to SW1 for reaction mode selection
'Pin 11 (RB5): input - connected to SW2 for lightup time selection
'Pin 10 (RB4): input - connected to SW3 for LED-lamp Speak mode selection
'Pin 9 (RB3): input - connected to SW4 for Day&night & Night only mode selection
'Pin 8 (RB2): output - connected to Photo relay's LED to turn on Voice Recorder
'Pin 6 (RB0): output - connected to LED lamp via R=47
'****** Program ******
SensIn var PORTB.7 ‘7つのRBポートへの割り当て
ReactMode var PORTB.6
LightupTime var PORTB.5
LampOrSpeak var PORTB.4
DayOrNight var PORTB.3
SoundBdPWON var PORTB.2
LEDLampON var PORTB.0
T var Byte 'Lightup Time in sec
AddH var Byte 'H level counter
CMCON=7 'Comparator OFF
TRISB=%11111000
OPTION_REG.7=1 'No weak pull-up
INTCON.7=1 'Enable the use of interrupt
INTCON.3=1 'Enable the port input-level change interrupt
Startloop:
LEDLampON=0
AddH=0
T=0
SoundBdPWON=0
LEDLampON=0
INTCON.0=0 'Clear GPIF
@Sleep 'Have good sleep! - This is a key command
INTCON.0=0 'Clear GPIF
'******** Main routine ********
If ReactMode=0 Then LightupInstant '0->Instantly これ以下が割込み後のメインルーチン − SW1を読込む
Goto LightupWait '7/10 times check
LightupWait: ‘これ以下が10回センサ入力を0.5秒毎にチェックし“H”の数が7またはそれ以上なら次に進むルーチン
AddH=0 'AddH = No. of 'H' pulse detected in reading SensIn
If SensIn=1 Then 'Read SensIn
AddH=AddH+1
Endif
Pause 500 '0.5 sec
If SensIn=1 Then
AddH=AddH+1
Endif
Pause 500 '0.5 sec
If SensIn=1 Then
AddH=AddH+1
Endif
Pause 500 '0.5 sec
If SensIn=1 Then
AddH=AddH+1
Endif
Pause 500 '0.5 sec
If SensIn=1 Then
AddH=AddH+1
Endif
Pause 500 '0.5 sec
If SensIn=1 Then
AddH=AddH+1
Endif
Pause 500 '0.5 sec
If SensIn=1 Then
AddH=AddH+1
Endif
Pause 500 '0.5 sec
If SensIn=1 Then
AddH=AddH+1
Endif
Pause 500 '0.5 sec
If SensIn=1 Then
AddH=AddH+1
Endif
Pause 500 '0.5 sec
If SensIn=1 Then
AddH=AddH+1
Endif
Pause 500 '0.5 sec
If AddH >= 7 Then '7 times out of 10 (x/10 timesでxを大きくすると人体を検知し難くなる)
Goto LightupInstant
Endif
Goto Startloop
LightupInstant:
If LightupTime=0 Then ‘SW2を読込む
T=10 '10 sec
Else
T=30 '30 sec
Endif
If LampOrSpeak=1 Then DayOrNight0 ‘SW3を読込む
Goto DayOrNight1
DayOrNight0:
If DayOrNight=1 Then SoundBdLEDLamp ‘SW4を読込む
Goto Startloop
DayOrNight1:
If DayOrNight=1 Then LEDLampONR ‘SW4を読込む
Goto Startloop
SoundBdLEDLamp:
High SoundBdPWON
Pause 500 'Turn ON Voice Recorder’s Replay SW for 0.5 sec ボイスレコーダの再生スイッチを0.5秒間押し音声を再生させる
Low SoundBdPWON
High LEDLampON 'Turn ON LED Lamp for 25 sec LEDランプを25秒間点灯させる
Pause 25000 '25 sec
Goto Startloop
LEDLampONR:
If T=10 Then ‘Turn ON LED Lamp for 10 sec
High LEDLampON
Pause 10000 '10 sec
Goto Startloop
Else
High LEDLampON ‘Turn ON LED Lamp for 30 sec
Pause 30000 '30 sec
Goto Startloop
endif
End
'********** ここまでがプログラム ***************
'Note:
'AKI Programmer's configurations:
'FOSC - INTOSC(GP4:I/O); WDTE - Disable; PWRTE - Enable
'MCLR - MCLRpin ; BODEN - Diable; CP - Disable; CDP - Disable.
結論・余談
1) 実験ボード上では思惑通りに動作することが確認された。待機時の電流消費も小さく電池で十分いける。ただボイスレコーダモジュールのボタン電池の電流消費はまだ不明。
2) 今回かかった費用はセンサとボイスレコーダモジュールを含め2千円ほど。
3) ボイスレコーダモジュールには別に10秒間録音・再生タイプがあり290円と安価。
4) 最初、音声ボード(KO1−A,、写真の左手の部分)を入手(1000円)、組立、マニアル通りに録音してみたら音が低すぎ良く聞こえない。そこで手元のオーデオアンプ386Dを加えて音声レベルを上げてみたがノイズがひどくとても実用にならなかった。ただし、過去に電子工作27の実験で同じ音声ICを使った時かなりの良い音質が得られた経験がある。回路が複雑になるので今回は市販のこのボイスレコーダモジュールを使った。