Skip to content

96-Well Plate Inverter

Decanting a 96-well plate by hand is the least repeatable step in a wash. You tip it, you flick it, and how hard you flicked is now a variable in your data — worse, a fast tip walks liquid up the well walls and drops it into the next column. This is a printed cradle on a servo: clamp the plate, press the button, and it sweeps through 180° over a waste tray, dwells while it drains, and comes back the same way it went.

The models and the sketch aren’t published yet — that is what the banner at the top of this page is about. The parts list below is complete; the mechanical notes are what to read before you model anything.

How it works

The cradle grips the plate by its skirt. It turns on a horizontal axis: a standard-size servo drives one trunnion, a 608 bearing carries the other, and a single momentary button starts a sweep. There is nothing to home and nothing to count — a standard servo is a position, so “upright” and “inverted” are two numbers and the dwell between them is a third.

Whether it works well comes down to one decision: where the rotation axis sits. Run it through the middle of the plate and the load is balanced either side of the axis through the whole sweep, so the servo carries almost nothing and the motion is as smooth at 90° as it is at 10°. Put the axis under the plate — which is the obvious way to draw it, because that is where there is room — and the plate’s mass now sits above the pivot. Upright stops being a balance point and becomes the top of an arc: gravity pulls the cradle over from the moment the sweep starts, hardest at 90°, and the servo spends the outbound stroke braking a load running ahead of its own gear backlash. The plate arrives inverted faster than it was told to, which is exactly what throws liquid between wells, and no amount of slowing the command down will fix it. The return stroke is the other half of the same mistake — the servo lifts the whole plate back over the top, and that is where a marginal one stalls.

Plate footprints are standardised and heights are not. Every SLAS-footprint plate is 127.76 × 85.48 mm, so clamp on the skirt and the cradle fits everything; clamp on the top edge and it fits one plate type. Design the top bar to adjust, or accept that a deep-well block will not go in.

Parts

Some links below are Amazon affiliate links. As an Amazon Associate I earn from qualifying purchases — at no extra cost to you. It helps keep these guides free. Outside the US, they should send you to your own Amazon store; if one doesn't, searching the part number there will find it.

Two worth adding. A Nano screw-terminal shield turns the whole harness into screw terminals, which matters when the box gets opened wearing gloves. And if you want the inverter to show up in Home Assistant rather than answer only to its own button, an ESP32 DevKit drives the same servo and reads the same button off the same two rails.

The MG996R is roughly 10 kg·cm at 6 V, which is far more than a balanced cradle asks for and about right for one that isn’t quite. If yours ends up nose-heavy, the DS3218 is 20 kg·cm in the same standard servo case — but fix the balance first. More torque only means the servo can hold the offset. It still holds it continuously, it still gets hot doing it, and the sweep is still quicker going over than coming back.

SettingValue
Layer height0.2 mm
Walls4 perimeters on the cradle and the trunnions
Infill25% frame, 40% cradle
SupportsNone, if the trunnion bores print vertically
MaterialPETG for the cradle, PLA+ for the frame, TPU for the pads

Print the cradle in PETG. It is the part that gets wiped with 70% ethanol several times a day and the part that sits over the waste tray, and PLA is the worse choice for both. Nothing here is autoclavable — PETG gives up around 80 °C and an autoclave runs at 121 °C — so design the cradle to be wiped and replaced, not sterilised. It costs an hour of print time to make a spare.

The clamp pads are the only reason to load TPU. Two thin pads under the top bar spread the load across the plate skirt so you can clamp hard enough to hold it inverted without cracking a polystyrene plate. Print them at 0.2 mm and 100% infill; at anything less they compress unevenly and the plate rocks.

Orient the trunnions so the bore axis is vertical on the bed. Printed horizontally the bore comes out oval, and an oval bore in a 608 bearing seat is a cradle with slop in it — which you will see as the plate nodding at the end of each sweep.

Powering it

The servo does not run off the board’s 5 V pin. An MG996R pulls well over an amp starting a sweep and around 2.5 A stalled, and a Nano’s regulator answers that by browning out mid-flip with a plate upside down in the cradle. Set one step-down to 6.0 V with a meter before you connect the servo, feed the servo from there, and tie the grounds together so the board and the servo share a reference.

The board gets the second module out of that 5-pack, set to 5.0 V and wired to the Nano’s 5V pin, which goes in past the onboard regulator. Don’t feed it the 6 V servo rail through VIN — the Nano’s regulator needs 7 V or more to hold 5 V, and 6 V in is exactly where it drops out. USB is fine while you’re still writing code, but pull the 5 V feed before you plug it in rather than have two supplies arguing across the board.

Assembly

  1. Melt the heat-set inserts in while the printed parts are still loose and you can get an iron square to each hole. Every screw in this thing gets undone again — the clamp bar every time the plate size changes — and a tapped-plastic thread will not survive that.

  2. Build the cradle and check the balance by hand. Load a real plate, hold the trunnions between two fingers and let go at 45°. It should stay where you put it. If it keeps falling over, the axis is below the load and has to come up; if it swings back to upright, the axis is above it and has to come down. Move it now, not after the servo is mounted.

  3. Centre the servo before the horn goes on. Power it, command mid-travel, and only then press the horn on so the cradle reads upright. A standard servo gives you about 180° of travel and nothing more, so a horn fitted a few splines out costs you the end of the sweep you most need.

  4. Threadlocker on the horn screw. It is the only fastener taking a reversing load every cycle, and it is the one that will be loose in a fortnight.

  5. Wire it, set both step-downs on a meter, then connect the servo and the board — in that order. 6.0 V and 5.0 V with nothing loaded, checked again with the servo moving.

  6. Set the two endpoints with the plate empty, then repeat with the plate full of water over the sink before it ever sees a sample.

Setting the sweep

Three numbers: upright, inverted, and the dwell in between. Upright and inverted are whatever your horn indexing gave you — read them off, don’t assume 0 and 180. The dwell is the one you tune, and the honest way to tune it is with water and a balance: invert, hold, come back, and weigh what is left in the plate. Somewhere around a couple of seconds the residual stops dropping and holding longer buys you nothing.

Sweep speed matters more than dwell. Take four or five seconds to go over rather than one — if the plate arrives inverted faster than the liquid does, the liquid arrives as a splash and lands wherever it likes. Slow is not a compromise here; slow is the entire point of building the thing instead of flicking it.

Whatever is in the plate ends up in the tray. Run this over a tray of disinfectant with an absorbent pad in it, and if the contents need a biosafety cabinet then the inverter needs to be in the cabinet too — a motorised flip generates the same aerosol as a hand flick and does it at bench height where you are not looking. Nothing holds the plate but the clamp, and nothing on this machine knows if it lets go — check it is tight before every run.

Files & downloads

The source files for this project aren't in the repo yet — there's nothing to download beyond the notes. They land in projects/96-well-plate-inverter/ when they do, and this section fills itself in.

Every file for this project on GitHub →