ultr4rick

The high-end big sibling of pic0rick

ultr4rick

Why another board?

pic0rick was always meant to be the simple one: a plain old Raspberry Pi Pico, a few PMODs, no FPGA, no BGA. It does that job well, and it keeps shipping to people around the world. But every time someone used it for real non-destructive testing, the same wishes came back: more power on the pulser, more channels, faster sampling, and please do the maths on the board.

So ultr4rick is the answer to that list. Same philosophy (open, hackable, documented), one notch up on everything. And for the opposite direction, there’s minUS, the minimal one. Between the two, pic0rick sits happily in the middle =)

What’s on it

It’s built around an RP2350B, the bigger brother of the RP2040, with:

  • a 10-bit, 60 MS/s ADC (AD9215) behind an AD8331 variable-gain front end, with the gain set by a small MCP4812 DAC;
  • a bipolar HV pulser driven by two logic lines (A for negative, B for positive, both for damping), fed by its own SEPIC high-voltage supply;
  • a 16-channel HV mux (MAX14866), with 8 U.FL element connectors on the back;
  • a uSD slot, an RGB status LED on I2C, and USB-C.

The board running with a transducer

It runs off USB-C, about 1 W on the meter when acquiring. Not bad for a board with a high-voltage pulser on it.

The DSP bit

The part I’m happiest with: the firmware computes the Hilbert envelope (and A-law compression) of each 4096-sample capture directly on the RP2350. No need to ship raw RF to a laptop to see something useful. The board sends you the envelope, ready to plot.

Here’s the mux in action, each element in turn on transmit and receive, with the raw trace on top and the on-board envelope below. You can see echo trains on some of the elements, about every 13 µs on one and every 20 µs on another:

Raw and envelope captures for mux elements 1 to 7

How it came together

This one was very much a team effort with friends: board design and reviews over the summer, the first boards delivered at the end of July, then a few rounds on the ADC, the LP and the mux. The firmware and the Python library grew alongside, and this October the documentation got finished, with first NDT tests on a steel block. Next steps: the OSHWA certification and the tweaks listed in the repo’s TODO for the next revision.

Using it

The firmware is Pico SDK C, with two builds: a plain text REPL, and one with on-board DSP and binary frames. Flash the UF2, then drive it from Python:

from ultr4rick.device import Ultr4rick
probe = Ultr4rick()          # finds the board over USB
frame = probe.read_fft()     # 4096-sample Hilbert envelope

Usual disclaimer: the pulser generates high voltage. The firmware boots with it disarmed. Only arm it with a transducer connected, and disarm it afterwards.

So…

It lives on GitHub: kelu124/ultr4rick, with KiCad files, firmware, the Python library and notebooks. Hardware under TAPR OHL, code under GPL-3.0, docs under CC BY-SA 4.0. If you build one, or point it at something interesting, let me know!