概要
眠っている時、火災が発生したら逃げられかと自問する昨今。そんなら自分で火災報知器を作ってみようということにあいなった。今回は、煙の検知器。原理は光の通路に煙が入った時の電気信号の変化を利用して、ブザーを鳴らそうというもの。いつもの様に、Web上で関連情報を探してみると、煙の粒子に光を当てて、それらからの散乱光を測定するもの、光の通路に粒子を導入して、それらによる光の減衰を利用するものなどがあった。簡単そうなので後者を試して見ることにした。
回路と装置の製作
下に回路図と、ボード上に組んだ実験回路の写真を示す。今回はADC(アナログ/デジタル変換)機能を持った12F675を使い、煙検知センサからの電圧変化を、そのGP0 (Pin7)に取入れている。取込んだ信号を内部で処理して、あるレベル以上だと、GP5
(Pin2)につないだブザーを鳴らす。写真で見るように、煙検知センサは約86x32x20mmの角材を用いて作った。すなわち、その中心部に、長さ方向に沿って直径 4.2mm 程の貫通孔をドリルであけ、孔の一方の開口部に高輝度LED(OSPW5111B-QR)を差込み、もう一方の開口部にはホトトランジスタ(PT501B)を差込んだ。 これら2つの送受素子の先端間距離は約70mmである。 また、この角材の中央部に、長さ方向の貫通孔と直交するように、同じく4.2mmの孔をドリルであけた。この孔を煙が通過し、LEDからの光をブロックし、ホトトランジスタへ到達する光量を低下させ、GP0に入る電圧値を増加させる。もう1枚の写真は、実際に線香の煙を、この孔から導入して実験している様子を示す。光源LED用のVR(10K)を6.8KW位に調整して、LEDに流れる電流を0.37mAにし、受光側(ホトトランジスタ)のVR(20K)を適当に調整すると、GP0に入る電圧値は、煙が無い時に0.6V前後、煙が入ってくると最高3V位まで上昇する。つまり、煙の有無を、この電圧値の差で検知するわけである。実際、こんなに差が大きく出るとは想像出来なかった。煙が孔に入ってある基準以上の濃度に達すると、その濃度が保たれることを6秒間ほどチェックし、変わらなければ約150秒間ブザーを鳴らして止まる。但し、煙の濃度が高く保たれ続ければ、再び、ブザーは鳴り続ける。
プログラム
下に煙検知プログラムのためのフローチャートを示す。初期設定をして、GP0 (Pin7)より入力電圧Vin(実際は、Vに対応するstep数)を読込み、そのVin値が200より大きいかどうかチェックする。大きい場合は、煙が入ってきていると判断する。200の値は次のようにして決めた。すなわち、ADCの基準電圧として+5Vを選んでいるので、10ビット(210=1024)のADCでは、5V/1024=0.00488V/stepとなる。したがって、煙の有無の判断基準値にしたい1.0Vは、1.0V/0.00488V=205 stepsとなる。切りの良い値として200を選んだ。Vin > 200 ? を途中に待機する(3秒間)を2回入れて繰返しているのは、誤動作を防ぐためである。
'************ プログラミング備忘録 *************
'FAL675a.bas 2007.9.5 succeeded!
'This is a smoke detector program, which measures the light intensity change
'between a white LED and a phototransistor due to the entry of smoke in the
'path between them. An increase in smoke concentration leads to the increase
'in the voltage at GPIO.0 (pin 7).
‘internal clock used
'************** Pin connection *****************
'Pin 1: Vdd (+3-5V)
'Pin 8: Vss
'Pin 7: GPIO.0: input - connected to +5V via 20K VR and 300K resistor
'Pin 6: GPIO.1: NC
'Pin 5: GPIO.2: NC
'Pin 4: GPIO.3: input - MCLR/Reset
'Pin 3: GPIO.4: NC
'Pin 2: GPIO.5: output - connected to buzzer
'*************** プログラム本体 ******************
ADCON0=%10000011 '=131 (decimal)
'bit7=1(right justified),bit6=0(volt refer-Vdd),
'bit5-4=0(unimplemented),bit3-2=00(channel0-An0),
'bit1=1(starts right away),bit0=1(on operation)
ANSEL=%00010001 'sets Fosc/8 and GPIO.0 as ANS0 input
'bit7=0(unimplemented),bit6-4=001 (Fosc/8),
'bit3-2-1=0(Digtal I/O pins),bit0=1(Analog input)
TRISIO=%001001 'sets all pins except GPIO.0 & 3 as 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
Vin var word 'Vin - voltage input storage
t var byte 't - repeating number
ADCloop:
GPIO.5=0
Vin=0
Pause 20
ADCIN 0, Vin 'reads ADC ch-0 and save in Vin (range 0-1024)
Pause 50 'allows time for ADC conversion
If Vin>200 then '200 equal to about 1.0V analog input V (V=5.0 x 200/1024=0.98V)
goto Second
Endif
Goto ADCloop
Second: 'Second smoke concentration check (誤動作防止のため)
Pause 3000 ‘wait 3 seconds
Vin=0
Pause 20
ADCIN 0, Vin
Pause 50
If Vin>200 then
goto Third
Endif
Goto ADCloop
Third: 'Third smoke concentration check (誤動作防止のため)
Pause 3000
Vin=0
Pause 20
ADCIN 0, Vin
Pause 50
If Vin>200 then
goto Buzzer
Endif
Goto ADCloop
Buzzer: ‘Buzzerを鳴らす pp-pp-pp-pp for 約150 秒 ((0,2+0.1)x500)
For t=0 to 500
High GPIO.5
pause 200
Low GPIO.5
pause 100
Next
Goto ADCloop
'********** プログラムの終わり ***************
'Note:
'AKI Programmer's configurations:
'FOSC- INTOSC (GP4:I/O); WDTE - Enable; PWRTE - Enable
'MCLR -MCLRPin; BODEN - Enable; CD - Disable; CDP - Disable
余談
今回の煙感知器はあくまでプロトタイプ。 かかった材料費1000円ほど。とにかく、煙を検知して、何とかブザーを鳴らすことまで出来たのは収穫。温度センサなどを加えて、もっと実用性の高いものを目指したい。課題は、LEDやホトトランジスタの寿命を延ばすために常時点灯を避ける方法、電池駆動の可能性、正常/異常を示すインデケータの導入等など。簡単で、安く作れて、使える、となればイイダロウと考えている。