Thinwall and Solid Boxes for 3D Printer Calibration

A revision to my Fundamental Calibration Object adds some variations …

The classic thinwall open box:

Calibration Box - open - 1 thread - solid model
Calibration Box – open – 1 thread – solid model

A solid box:

Calibration Box - solid - solid model
Calibration Box – solid – solid model

A solid box with text embossed on the lower surface:

Calibration Box - solid text - solid model
Calibration Box – solid text – solid model

You must consider how the slicer settings interact with the solid model parameters, particularly now that slicers can produce adaptive infill for small gaps between perimeter threads. Previewing the slicer’s output will show you what assumptions it makes and prevent surprising results out there on the platform.

A single-thread wall comes out properly:

Thinwall open box - 0.40 wall - Slic3r
Thinwall open box – 0.40 wall – Slic3r

The results look just like the preview, with firmly bonded layers and no fluff:

Thinwall open box - 1 thread walls
Thinwall open box – 1 thread walls

This wall should be two threads wide, but Slic3r inserts very very thin infill thread:

Thinwall open box - 0.80 wall - Slic3r
Thinwall open box – 0.80 wall – Slic3r

I think that’s a result of forcing the two perimeter threads to sit with their centers exactly one thread width apart, making the (nominal, ideal) inner walls tangent to each other.  Setting the wall to 1.9 mm eliminates the hair-fine infill thread, at the cost of producing an object 0.1 mm smaller than it looks.

Unfortunately, that fine infill doesn’t produce enough plastic flow for a continuous thread. The PET I’m using accumulates on the nozzle until enough of a glob forms to stick on the previous layer, but hair-fine strands connect those globs to each other and the nozzle, producing awful results:

Thinwall open box - 2 thread walls
Thinwall open box – 2 thread walls

A triple-thread wall allows Slic3r to produce a fatter infill thread that works the way you’d expect:

Thinwall open box - 1.20 wall - Slic3r
Thinwall open box – 1.20 wall – Slic3r

The threads bond firmly in all directions:

Thinwall open box - 3 thread walls
Thinwall open box – 3 thread walls

It’s not obvious from that picture, but the bond between successive infill threads produces a glass-clear vertical plastic slab that relays images from the bottom to the top. The perimeter threads are also firmly bonded, albeit with not quite the same optical quality.

To use these boxes:

  • Set the OpenSCAD extrusion parameters to match whatever the slicer will use
  • Set the wall height and thickness to whatever you like
  • Compile-and-render, export the result as a solid model in STL / AMF / whatever
  • Feed the solid model into your favorite slicer and save the G-Code
  • Feed the G-Code into your printer, watch it magically create a little box
  • Measure the printed results and compare with the ideal settings
  • Change the slicing configuration and iterate until satisfied

Verify these measurements before adjusting anything else:

  • Filament diameter: actual vs. nominal will be different
  • Extruder steps per millimeter: mark 100 mm on filament, extrude 100 mm, compare

Then you can verify / adjust some finicky settings:

  • Extrusion multiplier: does the actual single wall width match slicer’s nominal value?
  • Infill density: 100% infill should perfectly fill the solid box
  • Initial Z offset: does actual height match the model setting?
  • Platform alignment: print five boxes at platform center + corners, verify heights
  • First layer adhesion: if these don’t stick, the platform has weak adhesion
  • Minimum time per layer: if the walls slump, you’re printing too fast
  • Extrusion temperature: good bonding and no delamination along any axis

The OpenSCAD source code as a GitHub gist:

// Simple calibration boxes
// Thin wall open box - verify Extrusion Multiplier
// Solid box - verify infill settings
// Ed Nisley - KE4ZNU
// https://softsolder.com/
Layout = "Open"; // Open Solid
Texting = "Text!"; // text message on solid box or empty string to suppress
//-------
//- Extrusion parameters must match reality!
ThreadThick = 0.25;
ThreadWidth = 0.40;
Protrusion = 0.1; // make holes end cleanly
function IntegerMultiple(Size,Unit) = Unit * ceil(Size / Unit);
//-------
// Dimensions
WallThick = 1.0 * ThreadWidth;
echo(str("Wall thickness: ",WallThick));
BoxSize = 20.0;
echo(str("Overall size: ",BoxSize));
NominalHeight = 3.0;
echo(str("Nominal height: ",NominalHeight));
Height = IntegerMultiple(NominalHeight,ThreadThick);
echo(str("Actual height: ",Height));
Rotation = 0; // 45 to exercise X and Y axis motors at same time
CornerRadius = 2.0;
CornerSides = 8*4;
//--------
module Solid() {
difference() {
hull()
for (i=[-1,1], j=[-1,1])
translate([i*(BoxSize - 2*CornerRadius)/2,j*(BoxSize - 2*CornerRadius)/2,0])
cylinder(r=CornerRadius,h=Height,$fn=CornerSides);
if (len(Texting))
translate([0,0,-Protrusion/2])
linear_extrude(height=3*ThreadThick + Protrusion)
mirror([1,0,0])
text(text=Texting,size=6,spacing=1.05,font="ITC Zapf Chancery:style=Italic",halign="center",valign="center");
}
}
module Thinwall() {
difference() {
Solid();
hull()
for (i=[-1,1], j=[-1,1])
translate([i*(BoxSize - 2*CornerRadius)/2,j*(BoxSize - 2*CornerRadius)/2,-Protrusion])
cylinder(r=(CornerRadius - WallThick),h=(Height + 2*Protrusion),$fn=CornerSides);
}
}
//-------
rotate(Rotation)
if (Layout == "Open")
Thinwall();
else
Solid();

One thought on “Thinwall and Solid Boxes for 3D Printer Calibration

Comments are closed.