Semiconductor nuclear-radiation sensor: part II

There are many ways to measure radioactivity level, semiconductor detectors sense interactions between ionizing radiation and p-n junction. Because in hobbyist area most popular are Geiger-Muller based detectors (in short: not a semiconductor but lamp based devices), I think it's a cool idea to take a look at this approach.

In this post I will present such home-made sensor and a set of software to parse collected results.

Picture below presents circuit of the sensor that I made, it consist of a photodiode that acts as a sensor, transimpedance amplifier and "regular" amplifier. I've selected op-amps that has little input noise.

Changes that I made during testing the device, that are not presented on the diagram:

  • D1 is BPW34
  • U1 is OPA657U
  • U2 is OPA656U
  • 2p capacitor is connected in parallel with R6
  • 820k resistor is connected between U2 out and BNC socket.

Below is visible sensor in enclosure and without it. Because the device is sensitive for background EMI and light noise, a metal housing is needed. To increase exposure of the sensor to the radiation, where it is, in the housing, a hole is made and just a tiny adhesive metal tape is covering it.

Because the housing was used in different projects, a lot of holes was made and a lot of additional tape was needed to cover them.

PCB was cleaned using cheap ultrasonic washer and isopropyl alcohol to avoid flux residues.

Diagram below presents how the sensor is connected. All diagrams were created using LATEX, and can be automatically regenerated using documentation/creatediagrams.h script.

Sensor and oscilloscope are connected via BNC cable, not via a regular probe because. BNC-BNC connection is more mechanically stable and can be used here.

Oscilloscope is used as a dirty hack because I don't have yet a circuit to convert analog output of the sensor to digital form. It's connected with Nucleo board via it's trigger out, so when the trigger occurs, the state is high for some moment. Coupling is set to AC to skip DC bias. Level of the trigger is set in a way that pulses are visible when the sample (that is radioactive) are visible and aren't when no sample is present. It's not the best way, but it works.

Below is a sample "count" occurrence.

To collect and easily display of the data, I used a STM32F103RBT6 board, output of the sensor is connected to a pin that raises external interrupt. On interrupt, counter is increased, each 60 seconds, counter value is presented on the display (making bar graph) and its value is send to the host CPU (Raspberry PI) for further processing. The board is powered via USB.

To analyze the data in detail, I made set of scripts on Raspberry, theirs connections are presented below. It all could all be just written in Python but I don't like visual appearance of its plotting libraries, therefore python part is storing data into .cvs, that is periodically transformed into a diagram by a R script. The R script is based heavily on the one that I used to communicate with my bench multimeters (click to go to the article).

Regarding running the scripts, in one terminal (i'm using Linux screen command-line tool), a python script is executed. In addition of creating output file, it will also print collected data to STDIO. Sample usage is below:

root@raspberrypi:/home/pi/repositories/SemiconductorRadioactivityDetector/software/presentation# python3 ./

In a second window, the R script is run to parse the data into a .png image. Output file has theirs creation timestamp as part of file name. Sample usage below:

root@raspberrypi:/home/pi/repositories/SemiconductorRadioactivityDetector/software/presentation# Rscript script.R
Loading required package: lattice
Loading required package: RColorBrewer
Loading required package: gridExtra
Loading required package: grid

Regarding results, here are some of meassurements.

Measuring an old military compass with radioactive tips:

Measuring thorium welding rods:

Measuring background radioactivity:

All project files can be downloaded from my Github, branch name is feature/hw_rev_3_0 .

That's all, thanks for reading :-)


  1. Brilliant work! Btw, what kind of photodiode you are using, is it necessary to use a PIN diode?

    1. Hi,


      The diode is BPW34 because it has big p-n surface and is cheap, any similar photodiode can be used.


  2. You destroyed noise performance of OPA657 by thermal noise of (way too low value) R3.
    You need low-valued R3 only in high count rate case.
    The latter stage could have some more lowpass action (why not add 10pF parallel to R6, instead of 2p, to math time constants).

    To boost the performance of the input stage, try to increase the feedback resistor to, let's say - 1GOhm. The value is available in Farnell easily. If you keep the capacitance of C3 constant, the output peak amplitude won't change.
    There's also much more excititing way - to get rid of feedback resistor totally. In that case you also have to close the fedback loop some way. Do do it, you may use a LED as photodiode (while being illuminated by other LED). Small SMD blue-green two-color green LED makes an nice optocoupler with ~10^-6 CTR (blue being illuminated, of course).