勝手な電子工作・・

勝手なオリジナル電子工作に関する記事を書きます

いちばん簡単なドロボー除け(かな?)

 

f:id:a-tomi:20200131112155j:plain

古いマイコン(PIC12C509)のプログラムメモリーはEPROMですので、紫外線窓付き以外のモデルでは、プログラムを一度書き込んだら特殊な修正以外はできません。ICの上面にある4桁数字は製造年月(YYMM)です。というわけで20年前のこのマイコンはそろそろ捨てるかな?今どきこれが役立つ場面は?

このPIC12C509マイコンの場合、外付けRCでクロックを極端に遅くしさえすれば、電流の消費が小さいのが利点です。クロックを30kHz程度にすればわずか35µA程度しか消耗しないので、アルカリ単三電池が2年以上もちます。今回はこれにまつわるドロボー除け装置について書きます。

f:id:a-tomi:20200131133733j:plain

12C509Aを3Vで30kHzあたりで動かすとこんなもの

プログラム用にフラッシュメモリーを搭載した今のマイコンの場合は、単にクロックを遅くするだけでは電流の消費をそこまで抑えることができません。電池をなるべく長持ちさせたい用途の場合は、別途少し工夫がいります。

だいぶ昔ですが、新築し無防備だった我が家に空き巣が入りました。それに懲りてすぐに色々な防犯対策を施しました。外出時に雨戸を閉める(当たり前か^^;)だけでなく、敷地への侵入者を赤外線センサーで検知して警報を鳴らしたり照明をつけたり、防犯カメラで動くものを自動録画する、留守中の照明の自動操作をする、などあれこれです。そこでは勝手な電子工作が十分楽しめますが^^;  その中で一番簡単で役立つドロボー除け(のおまじない?)を紹介したいと思います。

f:id:a-tomi:20200131113844j:plain

道路からみえない庭側のガラス戸を上図のように破られ、クレセント錠をあけられました。よくあるパターンのようです。そして唾を付けた指で和室側の障子紙に穴をあけて(!)内部の不在を確認のうえで侵入(さすがプロだあ・・)。10分以内の短時間で家じゅうのひきだしや押し入れなど全てを物色、お金と金目の品だけを盗ってお帰りです。その後すぐに次の家を荒らしたそうな。このドロボーは半年後に捕まり、現場に引き回されてきましたが、関東広域どろぼうのプロとのことでした。捕まっても金品は何も戻らずで、以後は絶対入ってほしくないわけです。

防犯カメラは、壊されて侵入されたくはないので一目でわからないように4台設置してあります。自作の記録システムは大容量SDに動画を循環記録、必要な際は1週間遡ってみられます。ところが、記録を万全にすれば予防に役立つということにはなりません!

また、もしルーバー窓が壊されても、そこから中には侵入させないようにメカ(といっても金属棒)を取付てあります。しかし、そもそも侵入したいと思わせない予防装置もあるに越したことはありません

 最初に考えて作ったのは3V省エネで動く、4000シリーズCMOSインバーターを使ったLED点滅機。R1とR2でデューティ比や時間が変えられます。しかし、これだとLEDを一定のパターンでしか点滅できないので、その3年後にこれをマイコンで作り変えました。

f:id:a-tomi:20200203201516j:plain



マイコンだと一定間隔の点滅だけではなく、いかにも何か発見したような点滅が加えられますので、予防効果が一層大きいと思います。実は、見知らぬ人が家を覗き込み、これを見てすぐに立ち去るのが防犯カメラに写っていたことがあり、それでこの装置への自信が湧きました^^; 数年前にもこれを見て慌てて去る不審者が写っていましたのでなおさら。

f:id:a-tomi:20200131134305j:plain

f:id:a-tomi:20200131134901j:plain

当時の基板

これに単三電池2本をつけて、次のように当時のチューインガムケースに収めました。20年も使っていた装置なので傷だらけですが。

f:id:a-tomi:20200131134957j:plain

窓への置き方は次の絵のようにします。

f:id:a-tomi:20200131134810j:plain

これを作った数年後にプログラムを少し改良し、電池が3年以上もつように改善できました。なおEPROM内容が変更できないとはいっても、内部のビットが1であるものを0に変えることだけなら上書きすればできます。それに気づいて、これを利用してプログラム済みのものも定数がうまく更新できました^^。

この単純なドロボー除け装置を見た友人に是非とせがまれて、沢山作ってあげました^^ 相手も同じチューインガムの箱を用意するのがたいへんだったそうです。

f:id:a-tomi:20200131145158j:plain

f:id:a-tomi:20200131135153j:plain

さて、今回は年月が経ち自然に壊れてきたプラスチックのケースを更新したり数台を増設したりする必要がありました。

この際は基板も新たに作ろうと思い、試しに同じプログラム論理をPIC12F1822に入れてみました。ところが、クロックをいかに遅くしても案の定、電流が1桁増えます。フラッシュメモリーのマイコンではクロック速度の調整だけでは電池がとてももちません。

確定申告間近の今(1月末)、忙しい時機なのでやっぱり12C509のままにしようかといったん考えなおしました。しかし増設ぶんについては古いProgram Writerを引っ張り出して使い、RS232接続の為古いノートPCを出して・・と考えていると、やはりこの際新しい型で別の省エネ方法を考えた方がよいかなと考えなおしました。

