Home-made Geiger Counter with RNG

Last June, I started with a LND712 Geiger Muller tube and a personal drive to create the most functional home-made Geiger counter on the web. I am now finished and in good timing since these devices are currently a hot topic as the Japanese nuclear disaster has sparked an interest among many people.

A Geiger counter is actually a relatively old device so my goal was to create a modernized version of it. I have also implemented additional features such as a random number generator (RNG) and data logging in LabVIEW through serial communication.

What is a Geiger Counter?

A Geiger counter is a device used to detect ionizing radiation. Ionizing radiation (as opposed to non-ionizing radiation) has enough energy to remove tightly bound electrons from atoms, thus creating ions. Alpha and beta particles, X-rays and gamma rays are forms of ionizing radiation. Ionizing radiation is dangerous because it damages the internal structure of living cells, either by killing living cells or producing errors in the reproductive process of cells.

Non-ionizing radiation on the other hand, only has enough energy to move around or vibrate atoms in a molecule, but not enough to remove electronics. Forms of this radiation are microwaves and radio waves.

A Geiger counter has many different applications.

  • Surveying for contamination of radioactive emissions
  • Detecting radioactive rocks and minerals
  • Checking background levels near a nuclear power facilities
  • Determining radiation risks for fire and police first-responders to a disaster.

How does radiation work?

Atoms in their normal state are electrically neutral because the total negative charge of electrons outside the nucleus equals the total positive charge of the nucleus. For example, the Hydrogen atom has one electron (negative charge) that orbits the nucleus which contains one proton (positive charge).

Above: Atomic structure of hydrogen

Atoms with the same number of protons and different number of neutrons are called isotopes. These different forms may be stable or unstable (radioactive). Tritium is radioactive isotope of hydrogen. The nucleus contains one proton and two neutrons.

Above: Atomic structure of tritium

There are three types of radioactive decay; Alpha, beta, and gamma decay. Tritium is a light beta emitter. Beta emission occurs when the ratio of neutrons to protons in the nucleus is too high. In this case, an excess neutron transforms into a proton and electron. The proton stays in the nucleus and the electron is ejected energetically.

The electron emitted is called the beta particle. The nucleus loses one neutron and gains one proton. Two protons in the nucleus corresponds to a helium atom. Therefore, a tritium atom undergoing beta decay becomes a isotope of helium (Helium-3). Helium-3 is stable (not radioactive) and so it will not decay further.

How Does it Work?

Note: I have posted the circuit schematic here. I will reference it throughout the post.

The main component of any Geiger counter is the Geiger Muller tube,  commonly called a GM tube. I was fortunate enough to have two LND712 tubes donated to me by LND Inc.  The GM tube works by the physical process of ionization. The tube is filled with low pressure neon and other halogen gases.  When a particle of radiation enters the tube, a trail of ionized atoms will be left behind. These ions are accelerated by the electrical field and collide with other atoms, which greatly multiplies the number of ions inside the tube. The gas dielectric breaks and, as a result, a short circuit is created from the anode to the cathode. A short circuit can easily be detected with simple electronic circuits. In the case of my design, the short circuit triggers an interrupt on pin 3 of the Arduino.

Above: LND712 Geiger Muller tubes.

One big problem I encountered was that the GM tube requires a voltage of 500V (recommended) across it for it to operate. So I got my ladder and went outside to tap the voltage off the transmission line. Just kidding.  I ended up simply using a voltage multiplier circuit. Here is a resource I found useful in this design. The link shows schematics of voltage multiplier circuits using a transformer in a similar fashion to a flyback converter. I built and tested some of these circuits. They work-but not well with low voltage supplies. Running the circuits with a 5V supply doesn’t quite produce 500V. So how can I operate the circuit with a 5V supply? What I did was throw away the transistor oscillator part of the circuit and replaced it with a 555 Timer in astable mode.

The circuits shown in that link use a transistor oscillator to generate a square wave which drives the transformer. I found out that the transistor oscillator output doesn’t swing from VCC to GND. If VCC = 9V, then the voltage swing is about 8V to 1V. Not only this, but the transition from HIGH to LOW wasn’t very sharp. Its important to have sharp transitions in order to fuel the collapsing magnetic field of the transformer’s inductive properties. I know that a 555 Timer has full swing from VCC to GND and sharp transitions.

T1 is a high voltage NPN transistor that drives the transformer. When the transistor T1 is ON, the primary of the transformer is connected to VCC (+5V) through the collector of the transistor to near ground potential. This creates an increase in magnetic flux in the transformer. When the transistor is OFF, the magnetic field in the transformer collapses, which creates a high voltage spike. This is sent to the charge pump network to charge the 1000V metalized film capacitors. The output of the stage is was measured to be 330V. This is misleading because of the effect of multimeter impedance.  I personally estimate it to be around 600V. This voltage is sent to the GM tube through current limiting resistors.

