勝手な電子工作・・

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

プレゼンタイマー(PICアセンブラー版)

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

多数のプレゼンテーションを所定時間に収めるのは主催者としては大変です。多くの場合、タイムキーパー係を設けて、終了2分前などにベルで予鈴を鳴らしてもらいます。とはいえ、人がやること、少しは間違いも起きます。

講義時間内の学生発表などでも同じです。最初はTA(チューター・アシスタント)の学生に予鈴器で押してもらいますが、本人も授業に参加するわけなのでなかなか難しいもの。

もう10数年前ですが、マイコンで次のような初代の予鈴器を作りました。

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

28ピンのPICを使い発表時間と予鈴時間をロータリースイッチで指定しておきます。しかし、入力用スイッチだけで12ピンも使ってしまいます。しかも当時全盛の16進スイッチ^^;

そのうちにプログラで決めて固定しておくほうが単純で間違いもないことに気づき、入力なしの8ピンPICで二代目を作りました。これはたいへん使いやすく好評。音量も大教室に響きわたり、時間が必ず守られます。それ以来10数年、ずっとこれを使ってきました。

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

内部はこれです。10数年使っていると内部も多少汚れるものです。

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

市販製品に予鈴が設定できるものが当時は見当たらなかったため、人に貸し出したり、作ってあげたりもしました。発表数は色々ですから、数に合わせた割り当て時間を予め決めて、プログラムを直しておくという単細胞的な仕様。しかしこれが一番確実で操作の間違いもないのでした。

さて、発表を9つコントロールしなければならない参加無料シンポジウムが近々あります。http://ll.wclab.jp/?p=620

プレゼンテーション時間が3種類あるため、使い慣れたこれまでのプレゼンタイマーではダメ。そこで初代のツールを持ち出そうと思いましたが、蛇の目基板でレトロそのものですし、電源もUSBから。今では8ピンマイコンでもI2C接続などでディスプレイが繋げられますし、デバイスの省電力化も進んでいます。

そのいっぽうでスマホのアプリを使う手もありますね。すぐにスマホのアプリを試してみましたが、ユーザーインターフェースなどとてもよくできています。しかし、複雑操作をするとバグがあるのに気づきましたので信頼性が心配になります。また、スマホの電池がさらに心配・・・。そのスマホは会場での主催側用テザリングに使うので電池切れは致命的・・。

そこで、この際は短時間で新たに作ることにしました。今度はディスプレイ付きにします。LCDより7セグLEDの方が見やすいのでそれにします。4桁でも明るさと消費電力はデューティ比の設定次第です。適切な明るさで電流は7~11mAですから、仮に数日間続けるとしても単3電池なら交換不要。

早速回路をデザイン、といっても汚い図のままですみません。

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

スピーカーは、この場合は比較的音の大きなやや古い圧電ブザーです。鳴る際は断続で50mAも使うので電源には100μF程度のキャパシタが要ります。音さえ大きければ、他の音響部品でもいいですね。

これでテスト用回路と簡単なプログラムを作ってテストしました。

www.youtube.com

パワーオン時に発表時間全体の分・秒(Duration)と、何分何秒前に予鈴(1st Bell)を鳴らすかを指定します。あとはいつであっても「ボタンを押せば開始」だけの単純操作だけです。時間変更の設定時は蓋を開けパワーを入れなおして、Dur=(時間)とYor=(予鈴)をタクトスイッチで設定。そしてボタンを押して開始。

このようなソフトで注意することは、

①ボタンはチャタリングを回避するために押し終わったときから1ミリ秒後を処理開始にする、

②長押しの判定は例えば0.5秒後にオン継続かを判定。

③予鈴時間設定では許される範囲内でしか数値を動かさない。発表が3分なのに予鈴が3分ということはないでしょう、上限下限で数値を止めるということです。同様に発表時間もまさか2分という短いのはないでしょう。その場合ならタイマー要りませんから。

④時間経過は予め一定時間経過用のルーチンをいつも使うように作っておくと楽。(あとでコーディング例を示します。)

⑤この場合、PIC12F1822を使っていますが、内部クロックの精度は0℃~60℃間は個体差を含んで2%以内。このような用途では内部クロックで問題ないと思いますが、正確性を要する用途では16MHzなどのクリスタルOscillatorを使います。そうすると8ピンでは間に合わなくなりますが。

