Introduction: Scintillino - an Arduino-based Quick&dirty Scintillation Counter

Have you ever wondered about the radiation levels around you? Well today you can build your very own detector that measures ionizing radiation and displays data in real-time on an LCD (and also your computer if you want).

The visual design, as seen below, is perhaps a tad short of a Red Dot Award, but it sure works fine. It is a scintillation counter, no less and no more.

In fact, the game was all about doing it with the least amount of effort and nearly no budget, given that we already had a small scintillation crystal (LYSO) and a Silicon photomultiplier (SiPM) at hand. (Those were the only two expensive parts, at roughly $100 each. Sigh... We know...).

Our scintillator was supplied by Andy of The SiPM is a KETEK one because they have a low breakdown voltage of 25V which makes it really cheap to bias them at around 30V....

What you will need:
- a scintillator crystal (we used a 1cmx1cmx2cm LYSO (Lu2Si2O7:Ce3+) but most any scintillation material should do)
- a Silicon photomultiplier (we prefer that over a PMT because HV biasing is easier and they are also harder to destroy)
- resistors, capacitors
- two fast rail2rail op-amps
- a simple DC-DC step-up converter off eBay
- a piezo buzzer for added dramatic effect
- Arduino Uno board
- LCD Keypad Shield (or another LCD, with minor adjustments to the Arduino sketch)
- soldering iron and tin (we use, lovingly, the old school non-ROHS stuff that will kill you etc etc yada yada)
- cardboard (for the motherboard), nylon ties
- a bunch of wires
- something to hold your SiPM tight against your crystal (we drilled holes into a scrap piece of thick plastic)

Now let's get started!

Step 1: Setting Up the Scintillation Detector

Scintillators work by eating up a gamma-ray and then emitting a burst of several thousand photons of visible light within the next few nanoseconds. This meagre amount of visible light is detected by a Silicon photomultiplier and converted into a pulse of electrical current.

To measure light flashes this dim, we must obviously prevent any daylight from entering the detection chamber. For this reason we've constructed a cardboard box to enclose it.

Inside, we used a machined piece of thick plastic (because we had it, but duct tape or transparent epoxy would do, too) and some upholstery foam to press the scintillation crystal against the SiPM. You want good optical coupling here. The faces of the scintillator that are not facing the SiPM are wrapped in white teflon tape (yes, plumbing tape from HW store) to reflect as much light as possible toward the SiPM.

The top half of the box is a bit larger to fit over the bottom half. Make V cuts on both the bottom and the top half (as seen on the picture), so that you will be able to route the cables out of the box.

Tip: Depending on which you do first, the plastic or the box, make sure that the latter will fit the former.

Cover the scintillation thing with aluminium foil before closing the box. This will help keep out stray light....
... and your detector is ready!

Step 2: Some Very High-fidelity Nucleonics Comin' This Way...

Front-end electronics.

The left side is the basic plain vanilla SiPM biasing circuit. Powered at 30V through the 10k resistor, with the ultra-fancy transimpedance stage being the 47ohm at left bottom. This is capacitively coupled to a two-stage discriminator that fires when the input pulse is large enough. Any fast rail-to-rail op-amp will do, and so does OPA2354 by Texas.

The hard part was soldering the darn smd package by hand to an old DIL socket. A shot of Gin steadied the hand and then all went well.

Ugly? Yes.
Works? Absolutely.

Step 3: DC-DC Step-up Converter 5V to 30V

An LM2577 DC-DC adjustable step-up board. $3 off eBay from seller BuyInCoins.

Solder a wire to each end of the IN side (IN+ and IN-) and connect them, respectively, to 5V and GND of Arduino.
Similarly for the OUT side,  the "minus" is the same as IN-, and OUT+ is the 30V "HV" bias for the photosensor.

Turn the screw on the blue multi-turn pot to get to 30V output.

Step 4: Programming the Arduino Board

For this step I'll assume that you already have Arduino IDE installed. (if not, you can check out on a tutorial on how to do just that.

Upload the code below to the Arduino board, mount the LCD screen.

Note: We're using an "eBay LCD keypad shield" with pinout defined as lcd(8, 9, 4, 5, 6, 7).
If you're using another LCD, you might need to adjust the LCD connection pin numbers in the code.

This is the code we used:

