TL;DR. i3mega-pipettebot turns a used Anycubic i3
Mega 3D printer plus a DLAB dPette+ electronic pipette into a
disposable-tip 96-well pipetting robot. Total reference build: ~$150.
Marlin firmware runs unmodified — the print head and PCB are
physically removed; the chassis becomes a bare 3-axis gantry with the
pipette mounted on the carriage. A separate USB-serial link talks to the
pipette. Python drives both. Apache-2.0. Also supports the Geeetech
A30 (Smartto firmware) via the same library.

The cost gap
Commercial pipetting robots start at five figures. Even the well-loved open-source builds start near a grand. Pipettebot collapses the gap:
| Solution | Cost | Tips | API control |
|---|---|---|---|
| i3 Mega (used) + dPette (new) + this repo | ~$150 | Disposable | Python |
| A30 (used) + dPette (new) + this repo | ~$200 | Disposable | Python |
| Science Jubilee + OT-2 pipette toolhead | ~$900+ build | Disposable | Python |
| Opentrons OT-2 | from $15,950 | Disposable | Python |
Sources: Opentrons price is the vendor list; Jubilee figure is a community build estimate anchored at the Science Jubilee project (OT-2 pipette toolhead build). Used i3 Mega and dPette prices are market estimates from secondary listings (no canonical source — verify locally).
Disposable tips matter: cross-contamination is the failure mode that kills amateur lab automation. The dPette+ uses the standard SBS-pitch tip stack.
The hack
The insight: a consumer FDM printer is already a precise 3-axis motion platform. The only parts you don’t need are the print head, hotend, and extruder PCB. Strip those, mount the pipette on the bare carriage, and you have a gantry that can move a tool to any (x, y, z) in the build volume.
Firmware stays stock. No Klipper flash, no Marlin patch, no Arduino work. The PC is the host:
host (Python)
│
├──→ /dev/ttyUSB0 ──→ Marlin (gantry, G-code over 250000 baud)
│
└──→ /dev/ttyUSB1 ──→ dPette+ (pipette, USB-serial)
The library auto-discovers firmware family from M115 and dispatches per
platform: plain G28 on Marlin/i3, polled-Z descent on Smartto/A30 (stock
G28 Z is broken on A30). Calling code just writes bot.move_to(x, y, z)
and bot.aspirate(volume) — the family-specific quirks are isolated in a
safe_home dispatcher.
Pipette as a Protocol
The pipette interface is _Pipette (Python Protocol). The dPette+ is the
reference implementation, wired in via dpette-usb-driver by
Lambda-Biolab.
Swapping in a multichannel head or an open-source pipette is a matter of writing a new adapter against the protocol. The gantry side does not change.
What runs
After hookup, preflight (no motion sent, just firmware probe):
uv run tools/preflight.py
The canonical end-to-end demo — full 96-well plate fill with real aspirate/dispense at the dPette+:
uv run examples/showcase_v0_i3_full_pipettebot.py
Gantry-only mode runs if PIPETTE_PORT is unset (motion executes for real,
aspirate/dispense are log-only stubs). Useful for cabling bring-up before
the pipette arrives. Project tooling uses uv by Astral.
Experiment profiles (TOML) drive cycle counts, per-cycle volumes, and reservoir gradient notes. Motion profiles (SLOW / MID / FAST) tune gantry acceleration via M203/M201/M204/M205 for liquid-handling-friendly moves.
Companion tools
A pipetting robot is one node in a wet-lab loop. Two siblings cover the gaps:
so101-biolab-automation— dual SO-101 robot arm that retrieves the used-tips bin from the deck after the i3 homes. The gantry is precise but rigid; the arm is flexible but less precise. Different failure modes, complementary.CellPlateVision— image-based confluence estimation for round Petri dishes, with eLabFTW ELN integration. Closes the loop on the outcome side: pipette → grow → image → measure → report. OpenCV / Cellpose / Fiji backends; Apache-2.0.
Limitations
The repo is honest about what’s out of scope:
- No deck library, no soft limits, no calibration auto-routine yet — caller
passes raw
(x, y, z). - Aspirate verification (Hamilton-style MAD / TADM pressure monitoring) is surveyed in the repo but not implemented.
- Stage 1+ firmware integration (modified Marlin, UART tap to dPette) is deliberately out of scope for the PC-as-host architecture.
The thesis: pipetting cycles are slow (seconds per move, seconds per aspirate); USB-serial round-trip latency (~20–50 ms) doesn’t matter. PC hosting buys you Python’s ecosystem at near-zero motion-control cost.
Why this matters
A wet-lab person can stand up a working pipetting robot for the price of a used 3D printer and a used pipette. That’s a different ceiling from “buy an Opentrons or write a grant.” Disposable tips solve the cross-contamination foot-gun. Python on a host PC means existing analysis code reaches the deck.
Quick answers
How much does the reference build cost? ~$150 — a used Anycubic i3 Mega plus a DLAB dPette+. The A30 variant is ~$200.
Do I need to flash custom firmware? No. Marlin (on the i3 Mega) and Smartto (on the A30) run unmodified. The print head and PCB come off the carriage; everything else stays stock.
Does it use disposable tips? Yes. The dPette+ uses standard SBS-pitch disposable tips. Cross-contamination is the failure mode that kills amateur lab automation; disposable tips solve it directly.
Can I use a different pipette? Yes. The pipette interface is a Python
Protocol (_Pipette). Writing a new adapter for a multichannel head or
an open-source pipette doesn’t touch the gantry side.
Does it work with other 3D printers? Currently i3 Mega (Marlin) and
Geeetech A30 (Smartto) are first-class. The library auto-detects firmware
family from M115 and dispatches per platform.
What’s the license? Apache-2.0.
Acknowledgements
- Lambda-Biolab for
dpette-usb-driver. - The Science Jubilee community for the open-source liquid-handling reference build.
- The Marlin firmware project — the unmodified target this build depends on.