This polyholes test piece started with the nozzle 0.45 to 0.50 mm above the build plate. The threads around the holes didn’t bond well to the plate, dragged slightly inward of their intended position, and didn’t join to their neighbors or the infill.

Adjusting the nozzle downward to start at 0.28 to 0.39 above the plate produced this result:

So, in round numbers, changing the nozzle’s height by 0.2 mm makes all the difference for an object printed with 0.33 mm layer thickness. That’s why I’ve been so focused on getting a flat, level build platform: a mere 0.2 mm is 60% of the layer thickness!
The perimeter and additional threads around the holes are now where they should be, plus they’re all bonded to each other and the infill.
I think Skeinforge positions the center of the perimeter thread at the very outside edge of the object, which means objects are one thread width larger than they should be and holes are one thread width smaller. The HoleWindage parameter I added to nophead’s code compensates for that, although you must manually add it to / subtract it from the critical dimensions.
[Update: SF does the right thing. See the comments.]
The larger holes in the second test piece (printed with the correct starting height) came out just about spot on, the mid-size holes are 0.25 mm too large, and the smaller holes are pretty close in absolute terms (and awful in relative terms). There’s no way to get perfect holes, but these are certainly good enough for most purposes and repeatable enough to not require much in the way of tweakage.
The polyholes sheet is three layers thick. It presents quite an infill challenge, because there’s not much room around the holes (witness the open areas where the available space drops below one thread width) and the Fill plugin doesn’t lay the infill down from one end to the other. The myriad stops, starts, and movements presents many opportunities for blobs, of which you’ll see quite a few.
Feed 40 mm/s, flow 2 rpm, 210 °C / 120 °C. First layer at 25% feed & flow. Reversal set for 20 rpm, 90 ms in & out, and no early action.
I measured the thickness of the Outline thread around the actual objects, as described there, to get the first layer thickness. The starting heights for the first piece are the middle array there. These are the heights for the second piece, in units of 0.01 mm:
33 | 28 | 29 | ||
31 | 28 | |||
31 | 31 | |||
32 | 39 | |||
28 | 32 | 37 |
The OpenSCAD source, which is pretty much directly from nophead:
// nophead polyholes // Modified to use parameters and add diameter Finagle Constant HoleWindage = 0.6; NumHoles = 9; PlateZ = 1.0; Protrusion = 0.1; HoleZ = PlateZ + 2*Protrusion; module polyhole(h, d) { n = max(round(2 * d),3); rotate([0,0,180]) cylinder(h = h, r = (d / 2) / cos (180 / n), $fn = n); } difference() { cube(size = [NumHoles*10,27,PlateZ]); union() { for(i = [1:NumHoles]) { translate([(i * i + i)/2 + 3 * i , 8,-Protrusion]) polyhole(h = HoleZ, d = (i + HoleWindage)); assign(d = i + 0.5) translate([(d * d + d)/2 + 3 * d, 19,-Protrusion]) polyhole(h = HoleZ, d = (d + HoleWindage)); } } }
Skeinforge correctly insets the perimeter by the filament width, so the outside dimensions of an object and the inside of polygonal holes should be spot on if your extruded width matches what SF thinks it is.
That makes sense, although it means I need better control to nail the filament down properly. The HoleWindage value dramatically improves the accuracy of small holes, which simply means the nozzle isn’t putting the filament in the right place to start with.
I’ve been taking a first approximation to the width from the top of a thin-wall open box, then tweaking that number to match reality. Now that I have better control over the first layer height, I think the results will improve. On the other paw, I’m worrying about sub-millimeter accuracy, which may be beyond what’s possible here.
I’m doodling a height probe similar to yours, although I think the TOM nozzle must contact the switch (after wiping) to get a sufficiently accurate height-over-platform value for the whole extruder hot end & support structure. That means the switch must not only clamp to a hot build plate and register to the top surface, but present enough contact force to squish a small amount of hot ABS flat against the nozzle… all with better than 0.1 mm resolution.
And even though getting ABS to stick to the platform is a challenge, I’m certain it’ll stick like snot to a fingernail on the switch actuator… [grin]
Then bypass the issue of measuring to the plate itself, instead use a known reffrerence point if possible. Maybe something like this:
| n
| o H
EXTRUDER -----> | z H < --Switch
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\____####
Print surface
(Sorry about the crude illustration, think of it as a note on a napkin)
You could arrange it so that there is only a threat of accidental contact if the nozzle is at (0,0), and resting on the plate. To calibrate the switch, you’d drive out the screw all the way, move the print head to (0,0), then instruct it to lower itself towards the print area untill the switch is tripped. at that point you turn the screw to shorten it and repeat the "lower" command untill you have reached the desired z=0 position. As long as you don’t alter the screw or the switch, you’ll have a way to refference z=0 without ever exposiong electronics to the print nozzle.
oh no!!! ASCII art fail!!!
I may upload an immage later, but I need to sleep now.
I changed the drawing into a code block that may look better, but … you got the idea across!
The trouble is that I’m using three different build plates and I really need to know where the current surface lies, so the switch must index to the plate and get tripped by the nozzle.
I like nophead’s solution, but it doesn’t fit into my assortment of kludges…
I’ve gotten into the habit of designing in bevels around the bottom perimeters to accomodate imprecise platform surfaces.
It’s a compromise, but it helps when doing things like printing multiple parts raftless on an ABP where the bottom surface characteristics don’t matter as much as the top.
If OpenSCAD made it easy to bevel the edges of rectangles / cubes / whatever, I’d be on that like static cling…
Good idea!
There’s a lot of hidden power in the minkowski operator.
Here’s one approach to coding up a bevelling module-operator I whipped up: https://github.com/clothbot/makerbot/blob/master/tests/minkowski/bevel.scad
I’m glad folks like you can figure that stuff out and provide paint-by-numbers examples for folks like me. I looked at the somewhat terse description in the OpenSCAD doc and moved right along. [sigh]
That one definitely goes in the to-be-played-with pile. Thanks for the update!