Posts Tagged M2
Confronted with a puzzling failure, I decided to perform some long-delayed tweaking…
The folks at Makergear send me (and several others) a new filament drive gear for testing. It has smaller splines / teeth and produces a much finer mark on the filament:
The obvious stripped section on the right comes from finger-fumbling an absurdly large extrusion distance (something like, mmm, 1450 mm) with a high extrusion speed. Not the fault of the drive gear, that’s for sure!
I remeasured the actual filament length extruded to recompute Marlin’s
STEPSPERMM configuration constant. After rediscovering the awkward fact that, when you change that value with an
M92 command, Marlin doesn’t recompute the current extruder position, so the next manual extrusion will move a random amount of filament in a random direction, the value eventually converged to 476.9 steps/mm.
I intended to put the M92 in Slic3r’s startup G-Code, but the prospect of random extrusions suggested that now was a great time to update the firmware; again demonstrating that no good idea goes unpunished.
The most recent Marlin version, 1.1.0-RC5 (clearly labeled “Not for production use – use with caution!”), had been released a few hours earlier, so I fetched that and tweaked the configuration files as before.
The firmware now includes thermal runaway / thermistor failure protection for both the bed and hot end. Increasing the two
THERMAL_PROTECTION hysteresis values to 6 °C seems to work well.
It also includes a
CONTROLLERFAN output that can go active when any stepper is enabled, then off after predetermined time. Setting that to Pin 6 and 30 seconds means the whining fan (it’s a ball bearing replacement in an aerodynamically poor location) in the control box goes off when it’s not needed.
DEFAULT_STEPPER_DEACTIVE_TIME to 600 seconds means the motors don’t time out while waiting for the platform to reach operating temperature.
HOMING_FEEDRATE for the Z-axis to 60*60 mm/min causes it to whack the lever a bit harder and overtravel slightly more. The Z Offset ended up at -2.15 mm, based on the calibration cubes below.
Running a PID calibration on the V4 hot end produced slightly different values: P=17.41, I=1.02, D=74.44. Hardcoding those into the config file does not override the values already stored in EEPROM: you must manually set them with
M301, then use
M500 to program the EEPROM.
A few Calibration Box iterations settled settled the Extrusion Multiplier at a convenient 1.00 with the new drive gear:
All in all, that whole process went much more smoothly than I expected.
The config files as GitHub gists:
The first pass at the lip balm holders suffered from a grossly overstuffed first solid infill layer:
The skirt measured the usual scant 0.25 mm and was level all around, so the platform alignment and home position were just fine. That’s rarely a problem, but it’s good to verify before proceeding.
Previewing the G-Code didn’t show any problems; all the second-layer threads looked just fine. With that said, I did create an issue for gcode.ws pointing out that the profusion of thread colors wasn’t useful and suggesting some alternative methods.
The first layer requires 15-ish minutes to print, so I decided to reproduce the problem in a solid calibration box sliced with the same settings as the holder:
That still life represents these tests:
- Solid 3 mm tall box, 20 mm square
- 30 mm square
- 25 mm square, with text in Arial
- Again, because I can’t believe it hasn’t failed yet
- With rectilinear first layer
- Back to Hilbert with text in Zapf Chancery
All of those printed without trouble; every layer came out exactly as it should. In particular, the first solid infill layer atop the Hilbert Curve bottom layer had the precisely filled threads I’m used to seeing, each one butted against its neighbors without any excess plastic.
I modified the OpenSCAD source code to extract a 20x20x3 sample block from the lip balm holder model, including a snippet of the actual text. That worked fine.
Expanding the sample produced the irregular chunk in the front row, also 3 mm tall, including a section of the lilypads surrounding the tubes. Another successful print!
I’ll leave to your imagination a pile of half a dozen first layers topped with small sections of grossly overstuffed solid infill, printed in between the successful blocks and as a result of the variations mentioned below, with identical text and slicer settings. The test blocks work fine, but the actual holder and sections from it do not.
Having eliminated the obvious causes, it was time for more drastic measures.
I build OpenSCAD and Slic3r from the latest source files on GitHub. Nothing in this leads me to suspect the OpenSCAD models and using the most recent stable Slic3r version produced the same results.
Rebuilding the Slic3r configuration files from scratch produced the same results.
That’s where I gave up, set the 3D Honeycomb infill to start with Layer 2, and completed the mission.
Lacking any better ideas, I decided to throw all the balls in the air at once …
For reasons that aren’t relevant here, Mary asked me to make four sets of improved lipstick / lip balm / sunscreen holders with five smaller tubes plus the central one and an inscription on the bottom. I ran off one with the last of the cyan PETG and the other three in natural PETG:
I embossed the text into the bottom three layers. The tiny spots of detached infill for lowercase letters like a didn’t adhere to the platform, mostly because the retraction settings that work well for larger areas don’t push enough plastic out to bond with the platform before retracting and moving away.
The bridging layer over the text shows Slic3r doing the best it can (clicky for more far more dots). Laying a uniform patch over all the letters in one shot would work better, but I don’t know how you’d define an algorithm that specifies when such a situation occurs:
The solid infill layer directly over the Hilbert Curve bottom layer came out grossly severely excessively overstuffed, to the extent that the accumulation reduced the flow of molten plastic and caused the filament drive to strip:
Previewing the G-Code show nothing out of the ordinary and, after considerable flailing around, I finally set Slic3r to begin the 3D Honeycomb infill directly atop the Hilbert Curve bottom layer. That provided enough open space to complete the mission, but more debugging was in order.
The OpenSCAD source code as a GitHub gist:
A spate of cleaning put the little tab that fixed the never-sufficiently-to-be-damned strut supporting the lower refrigerator drawers into my hands:
I discovered that 4-40 knurled inserts perfectly match the available space, so I drilled the 3D printed holes out to 11/16 inch (the OD of the smaller knurls) and rammed the inserts into place:
No epoxy, no heat, nothing but a friction fit.
Looks much better, ought to work just as well, and will definitely outlive the refrigerator; if I never take that thing apart again, it’ll be fine with me.
Some equations relevant to indentations produced by a filament drive gear:
For reference, the smaller indentations are 0.25 mm deep and 1.3 mm across the bottom.
- d = filament (a.k.a. circle) diameter
- r = filament radius
- m = chord depth (inward from circle)
- c = chord length
- Θ = angle across chord from circle center, degrees
- A = chord area (a.k.a. indentation face area)
The length of the chord at the bottom of the indentation, perpendicular to the filament axis:
c = 2 sqrt(2mr - m2)
The chord angle:
Θ = 2 arcsin(c/2r)
The chord area, which would be the indentation face if it were perpendicular, which it isn’t:
A = (r2 / 2) x ((πΘ / 180) - sin(Θ))
If you measured Θ in radians, the π/180 factor would Go Away.
Some doodles showing that reducing the indentation from 0.25 to 0.15 reduces the chord area by a factor of two:
The implication being that you must maintain fairly constant force on the drive bearing against the filament to prevent stripping the indentations.
Five single-thread thinwall boxes scattered across the platform had an average height of 2.99 mm, with a range of +0.04 mm, -0.06 mm:
The wall widths work out to 0.39 mm, with a range of +0.2 mm, -0.01 mm.
Close enough, given that I can’t recall the last time I tweaked the platform height. I update the filament diameter setting in Slic3r every now & again as the printer gradually works through the spool, but, with one exception, this cyan PETG has been quite consistent and my tweaks didn’t really amount to much.
Frankly, given that any of the measurements may be off by ±0.02, the best I can hope for is an overall warm fuzzy feeling. When the printed results stop looking good, these results will (probably) provide some indication of whatever just changed.
The raw measurement data, such as it is:
A revision to my Fundamental Calibration Object adds some variations …
The classic thinwall open box:
A solid box:
A solid box with text embossed on the lower surface:
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:
The results look just like the preview, with firmly bonded layers and no fluff:
This wall should be two threads wide, but Slic3r inserts very very thin infill thread:
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:
A triple-thread wall allows Slic3r to produce a fatter infill thread that works the way you’d expect:
The threads bond firmly in all directions:
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: