勝手な電子工作・・

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

Arduinoでの自作ガイガーカウンター解説-#3 GM管からの信号取出し

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

SBM-20信号の多数回記録

前回#2でGM管からの信号取出し部の回路について触れましたので、今回はどのような信号が取り出せるのかをいっきに説明することにします。

 

信号の取出し部は次のようにしています。

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

図でRはGM管に合う適切な抵抗で、今回説明するGM管の推奨抵抗値は、SBM-20とSI-29BGでは5MΩ、SI-180GおよびSI-22Gでは10MΩとなっています。

カソード(陰極)とグラウンドの間にその抵抗を入れて、そこから信号を取り出す例もみられますが、ここではアノード側(A点)から取り出します。

その理由は前回も少し触れたとおり、GM管のカソードをグラウンドから浮かしたくないからです。もしグラウンド側に高い抵抗を入れてつなぐと、環境の雑音を拾いやすくなることが明らかです。高いインピーダンスですから。もしそのようにすると、たとえ接続をシールド線にしても、GM管を本体から少し離せばそれなりのノイズを拾うことになりますし、少し長いとGM管の仕様を超える容量が加わってしまいます。

GMT(GM管)は放射線を検知すると短い間抵抗値が下がるわけで、A点には負のパルスが出ます。各GM管の仕様上で許される小容量(10pFで耐圧の高いもの、例えば2kV)のキャパシターでいったんトランジスタのベースにつなぎます。

このトランジスターにはPNPを使用し、エミッターフォロワー接続としてインピーダンス変換をするものです。GM管の信号を十分に高いインピーダンスで受けるためのバッファーです。この場合、ベースの入力抵抗は十分高いのでキャパシターとの間に抵抗は要りません。

もし、このトランジスターを入れずに直接マイコンで受けても動くには動くでしょうが、B点のインピーダンスが十分高くないとGM管が次の信号を出すまでの間隔(Dead time)が増すため、避ける必要があります。

このようにしてE点をオシロスコープで見ると、信号を検知した時点で次のようになります。

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

SBM-20の信号

この場合の信号の幅は10μ秒より大きく20μ秒より小さいですが、念のために多数回記録して確認をします。なぜなら、GM管が何を検知するかで幅が多少異なるからです。時間をダメ押しで確認しているのが冒頭の写真です。さらになるべく先のほうまでを確認して変化がないことも確認しておきます。信号をダブルカウントしたり、検知し損なうのを完全に防ぐために重要だと思います。

このテストを速やかに行うには、通常環境だけでなく何らかの線源(セシウム137などでなくとも、例えば炭酸カリウムK2CO3や「やさしお」などでも助けになりますが、身近な泉源について別の回に説明したいと思います)を近づけると検出頻度が増します。

同じことを適切な抵抗Rを介して他のGM管でもテストします。それが以下の写真です。

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

SI-29BGの信号

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

SI-29BGでの多数回の記録

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

SI-180Gの信号

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

SI-180Gでの多数回の記録

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

SI-22Gの信号

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

SI-22Gでの多数回の信号

上のようなGMTの信号を確実に検出するためには、長くとも5~6マイクロ秒以内には必ず検出されるようにしたいところです。ところがArduino IDEのdigitalRead(pin)インストラクションにはかなりのオーバーヘッドがあるうえ、ループ中で他の信号と共にdigitalRead命令で検出するとなると、その範囲には到底はいらず、検出漏れを起こすことになります。

これを防ぐには、①アナログ信号をもっと長くするか、②Arduino(ATmega328p)をアセンブラー言語または特殊な方法で書くか、あるいは、③直接Arduinoに取り込まず他のマイコンで信号を受けて長い固定長にするなど、何かの方法が必要です。しかし②は避けたいところです。

①の場合、アナログ信号を長くするには、回路図中のカップリングコンデンサー10pFの値をもっと大きくすればよいのですが、前に述べたようにdead timeが犠牲になります。ただ、よほど高い線量を測るのでなければこれはあまり問題にならないとは思います。