これで次の装置をいったん完成。

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

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

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

操作性も音量も申し分なし。

さて、ふと考えて思いました。まてよ、単3アルカリ電池3本がこんなに重いとは・・・それだけで80g、頑丈なケースを加えて全部で150g近くある!

それなら、スマホの補助バッテリーとあまり変わらないことになるのでは?

よく考えてみれば単4アルカリ電池にすべきです。それでも連続40時間程度は使えます。そうすると電池の重さは36g。ケースも名刺箱位に入りそう!・・・考えた末の結論はこの際作り直し・^^;;;

電池とケースを変えるだけですが、できるだけ軽く。全部でほぼ100グラムにできました。そして次を私のプレゼンタイマーの第3代としました。

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

ここまでやり直ししたのなら、いっそ部品配置も完全にぶつからないように基板を直そう(凝り性ですね^^:)。もはや製作に大して時間がかからないものですから、いっぺんに4つ作っておこう。。。結局は1日をかけて追加4台をいっぺんに作ったのでした。

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

www.youtube.com

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

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

テストして4台とも全く問題なし。まあ、半田付けさえきちんとすればあたりまえですね。

仕上げは最近常にこうしますが、表の周囲にマスキングをして銅箔面にスプレー式透明ラッカーを塗って保護をします。このあたりは長持ちさせるための生活の知恵です。

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

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

ランドを省略した基板ですからはんだ付けが汚らしく、半田も少し無駄なのがお分かりかと思います。でも全体の時間は圧倒的に短くてすみます・・^^;;

さて、PICのプログラミングの工夫として一定の時間消耗タイマーは常備しておくと書きましたが、次にその例を示しておきます。マクロをプログラムの最初の方に挿入し、プログラムの最後の方にはそれをサポートするサブルーチンを入れます。いつもいれておき、必要なときは要らないものを削除すればよいだけです。

(コードをコピペする際に操作ミスをして誤植を作ったのを2018.9.17-15:30に気づきました。コピペしなおしました。それ以前にダウンロードされた方には申し訳ありません、深くお詫びします。場所はMic2rというルーチンの中でした。)

 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;	Time consuming macros		;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Mic	macro			;Consume 1 μS only
	goto	$+1
	goto	$+1
	endm
;
Mic2	macro	mic2p		;Consume 2 μS x n
	movlw	mic2p
	call	Mic2r
	endm
;
Mic2p5	macro 	mic25p		; Consume 2.5μS x n
	movlw	mic25p
	call	Mic25r
	endm
;
Mic5	macro	mic5p		; Consume 5μS x n
	movlw	mic5p
	call	Mic25r
	movlw	mic5p
	call	Mic25r
	endm
;
Mic50	macro	mic50p		; Consume 50μS x n
	movlw	mic50p
	call	Mic50r
	endm
;
Milli	macro	millip		; Consume mS x n
	movlw	millip
	call 	Millir
	endm
;
Mil100	macro	mil100p		; Consume 100 mS x n
	movlw	mil100p
	call 	Mil100r
	endm
; 
Secs	macro	secsp		; Consume Second x n
	movlw	secsp
	call	Secsr
	endm
;
Mins	macro	minsp		; Consume Minute x n
	movlw	minsp
	call	Minsr
	endm
;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;	Timing subrooutines for general purposes;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 	Make 2.0 micro S x n	(Mic2)	;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Mic2r	movwf	Mic25c		; Number of 2 micSs (1 micro s up to here) 
;
Mic2l	decfsz	Mic25c,F	; If exhausted, 1 micro S hereafter
	goto	Mic2li		; else go out (2nd time 1.75 mic sec)
	return		
;
Mic2li	goto	$+1		;            (2nd time 2.25 mic sec)
	nop			;	     (2nd time 2.5 mic sec)
	goto	Mic2l		; go back    (2nd time 3 micro sec)
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 	Make 2.5 micro S x n (Mic2p5)	;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Mic25r	movwf	Mic25c		; Number of 2.5 micSs ( 1 micS consumed)
	nop			; 1.25 micro sec
;
Mic25l	nop			; 1.5 micro sec (2nd time 4 mic sec)
	decfsz	Mic25c,F	; If exhausted, 1 micro S hereafter
	goto	Mic25li		; else go out (2nd time 2.25 mic sec)
	return		
