電子工作50 – 足温器の製作(その2)−16F688を使ってコントロール
概要
前の電子工作49の所謂マニュアル式足温器は普通に使う分には十分である。PIC愛好者としてはそれでは物足りないので、温度コントロールを自動化し同時に過熱をソフト的に検知・防止する機能を加えたものを製作することにした。何となく元々簡単なものを意図的に複雑にしている感もあるが、とにかく製作してみたかったと云うのが本音。
注意: 危険なので製作は自分の責任で行うこと。
製作にあたって;
1) PICの特性をうまく利用すること。
2) 安全性が高いこと。
3) 材料費があまりかからないこと。
回路図
回路図を下に示す。前の電子工作49と大きく違う点は調光器を除いて代わりにPICを使う制御部を導入したことである。火花を発せず長寿命なSSR (Solid State Relay)が発熱部の2個の電球のON/OFFを行う。全体の制御にはピンの数が手頃な16F688を使った。温度センサは2個使い、一つは希望する温度の設定と制御に、もう1個は何かの理由でプラスチックカバー内が過熱した場合にシステムを完全に停止させる目的に使う。この温度センサは外付けの抵抗の値によって決まる温度で出力ピンがLowからHighに変化する特性を持つもので、例えば可変抵抗器(ボリューム)を使って抵抗値を変えてやるとその値に相当する温度で出力ピンの状態が反転する。これをPICで検知してSSRのON/OFFにつなげる。抵抗値を大きくとると高い温度で反転が起き、逆に小さくとるとより低い温度で反転を起こす(電子工作39参照)。可変抵抗値を大まかに知るために2連(同軸)の可変抵抗器の別の1個と6つのLEDを使って表示させる。今回使った下表のように2連の可変抵抗器の間には抵抗値に若干のずれがある。R2がR1より少し大きい(下の回路図参照)。例えば、温度センサの反転温度を60°Cに設定しようとすると要求される抵抗値(R2)は143KWである。この時に同軸上で回転するもう一つの可変抵抗器の抵抗値(R1)は134KWと若干低い。この値の時に分圧器からPORTA.0に入るVin(V)の値は1.44Vである。つまり、ADC入力電圧Vin=1.44Vは温度センサ1の60°Cおける反転出力に対応するということである.個の関係を利用してVinを6個のLEDで分類表示して間接的に温度設定を行う。
2連ボリュームの2つの可変抵抗器の特性: 温度センサの反転温度と抵抗値R2と関係、
抵抗値R2とR1の差、 R2、R1とPORTA.0に入るVin(V)の関係
温度°C |
100 |
95 |
90 |
85 |
80 |
75 |
70 |
60 |
50 |
40 |
30 |
20 |
10 |
R2 (KW) |
180 |
175 |
170 |
165 |
162 |
155 |
151 |
143 |
133 |
125 |
116 |
109 |
101 |
R1 (KW) |
169 |
164 |
159 |
155 |
152 |
144 |
141 |
134 |
127 |
117 |
108 |
101 |
93 |
Vin (V) |
0.46 |
0.62 |
0.76 |
0.87 |
0.96 |
1.19 |
1.25 |
1.44 |
1.67 |
1.93 |
2.19 |
2.41 |
2.61 |
R1: 2連ボリュームの軸側の抵抗器、 R2: 2連ボリュームの軸の奥側の抵抗器
温度センサ1のR1の値は電源をOFFの状態で外に出したTerminalにテスタ棒を当てて測定できる。過熱検知温度を設定する温度センサ2のVRlimitの抵抗値も同じく電源をOFFの状態で外に出したTerminalにテスタ棒を当ててVRlimitのスクリューをドライバーで回して設定できる。
<<各部品の詳細>>
1) PIC 16F688
2) 小型電球X2: 口金口径14mm、100W90W (National)全高85mm、100W40W (メーカ不明)全高60mm
3) ソケットX2: 磁器製 口径14mm <PS>E JET 300W 3A
4) 電動ファン: DC12V 0.1A F38mm
5) 熱フューズ: 94°C
6) 基板: 硬質木 L27XW18.5XT1.0cm
7) プラスチックカバー: ダイソ- A80 バスケット36 ポリプロピレン製(120°CまでOK) L26XW17.5XH13cm
8) ACアダプタ: DC6V 250mA、 DC5V 1A(昔のZIPドライブに付属していたもの)
9) SSR(Solid Statw Relay) D2W202F 2A240VAC
10) 温度センサ TC622EPA x 2
11) 2連ボリューム (可変抵抗) Linkman 200K 0.005W (マルツパーツ館 \180)
12) 多回転半固定ボリューム たて型 200K 25回転 (VRlimit)
13) 電子ブザー HDB0LFPN
14) タイマ; 市販品“時間が来ると切れる”機能の付いたもの
15) ダンボールボックス: L42XW40XH35cm(現在使っているもの)
一番上の青色のものが2連ボリューム、中央部の黒いのがSSR、その前に6個のLED(うち白い1個は点滅LED0)、
SSRの下にブザーが見える。LED列の前に14ピンの16F688、その左斜め上に多回転半固定ボリュームが見える
足温器の外観。左右のスペースに足を入れ毛布をかける 発熱部の基板。左斜め上に2個の温度センサが組込んである
温度センサの拡大図。ガラスファイバーでカバーし
ON/OFFの繰返し時間を多少遅らせている
実験1
温度センサ1と2を載せた基板をガラスファイバーで覆い、その中に温度計の薄いサーミスタ検知部を差し込んでLED0からLED5まで変化させた時温度がどう変化するか測定した。同時に段ボールボックスの手前内壁付近の温度も測定した。その結果、どの温度範囲でも2−3°Cの温度変化で30−60秒位の間隔で電球の点滅が繰り返されることが分かった。
選択したLED |
LED1 |
LED2 |
LED3 |
LED4 |
LED5 |
温度センサ部ON−OFF温度範囲(°C) |
32-35 |
43-46 |
54-56 |
61-64 |
65-68 |
段ボール手前側内壁温度 (°C) |
28 |
33 |
38 |
42 |
48 |
結果&コメント
1) 温度センサからの6本の線を、電球を点灯するための電源線と一緒にビニールテープできつく束ねて動かしたところノイズを拾って誤動作を起こした。症状は: ON/OFFが一気に決まらずに何度か繰り返した後に落ち着く。どの温度レンジでも頻繁にシステムがシャットダウンした。束を解いて分離したら正常に戻った。なかなかの難問でオシロなどを使ってやっと解決した。
2) 2連ボリュームは200KWなので、計算では温度センサに取付けた場合は119°Cまでコントロールが可能になる。しかし、実際は最高で75°C位に設定するので155KW位までしか使わない。その上の範囲は必要ない。そこで点滅式LED0を設置して2連ボリュームを回し過ぎないように注意を促している。LED0を選択してしまった場合、ボリュームの回転につれて次第に温度センサ1からOUT出力反転温度が上がり理論上最大119°C位まで達する。しかしその前に温度センサ2(今回は75°Cに設定)が動作してシステムをシャットダウンさせる。実際電球の総ワット数が130Wと比較的小さく、さらにボックスと毛布との隙間などからの放熱で119°C位まで上昇することはない。上昇しても最高で熱フューズの溶解温度94°C位までと思われる。
3) 0−200KWを6つの範囲に分け6個のLEDで表示している。どれか1個のLEDが点灯し続けている場合でもわずかなボリュームの回転によってR2の変化があり温度センサ1のOUT出力が反転する温度が変わる。
4) 異常過熱などによってシステムがShutdownした場合、Reset SWを押して元に戻す。
5) 安全上勿論“時間が来る切れる”タイマは絶対必要で、その他に熱フューズと今回の温度センサ2を使った過熱検知・防止ルーチン、合計3つの対策で万全を期している。
6) 温度センサ2からOUT出力が反転する温度を75°Cに設定した。したがってVRlimit値は155KKWに調整した(電子工作39参照)。
7) 足湯に入っているような感じでなかなか快適!
8) 納豆や甘酒の造りの保温器などにも使えそう。
9) タイマを除いた総材料費は2000円ほど。
10) (追加12.3) プログラムの改良で、1連ボリュームと温度センサを各々1個、ADC無しの12F629を使って今回の機能を満たせそう。過熱の場合はHigh(電球ON)の状態が連続するので、例えばHighが15分続いたらENDにスキップするようにする。一方正常な状態ではHighとLowの状態は一定時艱ごとに繰り返すので、二つの違いを区別するようなルーチンをつくればよい。
プログラム
このプログラムでは温度センサ1のOUT出力を設定する抵抗値R2を6つのLEDs、すなわちLED0、LED1−5を使って目視出来るようにしたのが肝心なところ。さらに温度センサ2のOUT出力を使って足温器内部が異常に過熱した場合にシステムを停止させるようにして安全性を高めた。
プログラムのフローチャート
‘********************************************
'FootHeater16F688a.bas - 2010.11.26 - works well
'16F688 with internal clock 4MHz (default)
'Controlling a foot heater
'********Pin connections************
'Pin 1: Vdd (5V) ‘今回は14ピン全てを使った
'Pin 14: Vss (GND)
'Pin 2: PORTA.5: output - connected to SSR
'Pin 3: PORTA.4: input - connected to LED0
'Pin 4: PORTA.3: input - connected to Reset
'Pin 5: PORTC.5: output - connected to buzzer via Tr
'Pin 6: PORTC.4: output - connected to LED1
'Pin 7: PORTC.3: output - connected to LED2
'Pin 8: PORTC.2: output - connected to LED3
'Pin 9: PORTC.1: output - connected to LED4
'Pin 10: PORTC.0: output - connected to LED5
'Pin 11: PORTA.2: input - connected to OUT of Temp Sensor2
'Pin 12: PORTA.1: input - connected to OUT of Temp Sensor1
'Pin 13: PORTA.0: input - analogue input of 0-5.0V from divider(200kVR)
'Power supply - AC adaptor 5.14V 1A
'****** Program ********
Define ADC_BITS 10 '10-bit ADC used 以下ADCの設定を含めた初期設定
Define ADC_CLOCK 3 'Internal clock used ?
Define ADC_SAMPLEUS 50 'Sample timing
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=%00000001 'AN0 of A/D used
CMCON0=7 'turns off comparator function
TRISA=%00001111 '0-5.0V input from divider
TRISC=%00000000 'all are outputs
Vin var word 'AD input value
TempIN var PORTA.1 'Temp input (OUT from Temp Sensor1) 温度センサ1からのOUT出力 − 2連ボリュームの位置で決まる
TempINshut var PORTA.2 'Temp input (OUT from Temp Sensor2) 温度センサ2からの過熱時のOUT出力 − VRlimitで調整する
SSRSW var PORTA.5 'SSRSW - ON/OFF of SSR(Solid State Relay) SSRをON/OFFスイッチ
Buzzer var PORTC.5 ‘ブザーを鳴らすピン
LED0 var PORTA.4 'ON/OFF of LED0
LED1 var PORTC.4 'ON/OFF of LED1
LED2 var PORTC.3 'ON/OFF of LED2
LED3 var PORTC.2 'ON/OFF of LED3
LED4 var PORTC.1 'ON/OFF of LED4
LED5 var PORTC.0 'ON/OFF of LED5
m var byte
n var byte
TempINshut=0
SSRSW=0
Buzzer=0
Loop:
Adcin 0, Vin ‘Read ADC value from Channel 0
Pause 5 'Wait 5ms
'Selecting temperature ranges for heating 2連ボリュームの1個からの入力を電圧の形で読込み以下の6つの範囲で分け、該当するLEDを点灯させる。それから設定した反転温度が大体何度かが分かる
If (230>=Vin) Then LED0ON '230 - 1.12V - 72C 230 <- (1024/5V) * 1.12V この1.12Vは分圧器R1=142KWで72°C位に相当しPORTA.0への入力電圧となる
If (230<Vin) AND (Vin=<256) Then LED1ON '258 - 1.25V - 70C
If (256<Vin) AND (Vin=<295) Then LED2ON '295 - 1.44V - 60C
If (295<Vin) AND (Vin=<342) Then LED3ON '342 - 1.67V - 50C
If (342<Vin) AND (Vin=<395) Then LED4ON 'This description using 'AND' is very important!
If (395<Vin) Then LED5ON '395 - 1.93C - 40C 40°C以下では電球は頻繁には点灯しない
'Indicating temperature ranges selected on LED0-5
LED0ON: High LED0: Low LED1: Low LED2: Low LED3: Low LED4: Low LED5 ‘only LED0 turned to ON
Pause 10 '10 ms 2010.11.30 maybe not necessary? これ必要ないかも?
Goto TempINCheck
LED1ON: Low LED0: High LED1: Low LED2: Low LED3: Low LED4: Low LED5
Pause 10
Goto TempINCheck
LED2ON: Low LED0: Low LED1: High LED2: Low LED3: Low LED4: Low LED5
Pause 10
Goto TempINCheck
LED3ON: Low LED0: Low LED1: Low LED2: High LED3: Low LED4: Low LED5
Pause 10
Goto TempINCheck
LED4ON: Low LED0: Low LED1: Low LED2: Low LED3: High LED4: Low LED5
Pause 10
Goto TempINCheck
LED5ON: Low LED0: Low LED1: Low LED2: Low LED3: Low LED4: High LED5
Pause 10
Goto TempINCheck
TempINCheck: 'Checking the state of TempIN ここで温度センサ1からのOUT出力をチェック
If TempIN=1 Then
Pause 10
SSRSW=0 'SSR -> OFF If TempIN=1 OUT出力=1ならSSRSWをOFFにする
Else
SSRSW=1 'SSR -> ON If not TempIN=1 OUT出力=0ならSSRSWをONにする (電球が点灯する)
Endif
If TempINshut=1 Then ShutOFF ‘もし温度センサ2からのOUT出力=1なら過熱状態なのでShutOFFへ飛べ、そうでなければLoopへ飛べ
Goto Loop
ShutOFF: ‘過熱時にシステムをshutdownする
SSRSW=0 'SSR -> OFF SSRSWをOFFにする
For m=0 to 2 ‘時間稼ぎルーチン、途中LED1を点滅させ、ブザーを間欠的に鳴らす
For n=0 to 100
High LED1
Pause 250 '0.25 sec
Low LED1
Pause 250
High Buzzer
Pause 100 '0.1 sec
Low Buzzer
Pause 100
Next n
Next m
End
'****** End of Program ********
'Note:
'melabs U2 Programmer's
configurations 16F688
'FOSC – INTOSCIO; WDTE - Enable; Power-up Timer - Disable
'MCLRpin – Reset ; BODEN - Enable; Internal External Switch Over – Enable, Fail-Safe Clock Monitor – Enable, CD - Disable;Dtata EPPROM – Disable
簡易型足温器の製作 (2010.12.8)
上記の足温器をもうちょっと簡単に出来ないかと考えて製作してみたものである。
留意点は;
1) 温度の設定はボリューム(可変抵抗)のみで行う
2) 温度センサは1個だけ使う
3) 温度制御には2個の12F629を使う。1個は本来のON−OFF温度制御に、もう1個は過熱検知の目的に使う。
下に回路図を示す。 上記の16F688を使ったものと違って、温度の設定はLED(6個)の表示ではなくボリュームの回転位置(角度)を見ながら行う。これでプログラムも簡単になる。温度センサからのOUT信号(High or Low)を12F629Aに取込んでプログラムでSSRのON/OFFを行う。もう1個の12F629Bは同様にOUT信号(High or Low)を取込んでプログラムでSSRのON状態が一定時間以上続いた場合に12F629Aに信号を送ってシステムの動作を停止させる役目を果たす(過熱検知.・防止)。割込みなどの使い方まだ良く分からないので、12F629を1個使ってはどうしても実現できなかった。
実験中: 上部の小さきブレッドボードに載っているのが温度センサ、この部分がプラスチックカバー
の中に入る。本体とは4本の線で結ばれる。下に2個の12F629、SSR、VRなどが見える。
結果&コメント
1) 実際に回路を組んで動かしてみたらキチンと動作した。
2) 12F629B用のプログラムの中でFor m=1 to 20の20を3倍の60(15分)にし、If L>=18 Then OverHeatDetecdのL>=18をL>=55位にすると、15分毎に過熱チェックをすることになる。より実用的であろう。
3) 割込みを使って1個の12F629で事足りる気がするが、具体的にどうするかは目下検討中。
プログラム
以下に示すように、12F629Aと12F629Bの各々に別のプログラムが必要である。
12F629A用のプログラム
温度センサOUTからのHigh or Low信号をTempINでチェックしながらSSRをON/OFFする。同時に12F529Bからの過熱信号OverHeatINも常時チェックしている。OverHeatIN=1の場合、ShutOFFに飛んでシステムを停止させる。
'FootHeaterSimpleA.bas - 2010.12.7 works OK
'Program for 12F629A
'********Pin connections************
'Pin 1: Vdd (5V)
'Pin 8: Vss (GND)
'Pin 7: GPIO.0: input 温度センサOUTからの入力
'Pin 4: GPIO.3: input - MCLR
'Pin 5: GPIO.2: output - to LED(Y)
'Pin 2: GPIO.5: output - to +Pin of SSR
'Pin 3: GPIO.4: input - from 12F629B (GP5)
'****** Program ********
CMCON=7 'Comparator off
TRISIO=%011001
TempIN var GPIO.0
SSRSW var GPIO.5
OverHeatIN var GPIO.4
LED var GPIO.2 'LED(Y) Yellow
m var byte
n var byte
SSRSW=0
LED=0 'essential これ重要!
Loop:
If TempIN=1 Then
SSRSW=0
Else
SSRSW=1
Endif
If OverHeatIN=1 Then ShutOFF ‘12F629Bからの過熱信号チェックし、HighならShutOFFに飛んでシステムの動作を停止させる
Goto Loop
ShutOFF:
SSRSW=0 'SSR -> OFF
For m=0 to 2 ‘LED(Y)を点滅させる
For n=0 to 100
High LED
Pause 250 '0.25 sec
Low LED
Pause 250
Next n
Next m
High LED 'Keep LED(Y) ON until reset‘LED(Y)を点灯したままで終わる
End
'****** End of Program ********
'Note:
'melabs U2 Programmer's
configurations 16F688
'FOSC – INTOSCIO; WDTE - Enable; Power-up Timer - Disable
'MCLRpin – Reset ; BODEN - Enable; Internal External Switch Over – Enable, Fail-Safe Clock Monitor – Enable, CD - Disable;Dtata EPPROM – Disable
12F629B用のプログラム
温度センサOUTからのHigh or Low信号を15秒毎に20回(15x20=300秒=5分)TempINでチェックし、Highの成分とLowの成分をそれぞれ積算する。もしLowの成分(SSRがON)が20回のうち18回以上だったら(したがってHighの成分は20回のうち2回)、加熱時間が非加熱時間(SSRがOFF)比べて異常に長い(連続して加熱し続けている)と判断して、High信号をGP5より12F629AのGP4に送る。ただそれがけの役目(過熱検知)をこのPICは果たす。
'FootHeaterSimpleB.bas 2010.12.7 - overheat checking program
'Program for 12F629B
'********Pin connections************
'Pin 1: Vdd (5V)
'Pin 8: Vss (GND)
'Pin 7: GPIO.0: input - from OUT of Temp Sensor
'Pin 4: GPIO.3: input - MCLR
'Pin 5: GPIO.2: NC
'Pin 2: GPIO.5: output - to GP5 of 12F629A
'Pin 3: GPIO.4: NC
'****** Program ********
CMCON=7 'Comparator off
TRISIO=%001001
TempIN var GPIO.0
OverHeatOUT var GPIO.5
H var byte
L var byte
m var byte
TempIN=0
HorLcheck: HighかLowかのチェックをするルーチン
OverHeatOUT=0
H=0
L=0
For m=1 to 20 ‘以下で15秒毎にTempIN入力のHigh or Lowを20回チェックしてHighの数とLowの数を数える
If TempIN=1 Then
H=H+1 'H - Temp Sensor's OUT is +5V (=Lamps are OFF) 温度センサOUTがHigh(ランプがOFF)の場合
Else
L=L+1 'L - Temp Sensor's OUT is 0V (=Lamps are ON) 温度センサOUTがLow(ランプがON)の場合
Endif
Pause 15000 '15 sec
Next m
If L>=18 Then OverHeatDetecd 'important! 18 out of 20 20回のうち温度センサOUTのLowが18回以上なら加熱時間が異常に長いと判断しOverheatDetecdに飛ぶ
Goto HorLcheck
OverheatDetecd: ‘以下でHigh信号を12F629AのGP4に送り続ける
High OverHeatOUT
Pause 1000
Goto OverheatDetecd
End