プルアップしている抵抗330kΩをさらに大きくする方法も有効です。どの方法にしても信号をよく確かめて、ダブルカウントしないdelay時間を十分とって次回のチェックにいく論理にしないといけません。

 

ここでは、③の方法でいったん小さなPICで受けて長い固定信号に変換する形をとります。つまり5μS~20μS程度の信号を80μSの固定長(GMTの最短のDead Time以内の値)に変えてArduinoへ送信することにしています。ついでに放射線検出を音で示し、また、LED点灯で知らせます。

PICでGMTからの信号を次のオシロ波形のように変えているわけなのですが、PICからArduinoへ信号を送った後の処理では、GMTからの信号を取りこぼさないように、3μS以内の頻度で監視しつつ処理をしています。

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

PICへの入力(1)と出力(2,3,4)

sounderを鳴らしLEDを点灯している間にGM管の検出信号があれば、取り損なうことなくSounderやLED処理を途中ですぐやめて同じ処理を繰返すようにプログラムを組んであるわけなのです。このような面倒な処理をしたくない人は、単に短い信号を長い固定長の信号にとりかえてArduinoへ渡す処理だけすればよいと思います。この処理は、前にあげたGMTの場合は5マイクロ秒未満の短い間隔で検出ができるマイコンなら何でもいいわけですから。

このPICプログラムは次のものです。ただし#include文にある≦は半角の<へ、≧は半角の>へと読み替えてください(タグpreとタグcodeで挟んだコードもタグとみなされてしまうため、すみませんがとりあえずはこのようにしてあります。)。


    ;U1811-GM-Detector-BB-V00-01s.asm		           As of Nov. 20, 2018
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;										;
; GM Sounder for PIC12F1822 Version 00 Revision 00c				;
;	        All rights reserved. (c)2015-2018  Akira Tominaga 		;
;	  Funtion								;
;		1. Detect GM cirucuit signals (5-10 micro sec)			;
;			avoiding double-detection for 90 micro sec		;
;		2. Send L to  main, until Ack(L) from main			;
;		3. Inform radiation detection with sound(SWtched) and light	;
;		   wih sound off function by switch Low				;
;	  Input/OUtput 								;
;		1. RA0 LED outpput (H=on)					;
;		2. RA1 Det output: Signal Detected (L=on) 			;
;		3. RA3 Sig input from transistor: GMT signal(PU L=on) 		;
;		4. RA4 Mute input: Slide switchto mute sound (PU L=on)		;
;		5. RA5 Sounder output: Resonant frequency 4-5KHz		;
;	  Remarks								;
;		1. Clock = HFINTOSC (	16MHz)					;
;			Hence 1 step = 0.25 micro seconds			;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
	list		p=12F1822      ; list directive to define processor
	#include	≦p12F1822.inc≧; processor specific variable definitions
    __CONFIG _CONFIG1, _FOSC_INTOSC & _WDTE_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _CPD_OFF & _BOREN_OFF & _CLKOUTEN_OFF & _IESO_OFF & _FCMEN_OFF
    __CONFIG _CONFIG2, _WRT_OFF & _PLLEN_OFF & _STVREN_OFF & _BORV_LO & _LVP_OFF
;
	page
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 	Macro definitions						;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 	Device dependent Macros	;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
DEVset	macro	
	BANKSEL	OSCCON		; Bank=1
	movlw	B'01111010'	; 16MHz and internal oscillator
	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
	clrf	ANSELA		; No use of ADC
	BANKSEL	ADCON0		; Bank=1
	clrf	ADCON0		; No use of ADC
;
	BANKSEL	TRISA		; Bank=1
	movlw	B'11011100'	; RA0,1 and 5 are output
	movwf	TRISA
;
	BANKSEL	OPTION_REG	; Bank=1
	bcf	OPTION_REG,7	; Enable weak pull-up
	BANKSEL	WPUA		; Bank=4
	movlw	B'00011100'	; Weak Pull-up for RA2 to 4
	movwf	WPUA		;  
;
	clrf	BSR		; Bank=0		
	endm
