Ed Nisley's Blog: Shop notes, electronics, firmware, machinery, 3D printing, laser cuttery, and curiosities. Contents: 100% human thinking, 0% AI slop.
The Vica Illusion Sculpture provides an interesting data point: Reversal zits aren’t much of a problem at very slow extrusion speeds.
This view shows it lying down, with focus on the the zits along facing edges of the columns.
Vica Illusion – Reversal zits
They’re annoying, but not nearly as obvious as the ones on the Pink Panther Woman I examined yesterday.
The nominal speed is 30 mm/s with 100 mm/s moves, but the actual printing speed for those layers works out to maybe 15 mm/s because they’re so small.
In round numbers the extruder runs at half the previous speed, too, which means its internal pressure will be lower. I’m sure that’s a breathtakingly nonlinear process, so it’s not half the pressure.
Low speed isn’t the complete answer, though, because I’ve also done octopodes at 20 mm/s that looked essentially identical to those at 30 mm/s. Yes, it’s nonlinear, but I doubt it falls off a cliff under 15 mm/s.
I set Reversal to 25 rev/min and 125 ms quite some time ago as the smallest values that would eliminate drooling between separate parts. The only thing for it will be to explore the Reversal parameter space again; at least now I know what I’m looking for.
The Pink Panther Woman provided a clear view of the Reversal zit problem. With Clip = 0.1, she has what looks like a horrible surgical scar on her left side that extends from groin to, uh, bosom, with the defect punching inward:
PPW – Clip gaps
From bosom to collarbone, however, the scar consists of the usual Reversal zits extending outward:
PPW – Reversal zits
This microscope shot shows the outie zits in grisly detail:
PPW – outie zits
And another on her right side that’s nicely isolated:
PPW – outie – right
Skeinlayer shows the nozzle motions around that zit:
The three highlighted lines correspond to the last Perimeter thread, the gray move to the Infill, and the first Infill thread. This was printed at 30 mm/s with 100 mm/s moves, so the Cool plugin has reduced the speeds from 1800 mm/min and 6000 mm/min to what appears in the code.
Reversal is doing exactly what it should: inhaling the thread at the end of the Perimeter, moving, then exhaling before starting the Infill. The result isn’t nearly as good as you’d (well, I’d) expect, though.
However, here’s what Skeinlayer shows for an innie zit at her waist:
The first highlighted line is the last Perimeter thread on the previous layer, the second is the gray highlighted move to this layer’s Loop, and the third is the first Loop thread. The speeds here are even lower than you saw above; she has a rather slender waist.
As before, Reversal properly inhales the filament at the end of the previous layer. What’s new & different, though, is that the nozzle moves upward 0.33 mm immediately after finishing the Reversal motion. The result is a very small outward zit, plus the gap (probably) caused by the Clip setting.
What I don’t yet understand is why an in-plane motion causes such a large blob of ABS. It seems that there’s not much left, if a 0.33 mm upward motion can thin it to nearly nothing, but the outie zits seem to have plenty of plastic hanging out.
One obvious cause would be an inordinate delay between the end of the thread and the start of the Reversal action. The Arduino must (receive and) decode and execute the M108 G25.0 (or, more precisely, the S3G binary equivalent) before decoding and executing the M102 that starts the extruder motor, which could account for at least some of the problem. I want to blink an LED during the dead time between each command, slap that trace on a scope, and eyeball the command latency; given the number of I/O pins on an Arduino Mega, there should be plenty available.
Another possibility is mechanical backlash caused by the extruder’s 7:51 gear train. I’m not convinced that’s an issue, as herringbone gears do a good job of eliminating backlash and it feels eminently tight. I need a testcase that puts the backlash on a visible thread.
The Skeinforge Clip plugin trims the ends of closed loops to eliminate the overlap. I’ve found that setting Clip > 0.1 causes openings in small circles that shows up in the Polyholes testpiece, so I generally run with Clip = 0.0.
Whenever what might possibly be a timing problem crops up, the first suggestion seems to be “Print from the SD Card!” because the communication USB link between the PC and printer is so fragile it can’t keep the printer fed properly. This seems odd to me and some recent findings indicate that the latency problem is largely due to a weapons-grade blunder in the Java stack, but I figured I’d try it to see what happens.
This rather garishly contrast-stretched image shows the zits along the left side of the right-hand critter’s dome, plus an assortment below their eyes. The one on the left was from the SD Card, the one on the right was through the USB link:
Octopodes – SD Card variations
The zits may be a bit hard to see in the image, but I can’t see any difference in person, either.
For what it’s worth, I have never personally seen a problem that was resolved by printing from the SD Card. I think Linux does a better job of keeping the USB pipeline fed, despite Java’s baked-in RXTX delay, than Windows, but I really don’t have any data to support that. Other than that most of the complaints about USB latency seem to come from Windows users, that is.
Of late, the Thing-O-Matic has been producing very nice results with one annoyance: zits at the end of threads that seem to be caused by the Skeinforge Reversal plugin. That may be unjustly tarring it, so I’ve been running parameter variations while cranking out tchotchkes for an upcoming presentation.
The bottom and top have my standard 25 rev/min, 125 ms Reversal settings and don’t look all that bad. The middle two have Oozebane turned on: lower = 1.0 and upper = 0.25.
Fairly obviously, 1 mm of Oozebane early start produces dangling strands and the corresponding 1 mm of early shutdown leaves just less than 1 mm of gap. Not useful.
Reducing Oozebane to 0.25 mm produces results only slightly worse than no Oozebane at all.
The rest of the thinly documented Oozebane parameter space doesn’t seem helpful. I think it was intended more for DC motor extruders than steppers, although it didn’t seem useful even then.
In the process of tracking down the source of those Reversal zits, I noticed the motor mount flexed slightly as it reversed. That could produce a bit of backlash, so I added a quick-and-dirty support strut under the motor.
It’s a threaded standoff with a screw in one end. The nut (secured with a dab of Loctite) lets a wrench do the height adjustment. It just stands there, held in place by compression loading.
Unfortunately, it really didn’t have much of an effect on the problem, about which I’ll say more in a bit.
Stepper extruder design has advanced during the last half year, so I may print up the latest iteration of Greg’s Extruder. There’s also a beefy NEMA 17 on its way around the curve of the planet that might suffice as a direct-drive extruder motor along the lines of the MBI MK6 StepStruder motor, but with lower winding resistance for better performance.
Three spools of filament just arrived and needed a home; up to this point, I’ve been using the Lazy Susan Filament Spool for loose bundles atop the Thing-O-Matic. Until I use the last of the loose filament, which could take a while, I figured I could tack the spools to the floor joists.
It turns out 1-1/2 inch PVC drain pipe fits perfectly through the spool bore, so I squared up the ends of a chunk long enough to span the floor joists at a convenient distance from the printer. That steady rest doesn’t see a lot of use, but when I need it, I need it bad:
Turning spool axle
The endplate solid model looks about like you’d expect:
Filament spool axle endplates
I could turn those things from two chunks of plate, but this is much neater; a 3D printer makes short work of custom-sized parts.
The two pegs of yellow filament keep the axle endplate from turning on the central screw (and, inevitably, unscrewing themselves); add glue in the blind holes and trim to fit with a flush-cutting nipper. The aluminum brackets come from a pile I’ve been using for years: as almost always, the holes were in exactly the right places.
Filament spool axle endplate
With all that in hand, up it went:
Overhead filament spools
I bent some coat hanger wire into a guide bar with three eyelets for the filaments, plus another chunk to hold the guide in position. Three small (color coordinated!) clamps prevent the unused filament from unwinding.
I’m not completely happy with this arrangement, because there’s not enough control over the filament energy: the coil around each spool wants to expand into a tangle exactly the size and shape of the Basement Laboratory and there’s not a lot preventing that. I think a variation on tbuser’s Spool Guard theme might be in order: let the filament expand within a tightly enclosed space around each spool.
The OpenSCAD source code:
// Filament spool shaft adapter
// Ed Nisley KE4ZNU July 2011
include </home/ed/Thing-O-Matic/lib/MCAD/units.scad>
Layout = "Show"; // Show or Build
//-- Extrusion parameters
ThreadThick = 0.33;
ThreadWT = 2.0;
ThreadWidth = ThreadThick * ThreadWT;
HoleWindage = 0.1; // enlarge hole dia by this amount
Protrusion = ThreadThick;
//-- End Plate dimensions
PlateOD = 51.0;
PlateThick = ThreadThick * ceil(3.0 / ThreadThick);
AxleID = 40.0;
AxleThick = ThreadThick * ceil(5.0 / ThreadThick);
HoleSpacing = 0.75 * inch;
StubDepth = ThreadThick * ceil(2.5 / ThreadThick);
StubDia = 3.0;
ScrewDepth = PlateThick + AxleThick;
PrintOffset = 0.8*PlateOD/2; // fraction of dia to offset objects for printing
Tap6_32 = 0.1065 * inch;
Clear6_32 = 0.1495 * inch;
Head6_32 = 0.270 * inch;
Head6_32Thick = 0.097 * inch;
Nut6_32Dia = 0.361 * inch; // across points
Nut6_32Thick = 0.114 * inch;
//----------------------
// Useful routines
module PolyCyl(Dia,Height,ForceSides=0) { // based on nophead's polyholes
Sides = (ForceSides != 0) ? ForceSides : (ceil(Dia) + 2);
FixDia = Dia / cos(180/Sides);
cylinder(r=(FixDia + HoleWindage)/2,
h=Height,
$fn=Sides);
}
PegSize = 1.0;
module ShowPegGrid(Size) {
for (x=[-5:5])
for (y=[-5:5])
translate([x*10,y*10,Size/2])
%cube(Size,center=true);
}
//----------------------
// Single endplate
module AxleEndPlate() {
difference() {
union() {
cylinder(r=PlateOD/2,h=PlateThick,$fa=10);
translate([0,0,PlateThick])
cylinder(r=AxleID/2,h=AxleThick,$fa=10);
}
translate([0,0,-Protrusion])
PolyCyl(Tap6_32,ScrewDepth + 2*Protrusion);
for(y=[-HoleSpacing,HoleSpacing])
translate([0,y,-Protrusion])
PolyCyl(StubDia,StubDepth + Protrusion);
}
}
//----------------------
// Lash it together
if (Layout == "Show")
ShowPegGrid(PegSize);
translate([-PrintOffset,-PrintOffset,0]) AxleEndPlate();
translate([PrintOffset,PrintOffset,0]) AxleEndPlate();