電子工作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

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)

Menu Pageへ戻る

Topへ戻る