電子工作 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のサーミスタと2KWVR(ボリューム)の組み合わせでは(最初の実験)、0.77−0.84mA程度(3Vで)以下には出来ず、また、プログラムのTRISIOでピンの入出力やADOCON0の設定を変えてみたが効果なし。いろいろ実験しているうち、GP0(ピン7)からの電流流出が大きいことが分かり、50KWのサーミスタと10KWVRの組み合わせに換えてみた。その結果、消費電流を0.05(SW OFFの状態)−0.10mA(SW ONの状態)程度に低下させることに成功した。最初の約10分の1.これなら電池も長持ち間違いなし!

一応、外部割込みと節電スリープモードの使い方が分かったので、いろんなものに応用できそうである。それにしても、この僅か¥150で買える12F675の機能の高さは大したものである。脱帽!

 

Menu Pageへ戻る    

Topへ戻る