;
InitP	macro			; Initialize ports
	movlw	B'11011110'	; H excluding 5=Buzzer and 0=LED	
	movwf	PORTA
	endm
;		
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;	I/O macros			;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 	For general purpose	;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
LEDon	macro			; LED on
	goto	$+1
	bsf	PORTA,LED
	goto	$+1
	endm
;
LEDoff	macro			; LED off
	goto	$+1
	bcf	PORTA,LED
	goto	$+1
	endm
;
LEDonnw	macro			; LED on with no wait
	bsf	PORTA,LED
	endm
;
LEDofnw	macro			; LED off with no wait
	bcf	PORTA,LED
	endm
;
Buzzer	macro			; Set Sounder H when L, L when H
	goto	$+1
	btfsc	PORTA,Mute	; If Mute on (L), then skip sounding
	goto	$+2		; 	If Mute off(H), make sound
	goto	$+4	 	;  	If Mute on (L), pass through			
	movlw	Soundv		; 2^(Sounder pin number)	
	xorwf	PORTA,F		;		
;
	goto	$+1		;		total 7steps
	endm
;
Buznw	macro			; Buzzer with no wait for PORT ready
	btfsc	PORTA,Mute	; If Mute on (L), then skip sounding
	goto	$+2		; 	If Mute off(H), make sound
	goto	$+3	 	;  	If Mute on (L), pass through	
	movlw	Soundv		;		4 step
	xorwf	PORTA,F		;		total 5 steps

	endm
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;	Time cosuming 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
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;	Debug and Abend macros		;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Udebug	macro 	Addr
	movf	Addr,W
	call	Udbgr
	endm
;
Trigger	macro				; DSO external trigger
	goto	$+1
	bsf	PORTC,Trig
	Mic25
	bcf	PORTC,Trig
	goto	$+1
	endm
;
Uabend	macro	abn			; User Abnormal-end number
	movlw	abn
	goto	Uabendr
	endm
;
Ublink	macro	bno			; Blink LED for specified times
	movlw	bno
	call	Ublinkr
	endm
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 	Files and Equations					;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;	Files				;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	cblock	H'20'
;
;	For application support
	LpctrL		; Loop counter large for LED time
	LpctrM		; Loop counter medium for Buzzer time
	LpctrS		; Loop counter small for Sounder hafl cycle
;
; Areas for time consuming subroutines
; Do not change the sequences from Mic5c to Minsc
;	if to co-use with calculation parameters
	Mic25c
	Mic50c
	Millic
	Mil100c
	Secsc
	Minsc
;
; Areas for debugging routines
	DmpA 		; Display byte area 
	Dmp8C 		; Bit counter for loop (Initial Dmp8V =8)
	BlinkC 		; Counter for blinking (set for Debugb or Abendb)
	Abendn		; Abend number
	Ucpc		; User Check point chr to trace 
	Flags
;
	endc		
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 	Equations			;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 	For PORTA		;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
LED	equ	0		; RA0 = Output to LED H=on
GMTdet	equ	1		; RA1 = Output to Main proc L=on
GMTsig	equ	3		; RA3 = GMT signal from transistor
Mute	equ	4		; RA4 = Mute switch (L=no sound) 
Sounder	equ	5		; RA5 = Output to 5kHz sounder
Soundv	equ	B'00100000'	; Sounder pin position value 
;				;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;	Values & Characters	;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
LpctLv	equ	12		; LED time = LpctLv x 12 = 1.2mS
LpctSv	equ	D'80'		; Sounder half cycle 100 microsec/5steps
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 	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'25'		; number of blinkings to notify Abend
; Flags byte
LEDsv	equ	0		; LED save bit in Flags byte
;
	page
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;	Initializing						;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	org	0
	goto	Startp		; Go to start entry
	org	4		; This is Interrupt entry
	retfie			; 
;
Startp	DEVset			; Define ports
	InitP			; Initialize Ports
