Sunday, September 16, 2012

The $3 Geiger Muller tube to Arduino Interface

This is a "Revision 1.0". Rev 2.0 coming soon(longer tube life, better filtering..)! sdf

While complete Geiger Muller shields for the Arduino are available on the market, I tend to find them:
  • Unnecessarily Bulky
  • Too complexified for what they do.
Other awesome open source gm-counter projects do exist, however, they do not fit my (rather simplistic) requirements - just getting a TTL pulse for each ionization event.  

In this post, I will document how we can easily drive a GM tube with less than $3 worth of parts and an 
Arduino. It's not exactly the optimal circuit for GM tube driving, but it gets the job done in a very compact form factor.

In a nutshell, driving a GM tube typically consists of 2 distinct parts. 
  1. We need to provide the tube with a high voltage source for it to operate. 
  2. We need to detect each ionization event and convert it to a format that can be used by the micro controller. Interestingly, the circuit described above does exactly that. 

Prototyping a 400V boost converter

The first transistor (T1) takes a PWM signal(~1.9kHz) from the Arduino and together with L1, D1 and C1, acts like a boost converter to produce 400V. This voltage is then fed to the center pin of the GM tube(GMTUBE_1). 

The second pin of the GM tube, GMTUBE_2, goes to the pulse detector part of the circuit. Basically, each ionization event causes the 'Pulse_out' pin to to make a 'high-low-high' transition. This triggers an interrupt on the Arduino, which registers the event as one count. 

Typically, you'll want to count the ionization events over a certain period of time and report the results in counts per minute (cpm). You'll need to consult the datasheet of your tube to get the µRem/h conversion factor. 

The PWM_IN pin is connected to pin 5 on 8MHz Arduinos or pin 9 on 16MHz Arduinos. 
The PULSE_OUT pin is connected to pin 2 of the Arduino.

The test code can be easily edited to suit your needs. By default, it will report the "CPM" sampled over 10 seconds over serial. 

Good to know:
  • The arduino sketch included below assumes that the AVR is running at 8Mhz. If you are running at 16Mhz,  edit the code as instructed in the source file. (you'll get an incompatible PWM frequency if you don't, as the PWM frequency depends on the microcontroller's clock speed) 
  • When the PWM is at 0%, the circuit consumes a few micro amps. It consumes around 20mA during operation. 
  • The GM tube I used is a Russian, cold-war era, Si-29BG. Rugged, compact and sensitive enough. 

(Here's a video of the circuit in action - Thanks Johan! )

- M.


Anonymous said...

thanks for sharing...

Unknown said...

What an idea..Its really well defined with the help of pictures...
dropped hard drive

Anonymous said...

>> Too complexified for what they do.

I can't see how the voltage is being regulated / limited. They exhibit a plateau in sensitivity over the drive voltage. Overvoltage leads to premature failure and unreliable results. In addition, current draw depends on the count rate so voltage regulation is advised.

Also, never put a cap parallel to the tube (I neglect the 122k). This creates current surges that reduce lifetime. The tube datasheet will tell you what resistor value is ok. (usually 4M7 or 5M6).

Finally, use high voltage resistors or a series of standard resistors. Single standard resistors tend to break down at some point.

Manishi Barosee said...


"They exhibit a plateau in sensitivity over the drive voltage."

Very good point. The output voltage here is a very rough approximation but the component values I mentioned, I don't think it will get much above this tube's plateau voltage. I guess I should do some experimenting to find more about this issue.

About the current draw during ionization, my reasoning is that:

Since during ionization, only a handful of particles are involved in the current flow, the tube will consume in the order of nanoamps for low count rates(background) where it will spend 99.9% of its life.

I'll look into the resistors. 'HV' ones can be quite difficult to find in my neighborhood's electronics shop.

Johan said...

Nice idea, but GM tubes really need an anode resistor to work properly. Most tubes require resistors between 4M7 and 10M. Voltage does not matter, with low currents normal resistors won't have problems.

Also as an earlier commenter indicated, putting caps across GM tubes is also bad, with each ionization the whole cap will be dumped into the GM tube which is bad. Don't abuse GM tubes, it's a waste :)

This is a nice schematic, but please, read up on GM tube theory:

Manishi Barosee said...


Thanks a lot for the link. It's the best read on GM Tube theory i've come across.

I'll give it a read and try to improve the schematic while retaining its compactness.

Alessio said...

This is just what I was looking for, avoiding all the transformers and things I don't need.
However I think something should be added (a feedback for the voltage would be useful, or maybe with a series of zener diodes), and maybe it would be interesting to speed up the charge time, using a higher frequency PWM.
However, you are the one who proved the geigers are not that weird , ugly devices we think of! :P
What about the consumption? I did read it needs 20mA when charging and few femtoamp when nothing is received... but in the long term, how many milliamps does it uses (for example after one hour/one day)?
Thank you for this wonderful article! :)


