電子工作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を読込む

oto Startloop

 

DayOrNight1:

If DayOrNight=1 Then LEDLampONR    ‘SW4を読込む

oto Startloop

 

SoundBdLEDLamp:

High SoundBdPWON  

Pause 500            'Turn ON Voice Recorder’s Replay SW for 0.5 sec ボイスレコーダの再生スイッチを0.5秒間押し音声を再生させる

ow SoundBdPWON

High LEDLampON 'Turn ON LED Lamp for 25 sec LEDランプを25秒間点灯させる

Pause 25000    '25 sec

oto 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

 

nd

'********** ここまでがプログラム ***************

'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を使った時かなりの良い音質が得られた経験がある。回路が複雑になるので今回は市販のこのボイスレコーダモジュールを使った。

 

Menu Pageへ戻る    

Topへ戻る