quick & easy geiger counter integrator

Having just started with the Arduino I thought I should try something relatively straightforward, and the idea that came to mind was an integrator for a geiger counter. The arduino counts each event, allowing one to accurately measure radiation by long integrations or detect objects that are only very slightly radioactive and don't register as "hot" with a tell-tale stream of clicks.

In my toolbox I've got an old, cheap-o geiger counter with an LED that flashes after each event. Since there's no electrical output from the geiger counter, I soldered two wires inside the geiger counter -- one to ground, the other above the LED's limiting resistor. On an oscilloscope, this produces a 20ms pulse at ~1.5V every time a radiation event is detected. I then applied this signal (through a 100k resistor) to the base of a 2N2222 transistor which provides a stronger signal to the arduino's digital input. The emitter is at ground & collector goes to digital pin 2. The geiger counter's ground goes to the arduino ground.

The code is also straightforward; an integer is initialized to zero, and after each interrupt is received, it is incremented. Every 500ms, the accumulated total and the result from millis() is printed to serial. The system behaves well with my only test subject -- an antique porcelain object glazed with a uranium-based glaze. This source gives about 250 counts/minute at 3 inches -- about as close as I can measure before accuracy starts to suffer. At this range, the arduino can keep up with the counts without difficulty -- the count-rate vs. 1/distance2 plot is linear.

...a very simple application -- just the geiger counter & two discrete components -- but fun! :slight_smile:

// initialize variables
int pin_in                = 2;        // input on digital pin 2 for interrupt 0
volatile long pulse_count = 0;


// setup for counting
void setup()
{
  Serial.begin(9600);
  pinMode(pin_in, INPUT);             // set input pin, then set it normally high
  digitalWrite(pin_in, HIGH);
  attachInterrupt(0, blink, CHANGE);  // perform count when pin changes state
}


// main loop fairl self-explanatory
void loop()
{
  delay(500);
  Serial.print(millis());
  Serial.print(",");
  Serial.print((pulse_count-1)/2);
  Serial.print("\n");
}


// when count received, increment counter
void blink()
{
  pulse_count++;
}

http://img249.imageshack.us/img249/6724/screencapturey.jpg

jshine

Very nicely done.

You mentioned that at 3 inches you were seeing about 250 cpm which seemed to be the limit for accuracy.

Did you do any experimentation with changing the sampling time of 500 ms to something either higher or lower? If so, did it have an affect on the accuracy limit?

The 3-inch limit doesn't come from the arduino failing to keep up with increasing pulse-rate -- it's a matter of being able to measure smaller distances accurately with a ruler, and the fact that my source isn't a perfect "point source" (it's a 2-inch sphere), so the inverse-square law breaks down at shorter distances. I can certainly achieve higher count-rates, but due to these problems I have no way of calibrating them...

Because I'm using an interrupt to do the actual counting, the 500ms interval isn't strongly related to accuracy -- my guess would be that the Arduino could keep up no matter what the count-rate is. The limiting factor is probably the "dead-time" of the detector -- i.e., the fact that the pulses are 20ms long, so if a 2nd particle arrives within 20ms of the first, that 2nd particle will not produce its own pulse/signal and will not be counted. At very high radiation flux, the detector would saturate and produce just one long, continuous "pulse" rendering it useless. In principle, if the particles arrived one-after-the-other in a perfectly timed way, then (1000 ms*60 s)/(20 ms per pulse) = 3000 pulses/minute as a theoretical maximum.

I'll post an image of the setup when I get home from work.

-Jon

If you want a smaller and hotter source then carefully take apart a smoke detector. The Am241 fleck inside it should give an alpha count of about 15000 cpm. Careful with it though, don't drop it and lose it - it's quite small, housed in a metal container, and keep it in a secure place of course.

Nice interface!

BTW, If you want to build an Arduino interfaced Geiger Counter from scratch, I have build plans here. You can probably use the tube from the one you have.

The event pulse I got from the tube was only 150uS. I suspect that your 500 mS pulse is not the latency of the tube but is due to the circuit in your Geiger.

The Am241 that Cook mentions is a fun source. :smiley:

John