Snap-fit stencil pins — STL

Printable pivot pins for joints of 0.25 mm polyester (PET) sheet, through the laser-cut pivot holes. v12 binds the three fits separately: the shaft is sized from the measured hole (running fit, no radial play), the head-to-lip gap equals the sheet stack (no axial rattle), and the retention lip is a split thin-wall cone that snaps with a few newtons. The v11 lip was four r0.4 mm spheres on rigid sectors: 1 mm of material cannot flex 0.2 mm under any hand force, so nothing snapped — the barb rode the hole open and left every joint loose.

Defaults as shipped (HOLE_D 3.15 = 3.0 mm nominal + 0.15 mm kerf, FIT 0.10): head Ø5.0×0.7 mm; shaft Ø3.05 × stack + 0.05 mm; lip Ø3.45 mm = hole + 0.30 mm undercut, 40° shoulder, 0.12 mm land, 25° lead-in cone down to an open flat nose Ø2.30 mm; petal wall 0.45 mm with 3 slits × 0.45 mm; total length 2.84 mm, 1.64 mm of it below a 0.50 mm stack. Prints head-down; every overhang is 40° or steeper than vertical, so no supports and no bridges (the nose is open).

FileModelStackFacetsSize
fit_coupon.stlfit coupon: 5 shaft diameters Ø3.10–3.50 (0.10 steps) × 2 stacks, 10 pins; head OD = size code—15,4200.77 MB
pin_plate_050.stl10-pin print plate (5 × 2, 7.5 mm pitch), head down0.50 mm15,5000.78 MB
pin_plate_100.stl10-pin print plate (5 × 2, 7.5 mm pitch), head down1.00 mm15,5000.78 MB
pin.stlsingle pin, print orientation (head on the bed)0.50 mm1,5500.08 MB
fit_coupon_pla.stlfit coupon, PLA variant: lip 0.20 mm, wall 0.35 mm, 10 pins, same size code—15,3240.77 MB
pin_plate_050_pla.stl10-pin plate, PLA variant: lip 0.20 mm, head down0.50 mm15,1800.76 MB
pin_plate_100_pla.stl10-pin plate, PLA variant: lip 0.20 mm, head down1.00 mm15,1800.76 MB

Print: PrusaSlicer + PLA (0.4 mm nozzle)

Every number protects one feature: the shaft is the fit surface, the lip is the snap, the three slits must stay open. Print Settings / Filament Settings below are PrusaSlicer 2.6+; the search box finds any parameter by name.