;
	Secs	1		; Wait for one sec to start signals
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;	I am awake		;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;	
Sawake	LEDon			; Indicate I am awake
	Mil100	2
	LEDoff
	Mil100	D'8'
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;	Main program loop					;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Mainp	btfsc	PORTA,GMTsig	; Radiation detected ?
	goto	$-1		; No, repeat (wait for radiation)
Sigdet	bcf	PORTA,GMTdet	; Yes, notify it to Host (make it L)
;
;	Once signal detected, no sig more than 80 micro secs from GMT. 
;	To avoid double detection,consume minimum 80micro sec. 
;	Here, cosume 78 micro seconds, to consider the other instructions.
	Mic50	1		; Consume 50 micro seconds
	Mic2	D'11'		; Consume 22 micro seconds
;	add the 8 micro seconds consumed by thw follwings, total 80 micro seconds
;
	
	LEDon			;  
	Buzzer			; 
	Mic2	1		; 
	bsf	PORTA,GMTdet	; Off the Det signal to host
;
	movlw	LpctLv		; Get L loop count 
	movwf	LpctrL		; to large loop counter
;
; Sounding loop hereafter, checking GMTsig within max 3 micro sec
;
LoopL	movlw	LpctSv		; Set small loop counter
	movwf	LpctrS		; to small loop counter
;
LoopS	btfss	PORTA,GMTsig	; Radiation detected ?	
	goto	Sigdet		;  Yes, go out of loop and process it
;
	decfsz	LpctrS,F	;  No, LoopS over ?	
	goto	LoopS		;      No, LoopS=100 microsecs, 
;
	Buznw			; Next half cycle of sounder hereafter
	goto	$+1		; Timing for PORTA
;
	btfss	PORTA,GMTsig	; Radiation detected ? 
	goto	Sigdet		; Yes, go out of loop and process it
;
	decfsz	LpctrL,F	; Check Loop L
	goto	LoopL		; If not over, repeat loop S
