いちばん簡単なドロボー除け(かな?)
古いマイコン(PIC12C509)のプログラムメモリーはEPROMですので、紫外線窓付き以外のモデルでは、プログラムを一度書き込んだら特殊な修正以外はできません。ICの上面にある4桁数字は製造年月(YYMM)です。というわけで20年前のこのマイコンはそろそろ捨てるかな?今どきこれが役立つ場面は?
このPIC12C509マイコンの場合、外付けRCでクロックを極端に遅くしさえすれば、電流の消費が小さいのが利点です。クロックを30kHz程度にすればわずか35µA程度しか消耗しないので、アルカリ単三電池が2年以上もちます。今回はこれにまつわるドロボー除け装置について書きます。
プログラム用にフラッシュメモリーを搭載した今のマイコンの場合は、単にクロックを遅くするだけでは電流の消費をそこまで抑えることができません。電池をなるべく長持ちさせたい用途の場合は、別途少し工夫がいります。
だいぶ昔ですが、新築し無防備だった我が家に空き巣が入りました。それに懲りてすぐに色々な防犯対策を施しました。外出時に雨戸を閉める(当たり前か^^;)だけでなく、敷地への侵入者を赤外線センサーで検知して警報を鳴らしたり照明をつけたり、防犯カメラで動くものを自動録画する、留守中の照明の自動操作をする、などあれこれです。そこでは勝手な電子工作が十分楽しめますが^^; その中で一番簡単で役立つドロボー除け(のおまじない?)を紹介したいと思います。
道路からみえない庭側のガラス戸を上図のように破られ、クレセント錠をあけられました。よくあるパターンのようです。そして唾を付けた指で和室側の障子紙に穴をあけて(!)内部の不在を確認のうえで侵入(さすがプロだあ・・)。10分以内の短時間で家じゅうのひきだしや押し入れなど全てを物色、お金と金目の品だけを盗ってお帰りです。その後すぐに次の家を荒らしたそうな。このドロボーは半年後に捕まり、現場に引き回されてきましたが、関東広域どろぼうのプロとのことでした。捕まっても金品は何も戻らずで、以後は絶対入ってほしくないわけです。
防犯カメラは、壊されて侵入されたくはないので一目でわからないように4台設置してあります。自作の記録システムは大容量SDに動画を循環記録、必要な際は1週間遡ってみられます。ところが、記録を万全にすれば予防に役立つということにはなりません!
また、もしルーバー窓が壊されても、そこから中には侵入させないようにメカ(といっても金属棒)を取付てあります。しかし、そもそも侵入したいと思わせない予防装置もあるに越したことはありませんね。
最初に考えて作ったのは3V省エネで動く、4000シリーズCMOSインバーターを使ったLED点滅機。R1とR2でデューティ比や時間が変えられます。しかし、これだとLEDを一定のパターンでしか点滅できないので、その3年後にこれをマイコンで作り変えました。
マイコンだと一定間隔の点滅だけではなく、いかにも何か発見したような点滅が加えられますので、予防効果が一層大きいと思います。実は、見知らぬ人が家を覗き込み、これを見てすぐに立ち去るのが防犯カメラに写っていたことがあり、それでこの装置への自信が湧きました^^; 数年前にもこれを見て慌てて去る不審者が写っていましたのでなおさら。
これに単三電池2本をつけて、次のように当時のチューインガムケースに収めました。20年も使っていた装置なので傷だらけですが。
窓への置き方は次の絵のようにします。
これを作った数年後にプログラムを少し改良し、電池が3年以上もつように改善できました。なおEPROM内容が変更できないとはいっても、内部のビットが1であるものを0に変えることだけなら上書きすればできます。それに気づいて、これを利用してプログラム済みのものも定数がうまく更新できました^^。
この単純なドロボー除け装置を見た友人に是非とせがまれて、沢山作ってあげました^^ 相手も同じチューインガムの箱を用意するのがたいへんだったそうです。
さて、今回は年月が経ち自然に壊れてきたプラスチックのケースを更新したり数台を増設したりする必要がありました。
この際は基板も新たに作ろうと思い、試しに同じプログラム論理をPIC12F1822に入れてみました。ところが、クロックをいかに遅くしても案の定、電流が1桁増えます。フラッシュメモリーのマイコンではクロック速度の調整だけでは電池がとてももちません。
確定申告間近の今(1月末)、忙しい時機なのでやっぱり12C509のままにしようかといったん考えなおしました。しかし増設ぶんについては古いProgram Writerを引っ張り出して使い、RS232接続の為古いノートPCを出して・・と考えていると、やはりこの際新しい型で別の省エネ方法を考えた方がよいかなと考えなおしました。
省エネの方法としてはSleepさせて、それを定期的にWatch-dog-timerで目覚めさせる方法が一番簡単そう。PICにwatch-dog-timerを使ったことはありませんでしたが、モノは試しです。
前と同じ外付けRCで30kHzクロックの最小電流としておき、時間待ち論理の部分をSleep命令に入れかえました。Sleep中の電流を測ってみたら次のとおり、たったの18µA! PIC12F1822の通常ランの電流の1割といったところです。
これなら十分にいけますね。例えばですが、5秒中のLED点灯時間(例8mA)を5mSにすれば、無点灯時間の1000分の1の時間なので、平均消費電流はSleep時電流にその影響8µAを加算した26µAに抑えられます。よってこれまでよりもずっと省エネになります!
というわけで次の回路にします(同じですね^^)
強いて違いをあげれば、OSC2ピンにクロック信号を出力している点です。クロック周波数が一目でわかるテスト端子となるためとても便利です。
あのチューインガムはもう販売されていないので、箱は次のものを百均で調達。自家製用プリンの入れ物とかで、半透明で密閉でき、風呂場など水がかかる場所でも安心。しかも4つで百円。早速に採用です。
これに合わせて基板を作成。今回は基板のほとんどは電池ケースをとりつける面積が占めます。このほうが製作が楽で速いですからね。
電池ケースに合わせて穴あけし、ピンをを刺します。
基板の出来上がりは次。
ところがです。プラスとマイナスが違っているのに気づき、急きょルーターでパターンをカットして極性を入れ替えました。電池ケースのメーカーにもよるようですが、みっともないですね^^;
そして以後のために基板のデザインを修正。秋月でうっている基板用電池ケースに合わせました。なお、固定ネジ穴ははんだ付けの後で、現物に合わせてあけるほうが正確でいいですね。
プリン入れのケースに収めれば出来上がり、すきまには適当なスポンジ。とりあえず最初の2個です。プログラムは記事の後ろのほうにつけておきます。また電池が見えないように黒い紙でも入れておくと良い感じですがなくてもよいですね。
今後は傷んだものからこれに順次取り替えていくことにします。
やっぱりプログラムがいじれるフラッシュメモリーがよいですね。新しい方が値段も安いし圧倒的に高機能ですし。
とはいえ前のEPROMマイコンの用途はまだあるかもしれない、、、と考えていて捨てる気にはなりそうもありません。大した場所も取らないし。
以下、その後にPIC12F1822で複数個組み立てたのでその製作について追加で書きます(追加2020年3月15日)。
今回、正しい基板を1回で6枚作って組み立て、上で説明したプリンカップの容器に入れ、昔の古い防犯器すべてをこれに交換しました。LEDは十分明るく点滅するのでプログラム中の点灯時間をだいぶ減らし、さらに省エネとなりました。最新プログラムをはこの記事の最後につけておきます。
次の原稿は基板を6枚並べたもの。
これを使ってCNCルーターで生基板を削ります。
そしてカットしたのが次の写真です。
今回は手動で穴あけしましたが、少ないので全部で10分もかからず完了。
はんだ付けも30分ほどで終わり。テスト済のパターンですから問題ないと思いますが、はんだ付けの点検として念のために電源配線の抵抗値だけをチェックして異常なしを確認。
そしてPIC12F1822を6枚プログラミングして挿入したら基板のできあがり。
次の写真は出来上がりを部品面から。なお電池ケースは、まず端子を基板に挿入してから位置合わせをして穴あけするとぴったりに組み立てできますね。なお、ネジは2mmφのプラスチックねじです(秋月で売られています)。どの基板も一発で問題なく稼働しました。
これをプリンカップに収めますが、内部でがたつかないように、隙間テープを適当に貼ります。隙間テープは色々ありますがどれでもいい感じです。今回は右上の発泡ウレタン製のありふれたを適当にカットして使用しました。
半日もかからずに6個が完成できました。
これで置き換えましたので防水バッチリ。風呂場の窓でも安心です^^。
最後にプログラムをつけておきます。20年前に作ったPIC12C509のプログラムをそのまま使い、PIC12F1822で動くように少し変えただけです。論理は同じで、待ち時間を消耗する部分をSleepにおき換えたもの。環境設定やデバッグ機能などは最近のPICデバイスでいつもやっているとおりのコピペです。
なお、プログラムは最新版に更新をしておきます(2020年3月16日)。
;U2001-Wblinker-12F1822-V03s.asm As of Mar. 16, 2020
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; ;
; Warning Blinker for PIC12F1822 Initial Version Jan.26, 2020 ;
; (c)1999-2020 Akira Tominaga, All rights reserved. ;
; V02: Shortened LED-on time from 8mS to 6mS. Feb.21, 2020 ;
; V03: Adjusted 1mS (from 5 GOTOs to 3 GOTOs) Mar.16, 2020 ;
; Changed short WDT from 512mS to 256mS Mar.16, 2020 ;
; ;
; Function ;
; Blink LED with sleep for small energy consumption ;
; (Upgraded from 12C509(without sleep) to 12F1288(with sleep) ;
; ;
; Input/Output for 16F1823 ;
; RA0 LED output (on =H) ;
; RA4 Osc2 for Clock output (CLKOUTEN_ON) for test purpose ;
; RA5 Osc1 for _EXTRC connection ;
; Remarks ;
; 1. Clock = EXTRC (as slow as possible) ;
; R=100kΩ, C=100pF → f=30kHz (500 x time of 16MHz clock) ;
; Hence 1 step ≒ 125μS ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
page
list p=12F1822 ; list directive to define processor
#include ; <p12F1822.inc>specific variables
__CONFIG _CONFIG1, _FOSC_EXTRC & _WDTE_SWDTEN & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _CPD_OFF & _BOREN_OFF & _CLKOUTEN_ON & _IESO_OFF & _FCMEN_OFF
__CONFIG _CONFIG2, _WRT_OFF & _PLLEN_OFF & _STVREN_OFF & _BORV_19 & _LVP_OFF
;
page
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Macro definitions ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Device dependent Macros ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
DEVset macro
BANKSEL OSCCON ; Bank=1
movlw B'00000000' ; Clock determined by Configuration Word 1
movwf OSCCON
;
; BANKSEL INTCON ; Interrupt Con (in all banks hence comment)
clrf INTCON ; Disable all interrupts
;
; PORTA initialization
BANKSEL PORTA ; Bank=0
clrf PORTA
BANKSEL LATA ; Bank=2
clrf LATA
BANKSEL ANSELA ; Bank=3
movlw B'00000000' ; No use of Analog input
movwf ANSELA
BANKSEL TRISA ; Bank=1
movlw B'11101110' ; RA0 and 4 are output
movwf TRISA
;
BANKSEL ADCON0 ; Bank=1
clrf ADCON0 ; No use of ADC
;
BANKSEL OPTION_REG ; Bank=1
bcf OPTION_REG,7 ; Enable weak pull-up
BANKSEL WPUA ; Bank=4
movlw B'00001000' ; Weak Pull-up for RA3
movwf WPUA ;
;
BANKSEL WDTCON ; Bank=1
clrf WDTCON ; WDT is set by program
;
clrf BSR ; Bank=0
endm
;
OUTini macro ; L for LEDs, and H for Clk, Dio
nop ; Timing for PORTA
movlw B'11001000' ; Set RA0 zero
movwf PORTA
goto $+1 ; Timing for PORTA
endm
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; I/O macros ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; For general purpose ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
OUTon macro
bsf GPIO,Out
endm
;
OUToff macro
bcf GPIO,Out
endm
;
WDTonL macro ; Set long WDT
BANKSEL WDTCON
movlw B'00011001' ; Enable 4 sec WDT
movwf WDTCON
clrf BSR
endm
;
WDTonS macro ; Set short WDT
BANKSEL WDTCON
movlw B'00010001' ; Enable 256mS WDT
movwf WDTCON
clrf BSR
endm
;
WDToff macro ; Off WDT
BANKSEL WDTCON
bcf WDTCON,SWDTEN ; Disable SW Watch Dog Timer
clrf BSR
endm
;
LEDon macro
OUTon
endm
;
LEDoff macro
OUToff
endm
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Constant time consuming ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Rm1 macro Rm1p ;Consume 1 mS x n
movlw Rm1p
call Rm1r
endm
;
Rm250 macro Rm250p ; Consume 250mS x n
movlw Rm250p
call Rm250r
endm
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Debug macros ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Udebug macro Addr
movf Addr,W
call Udbgr
endm
;
Ublink macro bno ; Blink LED for specified times
movlw bno
call Ublinkr
endm
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Files and Equations ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Files ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
cblock H'20' ; available from H'20' to H'6F' (80 bytes)
;
; For application
Rm1c
Rm250c
;
; Areas for debugging routine
DmpA ; Display byte area
Dmp8C ; Bit counter for loop (Initial Dmp8V =8)
BlinkC ; Counter for blinking (set for Debugb or Abendb)
;
; Both for debugging and for application
Flags ; Flag byte
;
endc
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Equations ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; For logical GPIO port ; ** Change when PORTs changed **
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
GPIO equ PORTA ; GPIO is for 12C509
Out equ 0 ; Output
LED equ 0 ; LED
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Flags Byte ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
LEDsv equ 0 ; LED save bit for debug
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; For Debug ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Dmp8V equ D'8' ; Debug display bit counter initial value
Debugb equ D'8' ; number of blinkings to show Debugging
Abendb equ D'30' ; number of blinkings to notify Abend
;
page
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Initializing ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
org 0
goto Startp ; Go to start entry
org 4 ; This is Interrupt entry
retfie ;
;
Startp DEVset ; Define ports
OUTini ; L for LED(0), and H for Clk and Dio
OUTon ; Indicate I am awake
Rm250 2 ; for a half second
OUToff ;
Rm250 D'8' ; Wait for 2 seconds
clrf Flags ; Clear Flags byte
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Main program ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Mainp equ $
;
;Step1 Blink LED once and wait 4 seconds
WDToff ; Off watch-dog-timer
OUTon ; Blink LED once
Rm1 6 ; for 6mS
OUToff
WDTonL ; On watch-dog-timer long
sleep ; This includes clrwdt
;
;Step2 Blink LED once again and wait 4 seconds
WDToff ; Off watch-dog-timer
OUTon ; Blink LED once
Rm1 6 ; for 6mS
OUToff
WDTonL ; On watch-dog-timer long
sleep ; This includes clrwdt
;
;Step3 Blink twice with 0.5 sec sleep and wait 4 seconds
WDToff ; Off watch-dog-timer
OUTon ; Blink LED 1st time
Rm1 6 ; for 6mS
OUToff
WDTonS ; On watch-dog-timer short
sleep ; This includes clrwdt
OUTon ; Blink LED 2ndt time
Rm1 6 ; for 6mS
OUToff
WDTonL ; On watch-dog-timer long
sleep ; This includes clrwdt
goto Mainp ; Loop forever
;
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Make about 1 mS x n (Rm1 macro) ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Rm1r movwf Rm1c ;
Rm1l goto $+1
goto $+1
goto $+1
decfsz Rm1c,F ;
goto Rm1l ;
;
retlw 0 ; return (for 12C509)
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 250 mS x n (Rm250 macro) ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Rm250r movwf Rm250c ;
Rm250l Rm1 D'250' ;
decfsz Rm250c,F ;
goto Rm250l ;
retlw 0 ; return (for 12C509)
;
space
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; User debug subroutine ;
; Show bit 7 to 0 ;
; of specified area ;
; by Udebug macro ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Udbgr clrf BSR ; Set Bank=0
movwf DmpA ; move data to Dmpa
;
btfss PORTA,LED ; Check if LED=on (on=High)
goto UdbLoff ; if LED=off(Low), skip saving process
bsf Flags,LEDsv ; Save LEDon status
LEDoff ; and off LED
Rm250 D'4' ; wait for 1 sec in case LED has been on
;
UdbLoff movlw Dmp8V ; set counter 8
movwf Dmp8C ; to Dmp8C
;
Udblp Ublink Debugb ; Blink for Debugging = 8 times
btfsc DmpA,7 ; check top bit 7
goto UdbOn ; if on then to UdbOn
goto UdbOff ; if off then to UdbOff
;
UdbOn LEDon
Rm250 D'20' ;
goto Udbeck
;
UdbOff LEDoff
Rm250 D'5' ;
; goto Udbeck
;
Udbeck decfsz Dmp8C,F
goto Udbnext
goto Udbend
;
Udbnext rlf DmpA,F
goto Udblp
;
Udbend Ublink Debugb ; end blinking and
Rm250 D'12' ; blank for 3 seconds to write down
;
btfss Flags,LEDsv ; Check if LED was on
goto Udbret ; no, goto return
LEDon ; if it was on, then on again
bcf Flags,LEDsv ; Clear LED save flag
;
Udbret return
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Blinking to show debug or abend ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Ublinkr movwf BlinkC
Ublinkl LEDon ; LED on
Rm1 D'10' ; for 10ms
LEDoff ; LED off
Rm1 D'50' ; for 50ms
;
decfsz BlinkC,F
goto Ublinkl
return
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; End of program ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
end
以上、簡単に書きましたが、もしドロボー除けのご参考にでもなれば幸いです。
2022年8月24日追記:
2年半以上にわたり全部そのまま使っていますが、電池を一度も取り替えていません。まだまだ明るく、電池電圧はまだ2.99V以上あります。この分なら3年以上は軽くもちそう。また、どれにも液漏れ等が全く生じていないのは驚き。こういう使い方だとアルカリ電池はダメになりにくいのかもしれませんが、理由はわかりません。とにかくびっくりです。
2023年7月19日追記:
驚きです!2019年1月から3年半以上過ぎましたが電池を1度も代えずに、どれも明るく問題なく動いています。相変わらず電池の液漏れ等も生じていません。12本どれもOKということは、こういう時々ピクっと流す使い方ならダメになりにくいのかとますます思えます。百均の電池がよいのか?電池を変えてみたいですがここまで来たなら続けたい。いつ交換が必要になるかな?
2024年2月4日追記:
実に4年を過ぎたのに、どれも問題なく稼働中。12個全部です、驚きましたね。こういう使い方だとアルカリ電池が24本はどれも液漏れしないのに驚くばかり。どこまで行けるか試したく、どれも電池を替えずこのままにします。
2024年9月22日追記:
まだどれも問題なく、しっかり点滅して働いてくれています。4年半以上過ぎ容量は引き出したように感じますが、それでも電池がしっかりもち液漏れ等何も問題ないのにはビックリしています。たまたまではなく24個全部ですから、きっと何らかの理由があるに違いない、徹底的に究明したい、・・と思うこの頃ですが、仕事でそれどころでは・・・。さらにこのまま続けてどこまでもつかを試します。
©2020 Akira Tominaga, All rights reserved