概要
先日友人からトイレを使用中の時だけ電球が点灯し、使用していない時は消灯するような装置が出来ないかという問い合わせがあった。そこで要望に応えるべく前述の電子工作35を参考にしてAC100Vで動作する実用型人感センサライトを製作することにした。
注意: 危険なので製作は自分の責任で行うこと。
製作にあたって;
1) 出来るだけ簡単な構造にする。
2) 安全性に最大限の注意を払う。
3) 動作が確実であること。
回路図と動作原理
回路図を下に示す。人感センサとしてパナソニック電工のMPモーションセンサを使った。事前に安価なRE-210を使った回路(電子工作36)を再度組上げ試してみたが複雑で不安定であったので、高価ではあった結局前者を使用することにした。人体を検知している時間を選択する反応時間と、電球の点灯時間を選択する2つの要素だけ取込むようにしたのでコントローラーには最も簡単なPICの1つである12F629を使った。
)
<<主要部品の詳細>>
1) PIC 12F629
2) 集電型MPモーションセンサ AMN3111(黒、パナソニック電工) (¥1030 マルカ電機工業―秋葉原)
3) SSR(Solid State Relay) D2W202F 2A240VAC (¥250 秋月)
4) 超小型ACアダプタ DC5V 1.0A (¥600 秋月)
5) アルミケース 60X100X130mm (¥450)
人感センサの全体図: 左が蛍光灯電球、真ん中が制御部、右がACアダプタ
右手を上にして吊るして使用する
制御部の内部:、12F629,その右手がSSRとフューズ
左が電球、黒いのがモーションセンサ、LEDはセンサが検知すると光る
結果&コメント
1) 最適光源として蛍光灯電球を選んだ理由: MPモーションセンサのすぐ前で点灯していてもその人感検知能に影響を与えなかった。白熱電球、電気ヒータなど遠赤外線を出すものは近くにある場合時として誤動作(電球が消灯しない)を起こした。白熱電球を使う場合はMPモーションセンサの設置位置を直接電球の光を受けない場所、例えば、アルミボックスの側面などに移動する。ただ、蛍光灯電球は十分明るくなるまで1分以上かかる。
2) 良く出来たセンサで、トイレでの実験でもドアを開けるとすぐ点灯し中に入っている間は消灯することはなかった。
3) LED電球と組合せで超エコを図ろうとしたが、世の中そう旨くはいかなかった。LED電球を使うと0.5秒位の間隔で強目の光を放って点滅した。壊れるような症状に見えたので即中止。このLED電球(KEIAN60W相当、秋葉原で¥980で入手)の箱には人感センサには使えないと書いてあった。解決策: SSRをメカニカルリレーに変えればOKだろう。ただし、耐久性のありそうなDC5Vリレーはあまり見かけない。
4) 総材料費はちょっと高めの3000円ほど。市販品を買った方が安いかも?
プログラム
このプログラムの中で最も重要な部分は、検知される人間が居る間は電球を途中で消灯させることなく点灯し続けるようにすることだった。 例えば、以下のルーチンでは120秒間だけ電球をONにするが、その間にIf SensIn=1 Then LongTimeでMPモーションセンサからの入力をチェックし、もし、入力があれば(人が居れば)LongTimeに戻って最初から120秒間だけ電球をONにするルーチンを繰り返す。もし、入力がなければ電球をOFFにしてプログラムの最初に戻る。したがって、MPモーションセンサが何も検知しなくなってから(人が居なくなってから)常に120秒間は電球が点灯し続けることが出来る。
LongTime:
t=0
High SSR
For t=1 to 120 '120 sec
pause 1000 '1 sec
If SensIn=1 Then LongTime
Next t
Low SSR
Goto LightupLoop
'*************** Outline **********************
'MotionSens629CPrac.bas 2011.1.10
'This is for a practical model.
'12F629 based, AC adaptor of DC5V output
'******** Pin connection *****************
'Pin 1: Vdd (5.0V)
'Pin 8: Vss (GND)
'Pin 6: GPIO.1: input - connected to Motion Sensor and LED (red)
'Pin 3: GPIO.4: output - connected to SSR and LED (red)
'Pin 2: GPIO 5: input - connected to SW which leads to Vdd or GND via R=100K Lightup Time
'Pin 4: GPIO.3: input - connected to Vdd via R=10K
'Pin 7: GPIO.0: input - connected to SW which leads to Vdd or GND via R=100K Wait Time
'********** Program ***************
SSR VAR GPIO.4 'LEDs on GPIO.4 SSR=Solid State Relay
LupTimeSW var GPIO.5 'Read H(Vdd Long time) or L(0V Short time) 点灯時間を選択するSWからの入力
WaitTimeSW var GPIO.0 'Read H(Vdd X-sec wait) or L(0V Instantly) 反応時間を選択するSWからの入力
SensIn var GPIO.1 'Input from Sensor MPモーションセンサからの入力
AddH var byte 'AddH = No. of 'H' pulse detected in reading SensIn
CMCON=7 'Disable Comparators, GP0 & GP1 -> digital
TRISIO=%101011 'GPIO.1, LupTimeSW & WaitTimeSW read - inputs
t var byte 'Counter
LightupLoop:
SSR=0
If WaitTimeSW=0 Then Instantly ‘反応時間を選択するSWからの入力をチェックする
If WaitTimeSW=1 Then Xsecwait
Instantly: ‘人体にすぐ反応する場合のルーチン
AddH=0 'AddH = No. of 'H' pulse detected in reading SensIn
If SensIn=1 Then 'Read SensIn MPモーションセンサからの入力を読込む ‘H’パルスを読む
AddH=AddH+1 ‘’H‘の数を積算する
Endif
Pause 100 '0.1 sec 0.1秒待つ
If SensIn=1 Then ‘MPモーションセンサからの入力を読込む
AddH=AddH+1
Endif
Pause 100 '0.1 sec
If AddH = 2 Then '2 times out of 2 times MPモーションセンサからの入力(H)を2回読んで、2回とも‘H’ならLightupへ飛ぶ
Goto Lightup
Endif
Goto LightupLoop
Xsecwait: ‘人体をセンサが0.5秒毎に10回(5秒間)検知して、その内7回かそれ以上の回数が’H’なら反応する場合のルーチン
AddH=0 'AddH = No. of 'H' pulse detected in reading SensIn
If SensIn=1 Then 'Read SensIn
AddH=AddH+1 ‘’H‘の数を積算する
Endif
Pause 500 '0.5 sec 0.5秒待つ
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 times 10回検知して、その内7回かそれ以上の回数が’H’ならLightupへ飛ぶ
Goto Lightup
Endif
Goto LightupLoop
Lightup:
If LupTimeSW=0 Then ShortTime ‘点灯時間を選択するSWからの入力をチェックする
If LupTimeSW=1 Then LongTime
ShortTime: ‘センサが最後に人体を検知後30秒間電球を点灯させるルーチン
t=0
High SSR ‘SSR−>ON
For t=1 to 30 '30 sec 1秒毎に30秒間数える
Pause 1000 '1 sec
If SensIn=1 Then ShortTime ‘センサ入力をチェックし、もし、1(’H‘)ならShortTimeへ、もし、0(’L‘)なら Next t へ、そして30回に達したら‘SSR−>OFFにしてLightupLoopへ飛ぶ
Next t
Low SSR ‘SSR−>OFF
Goto LightupLoop
LongTime: ‘センサが最後に人体を検知後120秒間(2分間)電球を点灯させるルーチン
t=0
High SSR
For t=1 to 120 '120 sec
pause 1000 '1 sec
If SensIn=1 Then LongTime
Next t
Low SSR
Goto LightupLoop
'********** End of program ***************
'Note:
'melabs U2 Programmer's
configurations 12F629
'FOSC – INTOSC; Watch0dog Timer - Enable; Power-up Timer - Disable
'MCLR – Input Pin; Brown-out Detect - Enable; Code – Not Protected; Data EEPROM – Not Protected
LED電球も使えるメカニカルリレー式人感センサライト実用機の製作(2011.1.21)
上述のSSRを使った人感センサライトではLED電球が使えなかった。そこで、SSRをメカニカルリレー(OMRON G5LE-1,5VDC)に換えることにした。リレーの寿命が問題になるが、メーカーの説明書によると電気的寿命は4−10万回を保証しているようなので、1日30回開閉したとして5年以上は持つ計算になる。下の回路図にも示したように、今回は昼夜ともに動作するモードと夜のみ動作するモードを選択できるスイッチ(SW3)を導入した。結果は上々でLED電球を含めすべての種類の電球が使えるようになった。
右手に装着してあるのがLED電球(KEIAN 60W相当)である
プログラム
今回は、昼夜ともに動作するモードと夜のみ動作するモードを選択できるスイッチ(SW3)を導入したので、上記のプログラム'MotionSens629CPrac.basをわずかに変えた。すなわち以下の1行を加えた。
if DayorNight=0 Then LightupLoop
'*************** Outline **********************
'MotionSens629CPracMR.bas 2011.1.19 MR−Mechanical Relay
'This is for a practical model.
'12F629 based, AC adaptor of DC5V output
'Mechanical relay introduced for LED lamp
'Day & night SW introduced
'******** Pin connection *****************
'Pin 1: Vdd (5.0V)
'Pin 8: Vss (GND)
'Pin 6: GPIO.1: input - connected to Motion Sensor and LED (red)
'Pin 3: GPIO.4: output - connected to SSR and LED (red)
'Pin 2: GPIO 5: input - connected to SW which leads to Vdd or GND via R=100K Lightup Time
'Pin 4: GPIO.3: input - connected to Vdd via R=10K
'Pin 7: GPIO.0: input - connected to SW which leads to Vdd or GND via R=100K Wait Time
'Pin 5: GPIO.2: input - connected to CdS SW3 which selects Day&Night or Night Only operation 新たに導入
'********** Program ***************
SSR VAR GPIO.4 'LEDs on GPIO.4
LupTimeSW var GPIO.5 'Read H(Vdd Long time) or L(0V Short time)
WaitTimeSW var GPIO.0 'Read H(Vdd X-sec wait) or L(0V Instantly)
SensIn var GPIO.1 'Input from Sensor
DayorNight var GPIO.2 'Read CdS-SW - H (day&night) or variable (night only)-CdS input
AddH var byte 'AddH = No. of 'H' pulse detected in reading SensIn
CMCON=7 'Disable Comparators, GP0 & GP1 -> digital
TRISIO=%101111 'GPIO.1, LupTimeSW & WaitTimeSW read – inputs 少し変更
t var byte 'Counter新たに導入
LightupLoop:
SSR=0
if DayorNight=0 Then LightupLoop 'Day or Night SW3 check ここでSW3(GP0)をチェックー新たに導入
If WaitTimeSW=0 Then Instantly
If WaitTimeSW=1 Then Xsecwait
Instantly:
AddH=0 'AddH = No. of 'H' pulse detected in reading SensIn
If SensIn=1 Then 'Read SensIn
AddH=AddH+1
Endif
Pause 100 '0.1 sec
If SensIn=1 Then
AddH=AddH+1
Endif
Pause 100 '0.1 sec
If AddH = 2 Then '2 times out of 2 times
Goto Lightup
Endif
Goto LightupLoop
Xsecwait:
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 times
Goto Lightup
Endif
Goto LightupLoop
Lightup:
If LupTimeSW=0 Then ShortTime
If LupTimeSW=1 Then LongTime
ShortTime:
t=0
High SSR
For t=1 to 30 '30 sec
Pause 1000 '1 sec
If SensIn=1 Then ShortTime
Next t
Low SSR
Goto LightupLoop
LongTime:
t=0
High SSR
For t=1 to 120 '120 sec
Pause 1000 '1 sec
If SensIn=1 Then LongTime
Next t
Low SSR
Goto LightupLoop
'********** End of program ***************
'Note:
'melabs U2 Programmer's configurations 12F629
'FOSC – INTOSC; Watch0dog Timer - Enable; Power-up Timer - Disable
'MCLR – Input Pin; Brown-out Detect - Enable; Code – Not Protected; Data EEPROM – Not Protected
Building of Motion Sensor Light (English version of the above Electronics Project 52 in Japanese)
One of my friends asked me if I could build an eco-friendly sensor light for a toilet in his home. So I decided to build one using a motion sensor and PIC12F629 for lighting a LED lamp, compact fluorescent lamp or incandescent lamp. The control program was compiled by using PICBasic Pro. The circuit diagram is shown below. A brief explanation on it is given as follows:
1) Three selectable inputs into 12F629 from SW1, SW2 and SW3. Namely, SW1 selects Response Sensitivity, in which if L is selected the program turns on the light instantaneously when the sensor detects human-body movement but if H is selected, it turns on the light several seconds later after the detection of human-body movement. SW2 decides Lighting Time, in which if L is selected the lighting lamp is turned off 30 seconds later after the last detection of human-body movement by sensor but if H is selected the lighting lamp is turned off 120 seconds later after the last detection of human-body movement by the sensor. SW3 is Day&Night Select, in which if L is selected the lamp lights up only when the environment is dark (night) but if H is selected, it lights up day and night..
2) Motion Sensor (MP motion sensor NaPiOn, AMN31111, made by Panasonic Denko, \1030) has a built-in amplifier, so when the sensor detects the movement of human body, its output changes from L to H. This change is easily picked up and processed by 12F629, controlling the ON/OFF of the relay or lamp through GP4.
3) Mechanical relay was used to turn on the latest energy-saving LED lamp (60W equivalent using 5.5W made by Keian). Initially I tried to use a SSR (Solid State Relay) but it did not turn on the LED lamp properly. Later, I found that the instruction for the LED lamp said that it was not suited for use with a sensor light device.
.
Completed motion
sensor light unit
Comments
1) This Motion Sensor senses the far-infrared ray from various sources including electric heater or incandescent lamp. Therefore, when an incandescent lamp is used,, the sensor needs to be installed such a way that no direct light of the lamp is exposed to the sensor. Besides LED lamp, the compact fluorescent lamp that also consumes less electricity can be used satisfactorily.
2) Total cost was about \3000.
Program
'***************
Outline **********************
'MotionSens629CPracMR.bas 2011.1.19
'This is for a
practical model.
'12F629 based, AC
adaptor of DC5V output
'Mechanical relay
introduced for LED lamp
'Day & night
SW introduced
'******** Pin
connection *****************
'Pin 1: Vdd
(5.0V)
'Pin 8: Vss (GND)
'Pin 6: GPIO.1: input
- connected to Motion Sensor and LED (red)
'Pin 3: GPIO.4:
output - connected to SSR and LED (red)
'Pin 2: GPIO 5:
input - connected to SW which leads to Vdd or GND via R=100K Lightup Time
'Pin 4: GPIO.3:
input - connected to Vdd via R=10K
'Pin 7: GPIO.0:
input - connected to SW which leads to Vdd or GND via R=100K Wait Time
'Pin 5: GPIO.2:
input - connected to CdS SW3 which selects Day&Night or Night Only
operation
'**********
Program ***************
SSR VAR GPIO.4 'LEDs on GPIO.4
LupTimeSW
var GPIO.5 'Read H(Vdd Long time) or L(0V Short
time)
WaitTimeSW var
GPIO.0 'Read H(Vdd X-sec wait) or
L(0V Instantly)
SensIn var GPIO.1 'Input from Sensor
DayorNight
var GPIO.2 'Read CdS-SW - H (day&night) or
variable (night only)-CdS input
AddH var
byte
'AddH = No. of 'H' pulse detected in reading SensIn
CMCON=7
'Disable Comparators, GP0 & GP1 -> digital
TRISIO=%101111 'GPIO.1,
LupTimeSW & WaitTimeSW read - inputs
t var byte 'Counter
LightupLoop:
SSR=0
if DayorNight=0
then LightupLoop 'Day or Night SW3
input check
If WaitTimeSW=0
Then Instantly ‘Response Sensitivity SW1 input check
If WaitTimeSW=1
Then Xsecwait
Instantly:
AddH=0
'AddH = No. of 'H' pulse detected in reading SensIn - Sensor
If SensIn=1
Then 'Read SensIn - Sensor
AddH=AddH+1
Endif
Pause 100 '0.1 sec
If SensIn=1 Then
AddH=AddH+1
Endif
Pause 100 '0.1 sec
If AddH = 2 Then
'2 times out of 2 times
Goto Lightup
Endif
Goto LightupLoop
Xsecwait: ‘Wait
several seconds routine
AddH=0
'AddH = No. of 'H' pulse detected in reading SensIn - Sensor
If SensIn=1
Then 'Read SensIn - Sensor
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 times
Goto Lightup
Endif
Goto LightupLoop
Lightup:
If LupTimeSW=0
Then ShortTime ‘Day&Night Select SW3 input check
If LupTimeSW=1
Then LongTime
ShortTime: ’30
seconds light-up routine after the last sensor input
t=0
High SSR
For t=1 to 30 '30
sec counting
Pause 1000 '1 sec
If SensIn=1 Then
ShortTime ‘Checking the last sensor input. If yes, count again from the
beginning. – important!!
Next t
Low SSR
Goto LightupLoop
LongTime: ‘’120
seconds light-up routine after the last sensor input
t=0
High SSR
For t=1 to 120
'120 sec
Pause 1000 '1 sec
If SensIn=1 Then
LongTime
Next t
Low SSR
Goto LightupLoop
'********** End of program ***************
'Note:
'melabs U2 Programmer's configurations 12F629
'FOSC – INTOSC; Watch0dog Timer - Enable; Power-up Timer – Disable
'MCLR – Input Pin; Brown-out Detect - Enable; Code – Not Protected; Data EEPROM – Not Protected