Anonymous said...

I am happy to find this post very useful for me, as it contains lot of information.

High Voltage Commissioning

Anonymous said...

That's exactly what I was looking for!

But could you upload image of circuit with better resolution please.
It's hard to see the value of second capacitor and name of the second transistor :(

Johan said...

Actually built this circuit on breadboard:

It is simple and it works. It may need some tweaking and filtering, but the idea rocks. Combined with small micros like attiny85/trinket this should make killer cheap GM counters.

Johan said...

Here is a better schematic btw:

Manishi Barosee said...


Nice build! I will embed your vid in this post as a demo (if it's OK with you). I have a redesigned circuit around with better filtering. If it works i'll make a post about it soon-ish.

Johan said...

No problem, you don't need my permission to embed my public youtube stuff.

About the circuit, it works but it needs some improvements.

The 5V feeding the inductor should be decoupled with a electrolytic to make sure enough current is available when the inductor is charged.

Also, some regulation would be nice , for example some parts that shut off or change the PWM when voltage is too high or low. At high count rates the voltage could drop due to excessive current draw. For normal count rates and background measuring the circuit should work fine IMO

Johan said...

I have adapted my design to the Adafruit Trinket:

It works fine apart from some EMI triggering the transistor. I also added a serial output on one of the Trinket pins. Just connect a cheap USB-TTL adapter and you have a small, cheap serial enabled GM counter.

Anonymous said...

Weird, with absolutely the same components I can't reach output voltage more than 100V

I tried different frequencies, different capacitors, but 100V is a max.

Are you sure you have 15mH inductor?

Manishi Barosee said...


You are getting 100V because you are probably not using high voltage probes. The following article shows you how to build one:

This circuit produces a very very low current and is hence very susceptible to the internal resitance of your measuring intrument.

Anonymous said...


But how can resistors in probe help ?
That probe is made to measure 20kV on 1kV multimeter, so lowering the current will make it even worse.

Putting any resistor between source and DMM will give only lower voltage.

Anonymous said...

I was able to measure voltage correctly with 1GOhm resistor :)
Yes it was 400V
But another problem occurred, during the ionization, voltage drop on collector-emitter is so little it's not even possible to detect with arduino input, I was able to barely hear clicks with headphones
I tried with another tube SBM20, same result
I was changing frequency, duty cycle, capacitance, nothing helped, it looks like there is not enough current for transistor to open

Anonymous said...

There must be a resistor between PWM out and transistor base.
And also a diode between GND and 100K resistor to stop the parasitic current

Anonymous said...

EMI from inductor switches the second transistor

Anonymous said...

Very interesting, Can i use any other NPN transistor ? I currently do not have access to MPSA44, i have MPSA18 & BUL128A

Unknown said...

Very cool project :)
For you, what resistor value for 500V (lnd712 geiger tube) ?

I tested 10M but i obtain 250V, I think it's 1M ... 3M


Unknown said...

source code still available?