電子工作 18 – 省エネ型4−ModeプログラマブルLEDライトの製作
概要
今回製作したものは電子工作17の改良版である。1本100円の超高輝度LEDを3個と、単3のNiCd、または、NiHを4本を、100円ショップで売っているスタンドライト(短筒型)に組み入れた。12F629に、チルトスイッチ(傾斜させるとON/OFFするBall tilt SW)と共に、2連のスライドスイッチを設置して、以下の4つの点灯モードを選択できるようにした。
1) 連続点灯する。
2) 1時間連続点灯し、Sleep (LEDが消灯し、消費電力が極端に低下する状態)に入り、チルトスイッチからの振動による割込み入力で、1時間連続点灯を再開する。
3) 3分間標準パターン(単なる等間隔点滅)で連続点灯し、Sleepに入り、チルトスイッチからの割込み入力で、3分間標準パターン連続点灯を再開する。
4) 3分間特殊パターン(簡単なリズムを入れた点滅)で連続点灯し、Sleepに入り、チルトスイッチからの割込み入力で、3分間特殊パターン連続点灯を再開する。
上の2)、3)、4)で、ある程度の振動をチルトスイッチに与え続けると、割込みが次々と発生して点灯し続け、振動を与えるのを止めるとやがて消灯する(1時間、または3分間後)。消灯後の電流消費は非常に小さい。
回路
下に回路図を示す。購入したスタンドライトには、クリプトン球(4.8V、0.5A)が付いた。これをはずして代わりに、LED(OSPW5111A-YZ)を3本組込んだ。12F629の1本のポート(GP4)からLED3本を直接ドライブ出来ないので、Photo
Relayを介しLEDsにつないだ。このとき電池電源に電流制限用の抵抗16.5W(33Wx2、並列)を入れ電流や輝度を調整した。もう一つのポート(GP0)は割込み入力用のチルトスイッチにつないだ。さらに、SW1とSW2(2連のスライドSW)をポートGP1とGP2につないで、点灯モード設定の入力に使った。そして、GP3にはReset SWを外付けした。理由は不明だが、焼き込み時にInternal
Reset を選択すると、誤動作した。結局、12F629のピン8本の内、7本使用した。この回路は連続点灯時に80−85mA、消灯時、チルトスイッチの状態によって、100−320uA程度電流を消費する。ただ、スタンドライトには電源ON/OFF用のスイッチが付いているので、普通にスイッチを切れば、以後電池の消耗はない。忘れて、ONにしておいても、最大320uA程度消費するだけである。チルトスイッチに直列に抵抗を入れて更なる暗電流の低下を試みたが効果はなかった。しかし、SW1とSW2(2連のスライドSW)への抵抗510Kの挿入効果は大きく、無いときの暗電流2mAが、この抵抗を入れることで、その10分の1以下に低下した。
下の2枚の写真にライトの制御回路ボードと全体像を示す。ライトの側面に取付けたボード上に8ピンのPIC、6ピンのPhoto Relay 、チルトスイッチ(右端の黒い長方形の箱)、スライドスイッチ、それにリセットスイッチなどが見える。一本のLEDには電流が18−20mAほど流れるので、3本のLEDからの光は結構明るい。ライトの下側に簡単なスライド式のスイッチが付いていている。
プログラム
このプログラムでは、さまざまな項目の初期設定の後、スライドスイッチSW1とSW2からの設定入力A1とA2を読込んで、4つのIF文で判別して、それぞれ対応する4つのルーチンに飛んで必要な処理を実行する。(1)のルーチンはLEDsをONにして、その状態を保つだけなので最も簡単。他の(2)、(3)と(4)は時間とスリープ割込み機能が入るので多少複雑。内部クロック4MHzで動作しているはずだが、1時間、3分間が理論通りに仲々定まらず、(2)、(3)と(4)で使った時間定数72、735、184はすべて、実験的に決定した。
****************** プログラミング備忘録 *******************
'LmpH629Ha.bas 2007.3.19/20/21,22 Worked!
'Better lamp project using four 1.2V-NiCd/NiH batteries (4.8V) and
'3 LEDs (OSPW5111A-YZ) with a total current flow of 80-85 mA.
'*** Pin connections ***
'Pin 1: Vdd (4.8V)
'Pin 8: Vss (GND)
'Pin 4: /MCLR (External reset) to Vdd via 100 Kohm (省エネにessential!)
'Pin 7: GPIO.0: input - connected to Ball tilt SW
'Pin 6: GPIO.1: input - connected to Slide SW 1
'Pin 5: GPIO.2: input - connected to Slide SW 2
'Pin 3: GPIO.4: output - connected to Photo relay
A0 var GPIO.0 'Ball tilt SW input
A1 var GPIO.1 'Slide SW P1 input for mode select
A2 var GPIO.2 'Slide SW P2 input for mode select
A4 var GPIO.4 'Output to drive Photo relay
t var word 'Time counter - up to 65535
CMCON=7 'Turn off Comparator function
TRISIO=001111 'GP0, GP1, GP2 and GP3=input, others=output.
WPU=%000001 'Weak pull-up on GPIO.0
OPTION_REG.7=0 'Enable weak pull-ups
IOC.0=1 'Detect input at GP0 for interrupt - Ball tilt SW
If A1=1 and A2=1 Then Goto ContForever '(1) Continuous lighting
If A1=1 and A2=0 Then Goto Cont1hrAoff '(2) Continuously 1 hr lighting
If A1=0 and A2=1 Then Goto Blinknm3mAoff '(3) Normal blink 3 min autoff
If A1=0 and A2=0 Then Goto Blinkuq3mAoff '(4) Unique blink 3 min autoff
‘(1)
ContForever: ‘連続点灯させる
High A4 'Turn on LEDs.
Goto ContForever
‘(2)
Cont1hrAoff: ‘連続1hr点灯させ、Sleepさせる。割込みで起きる。
INTCON.3=1 'Enable the port input level change interrupt
Sleeploop1:
A4=0 'GPIO.4=0
INTCON.0=0 'Clear GPIF
@Sleep '
INTCON.0=0
'* main routine *
t=0
A4=0
For t=1 to 72 '1 hr
High A4 'Turn on 3 LEDs
Pause 60000 'about 60 sec
Low A4
Pause 200
High A4
Pause 200
Low A4
Pause 200
High A4
Pause 200
Low A4
Pause 200
Next t
Goto Sleeploop1
‘(3)
Blinknm3mAoff: ‘標準パターンで3 min点滅させ、Sleepさせる。割込みで起きる。
INTCON.3=1 'Enable the port input level change interrupt
Sleeploop2:
A4=0 'GPIO.4=0
INTCON.0=0 'Clear GPIF
@Sleep '
INTCON.0=0
'* main routine *
t=0
For t=1 to 735 'about 180 sec=3 min
t=t+1
High A4 'Turn on 3 LEDs
Pause 100 '0.1 sec
Low A4
Pause 100
High A4
Pause 100
Low A4
Pause 100
High A4
Pause 100
Low A4
Pause 100
Next t
Goto Sleeploop2
‘(4)
Blinkuq3mAoff: ‘特殊パターンで3 min点滅させ、Sleepさせる。割込みで起きる。
INTCON.3=1 'Enable the port input level change interrupt
Sleeploop3:
A4=0 'GPIO.4=0
INTCON.0=0 'Clear GPIF
@Sleep '
INTCON.0=0
'* main routine *
t=0
For t=1 to 184 'about 180 sec=3 min
t=t+1
High A4
Pause 500 '0.5 sec
Low A4
Pause 100
High A4
Pause 100
Low A4
Pause 100
High A4
Pause 200
Low A4
Pause 200
High A4
Pause 500
Low A4
Pause 100
High A4
Pause 700
Next t
Goto Sleeploop3
End
'********** ここまでがプログラム ***************
'Note:
'AKI Programmer's configurations:
'FOSC - INTOSC(GP4:I/O); WDTE - Disable; PWRTE - Disable
'MCLRpin - External ; BODEN - Diable; CD - Disable; CDP - Disable.
上のプログラムの機械語出力はこんな感じ(これがPICに書き込まれる)。
<LmpH629a.hex>
:020000040000FA
:100000004728A301A200FF30A207031CA307031C7B
:1000100042280330A100DF300F200328A101E83E71
:10002000A000A109FC30031C1828A00703181528FC
:10003000A0076400A10F152820181E28A01C222844
:10004000000022280800A101A301A20002302B28F1
:10005000A20001302B28A80023082102031D32280A
:100060002208200204300318013003190230280549
:10007000031DFF3042280038031DFF300405031D17
:10008000FF304228831303138312640008000730F3
:10009000990083165730850001309500811316149E
:1000A0008312003085180130A00001302320B200F7
:1000B000003005190130A00001302320B4003208BF
:1000C000840034083B20B400B500640034083504D3
:1000D00003196B28B928003085180130A0000130C1
:1000E0002320B200003005190130A0000030232089
:1000F000B4003208840034083B20B400B50064002A
:100100003408350403198528BE28003085180130CD
:10011000A00000302320B200003005190130A000FB
:1001200001302320B4003208840034083B20B4009E
:10013000B50064003408350403199F28FD280030F9
:1001400085180130A00000302320B20000300519CE
:100150000130A00000302320B400320884003408AD
:100160003B20B400B5006400340835040319B928F5
:100170003D290516831605128312B9288B15051221
:100180000B1063000B10BC01BD0105120130BC0057
:10019000BD013C08A0003D08A100A3014830282073
:1001A000031DFC280516831605128312EA30A300EE
:1001B00060300220051283160512C8308312012018
:1001C000051683160512C830831201200512831606
:1001D0000512C83083120120051683160512C83097
:1001E00083120120051283160512C83083120120E4
:1001F000BC0A0319BD0FC928BF288B1505120B10A7
:1002000063000B10BC01BD010130BC00BD013C0806
:10021000A0003D08A1000230A300DF302820031D0C
:100220003C29BC0A0319BD0A051683160512643061
:1002300083120120051283160512643083120120F7
:1002400005168316051264308312012005128316E9
:1002500005126430831201200516831605126430DE
:1002600083120120051283160512643083120120C7
:10027000BC0A0319BD0F0729FE288B1505120B10A8
:1002800063000B10BC01BD010130BC00BD013C0886
:10029000A0003D08A100A301B8302820031D932928
:1002A000BC0A0319BD0A0516831605128312013014
:1002B000A300F43002200512831605126430831265
:1002C00001200516831605126430831201200512E1
:1002D0008316051264308312012005168316051259
:1002E000C83083120120051283160512C83083120C
:1002F000012005168316051283120130A300F43085
:10030000022005128316051264308312012005169F
:100310008316051283120230A300BC300220BC0AEF
:0C0320000319BD0F47293E2963009429F2
:02400E00FC3F75
:00000001FF
余談
光モノをちょっとだけかじってみた。点灯パターンに本格的なリズムを入れたり、PWM制御などもトライしてみたい。超高輝度LEDの価格は1本100円もして、まだ高い。安くなったら、ふんだんに使って“自分好み”の洒落た照明器具でも製作してみたい。消費電流が、大雑把に言って白熱電球の10分の1程度なのはエコの時代にぴったり。何でも豪州では、省エネ目的で白熱電球を禁止する動きがあるようだが、代役蛍光灯、そして、LEDが次世代の照明の主役になるかも。
追記
(2007.4.1)
LEDの点滅だけでなく、その明るさもコントロール(PWM control)するには、Photo Relay では出来ない。そこでトランジスタを用いて、上記の回路を以下のように変えた。
同時に、プログラムも以下のように変えた。‘(4) Blinkuq3mAoff: の中のmain routine 部分がPWMコントール。ここでは、LEDが段々明るくなって、また暗くなる、という動作をする。実験ボード上でそれが確認された。
****************** プログラミング備忘録 *******************
'LmpH629q.bas 2007.4.1 Brightness control by using PWM Worked OK!
'LmpH629p.bas 2007.3.30 Use of PWM
'LmpH629a.bas 2007.3.19/20/21,22 Worked!
'LmpH629H.bas 2007.3.19/20
'Better lamp project using four 1.2V-NiH batteries (4.8V) and
'3 LEDs (OSPW5111A-YZ) with a total current flow of 40 - 50 mA.
'*** Pin connections ***
'Pin 1: Vdd (4.8V)
'Pin 8: Vss (GND)
'Pin 4: /MCLR (External reset) to Vdd via 100 kohm (省エネにessential!)
'Pin 7: GPIO.0: input - connected to Ball tilt SW
'Pin 6: GPIO.1: input - connected to Slide SW 1
'Pin 5: GPIO.2: input - connected to Slide SW 2
'Pin 3: GPIO.4: output - connected to Photo relay
'********** ここからがプログラム本体 ***************
A0 var GPIO.0 'Ball tilt SW input
A1 var GPIO.1 'Slide SW P1 input for mode select
A2 var GPIO.2 'Slide SW P2 input for mode select
A4 var GPIO.4 'Output to drive Photo relay
t var word 'Time counter - up to 65536
t1 var byte 'for PWM control - up to 255 added
CMCON=7 'Turn off Comparator function
TRISIO=001111 'GP0, GP1, GP2 and GP3=input, others=output.
WPU=%000001 'Weak pull-up on GPIO.0
OPTION_REG.7=0 'Enable weak pull-ups
IOC.0=1 'Detect input at GP0 for interrupt - Ball tilt SW
If A1=1 and A2=1 Then Goto ContForever '(1) Continuous lighting
If A1=1 and A2=0 Then Goto Cont1hrAoff '(2) Continuously 1 hr lighting & autoff
If A1=0 and A2=1 Then Goto Blinknm3mAoff (3) 'Normal blink 3 min autoff
If A1=0 and A2=0 Then Goto Blinkuq3mAoff '(4) Unique blink 3 min autoff
‘(1)
ContForever: ‘連続点灯させる
High A4 'Turn on LEDs.
Goto ContForever
‘(2)
Cont1hrAoff: ‘連続1hr点灯させ、Sleepさせる。割込みで起きる。
INTCON.3=1 'Enable the port input level change interrupt
Sleeploop1:
A4=0 'GPIO.4=0
INTCON.0=0 'Clear GPIF
@Sleep '
INTCON.0=0
'* main routine *
t=0
A4=0
For t=1 to 72 '1 hr
High A4 'Turn on LEDs
Pause 60000 'about 60 sec
Low A4
Pause 200
High A4
Pause 200
Low A4
Pause 200
High A4
Pause 200
Low A4
Pause 200
Next t
Goto Sleeploop1
‘(3)
Blinknm3mAoff: ‘標準パターンで3 min点滅させ、Sleepさせる。割込みで起きる。
INTCON.3=1 'Enable the port input level change interrupt
Sleeploop2:
A4=0 'GPIO.4=0
INTCON.0=0 'Clear GPIF
@Sleep '
INTCON.0=0
'* main routine *
t=0
For t=1 to 735 'about 180 sec=3 min
t=t+1
High A4 'Turn on LEDs
Pause 100 '0.1 sec
Low A4
Pause 100
High A4
Pause 100
Low A4
Pause 100
High A4
Pause 100
Low A4
Pause 100
Next t
Goto Sleeploop2
‘(4)
Blinkuq3mAoff: ‘特殊パターン(含PWMコントロール)で3 min点滅させ、Sleepさせる。割込みで起きる。
INTCON.3=1 'Enable the port input level change interrupt
Sleeploop3:
A4=0 'GPIO.4=0
INTCON.0=0 'Clear GPIF
@Sleep '
INTCON.0=0
'* main routine *
t=0
A4=0
For t=0 to 86 'about 180 sec=3 min PWM点滅
t=t+1
For t1=5 to 255 step 5 ‘明るくなる
PWM A4, t1, 5
Next t1
For t1=255 to 5 step –5 ‘暗くなる
PWM A4, t1, 5
Next t1
High A4 ‘以下は単純点滅
Pause 500 '0.5 sec
Low A4
Pause 100
High A4
Pause 100
Low A4
Pause 100
High A4
Pause 200
Low A4
Pause 200
High A4
Pause 500
Low A4
Pause 100
High A4
Pause 700
Next t
Goto Sleeploop3
End
'********** ここまでがプログラム ***************
'Note:
'AKI Programmer's configurations:
'FOSC - INTOSC(GP4:I/O); WDTE - Disable; PWRTE - Disable
'MCLRpin - External ; BODEN - Diable; CD - Disable; CDP - Disable.