電子工作51 – 30分、1、2、3、4、5時間に設定可能な簡易タイマの製作
概要
前の電子工作50での6個のLEDを使った温度表示の原理を応用してソフトウエア制御の簡易タイマを製作してみた。あまり正確でないとされているPICBasic Pro のPauseという遅延コマンドがタイマなどに果たして使えるのかどうかを検証する目的もあった。結果は予想に反してかなり正確であった。
注意: 危険なので製作は自分の責任で行うこと。
製作にあたって;
1) 最長5時間位まで設定可能なこと。
2) 設定時間が来たら電源が“切れる”または“入る”モードを選択出来ること。
3) 前の電子工作50で使った市販品のタイマの代替に使いたい。
4) 時間の精度はそんなに高くなくてよい。
回路図と動作原理
回路図を下に示す。今回もピンの数が手頃な16F688を使った。ADCの入力電圧を変えるVR100Kを回すとLED1−6のいずれが点灯する。各LEDに設定時間が割り当てられている(LED1=30min,LED2=1hr、LED3=2hrs、LED4=3hrs、LED5=4hrs、LED6=5hrs)。設定した時間が来たらタイマが“切れる”または“入る”の設定はMode SWで行う(L:“切れる”、H:“入る”)。設定した時間が終了したらSSRをON/OFFし点滅LEDを動作させる。Reset SWを押すと同じLED表示時間でまた時間の計数が始まる。VR100Kを回して別の(または同じ)時間を選択すると、その瞬間をゼロして時間の計数がまた始まる。電源には出力DC5V位(>200mA)のACアダプタを使う。
)
実験中: 14ピンの16F688の下には6個のLEDが、また右手にはスライド型VRが見える。
右端の別の基板に乗っているのはSSRである。
結果&コメント
1) 時間の精度は下表のように結構高いことが分かった。実測時間値は原則1回だけの測定で得られた値である。コマンドPauseを使って遅延をつくっているので精度はそれほどでもないと思っていた。実測時間のバラツキは環境温度などがに関係していると思われる。Internal Clock 4MHz ではなく外付け水晶発振器などを使えば精度が上がるかも知れない。
設定時間 |
30 min |
1 hr |
2 hrs |
3 hrs |
4 hrs |
5 hrs |
実測時間 |
29m 59s |
60m 1s |
1hr 59m 57s |
2hr 59m 55s |
3hr 59m 46s |
? |
時間差 |
1s |
1s |
3s |
5s |
14s |
? |
2) 30分の遅延ルーチンFor m=1 to 176で、繰返し数176は実験的に見出した。この値を基準にして1、2、3、4、5時間値を作成した。例えば、2時間では176x4=704回。
3) VR100Kを回して、ある時間表示LEDを設定した瞬間からその時間の計数が始まる。したがって、1時間に設定しておいて途中で3時間などに設定し直すとその時点から3時間の計数が始まる。
4) 勿論、例えば30分と1時間の間の時間設定は出来ない(市販のシンクロナスモータを使ったものは出来る)。
5) 少ない部品でかなり使えそうだ。外付けクロックなどを使って精度を上げた12時間タイマなども簡単に出来そう。
6) 総材料費は1000円ほど。
プログラム
このプログラムではVR100Kを使う分圧器からの入力電圧をもとに6個のLEDで時間表示が出来るようにした。 今回は5Vに対応する1024を6つに分割し1間隔を171(1024/6)にしてある。それとMode SWで時間が来たら“切れる”と“入る”を選択できるようにしたので合計12の計数ルーチンが必要になり、プログラムが結構長くなった。どのLED表示時間にあっても途中で自由に変更し再スタート出来るのがポイントの一つである。すなわち現在計数しているルーチンの中に“まだ同じLED表示時間の中にいるか?”をチェックする部分を加えることでそれが可能になった。
‘********************************************
'SimpleTimer16F688A.bas - 2010.12.17 - works well!
'16F688 with internal clock 4MHz (default)
'Timer - ON or OFF when time expires (30 min, 1, 2, 3, 4, 5 hours - 6 settings)
'********Pin connections************
'Pin 1: Vdd (5V) ‘全14ピン中13ピンを使用
'Pin 14: Vss (GND)
'Pin 2: PORTA.5: NC
'Pin 3: PORTA.4: output - connected to flashing LED via 1K
'Pin 4: PORTA.3: input - connected to MCLR
'Pin 5: PORTC.5: output - connected to LED1
'Pin 6: PORTC.4: output - connected to LED2
'Pin 7: PORTC.3: output - connected to LED3
'Pin 8: PORTC.2: output - connected to LED4
'Pin 9: PORTC.1: output - connected to LED5
'Pin 10: PORTC.0: output - connected to LED6
'Pin 11: PORTA.2: input - connected to Mode SW
'Pin 12: PORTA.1: output - connected to SSR
'Pin 13: PORTA.0: input - analogue input of 0-5.0V from VR 100K
'Power supply - AC adaptor 3.5 - 5.5V 200mA
'****** 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=%00001101 '0-5.0V input from divider
TRISC=%00000000 'all are outputs
Vin var Word 'AD input value from VR 100K
ModeSWInput var PORTA.2 'Mode SW input from Mode SW (ON or OFF when time expires) Mode SWの選択に使用
SSRSW var PORTA.1 'SSRSW - ON/OFF of SSR
FlashLED var PORTA.4 'flashing LED to indicate the expiring of time 点滅LEDに使用
LED1 var PORTC.5 'ON/OFF of LED1 以下の6個のLEDの点灯に使用
LED2 var PORTC.4 'ON/OFF of LED2
LED3 var PORTC.3 'ON/OFF of LED3
LED4 var PORTC.2 'ON/OFF of LED4
LED5 var PORTC.1 'ON/OFF of LED5
LED6 var PORTC.0 'ON/OFF of LED6
m var Word
n var Byte
SSRSW=0
FlashLED=0
Loop:
Adcin 0, Vin
Pause 5 'Wait 5ms
'Selecting voltage range (5V - 1024/6 fractions=171) 1024/6分割=171の間隔でVin値を6つに分類 VR100Kを回して設定時間を選択
If (171>=Vin) Then LED1ON '171 - 5V - 30 min
If (171<Vin) And (Vin=<341) Then LED2ON '341 -
If (341<Vin) And (Vin=<512) Then LED3ON '512 -
If (512<Vin) And (Vin=<683) Then LED4ON '683 -
If (683<Vin) And (Vin=<854) Then LED5ON '854 -
If (854<Vin) Then LED6ON '>854 - 0V - 5 hrs
'Indicating selected voltage ranges on LED1-6
LED1ON: High LED1: Low LED2: Low LED3: Low LED4: Low LED5: Low LED6 ‘LED1のみ点灯せよ
If ModeSWInput=0 Then LED1Tcount ‘Mode SWの位置をチェック もしModeSWInput=0(時間が来たら“切れる”)ならLED1Tcountへ飛べ、otherwise LED1TcountDownへ飛べ
Goto LED1TcountDown
LED2ON: Low LED1: High LED2: Low LED3: Low LED4: Low LED5: Low LED6
If ModeSWInput=0 Then LED2Tcount
Goto LED2TcountDown
LED3ON: Low LED1: Low LED2: High LED3: Low LED4: Low LED5: Low LED6
If ModeSWInput=0 Then LED3Tcount
Goto LED3TcountDown
LED4ON: Low LED1: Low LED2: Low LED3: High LED4: Low LED5: Low LED6
If ModeSWInput=0 Then LED4Tcount
Goto LED4TcountDown
LED5ON: Low LED1: Low LED2: Low LED3: Low LED4: High LED5: Low LED6
If ModeSWInput=0 Then LED5Tcount
Goto LED5TcountDown
LED6ON: Low LED1: Low LED2: Low LED3: Low LED4: Low LED5: High LED6
If ModeSWInput=0 Then LED6Tcount
Goto LED6TcountDown
'Counting time
LED1Tcount: '30 min OFF when time expires 30分経ったらタイマを“切れる”ルーチン
High SSRSW 'SSR -> ON SSRをONにする
For m=1 to 176 '30 min adjusted after actual measurement (180 in theory) ここからNext m が30分の時間をつくるルーチン
For n=1 to 40 '10 sec
Adcin 0, Vin ‘ここであらためてこのコマンドを入れないと動作しなかった
Pause 5 'Wait 5ms
If (171>=Vin) Then ‘これが重要で、VR100Kの入力(LEDsの位置)が変わっていないかをチェック。変化なければ0.25秒待つ、変化していればLoopに戻ってやり直し
Pause 250 '250 ms
Else
Goto Loop
Endif
Next n
Next m ‘30分間計数終了、次へ
Low SSRSW 'SSR -> OFF SSRをOFFにする
Goto Finishing ‘Finishingへ飛べ
LED1TcountDown: '30 min ON when time expires 30分経ったらタイマを“入る”ルーチン
Low SSRSW 'SSR -> OFF
For m=1 to 176 '30 min adjusted after actual measurement (180 in theory) trial&error方式でこの値176を見出した
For n=1 to 40 'nearly 10 sec 250ms+5ms x 40回=255x40=10.2秒 10.2x176=1795.2秒 1795.2/60=29.92分 (nearly30分)
Adcin 0, Vin
Pause 5 'Wait 5ms
If (171>=Vin) Then
Pause 250 '250 ms
Else
Goto Loop
Endif
Next n
Next m
High SSRSW 'SSR -> ON
Goto Finishing
LED2Tcount: '1 hour
High SSRSW 'SSR -> ON
For m=1 to 352 '176 x 2
For n=1 to 40 '10 sec
Adcin 0, Vin
Pause 5 'Wait 5ms
If (171<Vin) And (Vin=<341) Then
Pause 250 '250 ms
Else
Goto Loop
Endif
Next n
Next m
Low SSRSW 'SSR -> OFF
Goto Finishing
LED2TcountDown: '1 hour
Low SSRSW 'SSR -> OFF
For m=1 to 352 '1 hour
'For m=1 to 343 '352-9=343
For n=1 to 40 '10 sec
Adcin 0, Vin
Pause 5 'Wait 5ms
If (171<Vin) And (Vin=<341) Then
Pause 250 '250 ms
Else
Goto Loop
Endif
Next n
Next m
High SSRSW 'SSR -> ON
Goto Finishing
LED3Tcount: '2 hours
High SSRSW 'SSR -> ON
For m=1 to 704 ' 2 hours (352 x 2)
For n=1 to 40 '10 sec
Adcin 0, Vin
Pause 5 'Wait 5ms
If (341<Vin) And (Vin=<512) Then
Pause 250 '250 ms
Else
Goto Loop
Endif
Next n
Next m
Low SSRSW 'SSR -> OFF
Goto Finishing
LED3TcountDown: '2 hours
Low SSRSW 'SSR -> OFF
For m=1 to 704
For n=1 to 40 '10 sec
Adcin 0, Vin
Pause 5 'Wait 5ms
If (341<Vin) And (Vin=<512) Then
Pause 250 '250 ms
Else
Goto Loop
Endif
Next n
Next m
High SSRSW 'SSR -> ON
Goto Finishing
LED4Tcount: '3 hours
High SSRSW 'SSR -> ON
For m=1 to 1056
For n=1 to 40 '10 sec
Adcin 0, Vin
Pause 5 'Wait 5ms
If (512<Vin) And (Vin=<683) Then
Pause 250 '250 ms
Else
Goto Loop
Endif
Next n
Next m
Low SSRSW 'SSR -> OFF
Goto Finishing
LED4TcountDown: '3 hours
Low SSRSW 'SSR -> OFF
For m=1 to 1056
For n=1 to 40 '10 sec
Adcin 0, Vin
Pause 5 'Wait 5ms
If (512<Vin) And (Vin=<683) Then
Pause 250 '250 ms
Else
Goto Loop
Endif
Next n
Next m
High SSRSW 'SSR -> ON
Goto Finishing
LED5Tcount: '4 hours
High SSRSW 'SSR -> ON
For m=1 to 1408
For n=1 to 40 '10 sec
Adcin 0, Vin
Pause 5 'Wait 5ms
If (683<Vin) And (Vin=<854) Then
Pause 250 '250 ms
Else
Goto Loop
Endif
Next n
Next m
Low SSRSW 'SSR -> OFF
Goto Finishing
LED5TcountDown: '4 hours
Low SSRSW 'SSR -> OFF
For m=1 to 1408
For n=1 to 40 '10 sec
Adcin 0, Vin
Pause 5 'Wait 5ms
If (683<Vin) And (Vin=<854) Then
Pause 250 '250 ms
Else
Goto Loop
Endif
Next n
Next m
High SSRSW 'SSR -> ON
Goto Finishing
LED6Tcount: '5 hours
High SSRSW 'SSR -> ON
For m=1 to 1760
For n=1 to 40 ''nearly 10 sec 250ms+5ms x 40回=255x40=10.2秒 10.2x1760=17952秒 17952/3600s=4.99時間 (nearly 5時間)
Adcin 0, Vin
Pause 5 'Wait 5ms
If (854<Vin) Then
Pause 250 '250 ms
Else
Goto Loop
Endif
Next n
Next m
Low SSRSW 'SSR -> OFF
Goto Finishing
LED6TcountDown: '5 hours
Low SSRSW 'SSR -> OFF
For m=1 to 1760
For n=1 to 40 '10 sec
Adcin 0, Vin
Pause 5 'Wait 5ms
If (854<Vin) Then
Pause 250 '250 ms
Else
Goto Loop
Endif
Next n
Next m
High SSRSW 'SSR -> ON
Goto Finishing
Finishing:
High FlashLED ‘点滅LEDを点灯させて終了
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.29)
以下の写真のように組み上げた。上記回路図で変えた点は、1)三端子レギュレータ7805を搭載したこと、2)LED1-6とLED(G)の抵抗を4.7Kより1Kにしたことである。2枚の基板は100円ショップダイソーのバラエテー・トレイ(24.2X16.8X7cm)にぴったり入った。上の基板には16F688、Mode SW、VR100Kなどが、下の基板にはSSR(20A)とフューズが乗っている。差し当たって電子工作50の足温器と組み合わせて使ってみる。今回は安く仕上げるためアルミ箱をけちったが、使えば容量が3分の1位になるだろう。
追加情報(2014.1.5): 800Wのヒーターを接続する必要が生じ、SSR(秋月キット25A)にアルミの放熱フィンを取付け、それを5V(220mA)の小型ファンで冷やす様に改良した(5ohmの抵抗も入れた)。モーターノイズ除去のため0.1mFのコンデンサも入れた。このファンの導入で、前はフィンが熱く、やっと触れるような状態をフィン表面温度23C程度まで下げることに成功。実はファンなしの状態で使ってSSR(旧型の秋月キット20A?)を1個オシャカにした。
放熱のため5V(0.2mA)のファンを取付(800Wヒーター使用で必須2014.1.5)