2011年10月2日日曜日

改造Sparkfun ガイガーカウンタ回路へつなぐ Arduino のスケッチ

ガイガーカウンタとしては、カウンタ部分がない状態になっている Sparkfun のキットに、Arduinoで作ったカウンタをつけました。機能は単純で、
  • 1分あたりのカウント数(cpm)をPCへ送る(9600bps)こと
  • カウント数を液晶に表示すること
  • 検出時にブザーを鳴らし、LEDと液晶の右上に*の表示を点滅すること
ができます。理論上は600cpmまでカウントできますが、割り込みを使っていないので、LED点滅のための待ちでカウントができません。そのため放射線量が増えるにつれ、パルスのとりこぼしが目立つと思います。とはいえ、背景放射線だけなら、17cpmぐらいなので、通常は問題がないと思っています。


ほかのガイガーミュラー管の検出回路にも使えますが、正論理用になっているので、負論理(検出時に電圧が下がる)場合には
  while(digitalRead(GM) == 0) {}

  while(digitalRead(GM) != 0) {}
としてください。回路図とスケッチは以下です。




#include <LiquidCrystal.h>

const int GM = 6;
const int Speaker = 7;
const int LED = 13;
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
int count = 0;
int cpm = 0;
unsigned long t = 0;

void setup()
{
  pinMode(GM, INPUT);
  pinMode(Speaker, OUTPUT);
  pinMode(LED,OUTPUT);
  lcd.begin(16, 2);
  Serial.begin(9600);
  
  lcd.print("Geiger Counter");
}

void loop()
{
  while(digitalRead(GM) == 0) {}
  count ++;
  digitalWrite(LED, HIGH);
  lcd.setCursor(15, 0);
  lcd.print("*");
  tone(Speaker, 1000, 100);

  if ((millis() - t) > 60000) {
    cpm = count - 1;
    count = 1;
    t += 60000;
    lcd.clear();
    lcd.print(cpm);
    lcd.print("cpm        ");
    Serial.println(cpm);
  }
  lcd.setCursor(0, 1);
  lcd.print(count);
  delay(100);
  lcd.setCursor(15, 0);
  lcd.print(" ");
  digitalWrite(LED, LO);
} 
 
正常な動作のはずですが、測定してみると、ばらついてるようにみえてしまいます(測定条件は鉄筋コンクリートの建物の室内、キット附属の赤い蓋をつけたまま)。グラフの縦軸の単位はCPM、横軸の単位は分です。測定値の平均は17[cpm]、分散16で、108カウント=1μSv/hで換算すると0.15[μSv/h]ぐらいになります。

10分間で移動平均を取るとこんな感じです。

0 件のコメント:

コメントを投稿