電子工作53 – センサ部を赤外線で連結した人感センサライトの製作

 

 

概要

センサ部を人感センサライトの本体から数メートル離して設置する必要性が生じた。そこで、リモコンで使う赤外線信号を送受信して目的を達成しようと試みた。結果は上々で、室内で10メートル位離れてもきびきび動作することが分かった。

注意: 危険なので製作は自分の責任で行うこと

 

製作にあたって;

1)     出来るだけ簡単な構造にする。

2)     動作が確実であること。

3)     過去に製作した電子工作をフルに利用する。

4)     12F683内蔵のHPWM機能を使って正確な38KHz搬送波を作成して使う。

 

回路図と動作原理

  センサ部(送信側)Motion Sensor (AMN3111、パナソニック電工) からの入力を割込み信号として捕らえ、12F683で処理して1つのパルスパターンを作成して赤外線LEDより発射させる。割込みが発生する毎にこのパルスパターンがくり返し発射される。

   センサライト本体(受信側)ーセンサ部より発射されたパルスパターンは赤外線受信モジュールで元のパルスパターンに復元されて12F683に読込まれる。その中で個々のパルス(幅)が計測され、送った元のパルスパターンと同じかどうか調べられる。同じなら、リレーを動かして電球を点灯させたりする。

 

送信部; 電池を電源として使用。Motion Sensorで人体の動きを検知する毎に1つのパルスパターンを赤外線LEDから発射する。

                                人体の動きを検知しない時はSleepモードに入り、消費電流は約140mA位(ほぼセンサの駆動のために消費)に低下する。

 

 

                      受信部: ACアダプタを電源として使用。送信部からのパルスパターンをIR受信モジュールから取込み12F683の内部で処理してリレーを駆動し

                             AC100VをON/OFFする。Day&Nightと点灯時間がSW1とSW2で選択できる。

 

パルスパターン

   1種類のパルスパターンが送信部から赤外線で送られ、離れた受信部で受け取って復元される。

人体の動きを検知すると送信部の12F683のPin5(GP2)より以下(パルスパターン図1)のようなパルスパターンが次々と発生する。パターン幅は約71ms。その1つを10倍に拡大すると下のパルスパターン図3の様になる。格好乱れているように思える。このパターンを受け取った受信側のIR受信モジュールの出力端子でオシロを用いて計測してみるときれいに復元されている(パルスパターン図4)。このきれいなパルスパターンを受信側の12F683で読込んでプログラムで処理される。

 

                             パルスパターン図1: 12F683のPin5(GP2)でオシロで計測。1秒間に最大3−4個のこのようなパルスパターンが出現する

                                         (Fig. 1)

 

パルスパターン図2: このパルスパターンは電池駆動の送信部のON状態の電源SWをいったんOFFにして10―30秒待たずに

   (Fig. 2)        再びONにすると起こる現象で、この状態に放置するとSleep状態に入っても11−12mAの電流を消費して

                電池の持ちが極端に短くなる(上記パルスパターン図1の場合Sleep状態で140mA位消費)。したがって、

                ON状態の電源SWをいったんOFFにしてまたONにする場合は必ず30秒位待つこと。この特性は

                Motion Sensorに特有のようだ。いろいろPICの設定値を変えてもこのH−tailingは除けなかった。

 

パルスパターン図3: 上記パルスパターン図1の1つを10倍に拡大したもの。結構乱れが激しいように見える。

                                     (Fig. 3)

 

パルスパターン図4: 上のパターンをIR受信モジュールの出力端子で計測した結果。きれいに復元されている。左から幅3.35msのリーダーパルス

  (Fig. 4)        が先ず現れ、続いて幅0.85msの小さいパルスと幅2.5msの大きいパルスが現れる。大小パルスの合計は24本である。

                これらをプログラムの中でPulsinいうコマンドを使って1個1個読込んで処理する。小パルス=0、大パルス=1とする。

                ビット配列=%011111010111100000101000 (下のパルス配列と逆に数えることに注意。最初の3.35ms幅のL-パルスは数えない)

 

Photo. 5

                                        実験中: 右のボードから送って左のボードで受信。室内で10m位離しても通信できた。

 

