Electronics
Project 91 – LED Indicator for Walking Stick
概要 Introduction
夜の公園を歩いていて囲いのロープに足をとられて転倒、足の親指を骨折した。治療中の約2ヶ月間杖を使うことになった。そうだ夜道を歩いて時、前と後ろの方向から来る人や自転車などに自分の存在を知らせる目的で杖に点滅するLEDを装着してやろうと思い立った。 以前に使った振動スイッチ、更に夜間を検知する太陽電池センサを組込めばボタン電池でも実用になるものが出来るのではと考えた。出来上がったものは12F629の割込みやコンパレータ機能を利用したので結構省エネである。電源スイッチを入れてLEDが点滅していないときの電流消費は0.11mA、LED点滅時が1mAほどだった。杖を使わないときは電源スイッチを切っておく、切り忘れても電流消費は上記のように小さい。
Due to my broken toe, I was forced to use a walking stick for a
couple of months. An idea to attach a LED indicator to my walking stick came to
my mind in order to inform my existence to the passers-by in front of and
behind me when I am walking at night. The circuit diagram, photographs and
program shown below explain the details of this small gadget. In the circuit
diagram, Shake switch is normally open and close only when an external shock is
added, which is used to cause an interrupt to 12F629. Solar-panel sensor
produces approximately 3V (daylight) to less than 1V (nighttime). This output
voltage is then read into the comparator of 12F629 and is compared with the
reference voltage (set to 1V here), and the result appears at GP2 as 0 or 1. By
reading this digital value in the program, the program judges if the external
environment is daytime or night. When the shake switch activates an interrupt
function and the solar-panel sensor detects a dark environment, two LEDs start
blinking according to the program. The power consumption when no LEDs are
blinking, but the power switch is ON is about 0.11mA, and increases to about
1.0mA when two LEDs are blinking.
回路図 Circuit Diagram
コンパレータの付いた12F629を使う。振動スイッチ(センサ)はどんな姿勢でも通常非導通で振動が加わったときだけ導通する。この非導通と導通の変化をGP0から検知し、割込みに使う。太陽電池センサは明るいときに3V、暗黒で1V以下の出力がある。この電圧出力をGP1より読み込んで内臓のコンパレータの基準電圧と比較してGP2にLow(0)かHigh(1)かの値として出力する。これをプログラムで読んで周りが明るいか暗いかの判断をする。充分暗く、かつ振動スイッチが導通して割込みが入ったときに2個のLEDが点滅する
Photo 1 実験ボート上に必要な部品を載せて実験中。左に見えるのが振動スイッチ、中央が12F629、右手のものは太陽電池センサ。左下方に2個のLEDが見える。
Shake switch (left), 12F629
(center) and Solar-panel sensor (right) mounted on a breadboard for
experimental purpose.
Photo 2 ダイソーで入手した杖に製作した装置を装着したところ。
The assembled LED indicator is attached to a walking stick.
Photo 3 基板に組み上げた装置。左から3V Liイオンボタン電池、電源スイッチ、12F629、太陽電池センサ。振動スイッチは太陽電池センサの下に入っている。
LED driving circuit assembled on a small board. A coin battery,
power switch, 12F629 and Solar-panel sensor shown from left to right. Shake
switch is installed under Solar-panel sensor.
Photo 4 杖の下方部分に装着した2個のLED。杖を持った状態で前と後ろ方向を向くようにしてある。
Two LEDs installed in the lower part of the walking stick so as to
face the forward and backward directions when holding the walking stick with
hand.
結果とコメント
1) 電源スイッチをONにし、周りが充分暗く、杖に振動が加わった場合に始めて2個のLEDが点滅する。この状態で電流消費は1mA位。抵抗値を小さくすれば輝度は上がり、電流消費は増す。
2) 割込みを使っても、12F629の内臓クロック4MHzを使っているので電源スイッチをONの状態で0.11mA消費する。セラロックなどを使ってクロック周波数を下げるとこの値が低下するらしい。ConfigurationのWDTE - Disable, PWRTE - Disable, BODEN – Disableに設定して電流消費を抑えている。例えば、WDTE – Ableのすると0.11mAが0.13mAに上昇する。
3) コンパレータのCMCONとVRCONの設定が結構複雑(下のプログラムの項参照)。大変勉強になった。
4) 太陽電池センサに入る光の量を調節するため半透明の布などで巻くと良い。
5) 今回使用した振動スイッチ(Shake switch 18010P)は、それを装着した杖をドスンと地面を突いたとき導通するが、空中で振っても導通しなかった。
6) もっと簡易化出来そう。振動スイッチ、電源スイッチ、LEDsとボタン電池のみで作成。夜になったら電源SWをONに、振動でLEDが点滅、振動が無いとLEDは消灯。消し忘れても電流消費は極わずか(ほぼ0.1−0.2microA近くに下がることが電子工作84で分かっている)。このコンパクトな本体を結束バンドで杖に装着する。
7) 今回の材料費は500円ほど。太陽電池センサは昔入手してあったもので値段がつかない。この手のものは(小さくて、出力電圧が比較的大きいもの)秋葉原で入手出来なかった。
プログラム Program
3Vのボタン電池1個で実用になるようにプログラム作成では省エネに留意した。プログラムの流れは以下のようである。電源スイッチがONの状態で振動スイッチが導通すると(杖をドンと地面を突く動作で)、割込みが入ってスリープの状態から目覚める。そして、プログラム本体に進み、先ず太陽電池センサからの電圧入力値と内臓コンパレータの値を比較した結果の値(0 or 1) をチェックし、周りが十分暗いと判断したら2個のLEDを約25秒間点滅させる。充分暗くない場合は元に戻って、振動スイッチからの入力待ちになりスリープの状態に入る。この時の電流消費が0.11mAほどである。
一番煩わしいのがコンパレータの2つのレジスターCMCONとVRCONの設定で、以下のようにした。
CMCON=%00000011のように設定、その詳細は:
ビット0−2(CM2-CM0) 011 これはGP1/CINからの入力電圧(太陽電池)と内臓コンパレータの基準電圧を比較してGP2/COUTに結果(0又は1)を出すという意味。
ビット3−7 00000 他はすべて‘0’に設定した。
VRCON=%10101000のように設定、その詳細は:
ビット0−3(VR3-VR0) 1000 コンパレータの出力基準電圧を決めるもので、VRR=1なので、次式で希望する基準電圧が決まる。基準電圧=((VR0−3ビットの内容)/24))X電源電圧。希望基準電圧=1Vで電源電圧=3Vなので、 (Xb/24)X3(V)=1 à Xb=24/3=8(d)、8(十進)=1000(二進)。つまり、1000を使うと希望基準電圧=1Vがコンパレータから出力される。
ビット5(VRR)と7(VREN)は‘1’に設定した。
'***********************************************
'Name of program: WalkingStickLED
'Using 12F629 and PicBasic Pro V2.50A
'2016.7.29
'***********************************************
'Pin 1: Vdd (3V)
'Pin 8: Vss (GND)
'Pin 7: GPIO.0 - Shake SW (Input)
'Pin 6: GPIO.1 - Solar-panel sensor (Input)
'Pin 5: GPIO.2 - Cout (Comparator output)
'Pin 4: GPIO.3 - Reset (Input)
'Pin 3: GPIO.4 - LED x 2 (Output)
'Pin 2: GPIO.5 - NC
'***********************************************
ShakeSW var GPIO.0
SolarSensor var GPIO.1
CompOut var GPIO.2
LEDlight var GPIO.4
I var byte
J var BYTE
TRISIO=%001011
'Comparator setting
CMCON=%00000011 'External voltage inputted into GP1/CN- and compared with comp's reference V.
'The resulting output appears at GP2.
VRCON=%10101000 'Reference V is set to 1.0V (last 4 bits - 1000), so if an external input V is 1.0V or higher
'or lower than this value, the output at GP2 will be 1 or 0 (digital).
'Interrupt setting
WPU=%000001 'Weak pull-up at GPIO.0
OPTION_REG.7=0 'Weak pull-up enabled
IOC.0=1 'Detect input at GPIO.0
INTCON.7=1
INTCON.3=1 'Enable port input-level change interrupt
SleepLoop:
LEDlight=0 'essential
INTCON.0=0 'Clear GPIF
@Sleep 'Assembler command
INTCON.0=0 'Clear GPIF
'***********************************************
'Main routine
If CompOut=1 then LEDflash
Pause 100 '100ms
Goto SleepLoop
LEDflash:
For I=1 to 22 'nearly 25 secs
For J=1 to 5
High LEDlight
Pause 100 '100 ms
Low LEDlight
Pause 100 '100 ms
Next
Pause 300 '300ms
Next
Goto SleepLoop
'*****End of Program******
'Note:
'melabs U2 Programmer's configurations for 12F629:
'Oscillator - INTOSC, WDTE - Disable, PWRTE - Disable, MCLR - Reset, BODEN - Disable, CD - Disable, CDP - Disable
簡易型杖用LED表示器 (2016.8.14追加)
Simplified Walking-Stick LED Indicator (Newly added on 2016.8.14)
上で製作したものを使ってみて、太陽電池センサを除いて振動センサだけにした場合でもあまり不都合が生じないことが分かった。夜になったら電源スイッチを入れ、杖に振動が加わっている間はLEDは点滅を続け、振動が止む(使わなくなる)とやがてLEDは消灯する。これ以後の電流消費は0.0uA以下と極端に低くなる(前のものは0.11mA消費する)。つまり電源スイッチをONの状態になっていてもLEDが点滅していなければ電池の消耗はほぼゼロに近いので、電源スイッチの切り忘れを気にする必要ないということ。ボタンLiイオン電池2025の容量を165mAhとすると、杖を夜間1日につき1時間使ったとすると165日間、約5ヶ月間使えることになる。
I found later that the
solar-panel sensor was not necessarily needed because I could manually turn on
the power switch at night and there was no need to worry about the power
consumption of button cell that was almost zero when no LEDs were blinking
after the walking stick was used and left still. By removing it, the power
consumption when the power switch is ON can be reduced from 0.11mA for the
above model with the solar-panel sensor to less than 0.0uA for this new model
without the solar-panel sensor. A 3V Li-ion button cell 2025 with a capacity of
165 mAh, for example, may last 165 days or more than 5 months if the walking
stick is used for one hour per day.
回路図 Circuit Diagram
Photo 5 太陽電池センサを除いてよりコンパクトになった本体。左からLED、振動スイッチ、12f629、電源スイッチ、それとLiイオンボタン電池。
More compact circuit. Shown on the board, from left to right, are LED, Shake switch, 12F629, Power switch and 3V Li-ion button cell (2025).
Photo 6 杖に装着した本体。
The newly-built simpler LED indicator attached to a walking stick.
Photo 7 装置の電流消費を測定しているところ:写真左のように2個のLEDが点滅している時は0から最大1.5mAまで変動する。電源ONでLEDが点滅していない時 (杖を動かさずに静置してある場合) は写真右のように0.0uA以下である。大変省エネ。
These tests show that the device consumes 0 - 1.5 mA (left) when two LEDs are blinking, and less than 0.0uA (right) when they are not blinking.
プログラム Program
太陽電池センサが除かれたので上のプログラムからコンパレータ設定の部分が削除された。すなわち、CMCON=7が代わりに入って機能を停止させている。こうすることによって待機電流消費を極端に下げることに成功した。割り込みは振動スイッチから入る。
This program was
formed by removing the comparator setting for the solar-panel sensor from the
previous program and including CMCON=7 instead. Due to the interrupt from the
shake switch, two LEDs blink for 25 seconds and then if there is no more interrupt,
the program goes into sleep while consuming less than 0.0uA.
'***********************************************
'Name of program: WalkingStickLEDSimpler
'Using 12F629 and PicBasic Pro V2.50A
'2016.8.12
'***********************************************
'Pin 1: Vdd(3V)
'Pin 8: Vss(GND)
'Pin 7: GPIO.0 - Shake SW (Input)
'Pin 6: GPIO.1 - NC
'Pin 5: GPIO.2 - NC
'Pin 4: GPIO.3 - Reset (Input)
'Pin 3: GPIO.4 - LED x 2 (Output)
'Pin 2: GPIO.5 - NC
'***********************************************
ShakeSW var GPIO.0
LEDlight var GPIO.4
I var byte
J var byte
TRISIO=%001001
'Comparator setting
CMCON=7 'Comparator not in use
'Interrupt setting
WPU=%000001 'Weak pull-up at GPIO.0
OPTION_REG.7=0 'Weak pull-up enabled
IOC.0=1 'Detect input at GPIO.0
INTCON.7=1
INTCON.3=1 'Enable port input-level change interrupt
SleepLoop:
LEDlight=0 'essential
INTCON.0=0 'Clear GPIF
@Sleep 'Assembler command
INTCON.0=0 'Clear GPIF
'***********************************************
'LEDblink
For I=1 to 22 'nearly 25 secs
For J=1 to 5
High LEDlight
Pause 100 '100 ms
Low LEDlight
Pause 100 '100 ms
Next
Pause 300 '300ms
Next
Goto SleepLoop
'*****End of Program******
'Note:
'melabs U2 Programmer's configurations for 12F629:
'Oscillator - INTOSC, WDTE - Distable, PWRTE - Disable, MCLR - Reset, BODEN - Disable, CD - Disable, CDP - Disable
Menu Pageへ戻る (Return to Menu Page)
Topへ戻る
(Return to Top of Page)