;
	LEDoff			; If Loop L expired (1.2mS) then LED off
	goto	Mainp		;
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;	Timing subrooutines for general purposes;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 	Make 2.0 micro S x n	(Mic2)	;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Mic2r	movwf	Mic25c		; + Wset + call = 1 micro sec 
;
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		; + Wset + call = 1 micro sec 
	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	 	; set how many 50 microsec (1 micro sec 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 		; set how many 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		;set how many 100 ms(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 how many sec ( 1 mic sec 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 how many minutes from parameter
;
Minsl	Secs	D'60'		; 1 Seconds x 60
	decfsz	Minsc,F
	goto	Minsl
	return
;
	space
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; User debug subroutine		;
;	Show bit 7 to 0 	;
;	of specified area	;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
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
	Mil100	D'10'		; wait for a second in case LED has been on
;
UdbLoff	movlw	Dmp8V		; set counter 8
	movwf	Dmp8C		; to Dmp8C
;
Udblp	Ublink	Debugb		; Blink for Debug = 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
	Mil100	D'30'		;
	goto	Udbeck
;
UdbOff	LEDoff
	Mil100	D'30'		;	
;	goto	Udbeck
;
Udbeck	decfsz	Dmp8C,F
	goto	Udbnext
	goto	Udbend
;
Udbnext	rlf	DmpA,F
	goto	Udblp
;
Udbend	Ublink	Debugb		; end blinking and 
	Mil100	D'100'		; blank for 10 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
	Milli	D'30'		; for 30ms
	LEDoff			; LED off
	Milli	D'200'		; for 200ms
;
	decfsz	BlinkC,F
	goto	Ublinkl
	return
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 	Abend routine			;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Uabendr	clrf	BSR
	movwf	Abendn			; Set Uabend number
;
	Ublink	Abendb			; Blinking 25 times
	Udebug	Abendn			; Show Abend number
	goto	$
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;	End of program						;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	end

 これによって、Arduinoでは相当な余裕をもって80μSの信号を確実に検出できます。ただし、Arduinoでは信号検出処理が早く終わっても80μS経過してから次の検出をすることが必要です。ダブルカウントしないためです。GM管のdead timeの中に入っていれば、信号をとらえ損なうことはありません。

 

上に書いた理由からやむなくマイコンを1つ介しています。この理由は次回にでも詳しく補足したいと思います。本当は、まっすぐArduino だけでやりたいところなのですが、信号の取り込みのところをどなたかさらに工夫していただくと良いと思います。ただオペアンプで長さを延ばすなどもあり得ますが、それよりは8ピンマイコンを使うほうが単純ですね。

ここで筆者が参照するために作った、各GM管の仕様を示します。

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

上の表には購入時にお願いしてつけてもらったロシア語の仕様書からよみとったものと、計算によって求めた数値(項目13,14)があります。

SI-180Gは残念ながら仕様書がついてきませんでした。多くがコバルト60線源での測定数値となっていますが、幸いなことにSI-29BGではコバルト60に加えてセシウム137の数値がついています。これによりSBM-20とSI-22Gの項目13と14の推定値を求めたものです。有効数字は2桁ですが四捨五入を繰り返すとずれてきますので、計算値をそのままいれてあります。

何のために項目14を求めたかといえば、測定結果のμSv/h(毎時マイクロシーベルト)換算をする際、高い数値についてはセシウム137のそのような線源を確保するのがむずかしいためで、この1点を計算上の点の1つとして利用するためです。これについては後でArduinoのプログラムとともに具体的に説明したいと思っています。

SBM20は多く出回っていて、カウント値も大きな個体差がないのですが、SI-22Gは図体が大きいためあまり出回っていませんし入手も相対的に難しいです。最近多数追加購入したのを機会に、カウント値を今後十分に比較したいと思います。

 

さて、以上のような信号を確実に確かめるためには、ブレッドボードでの試作の段階でしっかり測定しておき、実装後も念のために確認したいものですね。今回のブレッドボードでの試作の写真は次です。この連載1回目に掲げましたが。

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

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

 

以下は、マイコン工作用の大事な道具であるブレッドボードについて、ごく簡単な説明です。多くの人がご存じのことなので読み飛ばしても構いません。

 

筆者が便利に使っている主なブレッドボードは次の写真のようなものです。

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

同じ種類なら大体はボード相互を凹凸でつなげますので、必ずしも大きなものを必要としません。しかしパーツの挿入しやすさは製品によってずいぶん違います。(筆者の経験では秋月電子から購入するものは挿入部の品質が高く、パーツの足が入り難いということは殆どありませんが、海外から購入する低価格のもののなかにはパーツの足やディスクリート部品の挿入に苦労するものもありますので注意が必要です。また、ブレッドボードの使い方の基本的な説明が秋月電子のHPからダウンロードできるようなので必要ならごらんになってください。

電源ラインが上下にあるものでは、もし必要がなければ片方を外すことができます。Arduino-UNOでテストする時は、グランド端子と+出力端子が足りないので、そこから引き出してこれを使うと多数のパーツの電源となって便利です。

ジャンパーワイヤーはカラーコードで間隔を示しているものが素早い選択ができて便利です。筆者は海外から調達したものを次の入れ物に時々補充します。

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

 一番多く使うのは赤の2、橙の3ですが、それだけを調達するのは難しいです。時々手作りで補充することがあります。長いもののは切って好きな長さを作る用途が多いです。

経験上、この容器を落としてこぼすと入れ直しに大変無駄な時間を消耗するので、念のために必ず輪ゴムをかけてしまっておくようにしています。ネジなどの扱いも同じことですね。

長いワイヤー(といっても最短のもの)は次のようにチャック付きビニール袋に分類していますが、不思議なことに紫(7)が手にはいりません。また茶色と灰色の供給は不足気味のようです。

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

 

本日は時間が来たので、このへんで。

 

この連載の記事:

a-tomi.hatenablog.com

a-tomi.hatenablog.com

 

次の記事:

a-tomi.hatenablog.com

a-tomi.hatenablog.com

a-tomi.hatenablog.com

 

(c) 2018 Akira Tominaga, All rights reserved.