実用機

                                      上のボードが送信部 – 単3 eneloop 2本で動作中、3カ月位はもちそう

                                      下は受信部 – 右手の黒いのはDC5V用アダプタ、IR受信モジュールは外に出してある

 

結果&コメント

                   

1)    最適光源として蛍光灯電球を選んだ理由: Motion Sensor のすぐ前で点灯していてもその人感検知能に影響を与えなかった。白熱電球、電気ヒータなど遠赤外線を出すものは近くにある場合時として誤動作(電球が消灯しない)を起こした。白熱電球を使う場合はMPモーションセンサの設置位置を直接電球の光を受けない場所、例えば、アルミボックスの側面などに移動する。また、蛍光灯電球は十分明るくなるまで1分以上かかる。

2)    メカニカルリレーを使ったのでLED電球も使える。 SSR(Solid State Relay)では原則LED電球は使えない。

3)    赤外線パルスパターンは電子工作32などで使ったFUNAIのRC-7というリモコンの“電源キー”を押した時に出るものを使った。

4)    送信部には単三電池3−4本を使うので省エネが最大の課題。Motion SensorはSleep中でも電流を消費する(公称170mA)。回路上での5V電源で測ると140mAほど消費した。問題はON状態の回路の電源SWをいったんOFFにして10秒も待たずに再びONにするとH−レベルのTailing (パルスパターン以外の部分でH(Vdd)レベルに留まること) 起こり11−12mAの電流を消費し続ける現象が出ることである。これを避けるためには最低30秒間位待ってから電源SWをONにする必要があることが分かった。

5)    室内で10m位離しても赤外線通信できたが、蛍光灯や太陽光下ではその距離が短くなるようである。

6)    線を使わずにセンサ部と人感センサライトの本体を離せるのはなかなか便利。

7)    Motion Sensor (AMN3111、パナソニック電工)は使い易く、良く出来ているが、価格が1000円以上と高いのがネック。

 

 

プログラム

  送信側用と受信側用にそれぞれプログラムが要る。著者が過去に作成したもの、つまり、前者では電子工作32と34で使われたものを、後者では電子工作33を参考にして作成した

 

送信側のプログラム

 1つのパルスパターンの各パルスを1個1個作成して送り出すわけであるが、12F683のHPWM機能に基づく正確な搬送波を使用したので最終的に発射されるパルスパターンのタイミングはかなり正確な筈である。それと電池駆動のため省電力化を図らなければならない。したがってMotion Sensorから信号入力のない時はSleepモードに入り省エネし、信号入力があった時のみ、その信号を割込みとして捕えてパルスパターンを作成し赤外線LEDから発射させる必要がある。設定が結構大変であった。以下が上記パルスパターン図1の1個1個のパルスパターンを作り出すプログラムである。

'*************** Outline **********************

'SLight12F683HPWMC.bas  2011.2.11 works but SW-ON-OFF timing important to exclude H-tailing!

'This produces a PWM-based remote-control command sequence.

'Use of @Sleep command

'12F683 with internal clock 4MHz

'Combined with PWMtestBB1.bas (2009.6.5 Eproj33)

‘Compiler used: PicBasic Pro V. 2.50A

'######## Pin connection #########

'Pin 1: Vdd (5.0V)

'Pin 8: Vss (GND)

'Pin 7: GPIO.0: input - from Motion Sensor (Port level change detect)

'Pin 5: GPIO.2: output - PWM output driving IRLED

'Pin 4: GPIO.3: input - connected to MCLR via 10K resistor

'######## Program #########

CMCON0=7             'Comparator OFF (Note: not CMCON=7)

ANSEL.0=0            'All pin digital

TRISIO=%001001       'GP0 - Motion Sensor input (level change interrupt)

PR2=25               'Set PWM for 38KHz (24:40KHz) 以下の4行がPWM38KHz搬送波出力のための初期設定(電子工作34参照)

CCPR1L=13            'Set PWM for 50% duty cycle

CCP1CON=%00001100    'PWM mode selection

T2CON=%00000100      'Timer2 ON + 1:1 prescale

 

INTCON.7=1         'Use of interrupt GIE->1   以下の3行がPort change割込みの初期設定

