Open hardware for a simple, yet powerful scintillation counter and multichannel analyzer (MCA) all-in-one device using a popular NaI(Tl) scintillation crystal. Suitable for (DIY) gamma spectroscopy while being significantly cheaper than any off-the-shelf platform.
Hardware design has been done with EasyEDA and all the needed files for you to import the project as well as the schematic can be found in the hardware
folder. There is also a Gerber file available for you to go directly to the PCB manufacturing step.
The software aims to be as simple as possible to understand and maintain; to achieve this I decided to use an off-the-shelf microcontroller - the Raspberry Pi Pico. This board can be programmed with the Arduino IDE over micro-USB and is powerful (dual core, good ADC, plenty of memory, ...) enough for the purpose and also exceptionally cheap.
This project is also on Hackaday.io!
Here are some of the most important key facts:
- Compact design: Only 60 x 60 mm (not including scintillator).
- All-in-one detector: No external sound card required.
- Micro-USB serial connection and power.
- Easily programmable using the Arduino IDE.
- Low-voltage device: No HV needed for PMT.
- Low power consumption: ~25 mA @ 5V.
- Geiger Mode: Capable of up to 30,000 cps without energy measurement.
- Default Mode: Capable of up to 10,000 cps while also measuring energy.
- 4096 ADC channels for the energy range of about 30 keV to 1300 keV.
This project utilizes a silicon photomultiplier (short SiPM) which is way smaller and more robust than a traditional photomultiplier tube and does not need a high-voltage supply. Here are some very helpful in-depth datasheets about this particular SiPM:
- C-Series SiPM Sensors datasheet
- Linearity of the Silicon Photomultiplier
- Introduction to the SiliconPhotomultiplier (SiPM)
- Biasing and Readout of ON Semiconductor SiPM Sensors
The hardware consists of the main detector (hardware
folder) which includes amplification, pulse detection and energy measurement. If you already have a SiPM/crystal assembly you may use it with the detector board by leaving the pin header out and soldering wires directly to the pads. Otherwise, you can use my SiPM carrier board and plug it directly into the pin header.
The heart of the detector board is the Raspberry Pi Pico which uses its ADC to measure the pulse amplitude (i.e. the energy) immediately after an event occurs using an interrupt. I can really recommend you reading the datasheet or maybe also having a look at a deeper analysis of the Pico ADC:
Here are some renders of the detector PCB. Size is roughly 6 x 6 cm.
The finished SiPM carrier board is there to allow for easier packaging with the scintillator as well as to be reusable for different detectors as that's by far the most expensive part and you'll want to use it as long as possible. You need to apply some optical coupling compound between the SiPM and the crystal window to reduce reflections as good as possible (this way the best photon detection efficiency is achieved). There are also special materials for this use case but you can use some standard silicone grease - works great for me. After you applied some, you press both parts together and wrap everything with light-tight tape, again, I'm just using some black electrical tape here. That's essentially it, now you plug the board in and you're ready to go.
I got all of my scintillators (used NaI(Tl), LYSO, ...) from eBay. Just search for some keywords or specific types, you'll definitely find something! Otherwise you can obviously also buy brand-new scintillators, however, these are very expensive (depends, but a factor of 10x is normal). Just be sure to look out for signs of wear and tear like scratches on the window or yellowing in NaI crystals as these can deteriorate performance significantly.
Programming is done using the Arduino IDE. The so-called "sketch" can be found in /arduino
.
To program the Pico you will need the following board configs:
The installation and additional documentation can also be found there. You will also need the following libraries. In addition, I wrote my own little library to calibrate the Pico's ADC using a simple linear calibration which is also used:
They can be installed by searching the name using the IDE's library manager.
You can also control your spectrometer using the serial interface. The following commands are available, a trailing -
indicating an additional parameter is needed for the call.
Commands:
read temp
reads the µC temperature in °C.read vsys
reads the board's input voltage.read usb
true or false depending on a USB connection. Thus always true if you can read it.read cal
reads the calibration values from Arduino-Pico-Analog-Correction.read spectrum
reads the histogram data of all energy measurements since start-up.set mode -
use eithergeiger
orenergy
mode to disable or enable energy measurements respectively. Geiger mode only measures counts per second, but has a 3x higher saturation limit.cal calibrate -
calibrates the ADC using Arduino-Pico-Analog-Correction. The parameter being the number of measurements used to average the reading, e.g.cal calibrate -5000
.ser int -
Enable or disable the event serial output. Takesenable
ordisable
as parameter, e.g.ser int -disable
.ogc info
prints misc information about the firmware.
To get the data from the detector the serial-over-USB port is used. You can of course use any serial monitor or dump the output to a file, etc.
I have also programmed a custom analyzer web-app called Gamma MCA where you can import these serial output files as well as connecting straight to the serial port and plot the data live. Please head to the repository to find more specific info about this project.
Spectrum of a tiny (~5g) LYSO scintillator showing all three distinct gamma peaks (88.34, 201.83, 306.78 keV) with an additional ~55 keV X-ray peak:
Spectrum of a standard household (ionization) smoke detector. Contains roughly 0.9 µC of Am-241. Gamma peaks at 26.34 and 59.54 keV:
Spectrum of a small tea cup with pure Uraninite (Pitchblende) glaze. You can see isotopes of the Uranium series and also a distinct U-235 plateau.
The Raspberry Pi Pico's ADC has some pretty severe DNL issues that result in four channels being much more sensitive (wider AC input range) than the rest. For now the simplest solution was to discard all four of them, by printing a 0
when any of them comes up in the measurement (to not affect the cps readings). This is by no means perfect and I hope this gets fixed in hardware soon.
During operation all the electronics including the photomultiplier naturally slightly heat up. Due to the detector board being connected only by a single pin connector all of it's heat shouldn't affect the SiPM PCB much. Also due to the SiPM being connected to a rather big copper area of the PCB it's heat should not increase the temperature much over ambient (if at all that is). So air or water cooling alone won't improve performance significantly. However, you could cool the SiPM PCB with a peltier module to sub-ambient temperatures. According to the datasheet AND9770 (Figure 27) every 10°C reduction in temperature decreases the dark count rate by 50%! But be sure to correct the overvoltage in this case as it also changes with temperature.
Note that the required breakdown voltage of the SiPM increases linearly with 21.5 mV/°C, see the C-Series SiPM Sensors Datasheet. This means that you would also need to temperature correct the PSU voltage if you wanted to use it with considerably different temperatures.
Shielding the ambient background can be done ideally using a wide enough layer of lead (bricks) all around the detector with a thin layer of lower-Z material on the inside (to avoid backscattering). The SiPM and the sample can then be put into the structure to get the best measurements possible (low background).
See Wikipedia: Lead Castle
Thanks for reading.