省エネの方法としてはSleepさせて、それを定期的にWatch-dog-timerで目覚めさせる方法が一番簡単そう。watch-dog-timerを使ったことはありませんがモノは試しです。

前と同じ外付けRCで30kHzクロックの最小電流としておき、時間待ち論理の部分をSleep命令に入れかえました。Sleep中の電流を測ってみたら次のとおり、たったの18µA! PIC12F1822の通常ランの電流の1割といったところです。

f:id:a-tomi:20200131141257j:plain

PIC12F1822を30kHzで動かしSleep中の電流

これなら十分にいけますね。例えばですが、5秒中のLED点灯時間(例8mA)を5mSにすれば、無点灯時間の1000分の1の時間なので、平均消費電流はSleep時電流にその影響8µAを加算した26µAに抑えられます。よってこれまでよりもずっと省エネになります!

というわけで次の回路にします(同じですね^^)

f:id:a-tomi:20200131143618j:plain

強いて違いをあげれば、OSC2ピンにクロック信号を出力している点です。クロック周波数が一目でわかるテスト端子となるためとても便利です。

あのチューインガムはもう販売されていないので、箱は次のものを百均で調達。自家製用プリンの入れ物とかで、半透明で密閉でき、風呂場など水がかかる場所でも安心。しかも4つで百円。早速に採用です。

f:id:a-tomi:20200131144100j:plain

これに合わせて基板を作成。今回は基板のほとんどは電池ケースをとりつける面積が占めます。このほうが製作が楽で速いですからね。

f:id:a-tomi:20200131144144j:plain

電池ケースに合わせて穴あけし、ピンをを刺します。

基板の出来上がりは次。

f:id:a-tomi:20200131144324j:plain

ところがです。プラスとマイナスが違っているのに気づき、急きょルーターでパターンをカットして極性を入れ替えました。電池ケースのメーカーにもよるようですが、みっともないですね^^;

f:id:a-tomi:20200131144437j:plain

そして以後のために基板のデザインを修正。秋月でうっている基板用電池ケースに合わせました。なお、固定ネジ穴ははんだ付けの後で、現物に合わせてあけるほうが正確でいいですね。

f:id:a-tomi:20200131144609j:plain

プリン入れのケースに収めれば出来上がり、すきまには適当なスポンジ。とりあえず最初の2個です。プログラムは記事の後ろのほうにつけておきます。また電池が見えないように黒い紙でも入れておくと良い感じですがなくてもよいですね。

f:id:a-tomi:20200131144755j:plain

f:id:a-tomi:20200131144844j:plain

今後は傷んだものからこれに順次取り替えていくことにします。

やっぱりプログラムがいじれるフラッシュメモリーがよいですね。新しい方が値段も安いし圧倒的に高機能ですし。

f:id:a-tomi:20200131145602j:plain

とはいえ前のEPROMマイコンの用途はまだあるかもしれない、、、と考えていて捨てる気にはなりそうもありません。大した場所も取らないし。

以下、その後にPIC12F1822で複数個組み立てたのでその製作について追加で書きます(追加2020年3月15日)。

今回、正しい基板を1回で6枚作って組み立て、上で説明したプリンカップの容器に入れ、昔の古い防犯器すべてをこれに交換しました。LEDは十分明るく点滅するのでプログラム中の点灯時間をだいぶ減らし、さらに省エネとなりました。最新プログラムをはこの記事の最後につけておきます。

次の原稿は基板を6枚並べたもの。

f:id:a-tomi:20200315181744j:plain

これを使ってCNCルーターで生基板を削ります。

f:id:a-tomi:20200315181857j:plain

そしてカットしたのが次の写真です。

f:id:a-tomi:20200315182014j:plain

今回は手動で穴あけしましたが、少ないので全部で10分もかからず完了。

はんだ付けも30分ほどで終わり。テスト済のパターンですから問題ないと思いますが、はんだ付けの点検として念のために電源配線の抵抗値だけをチェックして異常なしを確認。 

f:id:a-tomi:20200315182228j:plain

そしてPIC12F1822を6枚プログラミングして挿入したら基板のできあがり。

次の写真は出来上がりを部品面から。なお電池ケースは、まず端子を基板に挿入してから位置合わせをして穴あけするとぴったりに組み立てできますね。なお、ネジは2mmφのプラスチックねじです(秋月で売られています)。どの基板も一発で問題なく稼働しました。

f:id:a-tomi:20200315182637j:plain

これをプリンカップに収めますが、内部でがたつかないように、隙間テープを適当に貼ります。隙間テープは色々ありますがどれでもいい感じです。今回は右上の発泡ウレタン製のありふれたを適当にカットして使用しました。

f:id:a-tomi:20200315183000j:plain

半日もかからずに6個が完成できました。

f:id:a-tomi:20200315183035j:plain

これで置き換えましたので防水バッチリ。風呂場の窓でも安心です^^。

 

最後にプログラムをつけておきます。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

 以上、簡単に書きましたが、もしドロボー除けのご参考にでもなれば幸いです。

 

  ©2020 Akira Tominaga, All rights reserved