Description
Mu is a small standalone particle detector built for the UL Aeronautics Society Ogma flight computer stack. The idea is to put a muon detector in a rocket and see whether the count rate changes as it climbs through less atmosphere. It doesn't need the rest of the stack: it has its own battery input, onboard flash, pressure sensor, and firmware logger, so worst case it can fly as a blackbox wrapped in electrical tape.
The detector is a 50x50x20mm BC-408 plastic scintillator coupled to an OnSemi MicroFC-60035 6x6mm SiPM. The SiPM is biased at about 30V, filtered through small 50 ohm resistors and local capacitors, then read by an OPA656/OPA814-class transimpedance stage sitting around a 2.5V virtual reference. The STM32 samples the output using ADC DMA into a circular buffer, watches for negative-going dips from the rolling baseline, and logs pulse records to flash: timestamp, baseline, amplitude, and a short waveform snapshot. It also logs MS5607 barometric pressure, temperature, and altitude once a second, so the particle data can be lined up with the flight profile afterwards.
The charge-sensitive preamp was initially specced with a 10MΩ feedback resistor. After reducing that to an effective resistance of roughly 264kΩ, the 330pF feedback capacitor set a decay time constant of about 87µs. The flight firmware samples every 10µs, so it can read the stretched pulse rather than trying to catch the original nanosecond event.
I reached out to Luxium Solutions and was sponsored a 50x50x50mm cube of BC-408 scintillating plastic. I cut the 50x50x20mm detector from it using the tools in the University of Limerick's workshop, then polished it using acrylic scratch remover that one of the lab technicians found. I also reached out to a former Onsemi Principal Engineer for advice on the readout circuit in the initial stages.
I posted our initial schematic and PCB designs onto r/PCB with Ogma, then posted a final Mu review. Within 2 reviews of being confidently incorrect, u/Physix_R_Cool reached out with a proven TIA schematic and layout that he had used for his own SiPM projects, including at ISOLDE at CERN. He pointed out that our non-inverting OPA656 stage would delete the 5ns pulse rather than stretch it, then sent us the board files, real pulse captures, and advice on polishing, wrapping, and optically coupling the scintillator. He was also very clear that the TIA design wasn't his, he had just used it and knew it worked.
Progress
The schematic was only half the work. The physical detector fought back constantly. SiPMs are absurdly sensitive, so small light leaks through bolt holes, washers, and even the translucent Molex battery connector were enough to saturate the readout. At one point the board sat at a normal ~48mA in darkness and jumped to 200mA under a microscope light. Covering one spot with my finger fixed it, so it wasn't an analogue instability, just light getting in through gaps in the tape on the opposite side of the board.
Two nights before Mach26 (Scottish competition), in my student accommodation, I filed down the four mounting bolts into a wastebin because light was leaking in around them. They had to be short enough to fully cover. I also coloured in the Molex battery connector with a black Sharpie, because the plastic was just translucent enough to act as a tiny window.
The first version of the feedback network was also way too optimistic. We had specced a feedback resistor of 10MΩ. With the real dark current of a 6x6mm SiPM, the high feedback resistance let the amplifier pull the baseline down toward the negative rail. I added shunt feedback resistors, bringing the effective feedback resistance down to roughly 264kΩ, which kept the baseline inside the STM32's ADC range instead of relying on the MCU's clamp diodes to survive it.
I had a couple board-level mistakes too. I had to reroute the SPI data lines after swapping them, and because the flash and MS5607 shared the same bus, fixing one meant flipping the other. Assembly was a hands-on optics problem: file the mounting bolts, reseat the crystal, wrap the scintillator in PTFE tape†, wrap the whole thing in electrical tape, test it, find another leak, repeat. I also added some needle pin holes for accurate barometric pressure readings.
The first real capture was great craic. I had Mu hidden behind a stack of books in a shallow opening under my desk, sitting on top of some black plastic ribs that were once used to store CD cases. It started recording clean negative-going charge pulses, around 18-31 events per minute across a few sessions, fairly close to the rough 25/min estimate for that scintillator area at sea level. I did not use any sort of optical coupling fluid, and I was very concerned about this (and I tried to source some the week before). After I calmed down, I celebrated by starting to play Zelda: Breath of the Wild at my roommate's offer.
I tested it a handful more times and found an issue where, on battery power, it tried initialising the flash immediately at boot and of course that would fail, so it wouldn't log. It now retries a handful of times at boot and works.
It didn't get a clean run at Mach26. In the payload bay it was mounted too close to a Raspberry Pi 5 heatsink, and the logged temperature around the pressure event (~45°C) was high enough that the scintillator expanded and over-compressed the SiPM against the board. Afterward I could reproduce the fault by tightening and loosening the crystal screws: too much pressure bent the board and shorted it, so the cause was mechanical preload and thermal expansion, not a dead design. After reseating the detector and repairing the disturbed analogue parts, Mu came back.
Next up is a solo L1 flight in mid-August, where Mu flies as its own payload. Mach26 showed me that a particle detector is a lot more than just a circuit, it's an optical seal, a thermal stackup, a mechanical clamp, and a sensitive analogue front-end that doesn't appreciate living next to a hot Raspberry Pi 5 in a confined space for a couple of hours.
† And then cut the window out, rather than just including the opening in the wrapping. The latter resulted in uneven wrapping.
Documentation
Repo: Mu.