ValuePrusaSlicerWhy
filamentFilament Settings → Filament: Generic PLA or Prusament PLAPLA holds the shaft diameter best (0.2–0.4 % shrink vs 0.3–0.8 % for PETG) and does not creep under load
base profile 0.10–0.15 mm qualityPrint Settings: 0.10 mm DETAILonly layer height, speeds and the two fit knobs depart from stock
layer height 0.12 mm, first layer 0.20Layers and perimeters → Layer height, First layer heightlip shoulder is 0.24 mm and the land 0.12 mm: 2 and 1 layers. At 0.20 mm the hook rounds away and pull-out force drops
Arachne perimeter generatorLayers and perimeters → Perimeter generator: Arachne (2.4–2.5: classic plus Detect thin walls)Arachne prints the 0.35 mm wall as one line and leaves the 0.45 mm slits empty
extrusion width 0.42 mm, not moreAdvanced → Default extrusion width, External perimeter widtha width ≥ 0.45 fills the slits
3 perimetersLayers and perimeters → Vertical shells → Perimeters3 shells at 0.12 mm make the 0.70 mm head solid anyway
25 % grid infillInfill → Fill density 25 %, Fill pattern Grid0.22 cm³ parts; no load path depends on infill
external perimeters firstLayers and perimeters → Quality → External perimeters firstkeeps the shaft OD on the drawn line instead of pushed out by infill
seam AlignedLayers and perimeters → Seam positionRandom leaves blobs on the shaft OD, which is the fit surface
cooling: fan 100 %, Keep fan always on, slow down below 8 sFilament Settings → Cooling: Fan speed, Slow down if layer print time is below0.12 mm layers in PLA stay soft otherwise, and soft petals droop onto the slits
temperatures 210/215 °C nozzle, 60 °C bedFilament Settings → Filament → Temperature (Other layers / First layer), BedPLA default; hotter PLA strings into the slits
external perimeter 25 mm/s, first layer 20, small perimeters 20Speed → External perimeters, First layer speed, Small perimeters2.8 mm tall cones: slower means less heat pileup on the petals
supports offSupport material → Generate support materialsteepest surface is the 40° shoulder; type PLA rarely needs support at all
skirt 2 loops, brim 0Skirt and brim → Skirt loops, Brim widthcoupon and plate sit on 12 mm of footprint; for pin.stl only, set brim 5 mm
elephant foot compensation: profile defaultAdvanced → Elephant foot compensationit touches the bed face only; no bearing surface there
XY Size Compensation 0, then ±(error / 2)Advanced → XY Size Compensationthe one knob for shaft diameter; it shifts every contour, slits included
orientation as shipped, 100 % scaleArrange keeps the poseheads are already on the bed; the STL is in mm
  1. Slice, then check the Preview — the decisive step. Step to a layer through the petals: three slits empty, each wall one line. A thin line inside a slit means the gap was filled: re-render with -D SLIT_W=0.60, or set the extrusion width to 0.35 mm.
  2. Print the coupon first (next section): 10 pins, 0.38 cm³ of PLA ≈ 7.5 m of extrusion, ~8–12 min. A plate is 0.22 cm³ ≈ 4.4 m: ~5–10 min. Travel and layer changes dominate, so slow outer walls cost little.
  3. Cool fully before peeling; a warm pin bends its petals at the hinge. PLA is soft when warm and stiff when cold, so peel at room temperature, not off the bed.
  4. Measure the printed shaft with calipers and set XY Size Compensation to (target − measured)/2 — printed Ø3.00 for a nominal 3.05 → +0.025 mm. PLA shrinks 0.2–0.4 % of Ø, so a small correction is normal, and it also narrows the slits by the same amount.
  5. Never force a pin that does not enter by hand; straighten the laser sheets, do not ream the pins. PLA is brittle where PETG yields, and the PET film is the part that should yield first.

0.2/0.25 mm nozzle: 0.08–0.10 mm layers, extrusion width ≈ 0.55×nozzle. Better XY accuracy on the shaft and the hook; the slits stay open.

PETG, or Bambu Studio

Same geometry, same two knobs (extrusion width, XY compensation). Only the material numbers, the file variant and the menu labels change.

ValuePrusaSlicer + PETGBambu Studio + PLAWhy
filesdefault fit_coupon.stl, pin_plate_*.stl (lip 0.30 mm)*_pla.stl (lip 0.20 mm, wall 0.35 mm)the PLA variant asks less of the PET film, see the note below
base profile0.10 mm DETAIL0.16 mm Optimal, then pin Layer height to 0.12only Z resolution and speeds depart from stock
temperaturesnozzle 240 (first 245), bed 85nozzle 220 (first 220), bed 55–65filament defaults; PETG needs the hot bed for adhesion, PLA needs the fan
coolingstock PETG curve, slow down below 10 sFilament → Cooling: fan 100 %, slow down below 8 sPETG layers must bond warm; PLA must freeze hard
speedsexternal perimeter ≤ 60 mm/s, first layer 25Speed → Outer wall speed ≤ 60, first layer 30small cones: speed is heat, and heat rounds the land
fit knobsAdvanced → Default / External perimeter width 0.42; Advanced → XY Size CompensationQuality → Line width 0.42; Quality → X-Y contour compensation; Strength → Wall loops 3; Seam position Alignedthe same settings under different tabs; Arachne is the Bambu default
orientationArrange keeps the poseno auto-orient; Brim type noneheads are already on the bed; the STL is in mm