INTCON.3=1         'Use of GPIO port level change interrupt

IOC.0=1            'GPIO pin input change detect  Essential!

 

SleepLoop:    ここから8行が割込みとSleepを設定させる設定、試行錯誤で作成。

CCP1CON=0   'PWM Disable - Essential!

CCP1CON=12  '=%00001100  PWM Enable

INTCON.0=0      'Clear GPIF   important!

GPIO.2=0    'Essential to remove H-level tailing (save current) ? 要らないかも知れない

@Sleep           'This is a key command

GPIO.2=0    'Essential!                            要らないかも知れない

INTCON.0=0      'Clear GPIF

GPIO.2=0    'Essential!                            要らないかも知れない 

 

'*** Routine to be executed when wake up ***  以下で作成されるパルスは受信側のIR受信モジュールの出力ではH/Lが反転することに注意!(電子工作34の'PWMtestBB1.bas参照)

'Plspattern1:   '"Dengen" key of Funai RC-7 remote controller

Gosub w40msH   '40-ms H pulse

Gosub w3p5msL  '3.50-ms L pulse

Gosub w3p35msH '3.35-ms H pulse + 1-ms L pulse       3.35ms幅のHリーダーパルス+1ms幅のL部分をサブルーチンで作成

Gosub w0p85msH '1, 850-us H pulse + 1-ms L pulse - 1-24 以下の24本が実際に計測に使われるパルス

Gosub w0p85msH '2, 850-us H pulse + 1-ms L pulse

Gosub w0p85msH '3, 850-us H pulse + 1-ms L pulse

Gosub w2p5msH  '4, 2.5-ms H pulse + 1-ms L pulse

Gosub w0p85msH '5, 850-us H pulse + 1-ms L pulse

Gosub w2p5msH  '6, 2.5-ms H pulse + 1-ms L pulse

Gosub w0p85msH '7, 850-us H pulse + 1-ms L pulse

Gosub w0p85msH '8, 850-us H pulse + 1-ms L pulse

Gosub w0p85msH '9, 850-us H pulse + 1-ms L pulse

Gosub w0p85msH '10, 850-us H pulse + 1-ms L pulse

Gosub w0p85msH '11, 850-us H pulse + 1-ms L pulse

Gosub w2p5msH  '12, 2.5-ms H pulse + 1-ms L pulse

Gosub w2p5msH  '13, 2.5-ms H pulse + 1-ms L pulse

Gosub w2p5msH  '14, 2.5-ms H pulse + 1-ms L pulse

Gosub w2p5msH  '15, 2.5-ms H pulse + 1-ms L pulse

Gosub w0p85msH '16, 850-us H pulse + 1-ms L pulse

Gosub w2p5msH  '17, 2.5-ms H pulse + 1-ms L pulse

Gosub w0p85msH '18, 850-us H pulse + 1-ms L pulse

Gosub w2p5msH  '19, 2.5-ms H pulse + 1-ms L pulse

Gosub w2p5msH  '20, 2.5-ms H pulse + 1-ms L pulse

Gosub w2p5msH  '21, 2.5-ms H pulse + 1-ms L pulse

Gosub w2p5msH  '22, 2.5-ms H pulse + 1-ms L pulse

Gosub w2p5msH  '23, 2.5-ms H pulse + 1-ms L pulse

Gosub w0p85msH '24, 850-us H pulse + 1-ms L pulse

 

Goto SleepLoop

 

'Subroutines ---

w40msH:

CCP1CON=0     '=%00000000  PWM disable

Low GPIO.2

Pause 40

CCP1CON=12    '=%00001100  PWM enable    

Return

 

w3p5msL:

CCP1CON=12

Pauseus 3500

Return

 