;
Mic25li	Mic			;	      (2nd time 3.25 mic sec)
	goto	Mic25l		; go back    (2nd time 3.75 micro sec)
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;	50 Microseconds	x n	Mic50  	;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
Mic50r	movwf	Mic50c	 	; Number of 50 micSs (1 micro sec up to here)
	nop			; 1.25 micro sec up to here
;
Mic50l	Mic2p5	D'19'		; + 47.5 = 48.75 mic sec (2nd time 98.75 mic sec)
	nop			; + 0.25 = 49 micro sec (2nd time 99 mic sec)
; 
	decfsz	Mic50c,F	; If exhausted then 1 mic S hereafter
	goto	Mic50li		; else go out (2nd time 49.75 mic sec)
	return
;
;
Mic50li	Mic			; 	  (2nd time 50.75 mic sec)
	goto	Mic50l		; go back (2nd time 51.25 mic sec)
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;	Milliseconds x n	(Milli)	;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
Millir	movwf	Millic 		; Number of 1 mil sec (1 mic S up to here)
	nop			; 1.25 micro sec
;
Millil	Mic50	D'19'		; + 50 mic x 19 = 951.25 mic S (2nd, 1951.25) 
	Mic2p5	D'19'		; + 47.5 mic = 998.75 micro S  (2nd, 1998.75)
	nop			; +0.25 mic = 999 micro sec    (2nd, 1999)
;
	decfsz	Millic,F	; If  exhausted then 1 micro sec hereafter
	goto	Millili		; else go out (2nd, 999.75 mic S)
	return
;
Millili	Mic			; 		(2nd time 1000.75 mic S)
	goto	Millil		; go back (2nd time 1001.25 mic S)
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;	100 Milliseconds x n	(Mil100);
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Mil100r	movwf	Mil100c		;Number of 100 mSs (1 micr sec up to here)
	nop			; 1.25 micro sec
;
Milhl	Milli	D'99'		;+1ms x 99 = 99001.25 micS (2nd,199001.25mic)
	Mic50	D'19'		; + 950 mic = 99951.25 micS(2nd.199951.25mic)
	Mic2p5	D'19'		; + 47.5 mic = 99998.75micS(2nd,199998.75mic)
	nop			; + 0.25 mic = 99999 mic S (2nd,199999 micS)
;
	decfsz	Mil100c,F	; If exhausted then 1 micro sec hereafter
	goto	Milhli		; else go out (2nd time, 99999.75 mic S)
	return
;
Milhli	Mic			;  	    	(2nd time, 100000.75 mic S)
	goto	Milhl		; 		(2nd time, 100001.25 mic S)
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;	Seconds x n	 (Secs)		;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
Secsr	movwf	Secsc 		; Set number of seconds ( 1 mic S up to here)
	nop			; 1.25 micro sec
;
Secsl	Mil100	D'9'		; 
	Milli	D'99'		; + 999 milli sec = 999001.25 micro sec
;
	Mic50	D'19'		; + 950 mic = 999951.25 micro sec
	Mic2p5	D'19'		; + 47.5 mic = 999998.75 micro sec
	nop			; + 0.25 mic = 999999 micro sec
;
	decfsz	Secsc,F		; If exhausted then 1 micro sec hereafter
	goto	Secsli		; else, go out 
	return
;
Secsli	Mic
	goto	Secsl		; (Second time, Sec + 1.25 micro sec)
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;	Minutes	x n	 (Mins)		;
;	 Overhead ignored, that is only	;
;	 751.25 Mic S even when 100 Min	;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Minsr	movwf	Minsc		;set number of minutes
;
Minsl	Secs	D'60'		; 1 Seconds x 60
	decfsz	Minsc,F
	goto	Minsl
	return
;

割り込みを使いたくないプログラムで、長時間の間でボタンなどのチェックをしたい場合は、用途に応じて専用にルーチンを作るか、あるいは例えば100ミリセカンドのタイマーをループし、その間にチェックを入れるなど工夫できます。もちろんタイマー割込みのほうが楽かもしれません。

今回はここまでにしておき、アセンブラーでの他の色々な知恵は分かり易いものからおいおい書いていきたいと思います。

 

(c) 2018 Akira Tominaga, All rights reserved.