#include <LiquidCrystal.h> // includes necessary library
int INPIN = 2;      // input pulses on pin 2
int buttonPin = A0; // input button on pin A0
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);  // connections to LCD
int OUTPIN = 3;  // output pulses on pin 3
volatile long int numint = 0;  // counter for input pulses
int safevalue =500;   // initial value of number of pulses considered safe
void intservice(void)  // this is called for every input rising edge

void setup() {
  pinMode (buttonPin, INPUT);
  pinMode(INPIN, INPUT);
  pinMode (OUTPIN, OUTPUT);
  digitalWrite(OUTPIN, HIGH);
  digitalWrite(INPIN, LOW);
  attachInterrupt(0, intservice, RISING);  // attach interrupt routine

void loop() {
int avalue;

  lcd.setCursor(0, 0);
    lcd.print(numint);     lcd.print("cps");  lcd.print("      "); //print number of pulses in counts per second(cps)
    avalue= analogRead(buttonPin); //variable for button input
    if (120<avalue && avalue<150 &&(safevalue >=0 && safevalue <  1000)) {safevalue=safevalue+100; goto finish;} //upon pressing the up button, safevalue increases by 100 while lower than 1000
    if (270<avalue && avalue<320 &&(safevalue > 0 && safevalue <= 1000)) {safevalue=safevalue-100;}              //upon pressing the down button, safevalue decreases by 100 while lower than 1000
    if (120<avalue && avalue<150 &&(safevalue >=1000 && safevalue< 10000)) {safevalue=safevalue+500;}        //upon pressing the up button, safevalue increases by 500 while higher than 1000, up to 10000
    if (270<avalue && avalue<320 &&(safevalue > 1000 && safevalue<=10000)) {safevalue=safevalue-500;}        //upon pressing the down button, safevalue decreases by 500 while higher than 1000
    lcd.print(safevalue); lcd.print("    ");  //prints current safevalue
    numint=0;  // zero counter
    if (numint > safevalue){digitalWrite(OUTPIN, LOW); // beeper beeps if pulse count is higher than allowed
  digitalWrite(OUTPIN, HIGH);
    else {digitalWrite(OUTPIN, HIGH);}
  Serial.println(numint);          // print pulse count to serial

This code programs the Arduino to count gamma-rays (or other energetic stuff that dumps at least some 20keV at a time in the crystal) detected by the scintillation detector, in counts per second (cps). It will also send a signal to the beeper (that we will be connecting in the next step) if the value is higher than a selected "safe" cps level. You can change the preset safe value by pressing the up/down button on the LCD Keypad Shield. Events can also be monitored an a computer via a serial monitor when the Arduino board is connected to the PC via a USB cable.

Note: We will be using a USB cable to power the Arduino. If you want to make the whole thing portable, follow these instructions to power the Arduino from a battery, or simply buy a soldered one online.

Step 5: Connecting the Beeper - the Cool Part That Annoys the Office...

Again a $2 eBay purchase.
Connect ground to ground (gnd) on Arduino, vcc to voltage (5V) and I/O to pin number 3. It's an active buzzer that only needs a pin pulled low (no bit-banging) to beep.

The code is written such that it will chirp every second if the CPS levels are above the set threshold.

Step 6: Putting It All Together

All of it together and clicking away...

Get creative and make it look nicer. You could put it in a box, add custom decorations... 
Now go measure radiation to your heart's content!

Leave a comment on your experience making this project!

Rok & Matjaz
JSI and PhysEng


olafmarzocchi made it!(author)2016-08-30

Could you please provide a quote for the price of the SiPM and scintillator? so that we can compare with other options.

Also, you should NOT use the interrupt that way... each interrupt call takes at least 80 cycles, probably more:

Your maximum frequency will be CPU/80=200 Kcps (VERY optimistic!!). Use the T1 pin as external clock input for Timer1, so that you can read up to CPU/2.5= 6 Mcps.

Also, even if you don't have so many cps, with your code many pulses will be "missed" during the processing of the previous one and the value you obtain may not be reliable (unless you are VERY below the maximum, so up to 1 Kcps is ok).

Read here

olafmarzocchi made it!(author)2016-09-09

25 dollars per SiPM, 3x3 mm

skhare made it!(author)2014-10-08

Why do you need two stage discriminator? Why cant it be simple one rail2rail op-amp?

door144 made it!(author)2014-04-06

This was a lot of fun to build just at the last steps but for some reason cant get it to read anything back but 0. Any pointers?

mvencelj made it!(author)2014-01-22

Hi, actually, you don't need to bring 3V3 to power the op-amp. I fixed my comment on the schematic. 5V pin could be able to give you more current if the 3V3 onboard regulator cannot. See if this helps... and ask again until we get it working for you! :)

BTW, do you have any oscilloscope available for debugging this?

booliminator made it!(author)2013-11-19

can you help me out with building the discriminator and biasing circuits? There is no description here on how to build those. Which parts will I need?

mvencelj made it!(author)2014-01-03

Hi, sorry for my replying so late - haven't figured out yet how to set alerts based on comments here. :)

The full schematics of the discriminators and the biasing circuit are described in step two. Can you please tell me exactly what part of that you need help with? The functions of the various circuit parts or the implementation - i.e. soldering and stuff?

booliminator made it!(author)2014-01-16

Im having trouble getting the right SIPM I have a PM1150 but it has 4 outputs and is really small. What did you use? Do you know where I can buy one I really want to make this project. Im also having trouble following the steps on how to build the discriminator?

mvencelj made it!(author)2014-01-22

My diode was a PM3350. I cannot find Ketek's documentation for your PM1150 on their web site, but in principle it should work for you. Maybe ask Ketek for a datasheet? Then we can figure out the connections.

Anyway, SensL and Ketek would both definitely sell you one if you want. For one piece, they probably would ask between $50 and $150.

booliminator made it!(author)2014-01-17

Ok I know im driving you crazy lol. The image is what I built so far. the issue im having is 3.3v VCC or the gold wire looks to be shorting out the arduino. Also where does the out- go on the DC DC step up? Is there any way I can have more photos :P

reinlar made it!(author)2013-08-15

I love this, and think everyone should have one running 24/7 near their computer, or wherever they spend most of their day. Knowing the exact moment you're being exposed to a nuclear event, could help you minimize exposures, and save lives. That is a good thing in this era of "dirty bomb" threats. But since there are (2) high priced components (as you mentioned), I think you would be better off buying a $25-$50 Civil Defense 1950's era radiation detector, and wiring it to a 12 v. power supply so it could run 24/7, without the batteries. It would also allow you to distinguish between, Gama, Beta, and Alpha sources that have contaminated your home's air, with an audible alarm, and analog needle reading showing exact background levels. Just a thought on a cheaper way to do it. Also, I'm told smoke detectors use a radioactive source & detector (which is modulated by visible smoke). Could a smoke detector offer a cheaper source for your detector circuit??? Just wondering?

mvencelj made it!(author)2013-08-19

Sorry, forgot 'bout the smoke detector.
The detector part in those actually measures electric current in air.
Alpha radiation from the Am-241 ionizes air and makes it conducting. (Smoke particles attach to ions and hinder the effect).
So this is in effect a tiny gas detector called "ionization chamber". The trouble is that it is very insensitive. It works in a smoke alarm only because very close (millimeters) to the Am source, the radiation field is in fact rather high.

mvencelj made it!(author)2013-08-19

I agree - you're completely right. One doesn't usually take expensive parts and reduce them to an oversimplified instrument, such as this GM tube equivalent.
We simply had the parts in the drawer and decided to have fun.
Boundary conditions were: this crystal, this SiPM, Arduino, least work. :)

james.m.k made it!(author)2013-08-15

Very nice! I've always wanted a radiation detector.

So this is basically like the old WWII clicking detectors?

mvencelj made it!(author)2013-08-19

Yep, in the sense that it merely counts (as opposed to measuring the kinetic energy of) the gamma rays. The difference is that in the old clickers, the sensor was a gas tube with two electrodes that sparked upon radiation, while here we first convert the radiation to visible light and than detect flashes of the latter.

kelseymh made it!(author)2013-08-12

Sweet! A nice alternative to the G-M tube projects, and once close to my heart -- we used thallium-doped CsI for the electromagnetic calorimeter in BaBar, with SiPM's glued onto the ends. They're small enough that they work nicely in a magnetic field.

Do you get enough light pickup with the one PM to calibrate your energy scale?

mvencelj made it!(author)2013-08-14

Thanks kelseymh, at this stage it's only a counter, so no energy calibration needed. However, see scope traces in updated step 2... You can actually make out the 1274 and 511 keV lines of Na-22, as well as the Compton continuum. So yes, it looks like there would be enough light...