Why the PLA files differ. The snap does not come from the petals: a uniform radial load cannot shrink a ring, so the PET film cones over the lip instead. At the default 0.30 mm undercut that asks the hole to open 9.5 %, and PET film yields near 3 % — which is how the old rigid barbs coned every hole open. The *_pla.stl files use a 0.20 mm undercut and a 0.35 mm wall: film stretch 6.3 %, petal strain 2.1 %. Keep PLA pins out of a hot car (Tg ≈ 55 °C vs 80 °C for PETG).

Hair between the pins

Strings come from travel moves between the ten islands, and wet filament makes them worse. The rest is cosmetic: a string that runs from one pin to the next never enters a joint, so it cannot change the fit.

  1. Dry the filament: 4–6 h at 45 °C for PLA, 6 h at 65 °C for PETG. Wet filament is the first cause of hair.
  2. Nozzle 5–10 °C cooler: PLA 205/210, PETG 235/240. Less ooze per travel.
  3. Filament Settings → Retraction: length +0.2 mm, and Wipe while retracting on.
  4. Avoid crossing perimeters on (find it with the search box): travels then run around the head instead of across the pin.
  5. Travel speed 150 mm/s or more: the ooze has no time to land.

Pull the remaining hair off with tweezers after peeling. Do not sand a pin: sanding rounds the land and weakens the snap.

Sizing: the fit means nothing until you know the real shaft OD and the real hole ID, so print fit_coupon.stl with these settings, then follow Fit. If every size is uniformly tight or loose, change FIT in the source by that amount instead of chasing the slicer.

Fit: measure the laser hole first

  1. Print fit_coupon.stl (or the PLA variant). Ten pins: five shaft diameters × two stack heights. The head diameter is the size code — bigger head, bigger shaft. Nothing to count and nothing to read.
  2. Read the size off the head, not off a label: Ø5.00 mm head = shaft Ø3.10, Ø5.60 = 3.20, Ø6.20 = 3.30, Ø6.80 = 3.40, Ø7.40 = 3.50. Row 0 (0.70 mm head) is the 0.50 mm stack, row 1 (1.00 mm head) the 1.00 mm stack; both rows carry all five sizes.
  3. Push each pin into a real laser-cut hole and turn a bar. Take the largest shaft that still drops in and rotates with no side play; a shaft that needs force is one step too big. Every coupon pin is a real pin — only the head is oversized — so keep the winner.
  4. Render the production plate for the stack height and shaft that won, e.g. for shaft Ø3.20 (hole 3.30) and a 0.50 mm stack:
    openscad -o plate.stl --export-format binstl \
      -D 'part="plate"' -D 'HOLE_D=3.30' -D 'STACK_T=0.50' web/pin.scad
  5. If the fit falls between two sizes, print both again with the ladder offset: re-render with -D 'COUPON_SHAFT=[3.15,3.25,3.35,3.45,3.55]' and the same head code tells you which is which.

Every dimension is a parameter at the top of pin.scad: FIT (running clearance, 0.10), UNDERCUT (lip above hole, 0.30: raise to 0.40 mm for a harder pull, drop to 0.20 mm if inserting bends the sheets), WALL (petal stiffness, 0.45), FREE (axial play under the lip, 0.05: set 0 only if your stacks are exactly 0.50/1.00 mm).

Hole size: the laser exports draw the hole at hole_dia_mm + kerf (api/exporters.py, hole_dia = spec.hole_dia_mm + spec.kerf_mm), so the default 3.0 mm setting cuts a 3.15 mm hole, and up to 3.30 mm if your controller aims the cut on the path centreline. Measure a cut part, not the drawing: the coupon is the gauge. Whatever you measure, set HOLE_D to it and re-render.

Sources

pin.scad generates every file above (OpenSCAD 2021.01, no libraries). Also on this host: lattice builder.