スカイセンサー手元スイッチの作成 その2

(2005/09/11)日本変光星研究会・会誌「変光星」241号より

前の記事で「PICマイコンを使ってスカイセンサーを無改造で手元スイッチが実現できるものも工夫してみます」と書きました。そこで、PICマイコンを使って作成してみました。PICマイコンやPICのライターは秋葉原の秋月電子で買いました。通信販売もしていますのでインターネットが使える方は「秋月電子通商」で検索してみてください。URLは http://akizukidenshi.com/ です。

概要は、まず、キーを5つ用意します。東西南北方向への移動のために、キーを一個づつ設けます。他に停止キーを設けました。キーを押すとシリアルケーブルを経由してスカイセンサー2000PCにコマンドを送ります。PICマイコンには16F84を使いました。材料費は3000円以下でした。出来上がったコントローラの重さは170gでしたので苦痛を感じる重さではないと思います。

以下は回路図です。

電源は006P乾電池です。三端子レギュレータICを使って5Vにします。マイコンのRB0からRB4までにタクティルスイッチ(キーボードスイッチ)を接続してボタンを押すと端子がLowになるようにしました。プログラムはLowを検出するとRA3端子にシリアルでスカイセンサーのコマンドを出力します。RA3端子はMAX232Cに接続されていてRS232Cの電圧レベルに変換します。MAX232Cの出力は8ピンのDINコネクターを経由してスカイセンサーにコマンドを送ります。シリアル回線は16F84を10MHzで駆動した時に9600BPSになるようにプログラムしました。ちなみに、スカイセンサーとLX200は同じコマンドなのでLX200でも使えます(コネクターの形状は違います)。将来のことを思って送受信の両方を配線しました。

写真は完成された状態と蓋を開けて中をみせた状態です。電源スイッチをONにすると緑のLEDが点灯します。電源は9Vですが、10KΩで電流制限をしていますので暗く光ります。日中は暗く感じますが、夜のフィールドでは丁度良いと思います。電池の消耗も減らせますし。5つのスイッチは名刺サイズの基板にマウントして、その基板をネジで蓋に固定する方法にしました。見た目が悪いのですが、ケースに入れるPICマイコン基板の背が高く、スイッチをケースに時下付けする事をあきらめました。共同作成者にメカ屋さんがいれば、もっと美しい物が出来たかも知れません。PICマイコンはマイコンとMAX232が一緒になっている基板を秋月電子から買いました。レギュレータも入っています。1500円と高いのですが、これのおかげで配線が大幅に減りました。要は、ほぼ全ての配線は、この基板のおかげでやらなくて済みます。作成は数時間で終わりました。ケースは680円もしましたが、このケースは電池BOXが一体となっていて、006P電池が入れられます。その部分は見た目が美しくなりますので気に入っています。東京ラジオデパートで買いました。DINコネクターが何百円はしましたが、電源スイッチ・タクティルスイッチ・抵抗・LED・電線は持ち合わせを使いました。買ったとしても高いものでは無いと思います。他にはネジ・電池がありますが、ネジは100円としませんが、電池の210円は(比率的には)高いかもしれません。バッテリースナップはケースに付属していました。

一番、時間が掛かった作業はプログラム作成でした。最初、中核となるRS232Cの部分が上手く行きませんでした。本当はCで書きたかったのですが、CでRS232Cが全然動かず、アセンブラにしました。以下がプログラムリストです。

;
;	スカイセンサー2000PC 手元スイッチ2
;	For PIC16F84
;
;	送信・受信フォーマット:
;		9600bps,8ビット,1ストップビット
;		パリティー無し,フロー制御なし
;
;	5キー:Move N, Move S, Move E, Move W, Quit
;
		include	16f84.h

		.osc	hs
		.wdt	off
		.pwrt	off
		.protect off

btime		equ	83		; 9600bps @10MHz
txd		equ	ra.3

		org	0ch
start
		mov	!ra,#10111b	; RA.3を出力ポートへ
					; RA.4を入力ポートへ
		mov	!rb,#11111111b	; RBを入力ポートへ
		setb	rp0		; RAMバンク1を指定する
		clrb	rbpu		; RBをプルアップする
		clrb	rp0		; RAMバンク0にもどす
top_loop
		mov	rs,rb
		and	rs,#1b
		djnz	rs,push_rb0	; move 'N'

		mov	rs,rb		; key sw
		and	rs,#10b		; and RB.1
		rr	rs		; rs >> 1
		djnz	rs,push_rb1	; move 'S'

		mov	rs,rb
		and	rs,#100b
		rr	rs
		rr	rs
		djnz	rs,push_rb2	; move 'E'

		mov	rs,rb
		and	rs,#1000b
		rr	rs
		rr	rs
		rr	rs
		djnz	rs,push_rb3	; move 'W'

		mov	rs,rb
		and	rs,#10000b
		rr	rs
		rr	rs
		rr	rs
		rr	rs
		djnz	rs,push_rb4	; quit 'NEWS'
		jmp	top_loop

push_rb0	mov	poi,#0		; 0Byte目から
		mov	cu,#6		; 6Byte転送
		jmp	trans_com	; 

push_rb1	mov	poi,#6		; 6Byte目から
		mov	cu,#6		; 6Byte転送
		jmp	trans_com

push_rb2	mov	poi,#12		; 12Byte目から
		mov	cu,#6		; 6Byte転送
		jmp	trans_com

push_rb3	mov	poi,#18		; 18Byte目から
		mov	cu,#6		; 6Byte転送
		jmp	trans_com

push_rb4	mov	poi,#24		; 24Byte目から
		mov	cu,#24		; 24Byte転送
		jmp	trans_com

trans_com	mov	w,poi
		call	move_tbl	; 送信データをwへ
		mov	ch,w
		call	transmit
		inc	poi
		djnz	cu,trans_com
		goto	top_loop
;
;		RS232C送信サブルーチン
;
transmit	call	nop_wait
		bcf	txd
		mov	rs,#btime
trans10		djnz	rs,trans10
		mov	cn,#8
		nop
transmit0	rr	ch
		nop
		movb	txd,c		; データ出力(LSBから)

		mov	rs,#btime
trans11		djnz	rs,trans11

		djnz	cn,transmit0
		nop
		nop
		nop
		nop
		nop
		nop
		bsf	txd
		mov	rs,#btime
trans12		djnz	rs,trans12	; STOPビット分ウェイト
		call	nop_wait
		ret
;
;		wait
;
nop_wait	mov	cn,#50
		nop
nop_wait0	djnz	cn,nop_wait0
		ret
;
;		テーブル参照
;
move_tbl	jmp	pc+w
move_con	retw	'#Mn#',13,10,'#Ms#',13,10,'#Me#',13,10,'#Mw#',13,10
		retw	'#Qn#',13,10,'#Qs#',13,10,'#Qe#',13,10,'#Qw#',13,10

ch		ds	1		; 送信受信データ(8ビット)
rs		ds	1		; ウェイト時間調整用
cn		ds	1		; ビット数
cu		ds	1		; 転送バイト数
poi		ds	1		; 転送データ先頭アドレス

キーセンスの部分は、もっとスマートに書けそうですが、このアセンブラもよく分からなかったので、かっこうは気にせずに動いた部分は、これ以上は弄らないようにしました。プログラムを書き換えれば、もっと面白そうな事が出来そうです。アイデアがありましたら教えて下さい。


ホームへ戻ります
inserted by FC2 system