ガイガーカウンターとは?
アマゾンで福島第一原発の事故でガイガーカウンターの需要が高まったけど、最近Aliをうろうろしていたら電気工作レベルでつくれるガイガーカウンターをみつけて購入してみた。組み立てはめんどいので完成品を買ってしまいましたが工作好きの人は半田付けして組み立てをしている様子。
ガイガーカウンターは「カウンター(計数機)」とうことでGM管にβ線やγ線が当たった数を数えるだけです。
んじゃCPMから線量(Sv)に換算する式は?
ということになるので基礎知識を事前に学習する必要があります。CPMからSvに変換するには換算係数が用いられます。
CPM ÷ 換算係数 = μSv/h
換算係数は放射性物質により異なります。SBM-20というGM管における換算係数は
コバルト60 150.51CPM/μSv
ラジウム226 198.40CPM/μSv
セシウム137 170~180CPM/μSv(非公式)
となっており。色々なサイトの換算をみるとコバルト60の150CPM/μSvが使われているようです。1μSv(=0.001mSv)あたり約50CPMの差(コバルト60とラジウム226)がでると思うけど不正確というわけではなくエネルギーの中心をどこにするかの違いだそうです。
ガイガーカウンターキットを動かしてみる
到着後、家の中で動作させてCPMを計測してみると、20CPM(1分間のカウント数)程度。コバルト60を基準としてCPMからよく利用されるμSv/hに変換すると
20CPM ÷ 150.51CPM/μSv = 0.133μSv
となります。私たちは自然界から受ける放射線量があります。日本だと大体2.1mSv/year(=2100μSv/year)の被ばくがあるとされています。これを1時間単位に直すと0.24μSv/hとなります。CPMにすると36.1CPM程度となります。これをバックグラウンドと言います。
このキットに付属しているGM管はJ305βγという中国産のものです。SBM-20が一般的に多く資料もあるけどJ305を使ったレビューがあまり見当たらず・・・なんとかデータシートをみつけました。
SBM-20とさして変わらないような感じ。購入時のAliの写真ではM4011だったけどもJ305がついてきました。
とりあえず、マイコンを接続しないと計測がめんどくさいので、ESP8266とLCD1602をつないで計測できるようにします。Arduinoの方がロジック電圧の関係で親和性が高いと思いますが手持ちのArduinoがもうないのでESP8266にした次第です(笑)
このキット自体は5V駆動だけど、オシロスコープで確認したところカウント時のパルス出力は3V程度だったのでダイレクトにESP8266に接続して大丈夫の様子。また、LCD1602はI2Cで接続を予定。本来ならロジック変換を用いるべきだけど部品数が多くなるので3.3Vで表示できることを確認して利用することにしました。
VINをGPIO5、SDAをGPIO0、SCLをGPIO2に接続するだけの簡単な回路なので回路図は割愛します。
スケッチ
カウント方法は一定のカウント数(C_COUNT=100)に達するまでの時間からCPMを逆算する方法をとりました。100未満は100未満の数でCPMを逆算するようにしているので誤差が大きくなるが時間がたつにつれて精度が上がるとおもいます。もっと精度を上げたい場合はC_COUNTの数値を上げればよいです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 |
// 自作ガイガーカウンター ESP8266 // ガイガーカウンター VIN => GPIO5 // I2C GPIO0 => SDA GPIO2 => SCL // LCD1602 アドレス0x3F #include <Arduino.h> #include <ESP8266WiFi.h> #include <LiquidCrystal_I2C.h> #define GEIGER_VIN_PIN 5 #define SDA_PIN 0 #define SCL_PIN 2 #define C_COUNT 100 // cpm/1uSv/h double CPM_Co60 = 150.51; double CPM_Ra226 = 198.40; double CPM_Cs137 = 175.00; // 非公式170-180 unsigned long int_counts = 20; double BASE_CPM = CPM_Co60; unsigned long time_list[C_COUNT]; unsigned int time_list_p = 0; LiquidCrystal_I2C lcd(0x3F,16,2); unsigned long counts; //計測カウント unsigned long last_counts; //最終計算した計測カウント unsigned long start_time; void add_timelist(unsigned long t){ if(time_list_p < C_COUNT){ time_list[time_list_p] = t; time_list_p++; }else{ unsigned long temp[C_COUNT]; memcpy(temp, time_list, sizeof(time_list)); for (int i = 0; i < C_COUNT-1; i++) { temp[i] = time_list[i+1]; } temp[C_COUNT-1] = t; memcpy(time_list, temp, sizeof(temp)); } Serial.print("time_list = {"); for (int i = 0; i < time_list_p; i++) { Serial.print(time_list[i]); Serial.print(","); } Serial.println("}"); if(time_list_p > 1){ double pass_time = time_list[time_list_p-1] - time_list[0]; Serial.print("time_list_p = "); Serial.println(time_list_p); Serial.print("time_list[time_list_p-1] - time_list[0] = "); Serial.println(pass_time); if(pass_time>0){ double cpm = (double(time_list_p) * 60.0 * 1000.0) / double(time_list[time_list_p-1] - time_list[0]); double u_Sv = cpm / BASE_CPM; Serial.print("cpm = "); Serial.println(cpm); Serial.print("u_Sv = "); Serial.println(u_Sv); char cpm_st[10]; char u_Sv_st[10]; dtostrf(cpm, 12, 3,cpm_st); dtostrf(u_Sv, 12, 3,u_Sv_st); lcd.setCursor(0, 0); lcd.print(cpm_st); lcd.print(" cpm"); lcd.setCursor(0, 1); lcd.print(u_Sv_st); lcd.print(" uSv"); } } } void IRAM_ATTR impulse() { counts++; Serial.print("counts = "); Serial.println(counts); add_timelist(millis()); } void setup() { //LCD1602初期化 Wire.begin(0,2); lcd.init(); lcd.backlight(); lcd.setCursor(0, 0); lcd.print("Geiger Counter"); lcd.setCursor(0, 1); lcd.print("Based Co60 Wait."); //計測初期化 counts = 0; last_counts = 0; start_time = millis(); delay(500); Serial.begin(115200); pinMode(GEIGER_VIN_PIN, INPUT); attachInterrupt(digitalPinToInterrupt(GEIGER_VIN_PIN), impulse, FALLING); //カウント割り込みの設定 } void loop() { } |
上のスケッチでは換算計数はコバルト60を用いてCPMとSv換算を行っています。
β線の影響
ブレッドボードで計測をテストしたところ、屋内では13~25CPMとなりますが、屋外では予測を超えて高値となりました。100~200CPMを計測していました。
ホットスポット?
でも、原発事故後に土の入れ替えをしているし、北海道だし・・・なんか別の要因がありそう。原因を探していると
上のブログをみつけました。空間線量を計測するにはγ線のみを対象にしてβ線をしっかり遮蔽する必要があるとのこと。線量をβ線で換算してしまうと異常値が出るとのこと。まさにこれです。とても分かりやすく説明されていますので感謝です。
確かに、β線は透過力が弱いため屋内では計測できないので屋外のβ線を拾ってしまい異常値が出ていると考察。とりあえず、β線を遮蔽するために計測機を丸ごとアルミホイルで覆って計測したところ屋内と大して変わらない20CPM程度を示したので間違いないと思います。
アルミホイルで包んでいると昔のゲーセンにあったトーストサンドみたいで格好悪いw。
GM管だけを被覆すればいいので、3Dプリンタで0.5mm厚で筒を作りそれにアルミホイルを巻き付けて短絡しないようにセロテープで絶縁しセットしました。
これで屋外の線量を計測したところ、屋内と同等の数値を示していました。γ線源があればさらに考察を進めることができるんですが・・・まぁ取り合えず理想値まで近づきましたのでよしとしました。