w3p35msH:  ‘リーダーパルス作成サブルーチン (受信側のIR受信モジュールの出力では、反転して3.35ms幅のHパルス+1ms幅のLパルスとなる

CCP1CON=0 ‘PWMをOFFにする

Low GPIO.2  ‘L(0V)の時間を3.35msつくりGP2より出力する

Pauseus 3350

CCP1CON=12 ‘PWMをONにして38KHz搬送波でH(5V)の時間を1.0msつくる

Pauseus 1000   '1-ms L pulse

Return

 

w0p85msH:

CCP1CON=0

Low GPIO.2

Pauseus 850    '0.85-ms pulse

CCP1CON=12

Pauseus 1000   '1-ms L pulse

Return

 

w2p5msH:

CCP1CON=0

Low GPIO.2

Pauseus 2500

CCP1CON=12

Pauseus 1000   '1-ms L pulse

Return

'********** End of program ***************

'Note:

   'melabs U2 Programmer's configurations: IMPORTANT!

   'Oscillator - INTOSCIO; Watch-dog Timer - Disable; Power-up Timer - Disable

   'MCLR - Reset; Brown-out Reset - Disable; Int-Ext SW-over - Enable;

   'Fail-Safe clock monitor - Enable; Code - Not protect; Data EEPROM - Not protect. 2011.2.6

 

 

受信側のプログラム

  上記の送信側から送られてくる1つのパルスパターンを構成する24本のパルスの幅をPulsinコマンドで読込んで作成した24ビット配列が下の理論値と一致すれば、正しいバルスパターンを受け取ったとしてリレーをONにしてAC100Vの電球を点灯させたりする。  理論上のビット配列=%0111,1101,0111,1000,0010,1000

 ただ、PicBasic Proで扱える最大ビット数は16なので、24ビットは16ビットと8ビットに分けて捕捉し、後で一緒にして利用する必要がある。If (Code=30760) AND (Code1=125) then LupTimeCheckが受信した値が理論値と一致するかどうか検査している。

受信側でリレーが動作中に送信側から更なるバルスパターンの入力があった場合、再び点灯時間の計数を最初から開始するようにさせるルーチンは以下の2行で旨く動作することが分かった。

Pulsin GPIO.1,1,PlsW300  'Read the pulse with 3.3 ms ‘リーダーパルスの入力を検知して点灯時間の計数を再び最初から始める

If (300<PlsW300) and (400>PlsW300) then LongTime

'*************** Outline **********************

'SLight12F683HPWMRecA.bas 2011.2.12  works well!

'Based on IRrecTDtriac.bas (Works well - confirmed on 2009.1.9)

'Receiver side of remote IR-transmitter (SLight12F683HPWMC.bas)

'Use of IR pulses pattern from "DENGEN" key of FUNAI RC-7 remote control are used.

'To drive a relay by receiving the "DENGEN" pulses pattern from the remote IR-transmitter

‘Compiler used: PicBasic Pro V. 2.50A

'************** Pin connection **********************

'12F683, 4MHz Internal Clock used

'Pin 1: Vdd (5.0V)

'Pin 8: Vss (GND)

'Pin 6: GPIO.1: input - from Motion Sensor (NaPion)

'Pin 5: GPIO.2: input - from CdS sensor (Day & Night)

'Pin 4: GPIO.3: input - connected to MCLR via 10K resistor

'Pin 3: GPIO.4: output - connected to mechanical relay

'Pin 2: GPIO.5: input - lightup time selection

'*************** Main program ***********************

CMCON0=7  'Comparator off

ANSEL=0   'All pins are digital

TRISIO=%101110  'all except GP0 and GP4 are inputs.

 

PlsW300 var word   '3.3ms pulse storage

PlsW var word      '0.7ms pulse storage

Code var word      'Synthesized Code value storage (16 bits)

Code1 var word     'Synthesized Code1 value storage (8 bits)

Relay var GPIO.4    'Driving the relay

DayorNight var GPIO.2  'Read CdS-SW - H (day&night) or L (night only)-CdS input

LupTimeSW var  GPIO.5  'Read H (Vdd Long time) or L (0V Short time)

t var byte          'Counter

 

Loop:

PlsW300=0

PlsW=0

Code=0

Code1=0

 

if DayorNight=0 Then Loop  'Day or Night SW1 check ここで昼・夜を選択するSW1の状態をチェックする。もしLならLoopに戻る。Hなら下に進む。 

 

Low Relay  'Changed 09.1,9

 

Pulsin GPIO.1,1,PlsW300  'Read the pulse with 3.3 ms ここでリーダーパルスを捕捉するためGP1よりH−レベルのパルスを読込む

If (300<PlsW300) and (400>PlsW300) then   ‘ここで捕まえたパルスPlsW300が300と400(オシロを使って実験的に決めた)の間にあれば3.35ms幅のリーダーパルスとしてCountplsに飛ぶ

Goto Countpls

Else                                  

Goto Loop

Endif

 

Countpls:  'Formation of Code and Code1 "Power Key"="Dengen" key ここから受信した16個のパルスを検査して16ビットのCodeの各ビットを合成する

'Checking Bit0 - 0-15 (16 bits)

'Checking Bit0                             Power TV/Video

Pulsin GPIO.1,1,PlsW   'Read 24 working pulses               Key   Key

If 150>PlsW then Code.bit0=0  '0 is a small pulse (0.7 ms)   0      0      150以上ならCodeの0ビット目は0、150以下ならCodeの0ビット目は1とセットする

If 150<PlsW then Code.bit0=1  '1 is a large pulse (2.5 ms)

 

'Checking Bit1

Pulsin GPIO.1,1,PlsW  

If 150>PlsW then Code.bit1=0   '0     0

If 150<PlsW then Code.bit1=1

 

'Checking Bit2

Pulsin GPIO.1,1,PlsW  

If 150>PlsW then Code.bit2=0   '0     0

If 150<PlsW then Code.bit2=1

 

'Checking Bit3

Pulsin GPIO.1,1,PlsW  

If 150>PlsW then Code.bit3=0

If 150<PlsW then Code.bit3=1    '1     1

 

'Checking Bit4

Pulsin GPIO.1,1,PlsW  

If 150>PlsW then Code.bit4=0    '0     0

If 150<PlsW then Code.bit4=1   

 

'Checking Bit5

Pulsin GPIO.1,1,PlsW  

If 150>PlsW then Code.bit5=0

If 150<PlsW then Code.bit5=1    '1     1

 

'Checking Bit6

Pulsin GPIO.1,1,PlsW  

If 150>PlsW then Code.bit6=0    '0     0

If 150<PlsW then Code.bit6=1   

 

'Checking Bit7

Pulsin GPIO.1,1,PlsW  

If 150>PlsW then Code.bit7=0    '0     0

If 150<PlsW then Code.bit7=1

 

'Checking Bit8

Pulsin GPIO.1,1,PlsW  

If 150>PlsW then Code.bit8=0    '0     0

If 150<PlsW then Code.bit8=1   

   

'Checking Bit9

Pulsin GPIO.1,1,PlsW  

If 150>PlsW then Code.bit9=0    '0     0

If 150<PlsW then Code.bit9=1   

 

'Checking Bit10

Pulsin GPIO.1,1,PlsW  

If 150>PlsW then Code.bit10=0   '0     0

If 150<PlsW then Code.bit10=1   

 

'Checking Bit11

Pulsin GPIO.1,1,PlsW  

If 150>PlsW then Code.bit11=0

If 150<PlsW then Code.bit11=1   '1     0

 

'Checking Bit12

Pulsin GPIO.1,1,PlsW  

If 150>PlsW then Code.bit12=0

If 150<PlsW then Code.bit12=1   '1     1

 

'Checking Bit13

Pulsin GPIO.1,1,PlsW  

If 150>PlsW then Code.bit13=0

If 150<PlsW then Code.bit13=1   '1     1

 

'Checking Bit14

Pulsin GPIO.1,1,PlsW  

If 150>PlsW then Code.bit14=0

If 150<PlsW then Code.bit14=1   '1     1

 

'Checking Bit15

Pulsin GPIO.1,1,PlsW  

If 150>PlsW then Code.bit15=0   '0     0

If 150<PlsW then Code.bit15=1   

 

'Code=30760 in first 16 bits =%0111100000101000  (Power Key) 合成されたCodeの値がこの理論値と等しければ最初の16ビットは送信されたものと判断される

 

'Checking Bit16 - 16-23 (8 bits) ここからは残りの8個のパルスを検査してCode1の各ビットを合成する

Pulsin GPIO.1,1,PlsW  

If 150>PlsW then Code1.bit0=0

If 150<PlsW then Code1.bit0=1   '1     1

 

'Checking Bit17

Pulsin GPIO.1,1,PlsW  

If 150>PlsW then Code1.bit1=0   '0     0

If 150<PlsW then Code1.bit1=1   

 

'Checking Bit18

Pulsin GPIO.1,1,PlsW  

If 150>PlsW then Code1.bit2=0

If 150<PlsW then Code1.bit2=1   '1     1

 

'Checking Bit19

Pulsin GPIO.1,1,PlsW  

If 150>PlsW then Code1.bit3=0

If 150<PlsW then Code1.bit3=1   '1     1

 

'Checking Bit20

Pulsin GPIO.1,1,PlsW  

If 150>PlsW then Code1.bit4=0

If 150<PlsW then Code1.bit4=1   '1     1

 

'Checking Bit21

Pulsin GPIO.1,1,PlsW  

If 150>PlsW then Code1.bit5=0

If 150<PlsW then Code1.bit5=1   '1     1

 

'Checking Bit22

Pulsin GPIO.1,1,PlsW  

If 150>PlsW then Code1.bit6=0

If 150<PlsW then Code1.bit6=1   '1     1

 

'Checking Bit23

Pulsin GPIO.1,1,PlsW  

If 150>PlsW then Code1.bit7=0   '0     1

If 150<PlsW then Code1.bit7=1   

 

'Code1=125 in last 8 bits =%01111101 (Power Key) 合成されたCode1の値がこの理論値と等しければ残りの8ビットは送信されたものと判断される

Pause 20

If (Code=30760) AND (Code1=125) then LupTimeCheck  ‘ここでCodeとCode1の条件が一致すれば、受信した24ビットの値は送信されたものだと判断される

 

Goto Loop  ‘上の条件は一致しなければLoopに戻って別のパルスパターンの入力を待つ

 

LupTimeCheck: ‘ここではLight-up Time (点灯時間)の選択SW2のチェックをしている

If LupTimeSW=0 Then ShortTime ‘L (GND)ならShortTimeへ飛べ

If LupTimeSW=1 Then LongTime  ‘H (Vdd)ならLongTimeへ飛べ

 

ShortTime:

t=0

High Relay ‘リレーをONにする

For t=1 to 20 '30 sec   この値20で約30秒間待つことになる(実測)

Pause 1000    '1 sec

Pulsin GPIO.1,1,PlsW300  'Read the pulse with 3.3 ms ‘この2行で、最後に捉えたリーダーパルスからShortTimeに飛んで再び時間の計数を繰り返すー重要!

If (300<PlsW300) and (400>PlsW300) then ShortTime  ‘ここでリーダーパルスが捕えられなければ、Motion Sensorからの更なる入力なしとしてNext tに進む

Next t

Low Relay ‘リレーをOFFにする

 

Goto Loop

 

LongTime:

t=0

High Relay

For t=1 to 80 '120 sec ‘この値80で約120秒間待つことになる(実測)

Pause 1000    '1 sec

Pulsin GPIO.1,1,PlsW300  'Read the pulse with 3.3 ms

If (300<PlsW300) and (400>PlsW300) then LongTime

Next t

Low Relay

  

Goto Loop

 

'Note:

'********** End of program ***************

   'melabos U2 Programmer's configurations:

   'Oscillator-INTOSC (GP4:I/O); WDTE-Enable; PWRTE-Enable

   'MCLR-Reset; BODEN-Enable; IESO - Enable, FSCM-Enable;

   'Code-Not Protect; Data EEPROM-Not Protect

 

 

Building of Motion Sensor Light with the remote sensor connected by IR beam (English version of the above Electronics Project 53 in Japanese, 2011.2.22)

  This time, the Motion Sensor Light previously published in the Electronics Project 52 was modified in such a way that its sensor section is separated from its main body and the connection between them is made with infrared beam like one used in the conventional remote controller. Therefore, the remote sensor is required to send a pulse sequence modulated with 48-KHz carrier to the main body of Motion Sensor Light. In the man body side, the infrared reception module receives the infrared beam, brings it into the original pulse sequence and outputs it into 12F683 for further processing.

 

 

 

 

 

Pulse sequence used. Pulses are read from left to right. The first large pulse of 3,35ms in width is the leader, followed by the small and large

pulses of 0.85ms (0) and 2.5ms (1), respectively. Total number of pulses is 24. These pulses are read one by one using PULSIN command.

The bit array of 24 pulses is %011111010111100000101000.

Programs

  Two programs, sender- and receiver-side programs are required.

 

Sender-side program (SLight12F683HPWMC.bas described in the above Japanese section:)

  In my past projects (Electronics Projects 32 and 34 in Japanese), I have copied a pulse sequence from a conventional remote controller, which is generated by pressing one of its keys, and succeeded in producing a very similar pulse sequence using PBP's commands, transmitting and restoring it in the receiver side. The program SLight12F683HPWMC.bas can generate this particular pulse sequence. Because some comments are added to the program in Japanese, which are unable to read under English-version OS, they may be messy and obtrusive so just ignore them. The points to note this program are:

1)       A pulse sequence that is the similar to the copied one is formed using the program and transmitted to the receiver side.

