Posts Tagged CNC
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 …
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:
After taking the incandescent lamp socket off its base, I drilled the tapped (yeah, in plastic) 6-32 holes out to a firm press fit for the knurled 6-32 inserts, buttered the inserts with epoxy, and pressed them firmly in place:
Fast forward a day and they’re stuck in there like they were glued. You can see a bit of the epoxy around the right rim of the insert; I wiped a bit more off around the other one.
Putting The Right Amount of epoxy on the insert requires dialing back my “The bigger the blob, the better the job” enthusiasm, but wasn’t all that difficult. It’s certainly more tedious than just ramming the inserts into a printed hole and might actually produce better retention. I doubt that will make the least difference for (almost) anything I build.
On the whole, they look good…
Replacing the hex nut traps with knurled insert cylinders slims the ends of the socket:
Making the raised part of the socket fit the 25 mm ID of a hard drive platter swells the midsection of the socket
, but the platter won’t need any machining or punching:
The octal and duodecar sockets will require a punch to open up the platter hole and all sockets require two drilled clearance holes for the screws. Given that I’ll eventually do this on the Sherline, maybe milling the hole for the bigger tubes will be faster & easier than manually punching them.
I moved the screw centers to 35 mm (from the historically accurate 28 mm) to accommodate the larger center, not that anybody will ever notice, and enlarged the central hole to 7.5 mm (from 5.0 mm) to let more light into the tube base.
The support structures inside the (now much smaller) knurled insert cylinders might not be strictly necessary, but I left them in place to see how well they built. Which was perfectly, as it turns out, and they popped out with a slight push:
They’re just the cutest little things (those are 0.100 inch grid squares in the background):
Anyhow, the knurled inserts pressed into their holes with a slight shove:
The chuck jaws were loose on the screw cutoff stud and stopped at the surface, putting the knurled inserts perfectly flush with the socket:
The surface looks very slightly distorted around the inserts, although it’s still smooth to the touch, and I think the PETG will slowly relax around the knurls. Even without heat or epoxy, they’re now impossible to pull out with any force I’m willing to apply to the screws threaded into them. Given that the platter screws will (be trying to) pull the inserts through the socket, I think a dry install will suffice for my simple needs.
Match-mark, drill #27 6-32 clearance holes, and the screws drop right in:
Those stainless steel pan-head 6-32 screws seem a bit large in comparison with the socket. Perhaps I should use 4-40 screws, even though they’re not, ahem, historically accurate.
The tube pin holes get hand-reamed with a #53 drill = 1.5 mm. That’s a bit over the nominal 1.1 mm pin diameter, but seems to provide both easy insertion and firm retention. For permanent installation, an adhesive would be in order.
Buff off the fingerprints, stick the tube in place, and it looks pretty good:
Yeah, those screws are too big. Maybe a brace of black M3 socket head screws would look better, despite a complete lack of historicity.
Now to wire it up and ponder how to build a base.
The OpenSCAD source code as a GitHub Gist:
The nice stainless steel screws on the right range from 4-40 to 10-32, which suffice for nearly everything I build around here.
Unlike the splined metric inserts on the left, these inserts have actual knurls and ridges that should hold them firmly in place. The specs give hard-inch dimensions, of course, that (seem to) correspond to the root diameter of the knurls. You can find nice engineering drawings of precise tapered holes (by drilling down into the Heat-Set Inserts for Plastics item on that page), but a few metric measurements of the actual parts on hand should suffice for my simple needs.
Thread: overall length x small rim OD x (knurl length x larger knurl OD)
- 4-40: 5.8 x 3.9 x (4.0 x 4.6)
- 6-32: 7.1 x 4.7 x (4.6 x 5.5)
- 8-32: 8.1 x 5.5 x (5.9 x 6.3)
- 10-32: 9.5 x 6.3 x (7.0 x 7.1)
Rather than fussing with a tapered hole, just punch a cylinder with the small rim OD (to clear the screw) through the part and put a cylinder with the knurl OD x length at the surface.
Using cylinders without diameter correction will make them slightly undersized for heat bonding. The usual 3D printing tolerances don’t justify anything fussier than that.
Using PolyCyl diameter correction will make the holes nearly spot on for epoxy bonding: butter ’em up, ram ’em in, pause for curing, done.
That’s the plan, anyhow…
I wanted a slightly larger “plate cap” to fit a big incandescent bulb and it seemed a fake heatsink might add gravitas to the proceedings:
Yeah, that antique ceramic socket holds the bulb at a rakish angle. Worse, even though I painstakingly laid out the position of the heatsink atop the bulb, it’s visibly off-center. Which wouldn’t be so bad, had I not epoxied the damn thing in place.
After reaming out the M2’s filament drive, the entire blue base printed without incident.
A closer look at the cap:
Memo to Self: Next time, line it up with the vertical glass support inside the bulb and ignore the external evidence.
The boss has a hole for the braid-enclosed cable to the knockoff Neopixel:
The cupped surface perfectly fits the bulb’s 3.75 inch diameter. While you wouldn’t mill out a real heatsink, it definitely looks better this way and (alas) gives the epoxy more footprint for a better grip.
I built the fins with a 1/8 inch cutter in mind, so the fin root radius allows for a
G3 arc without gouging. I doubt machining a fake heatsink from aluminum makes any sense, but the cheap extruded heatsinks on eBay don’t look very good. Plus, they sport completely unnecessary tapped holes for LED mounts and suchlike.
A cross-section shows the wiring channel and cable entry:
I epoxied the Neopixel in place, applied double-sided carpet tape to the whole thing, then painstakingly trimmed around the fins with an Xacto knife:
That looked better from the top side (where it was completely hidden) and came heartbreakingly close to working, but after about a day the cable + braid put enough torque on the cap to peel it off the bulb. Obviously, the tape holds much less enthusiastically after that.
Part of the problem came from the cable’s rather sharp angle just outside the cap:
Rakish angle, indeed. Two of ’em, in fact.
Unlike the smaller cap on the halogen bulb, this time I didn’t bother with a brass tube ferrule, mostly to see how it looks. I think it came out OK and the black braid looks striking in person. Conversely, a touch of brass never detracts from the appearance.
Obviously, the cable wasn’t long enough, either. Part of that problem came from underestimating the braid length: it shortens dramatically when slipped over the cable, even when you expect shortening. Somehow I managed to overlook that, despite cutting the cable quite long enough, thankyouverymuch. There’s a tradeoff between gentle angles and having the cable stick out too far for comfort.
Memo to Self: Use a cable at least four inches longer than necessary, measure the combined cable + braid assembly after screwing the bulb in the socket, and don’t epoxy anything before all the parts are ready for assembly.
That’s why it’s a prototype made out of blue PETG…
Protip: running old ceramic sockets through the dishwasher greatly simplifies their subsequent cleanup.
All in all, I like it.
The OpenSCAD source code as a GitHub gist: