Design / Simple chips / Chamber chip maker

Chamber Chip Maker

chamber_chip

series or parallel tapered chambers volume solver runs in your browser SCAD · STL · JSON

Design a chip with up to eight small wells joined by channels, then download a file you can 3D print. Tell it the volume you want in each well and it works out the size. It runs on your own machine and sends nothing anywhere.

Nothing made with this tool has been printed or tested.

Technical details

Up to eight chambers in a rectangular block, wired either as one serial path or as N independent paths side by side. Each chamber has a hexagonal plan: the channel opens out over a taper, runs flat at the chamber width, and closes back down over a second taper. Enter the geometry on your printer's pixel grid — or enter the chamber volume you want in µL and let the tool solve the flat length — then read the volumes, dead-volume fraction, hydraulic resistance, pressure drop, flow rate and timescales as you type. Everything runs client-side; nothing is uploaded.

Ports here are plain geometric primitives, not h.r.3.3 library interfaces. An open end is a rectangular hole in the end face and a roof port is a square or round shaft through the roof. Neither carries the pin, obstruction or pitch conventions the h.r.3.3 PDK cells use (see pdk/gen_mixing_chamber.py, which builds chambers as LEF cells with declared lef_port() interfaces). Chips generated by this page do not natively mate with Foundry component library parts — they are standalone blocks.
The taper walls are sloped, and the printer is not. This tool emits the true trapezoid — the taper edge is a straight line between two whole-pixel endpoints — and every volume it reports is the exact area of that trapezoid. Your slicer will stair-step that edge onto the pixel grid, so the part that comes off the machine has a serrated taper wall whose exact volume differs from the number printed here by whatever the slicer's rounding does. How much that matters is not checked: the design kit gives no limit for it.

Jump to the results

1 · Printer

Asked first, because every dimension below is entered in this printer's pixels and layers. A pixel is the smallest step the printer can draw in X or Y: on the BYU printer, one pixel of its projected image (DLP); on the Phrozen Sonic Mighty 12K, one pixel of the LCD screen that masks its UV light. A layer is one Z step of the stage.

The Phrozen 12K has non-square pixels: 19 µm in X, 24 µm in Y. This tool models one isotropic pitch, so the machine is offered as two presets — pick the axis you want to check a feature against. Either preset matches the printer's pixel along that axis only. The .scad and the .stl give lengths in millimetres (the .json in micrometres), and the printer rounds them to its own pixels: worst case half a pixel, ±9.5 µm in X and ±12 µm in Y. Layer-height dimensions are unaffected.

µm

µm

2 · Layout

How the chambers are wired. This is the one choice that changes the topology of the part rather than its dimensions.

ch

≡ µm

Parallel layout only. The wall left between adjacent paths is pitch − chamber width.

3 · Chambers

All chambers are identical. In plan each is a hexagon: the channel opens out over the taper length, runs flat at the chamber width, then closes back down over a second taper. The taper ends exactly at the channel width, so the plan profile is continuous through the junction — only a step in Z remains, set by the alignment below. Depth is constant over the whole chamber.

≡ µm

≡ µm

0 gives a diamond — the two tapers meet at a point.

≡ µm

0 gives a plain rectangle with an abrupt step at each end.

≡ µm

Chamber volume solver

Works both ways. Change the width, flat length, taper or depth above and the achieved volume below follows. Type or drag a target volume here and the tool solves the flat length on the pixel grid, writes it into the field above, and reports what the grid actually delivers. The tapers hold volume of their own, so a target below what they already hold cannot be reached by shortening the flat — the tool says so rather than clamping.

µL

4 · Channels

One cross-section for every channel segment. The channel is centred across the chamber in Y, on a whole pixel. The taper meets it exactly at this width.

≡ µm

≡ µm

≡ µm

≡ µm

≡ µm

Series layout only — parallel paths never join.

5 · Surrounding solid

Wall thickness is applied on each side in Y, measured from the outermost chamber. With roof ports it also becomes the end-cap thickness in X. The block's outer size is derived from the layout, so it can never disagree with its own contents.

≡ µm

≡ µm

≡ µm

6 · Ports

How fluid gets in and out. Roof ports, the default, cap both ends with a wall and cut a shaft, round or square, up from the channel ceiling through the roof. Each port sits at the very end of its path, so no channel runs on past it into a dead end that liquid cannot flush out of. In a parallel layout every path gets its own pair. Where the channel is wider than its port, a tapered end closes the channel's side walls in to the port at 60°, so no square corner is left beside it for liquid to sit in. Tubing can go into a socket cut down into the chip, into a raised socket standing on the top face, or over a slip-on post. Open ends instead leave the inlet and outlet channels running clean out of both X end faces.

A round port's diameter is a whole number of pixels. The printer can only draw whole pixels, so it prints a round port as a stair-stepped circle, not a smooth one.

≡ µm

Channel end:

No tube port has been printed or tested. Whether tubing grips and seals depends on the printer and the resin, and nobody has measured it. You may need to make the socket a little wider or narrower. The wall around each socket is only as thick as the chip's side wall, 231.8 µm with the current settings, and pushing a tube in may crack a wall that thin.

No raised socket has been printed or tested. Whether tubing grips and seals depends on the printer and the resin, and nobody has measured it. The boss is a tall, thin feature: levering the tubing sideways can snap it off.

A raised socket is a round boss standing on the top face over the port, with a socket down its middle sized to the tubing's outside diameter. The socket's floor is the chip's top face: the tubing stops on the shoulder there, and the round port, sized above, carries on below it into the channel. The chip keeps its whole roof, and the grip comes from the boss's height. The starting tubing, 1/16 in, is a starting point, not a tested choice.

A tube port is a socket cut down from the top face, sized to the tubing's outside diameter. The round port, sized above, carries on from the socket's floor down into the channel, narrower, so the tube sits against the step between them.

µm

≡ µm

The starting depth, 100 layers, is a starting point, not a tested figure. The roof must be at least one layer deeper than the socket.

≡ µm

The starting depth, 150 layers, is a starting point, not a tested value.

≡ µm

The starting wall, 40 px, is a starting point, not a tested value. It must be at least the chip's side wall.

No slip-on post has been printed or tested. How well a post grips depends on the tubing: its material, its wall and how far it stretches. The post is a tall, thin feature: levering the tubing sideways can snap it off. It is a smooth post, not a barb: a retaining ridge would print as an overhang on the way up.

A slip-on post stands on the top face over the port, a little wider than the tubing's inside so soft tubing grips it, with a short cone at the tip to start the tubing on. Its bore carries the liquid from the port up through the post, as wide as the post's wall allows.

µm inside µm outside

The starting tubing, 1/32 × 3/32 in, is a starting point, not a tested choice. Measure your own: nominal sizes vary.

%

The starting 15% is a starting point, not a tested value: how far tubing can stretch and still grip depends on the tubing.

≡ µm

The starting height, 200 layers, is a starting point, not a tested value.

≡ µm

The starting wall, 30 px, is a starting point, not a tested value. It must be at least the chip's side wall; the bore is as wide as it allows.

7 · Flow conditions

Enter one of flow rate or pressure drop; the other is computed from the summed channel resistance. In a parallel layout these are per path, and the totals across all paths are reported separately.

How accurate the resistance, pressure drop and flow rate are. The channels' hydraulic resistance comes from a standard one-term formula for a rectangular channel. While the channel’s height is at most half its width (or its width at most half its height), it is within 0.2% of the exact solution. It drifts as the cross-section approaches square: for a square channel the resistance and pressure drop shown are 14% too high, and a flow worked out from a pressure is 12% too low. Checked against the exact series solution in Bruus, Theoretical Microfluidics, Oxford University Press, 2008.

µL/min

mPa·s

Water at 20 °C = 1.002 mPa·s. Editable.

m²/s

Slider is log₁₀. 1e-9 m²/s is offered as an ORDER-OF-MAGNITUDE starting value only — it is not a validated coefficient for your species. Enter your own.

Back to the settings

Plan — looking down

Long section — on a path centreline

Unsupported chamber roof span

—

Geometry

Volumes

Laminar estimate

Timescales

Checks

    Download

    • SCAD chamber.scad
    • STL chamber.stl
    • JSON chamber.json

    STL is binary, millimetre units, Z up, origin at the block's minimum corner.

    The downloads are off until the maker has started: it makes the files here, in your browser. If this line stays, the maker has not started (JavaScript may be off or blocked, or its script failed) and no file can be made.

    What this builds

    A rectangular block containing either one serial fluid path or N independent parallel ones.

    series    inlet → chamber 1 → channel → chamber 2 → … → chamber N → outlet    2 ports

    parallel  N × ( inlet → chamber → outlet ), side by side in Y    2N ports

    Parallel paths never touch: the wall left between neighbours is pitch − chamber width, and a pitch that would close that wall is a blocking failure. At N = 1 the two layouts describe exactly the same solid, and the tool emits byte-identical SCAD and STL for both — the verification suite asserts it.

    Chambers and channel segments occupy adjacent, non-overlapping intervals along X. They abut at a plane rather than interpenetrating, which is what lets the tool report the void volume as an exact sum of parts rather than an estimate: no inclusion–exclusion term is ever needed.

    The chamber shape

    Each chamber is a prism of constant depth whose plan is a hexagon. Walking along the path: the channel, at width cw, opens out linearly over the taper length tl to the chamber width mw; runs flat at mw for the flat length ml; then closes back down over a second taper of length tl to cw again.

    The taper endpoints are exactly the channel width, so the plan-view profile is continuous through the junction. The only discontinuity left at a chamber mouth is the step in Z, and which face that step lands on is what the alignment setting chooses.

    plan area A = mw·ml + (cw + mw)·tl    volume V = A · cd

    That is exact, not an approximation: the flat is a rectangle and each taper is a trapezoid with parallel sides cw and mw and height tl, so the two tapers together contribute 2 · (cw + mw)/2 · tl. Setting tl = 0 collapses the shape to a plain rectangle with an abrupt step at each end; setting ml = 0 makes a diamond whose two tapers meet at a point. Both are legal and both are covered by the verification suite.

    The sloped taper edges are not axis-aligned, and the printer is. This tool emits the true trapezoid, with its endpoints on whole pixels and a straight line between them, and every volume it reports is the exact area of that trapezoid. A slicer will stair-step that line onto the pixel grid, so the printed taper wall is serrated and its true volume differs from the figure here by whatever the slicer's rounding does. Nothing on this page estimates that difference, and the design kit gives no limit for it.

    cw, mw, tl and ml all stay whole numbers of pixels. When mw − cw is odd, a perfectly centred chamber would put the taper endpoints on a half pixel; the tool moves the chamber to the nearest whole pixel instead and reports the offset it used. The area formula above is unaffected — a trapezoid's area does not depend on whether it is isosceles.

    The volume solver

    Given a target volume the tool solves for the flat length, the only one of the four chamber dimensions that scales the volume linearly without changing anything else:

    ml = ( V_target / cd − (cw + mw)·tl ) / mw    then rounded to whole pixels

    Because the result is rounded, the achieved volume is almost never exactly the target; the residual is bounded by half a pixel of flat length, and the tool prints both the achieved volume and the error, in µL and per cent, rather than rounding the display until the discrepancy disappears.

    The tapers hold volume whether or not there is any flat left. The smallest chamber reachable at a given tl, mw and cd is the ml = 0 diamond, whose volume is (cw + mw)·tl·cd. Ask for less than that and no flat length — not even zero — will get you there. The tool reports that as a blocking failure, names the minimum reachable volume, and does not silently clamp ml to zero and hand you a chamber that is too big.

    The flow model, and where it is valid

    The pressure/flow relationship is the rectangular-duct Hagen–Poiseuille approximation given in the h.r.3.3 PDK's own component documentation for the rectangular channel (pdk/docs/Rectangular Channel.docx, “Component model”), which in turn cites Bruus:

    R_hyd = 12 · η · l / ( w · h³ · (1 − 0.63 · h / w) )    Q = ΔP / R_hyd

    It is summed over the channel segments only — inlet, each inter-chamber connector, and outlet — and the chambers contribute nothing to the total. That is a deliberate simplification, not an oversight: a chamber's cross-section here is far larger than the channel's, so its resistance per unit length is smaller by the same large factor and would be lost in the noise of everything else this model already ignores. The readout says so every time it prints a number: laminar estimate, channel resistance only — chamber resistance neglected. If you make a chamber barely larger than the channel, that assumption stops being reasonable and the tool will be optimistic about the pressure required; nothing warns you, because the design kit gives no threshold at which to warn.

    Where the ends are tapered, each taper is counted slice by slice with the same formula. With roof ports, each port's hole through the roof is counted too, as a duct of the port's shape: a round port as a round tube of the same area, R = 8 · η · L / (π · r⁴), and a square port by the exact series for a square duct, R = 12 · η · L / (0.4217 · a⁴); the readout then says channels and ports only. That part is approximate: the holes are short, and entrance effects are not modelled. Where the ports carry slip-on posts, each post's bore is counted as a round tube as well, and the readout says channels, ports and posts' bores only.

    In a parallel layout the paths are identical and independent, so they share the driving pressure and combine like parallel resistors: the pressure you enter is seen by every path, and the flow you enter is the flow in one path. Both the per-path and the all-paths totals are printed, labelled. Reynolds number stays per path — there is no combined Reynolds number for an array.

    Validity condition: h ≤ w. The series approximation the 0.63 term comes from is written for a duct whose height is the shorter side. If you enter a channel taller than it is wide the tool still reports a number, but it computes it on the same duct with the two cross-section dimensions exchanged and says so — and that geometry separately fails the PDK's documented h < w rule.

    Everything the calculator prints is a laminar estimate, not a guarantee. It assumes fully developed, steady, incompressible, single-phase Newtonian flow, rigid walls, no entrance or exit losses, no expansion or contraction losses at the chamber mouths, no surface-tension effects, no recirculation or dead zones inside the chambers, and perfectly rectangular channel cross-sections. A real printed chamber chip has none of those exactly. Reynolds number is reported so you can see when the laminar assumption itself is in question; water density is taken as 998.2 kg/m³ at 20 °C.

    Residence time is τ = V_chamber / Q and fill time is V_internal / Q. Both are plug-flow bookkeeping: volume divided by volumetric rate. Neither is a mixing time, and neither accounts for the fact that a real chamber does not exchange its contents uniformly.

    Diffusion time across the chamber depth is t = h² / (2D), with D entered by you. The tool offers 1e-9 m²/s as a starting point because that is the right order of magnitude for a small molecule in water at room temperature — it is not a validated coefficient for your species, your buffer or your temperature, and the page never treats it as one.

    Dead volume

    Reported as

    dead fraction = ( channel volume + port shaft volume ) / total internal volume

    Both the connecting channels and the vertical port shafts are volume the sample has to occupy without being in a chamber, so both are counted. The three components — chambers, channels, port shafts — are printed separately as well, so you can take a different view of what counts as dead without having to re-derive anything.

    Ports are not library interfaces

    The two port styles on this page are geometric primitives and nothing more. An open end is a rectangular hole where the channel meets the end face; a roof port is a square or round shaft from the channel ceiling to the top face. They carry no pin declaration, no obstruction layer, no pitch convention and no mating geometry.

    The h.r.3.3 component library works differently: its cells declare interfaces explicitly — see pdk/gen_mixing_chamber.py, whose chambers are emitted as LEF cells with lef_port() pins, obstruction boxes and a fixed routing pitch, so that the placer and router can connect them. A block from this page has none of that. It will not natively mate with Foundry component library parts, and it is not intended to be dropped into a placed-and-routed design. It is a standalone chip.

    What is checked, and what is not

    The blocking checks are geometric self-consistency only — whether the solid you described can exist as a printable body with the connectivity the chosen layout claims. The single process rule that is checked, h < w on the channel, is checked because it is written down in the PDK component document for the rectangular channel. It is the only one. There is no chamber component document in the PDK, so there is no documented chamber rule to check against.

    On the BYU grid, the block is also compared with the image BYU publishes for the OS1, 2560 × 1600 pixels (19.5 × 12.2 mm, BYU’s rounded figure; the OS1’s Specs page, read 2026-09-30), either way round. The comparison is in pixels: on this grid a pixel of the block is a pixel of the image, so 2560 pixels fit and 2561 do not, whatever a pixel’s exact size. A block bigger than that both ways is flagged and never refused: the files stay on. Each figure is BYU’s published figure for the OS1: see Hardware and process. On any other grid no build area is compared.

    The unsupported chamber roof span is displayed prominently, in mm, because it is the largest unsupported ceiling in the part and the thing most likely to decide whether the print succeeds. It is not gated: the OpenMFDA design kit's documentation gives no span limit for any resin, layer height or exposure profile, so there is no number to compare it against. Showing the span and refusing to invent a threshold is the honest version of that check.

    The tapers exist partly to give air somewhere to go on fill, but whether a given taper length is long enough to avoid trapping a bubble is not something this tool evaluates — the design kit gives no limit for it either. That, minimum wall survivability, minimum feature width and resin clearing are listed in the Checks panel as not checked.

    Nothing produced by this page has been printed or fluidically tested. It is geometry and arithmetic.

    Grid discipline

    Every dimension is stored as a whole number of pixels or layers, because that is what the printer can actually address. The µm boxes are a convenience: type 250 µm at a 7.6 µm pitch and the tool takes 33 px (250.8 µm) and tells you it did. Nothing off-grid is ever accepted silently, including the solved flat length, which is rounded to a whole pixel with the residual reported.

    Three centring consequences are worth knowing. When the channel width and the chamber width differ in parity, true centring would put the taper endpoints on a half pixel; the tool moves the chamber to the nearest whole pixel and reports the offset. The same applies to a roof port centred across the channel. And in a parallel layout every path is placed on a whole-pixel pitch, so the array is exactly periodic rather than accumulating a rounding error down the block.