ROS 2 · Python · C/C++ · wxPython · Firmware · Controls

I developed the software and control stack for a modified 3D printer that fabricates stretchable liquid-metal strain sensors. My work covered ROS 2 architecture, printer-dispenser synchronization, the operator interface, firmware changes, calibration, and automated sensor characterization.

Physical liquid-metal printing system

Sensor Fabrication

The process prints gallium directly onto a cured silicone substrate, then encapsulates the trace beneath a second silicone layer. Compared with the earlier mold-based injection process, direct printing makes it much easier to change sensor geometry without building new tooling for every design.

Completed liquid-metal strain sensor
Completed stretchable strain sensor fabricated with the printing process.

ROS 2 Control Architecture

I separated motion, pneumatic extrusion, and the user interface into independent ROS 2 nodes. That keeps the printer’s G-code stream isolated from slower user-interface and dispenser operations during a print.

  • Printer node: streams G-code to the Prusa i3 MK3S+, handles mold-alignment transforms, and reads serial responses on a dedicated thread so command writes stay non-blocking.
  • Dispenser node: implements the Nordson Ultimus V serial protocol, including framing, checksums, and command handshaking.
  • GUI node: handles jogging, registration, parameter tuning, and emergency-stop commands without interrupting print execution.
ROS 2 control architecture
ROS 2 architecture separating printer motion, pneumatic extrusion, and the user interface.

Interface and Registration

I built the operator interface in wxPython for manual control, calibration, and live process tuning. It can jog and home the printer, send raw G-code, control the dispenser, adjust pressure and vacuum settings, and preview transformed toolpaths before a print starts.

The registration workflow records four physical reference points and computes the transform needed to align generated paths with a mold. Saved registration profiles make repeat setups much faster; the workflow reduced setup time by about 70%.

Liquid-metal printer control interface

Firmware and Calibration

The stock printer firmware was written for thermoplastic extrusion, so I modified the C/C++ firmware for the heavier syringe toolhead and external gallium heater. This included thermal limits and fault handling, lower acceleration and jerk, and updated thermistor calibration.

Repeatable deposition also required tuning the relationship between motion speed, pressure, nozzle height, and pneumatic timing. I used pressure sweeps and calibration patterns to reduce pooling, broken traces, and start/stop artifacts, and adjusted multilayer paths to avoid unnecessary repositioning moves.

Liquid-metal pressure sweep experiment
Pressure sweep used to compare trace continuity and pooling at a fixed feed rate and nozzle height.

Sensor Characterization

Once the printing process was repeatable, I automated the characterization workflow. Python scripts control a Dynamixel-driven test rig, run repeatable displacement profiles, and log force and resistance measurements in sync. Post-processing aligns repeated trials so changes in electrical resistance can be compared against mechanical deformation.

Experimental setup for liquid-metal sensor characterization
Experimental setup used to characterize the fabricated sensors under controlled deformation.

← All projects