電子工作 14 – 半田ゴテの加温状態をLEDとブザーで知らせる−12F675で割込みとスリープモードを使う
概要
今回は前の電子工作13で検討した半田ゴテの温度変化の状態を2個のLEDで表示する回路をさらに発展させたものである。すなわち、割込み、Sleepモード、電子ブザーを導入し、さらに、割込みの入力に Ball SW (傾斜させると内部でボールが転がってSWをON/OFFさせるスイッチ)を加えた。これらによって、電池2本での低消費電流駆動が可能になった。また、半田ゴテが熱い時は、間欠的にブザーが鳴って警告してくれるようにした。
回路
下図に示すように、今回はGP4とGP5にBall SW (入力) とPiezo Buzzer(出力)を、それぞれ新たに加えた。4MHzの内臓クロックを使っているので、電池2本で3Vから2Vまでの範囲で理論上は動作する筈である。
写真1 緑と赤のLEDとセンサ部(ガラスファイバーに包まれたサーミスタが中に入っている)が見える。
写真2 左手がコテ先端方向、右手がAC電源への差込プラグ方向である。PICボード(青いVRの下の黒い長方形の物体がBall SW)の他に、真中の丸いものがPiezo Buzzerであり、右手のものはSW付き電池ボックスで、単4アルカリ電池が2本入っている。
動作原理
温度の変化を電圧の形で読込み、緑と赤の2個のLEDで温度の状態を表示し、Ball SWによる割込み入力を受付け、かつ、ブザーを鳴らすようにしたので、全8ピンの内、7ピンを使う。半田ゴテが冷えてる時、Ball SWをゆすって割込みをかけると、LEDGreenが点滅をはじめる。もし、コテに電源が入っていないと、一定時間 (今回は 5 minに設定)後に、PICが低消費電流のスリープモード(@Sleepというコマンドを使う)に入り、文字どおり眠った状態になる。 この時の消費電流は0.05−0.10 mA程度に低下する。この状態から起こす(wake-up )には、Ball SWを再びゆすって割込みをかける必要がある。 電源を入れ、コテの温度が上昇する状態で、割込みがかかる(Ball SWをゆする)と、スリープ状態から起き、先ずLEDGreenが点滅し、次いでLEDRedが点滅し、そして、LEDRedが連続点灯する状態(高温)になる。この状態では、Pieso Buzzer も約20秒毎に鳴り続ける (Soundというコマンドを使う、ピリピリピリという小さい音)。
プログラム
下にプログラムのフローチャートとプログラムリストを示す。
フローチャートから明らかなように、レジスタを含めたパラメータの設定項目が多い。今回は緑と赤の2つのLEDによる表示モードを、LEDGblink, LEDRblink, LEDRstatic の3つに単純化した(前回のものは4モード)。したがって、LEDの表示モードを分ける境界値も800と500の2つになった。LEDGblinkが5
min続くと自動的にスリープモードに入り、その点滅が停止する。この機能はプログラム最後の部分のラベル Ending とGoto SleepLoopの間にある各種コマンドでコントロールされる。この部分がこのプログラムの要である。
'****************** プログラミング備忘録 *******************
'SLD675Bc.bas (SLDBa=soldering iron Battery operated) Soldering iron temp.
'indicator 2007.1.11
'At last this program was found to work on 2007.1.04
'This is a tidy-up version of SLD675Ba.bas.
'Buzzer was added.
'Worked OK! 2007.1.7 15:34
'Type of buzzer was changed from 5V-buzzer to piezo speacker (Sound)
'Modified from I var Byte to I var WORD to use the number over 256
‘Use BYTE for I when I < 256 and WORD for I when I > 256 – Important!
'************** Pin connection **********************
'Pin 1: Vdd (5.0V)
'Pin 8: Vss (GND)
'Pin 7: GPIO.0: input - connected to (50K-thermistor + 10K-VR (0-3V))
'between Vdd and Vss
'Pin 6: GPIO.1: output - connected to Green LED via 560 ohm resistor
'Pin 5: GPIO.2: output - connected to Red LED via 560 ohm resistor
'Pin 3: GPIO.4: input - connected to Ball SW (switch)
'Pin 2: GPIO.5: output - connected to Piezo buzzer (controlled by SOUND command)
'*************** Details of registers setup *************
'ADCON0=%10000011 '=131 (decimal)
'bit7=1(right justified), bit6=0 (Vdd used as volt reference for ADC),
'bit5-4=0 (unimplemented), bit3-2=00 (channel0-An0),
'bit1=1 (starts right away), bit0=1(on operation?)
'ANSEL=%00010001 '=17 (decimal), sets Fosc/8 and GPIO.0 as ADC input
'bit7=0 (unimplemented), bit6-4=001 (Fosc/8?),
'bit3-2-1=0 (Digtal I/O pins), bit0=1(Analog input)
'TRISIO=%010001 'GPIO.0 and 4 (thermistor and Hg SW inputs)
'GPIO.1 and 2 (LEDGreen and LEDRed), GPIO.5 (buzzer - output)
'********** ここからがプログラム本体 ***************
ANSEL=%00010001
ADCON0=%10000011
TRISIO=%010001
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 'Polling is not needed due to use of ADCIN command
Vin var WORD ‘Storage for ADC data
LEDGreen var GPIO.1
LEDRed var GPIO.2
Buzzer var GPIO.5
I var WORD 'Time counter for LEDGblink - Use WORD for I > 256
K var BYTE 'Time counter for LEDRstatic
OPTION_REG.7=0 'Weak pull-up used
WPU.4=1 'Pull-up of GP4 (Pin3)
IOC.4=1 'GP4 -> Enable to detect GP4 port change interrupt
SleepLoop:
StartI: 'Start Initial
I=0
K=0
Start:
LEDGreen=0
LEDRed=0
Buzzer=0
ADCIN 0, Vin 'Read Vin from GPIO.0 (AN0).
If Vin>800 Then goto LEDGblink
IF (800>Vin) and (Vin>500) Then Goto LEDRblink
IF Vin<500 then Goto LEDRstatic
LEDGblink:
High LEDGreen
Pause 200
Low LEDGreen
Pause 200
I=I+1
IF I>750 then goto ending '750 nearly equal to 5 minutes
GOTO Start
LEDRblink:
High LEDRed
Pause 200
Low LEDRed
Pause 200
GOTO StartI
LEDRstatic:
High LEDRed
pause 200
K=K+1
IF K>50 then goto BuzzerR '50 time count -
GOTO Start
BuzzerR:
Sound Buzzer, [150,50] 'drive a piezo buzzer - piri,piri,piri ..
Goto StartI
Ending:
Low LEDGreen
Pause 2000
INTCON.3=1 'GPIE - Enable (GPIO port change interrupt used)
Pause 500
INTCON.0=0 'GPIF - Disable (clear for the next interrupt)
@Sleep 'Assembler command
INTCON.0=0
Goto SleepLoop
‘********** ここまでがプログラム ***************
'Note: WDT must be Disabled - Important!
'Note: AKI Programmer's configs. - FOSC: INTOSC(GP4:I/O), WDTE: Disable,
'PWRTE: Disable, MCLRE: Internal, BODEN: Disable (to save power – important!),
'CP/CPD: Not protected
考察・余談
半田ゴテを使おうと、コテに振動を与えた時に、自動的に割込みでスイッチが入り、加温状態を光と音で知らせながら監視し続け、コテの電源を切って使い終わると、スリープモードという節電状態になる簡単なシステムを組むことが出来た。今回の大きな目的は、振動を与え、SW ON の状態(GP4で)からOFFに変化したとき、あるいは、SW OFF の状態からONに変化したときの何れでも、割込みがかかる方法(GPIOポート入力レベル変化検出機能の利用)を検証すること、それと低消費電流になるスリープモード(@Sleep の利用)を実現することであった。最初は仲々、スリープモードからWake-up 出来ず、プログラム中にIOC.4=1(GP4ピンで入力データの変化を検出する)などを入れてやっと動作するようになった。
消費電流も3KWのサーミスタと2KWのVR(ボリューム)の組み合わせでは(最初の実験)、0.77−0.84mA程度(3Vで)以下には出来ず、また、プログラムのTRISIOでピンの入出力やADOCON0の設定を変えてみたが効果なし。いろいろ実験しているうち、GP0(ピン7)からの電流流出が大きいことが分かり、50KWのサーミスタと10KWのVRの組み合わせに換えてみた。その結果、消費電流を0.05(SW OFFの状態)−0.10mA(SW ONの状態)程度に低下させることに成功した。最初の約10分の1.これなら電池も長持ち間違いなし!
一応、外部割込みと節電スリープモードの使い方が分かったので、いろんなものに応用できそうである。それにしても、この僅か¥150で買える12F675の機能の高さは大したものである。脱帽!