2)       Since a 48-KHz carrier based on 12F683’s PWM is used for the formation of pulse sequence, the timing of transmitted pulse sequence is quite accurate

3)       The input from the Motion Sensor is used as the interrupt signal (Port-level change interrupt).

4)       Because batteries are used in the sender side, the current consumption must be very small, say less than 0.5 mA.

5)       When there is no signal from Motion Sensor, the system goes into the low-power @Sleep mode, consuming as low as only 140uA.

     

Receiver-side program (SLight12F683HPWMRecA.bas described in the above Japanese section):

  The IR-reception module restores the pulse sequence sent from the sender side and 12F683 reads it one pulse by one pulse (width) using PBP's PULSIN command to restore the original pulse sequence. And if the restored pulse sequence coincides with its theoretical one, that pulse sequence is considered to be the right one, activating the relay and turning on the lamp connected to the relay. The points to note are:.

1)       As a 24-bit pulse sequence is used, first it needs to be divided into 16- and 8-bit pulse sequences and later they are combined together again for the final reception/rejection processing.

2)       Code (16-bit) and Code1 (8-bit) are synthesized by reading the pulse sequence sent from the sender side using PULSIN command.

3)       Both Code and Code1 synthesized coincide with their theoretical pulse sequences , a transmitted pulse sequence is considered to be the right one, activating the relay and turning on the lamp connected to the relay. The theoretical pulse sequences are Code (16 bits ) = 30760 = %0111100000101000, and Code1(6 bits) = 125 = %01111101. Whether the synthesized pulse sequences are right or not is examined by the following program line: If (Code=30760) AND (Code1=125) Then LupTimeCheck.

 

