Paul FOLTZEREmbedded systems · AI
FR
All projects
Personal projectOn holdSince August 2026

DIY optical tomography scanner

A 3D optical tomography scanner: mechanics, firmware and reconstruction, end to end.

Building a home-made optical tomography scanner: a sample rotates on a motorised turntable while a camera captures images from many angles, later reconstructed into a 3D volume.

Exposure calibration interface for the IMX477 camera
Home-made exposure calibration tool for the IMX477 camera: it automatically finds the longest exposure with no saturated pixel.

Acquisition runs on a Jetson Orin Nano Super (JetPack 6.2.3) paired with an Arducam IMX477 camera on the CSI port, alongside a NUCLEO-L476RG board driving a NEMA17 stepper motor through a DRV8825 to rotate the sample precisely (200 steps per revolution).

The motorised turntable (NEMA17 + DRV8825) rotating during acquisition.

The intended software pipeline chains synchronised acquisition (rotation plus capture), image pre-processing (greyscale, flat-field), extraction of projection profiles, sinogram construction, then tomographic reconstruction with scikit-image (iradon) to stack the slices into a 3D volume.

What the camera sees during acquisition: the sample, backlit by the red panel, stands out as a crisp silhouette. That contrast is exactly what the pipeline then uses to extract projection profiles.

The project was also a chance to debug very concrete hardware problems: a specific device-tree overlay required to get the IMX477 camera working properly on the Jetson, and a loose power connection that mimicked a dead motor.

The project is currently on hold, blocked on rotation. The motor turns, but not reproducibly: in full-step mode the NEMA17 enters its resonance band at certain command rates, the rotor starts oscillating instead of advancing cleanly and loses synchronism — it drops steps without raising any error. Only one genuinely clean run, a continuous full revolution, was ever obtained, at roughly 250 steps per second; dropping to 125 steps per second brings the problem back every time.

That is blocking for this particular project, because tomography requires knowing the exact angle of every image: a single lost step corrupts the whole reconstruction, and nothing in the current setup can detect the loss. The avenues to explore are standard but need bench time — switching back to microstepping to smooth the torque and move out of the resonance band, tuning the DRV8825 current limit, adding an acceleration ramp instead of starting at full rate, and above all instrumenting the rotation with a position sensor to measure the real angle rather than assume it.

The bench as it stands: the backlit enclosure with the turntable and the IMX477 camera, then the lab power supply and the DRV8825 wiring on breadboard — the power chain at the heart of the rotation problem.

Key points

  • CSI camera integration on Jetson (device tree, overlays)
  • Stepper motor control synchronised with acquisition
  • Tomographic reconstruction pipeline in Python