As previously stated, a short circuit occurs inside the tube when radiation is detected. A short circuit inside the tube will create a voltage divider with resistors R4, R5, R6 and R7.  R8 taps from the voltage divider network and connects to the base of T2. T2 amplifies the signal so it can be sent to the Arduino and the next stage.

The next stage is the monostable circuit. The purpose of this stage is to extend the pulse width of the signal long enough so that the user can notice it on a LED and hear the click on a speaker. A 555 timer operating as a monostable multivibrator is used for this application. The pulse was extended to approximately 1ms based on the equation T = 1.1*RC.

Above: Prototype on a Breadboard

The entire circuit is shown below on a PCB. I used EagleCad to make the schematic, ran auto router, and exported the traces to an inverted PCB image. I then took it to college and fabricated it in the PCB lab.

Above: Inverted PCB image for transfer

Above: Main Geiger counter circuit on a PCB


I used an Arduino Microcontroller to control my Geiger counter. The program I coded is titled “CPM” (Counts Per Minute). You can download the source code here.

The functions of the program are:

  • Determine the CPS (Counts Per Second) of the radioactivity
  • Determine the CPM (Counts Per Minute) of the radioactivity
  • Calculate the absorbed dosage in mR/Hr
  • Send the CPS data serially to the PC for the LabVIEW interface
  • Generate random numbers
  • Display all information on the LCD
  • Read the switch inputs and determine which mode to display on the LCD

An hd44780 standard 16×4 LCD displays all the information. Both the Arduino and LCD were purchased at www.robotshop.ca.

The collector of the transistor T2 is connected to pin 3 of the Arduino. Pin 3 is setup to accept interrupts. When an interrupt is triggered, the variable named count is incremented. The definition of a count is the detection of one particle of radiation.

The standard display output on all Geiger counters is the CPM value. This is how many counts occur in a one minute period. It’s not practical to have the user wait a full minute to get the CPM reading of a source of radiation, so I took a shortcut to estimate the CPM. The shortcut used was to constantly have a running average of a five second sample and then multiply it by some constant to find the CPM.  The lines of code for this are shown below.

total -= previousCounts[index];
previousCounts[index] = count;
total += previousCounts[index];
if (index >= numberOfAveragingSamples)
index = 0;

One sample period is equal to 1 second. This period also corresponds to how often the LCD updates. I programmed CPM to be fairly customizable so the period can be changed to anything through the #define PERIOD. The variable numberofAveragingSamples can be changed by the user to adjust how many samples are taken to estimate the CPM. I have set the default for this variable to 5.  Since the default period is 1 second, five one-second samples will be taken. An array named previousCounts stores the amount of counts that occurred within each sample period. The total variable is the sum of the everything in the array. You can see in the last line of code how the averageCPM is calculated. PERIOD is equal to 1000 (milliseconds). Keep in mind that this is a running average, so as a new sample is added, the oldest one is discarded.

The CPM value is useful when reading a source of radiation but not when reading background radiation. Background radiation is too low to obtain an accurate average in a one minute period. So what I did was program a background radiation mode. This can be turned on using a switch on the front of the enclosure. Its basically a never ending average of the counts of radiation over time. Typical background radiation readings in my area were found to be 13 CPM.

Random Number Generator

A Geiger counter can be used as a hardware random number generator. It takes advantage of the fact that radiation is random in nature. Radiation is a quantum event and therefore impossible to be predicted. You can’t predict that some isotope will decay in x direction at x point in time. There are programs like Excel and Matlab that claim to generate random numbers. However, the thing is that these numbers are not entirely random. These software programs actually generate pseudorandom numbers using pre-defined mathematical algorithms.

A “random number generator” based solely on deterministic computation cannot be regarded as a “true” random number generator, since its output is inherently predictable.

How Random Numbers are Made

Since the time of any given radioactive decay is random, then the interval between two consecutive decays is also random. This is the basis for generating a random number.

As shown above, it takes a total of four counts  to generate two periods of a random interval of time.  The period of the first pulse is given the name T1 and the period of the second pulse is given the name T2. When the period of T1 is less than the period of T2, a ‘0’ is written to a bit. If the period of T1 is greater than the period of T2, a ‘1’ is written to a bit. In the above example, a ‘0’ will be written to the bit. If both the periods are the same, the periods will be thrown away and two new pulses will be found.

Once the bit has been written, the preceding bit is put in the queue and the process of obtaining two random periods is repeated. I have programmed the Arduino to generate 8-bit random numbers, so a total of 32 counts are required to complete the random number.

Serial Communication to LabVIEW

I built a VI to plot the incoming CPS data through the serial port. The LabVIEW VISA sub-programming language was used. The VISA driver may be required to run the VI properly.

I used the Serial.println() function in Arduino to send the CPS data through the serial port. On the PC side of things, the VISA Read function reads the bits and returns the data in read buffer.  The string is converted to decimal and sent to the chart. I have also programmed the front panel to display the mean and standard deviation of the data inside the graph. A latched alarm feature is available as well.

This entry was posted in Uncategorized. Bookmark the permalink.

Comments are closed.