Results & Comments

1)       Once Motion Sensor detected a human body movement, the IR beam is transmitted to the main body of Motion Sensor Light, driving the relay and turning on the lamp. The response is very quick.

2)       A 71-ms pulse sequence is transmitted 3 - 4 times per second at most.

3)       The maximum distance between the remote transmitter and the main body of Motion Sensor is about 10 meters in the ordinary room environment. The sunlight and fluorescent light interferes and shortens the transmission distance.

4)       The power consumption in the remote transmitter is about 140uA (though the power consumption of Motion Sensor is claimed to be 170uA when in its waiting mode). 12F683 operates from as low as 2.0V so two AA rechargeable NiMH cells is powerful enough to drive this PIC.

5)       Because a 24-bit long pulse sequence is used, no transmission error has been observed during the experiment.

6)       Two switches SW1 and SW2 are allowed to set up freely. SW1 selects Day&Night (24-hour operation) or Night only (operation only when the environment is dark). SW2 selects Lighting duration - Short time (30 seconds) and Long time (2 minutes).

7)       If, for example, in Long time mode of 2 min and another input from Motion Sensor is detected, the time counting restarts again from the beginning. That is, as long as Motion Sensor detects input signals, the lamp driven by the relay keeps lighting. This is important!

8)       The experiment is under way. The right-hand board is the sender side while the left-hand one the receiver side (See Photo. 5 in the Japanese section).

 

Practical Motion Sensor Light

Upper – Remote Transmitter board, operated with 2 AA NiMH batteries

Lower – Receiver box, capable of driving AC100V appliances including LED lamp

 

Menu Pageへ戻る

Topへ戻る