Arduinoでの自作ガイガーカウンター解説-#3 GM管からの信号取出し
前回#2でGM管からの信号取出し部の回路について触れましたので、今回はどのような信号が取り出せるのかをいっきに説明することにします。
信号の取出し部は次のようにしています。
図で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点をオシロスコープで見ると、信号を検知した時点で次のようになります。
この場合の信号の幅は10μ秒より大きく20μ秒より小さいですが、念のために多数回記録して確認をします。なぜなら、GM管が何を検知するかで幅が多少異なるからです。時間をダメ押しで確認しているのが冒頭の写真です。さらになるべく先のほうまでを確認して変化がないことも確認しておきます。信号をダブルカウントしたり、検知し損なうのを完全に防ぐために重要だと思います。
このテストを速やかに行うには、通常環境だけでなく何らかの線源(セシウム137などでなくとも、例えば炭酸カリウムK2CO3や「やさしお」などでも助けになりますが、身近な泉源について別の回に説明したいと思います)を近づけると検出頻度が増します。
同じことを適切な抵抗Rを介して他のGM管でもテストします。それが以下の写真です。
上のような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以内の頻度で監視しつつ処理をしています。
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管の仕様を示します。
上の表には購入時にお願いしてつけてもらったロシア語の仕様書からよみとったものと、計算によって求めた数値(項目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回目に掲げましたが。
以下は、マイコン工作用の大事な道具であるブレッドボードについて、ごく簡単な説明です。多くの人がご存じのことなので読み飛ばしても構いません。
筆者が便利に使っている主なブレッドボードは次の写真のようなものです。
同じ種類なら大体はボード相互を凹凸でつなげますので、必ずしも大きなものを必要としません。しかしパーツの挿入しやすさは製品によってずいぶん違います。(筆者の経験では秋月電子から購入するものは挿入部の品質が高く、パーツの足が入り難いということは殆どありませんが、海外から購入する低価格のもののなかにはパーツの足やディスクリート部品の挿入に苦労するものもありますので注意が必要です。また、ブレッドボードの使い方の基本的な説明が秋月電子のHPからダウンロードできるようなので必要ならごらんになってください。
電源ラインが上下にあるものでは、もし必要がなければ片方を外すことができます。Arduino-UNOでテストする時は、グランド端子と+出力端子が足りないので、そこから引き出してこれを使うと多数のパーツの電源となって便利です。
ジャンパーワイヤーはカラーコードで間隔を示しているものが素早い選択ができて便利です。筆者は海外から調達したものを次の入れ物に時々補充します。
一番多く使うのは赤の2、橙の3ですが、それだけを調達するのは難しいです。時々手作りで補充することがあります。長いもののは切って好きな長さを作る用途が多いです。
経験上、この容器を落としてこぼすと入れ直しに大変無駄な時間を消耗するので、念のために必ず輪ゴムをかけてしまっておくようにしています。ネジなどの扱いも同じことですね。
長いワイヤー(といっても最短のもの)は次のようにチャック付きビニール袋に分類していますが、不思議なことに紫(7)が手にはいりません。また茶色と灰色の供給は不足気味のようです。
本日は時間が来たので、このへんで。
この連載の記事:
次の記事:
(c) 2018 Akira Tominaga, All rights reserved.