Ed Nisley's Blog: Shop notes, electronics, firmware, machinery, 3D printing, laser cuttery, and curiosities. Contents: 100% human thinking, 0% AI slop.
The M2’s Z axis will descend under its own weight with the stepper motor disabled, landing with an emphatic thud when the Nylock nuts holding the leadscrew nut in place hit the top of the motor case. I stuck a pair of rubber feet atop the motor to cushion the impact:
M2 Z axis motor – added thermal compound
Yes, that’s thermal compound peeking out from between the motor and the chassis. More about that later, but it derives from those measurements.
The top end of the leadscrew passes through a ball bearing, but the bearing OD is about 15 mils smaller than the top plate recess ID. I slid a strip of 6 mil brass shimstock around the bearing to soak up the difference and reduce a nasty mechanical resonance:
M2 Z axis bearing – shimstock bushing
The leadscrew is also a loose fit in the bearing ID, which I’ll correct with a dab of low-strength threadlock when the time comes.
Note, however, that there’s no other mechanical compliance in the Z axis assembly, so a slightly misaligned leadscrew may actually need that slop when the stage approaches the top of its travel. That wasn’t the case in my printer, but don’t take it for granted; if the leadscrew doesn’t turn easily by hand, remove the shimstock.
It didn’t take long to realize that Makergear doesn’t actually have any assembly instructions that convert an array of parts bags into a working M2 printer. The box contained a set of subassembly drawings, their internal BOM checklist, and an orange sheet with cautionary notes. So I figured I’d build enough subassemblies to reduce the clutter, then put them together into the chassis while working on Phil’s card table.
Unfortunately, the BOM on each drawing may not match the drawing, the drawings don’t quite match what’s currently shipped, neither of those match the instructions on the website, the assembly videos / animations aren’t particularly useful (at least to me; I don’t need animated trajectories for nuts and bolts after the first one), not all hardware has a corresponding drawing, and nowhere will you find enough information to actually put the thing together on the first try. Makergear is obviously running as fast as they can, making improvements as they go, and, while the task isn’t impossible, if you’re not pretty good at mechanical assembly, building an M2 from scratch won’t be a pleasant experience.
A thread on the Makergear Google Group suggests there’s an unofficial “Heathkit style” manual in the offing, which will be a major improvement over the status quo. The catch will be updating the instructions in pace with production improvements, while not losing previous owners along the way. The Google Group has pointers to some good build logs; I regret I can’t contribute anything of the same scale.
Some assembly notes that don’t fit anywhere else…
The chassis arrived with the Y axis slide, Z axis stage, and Z axis stepper motor preassembled and aligned in the chassis. Given that’s the part of the process requiring, by their own admission and video example, some finesse, I think they found it impossible for newbies lacking experience.
CAUTION! If you must assemble the Z axis or modify it, you must remove all four screws from the stepper motor’s case to get it in or out of the chassis. Do not let the motor endcaps fall off or become misaligned, because that will demagnetize the rotor and drastically reduce the available torque. Perhaps wrapping some tape around the sides of the motor to secure the endcaps will prevent disaster. As I’ll describe later, the Z axis motor has barely enough torque for its job and any loss will render it useless.
Use the shortest possible screws in the two huge rubber feet on the X+ side of the chassis, because the electronics case must fit flush to the chassis just above them. The recommended screws protrude too far through the chassis plate, which is perfectly fine on the X- side.
Secure the electronics case to the chassis side using M3 screws, instead of the M4 screws that fit the threaded holes, with three M3 washers between the case and the chassis. Put Nylock nuts on the outside of the chassis. You’ll understand why when you get there.
Tape the picture of the power supply plugs behind the electronics case where you won’t mislay it, because inadvertently swapping the power connectors will not go well.
Believe it or not, that giant lump of wire on the end of the harness actually fits inside the electronics case. Take it slow and it’ll be all good.
M2 Electronics Case on chassis
Cut a cardboard cover (I harvested a shoe box) to fit the build platform and clip it in place whenever you’re not actually building something. You will drop tools on that lovely glass platform…
Makergear M2 3D Printer with cardboard protecting glass platform
Enthusiasm may get a product out, but engineering makes it work
Plywood and plastic do not produce a stable 3D printer
Measurements matter
8-bit microcontrollers belong in the dustbin of history
With that in mind, I’ve long thought that LinuxCNC (formerly EMC2) would provide a much better basis for the control software required for a 3D printer than the current crop of Arduino-based microcontrollers. LinuxCNC provides:
Hard real time motion control with proven performance
A robust, well-defined hardware interface layer
Ladder-logic machine control
Isolated userspace programming
Access to a complete Linux distro’s wealth of programs / utilities
Access to an x86 PC’s wealth of hardware gadgetry
Rather than (try to) force-fit new functions in an Arduino microcontroller, I decided it would be interesting to retrofit a DIY 3D printer with a LinuxCNC controller, improve the basic hardware control and sensing, instrument the extruder, then take measurements that might shed some light on DIY 3D printing’s current shortcomings.
Rebuild the extruder with temperature and force sensors
Start taking measurements!
My reasons for choosing the Makergear M2 as the basis for this project should be obvious:
All metal: no plywood, no acrylic (albeit a plastic filament drive)
Decent stepper motors (with one notable exception)
Reasonable hot end design
Good reputation
The first step of the overall plan included a meticulously documented M2 build that I figured would take a month or two, what with the usual snafus and gotchas that accompany building any complex mechanism. Quite by coincidence, a huge box arrived on my birthday (the Thing-O-Matic arrived on Christmas Eve, so perhaps this is a tradition), the day when I learned that Mad Phil had entered his final weeks of life.
As the Yiddish proverb puts it: If you wish to hear G*d laugh, tell him of your plans.
So I converted a box of parts into a functional M2 3D printer over the course of four intense days, alternating between our living room floor and a card table in Phil’s home office, showing him how things worked, getting his advice & suggestions, and swapping “Do you remember when?” stories. Another few days sufficed for software installation, configuration, and basic tuneup; I managed to show him some shiny plastic doodads just before he departed consensus reality; as nearly as I can tell, we both benefited from the distractions.
Which means I don’t have many pictures or much documentation of the in-process tweakage that produced a functional printer. The next week or so of posts should cover the key points in enough detail to be useful.
Not to spoil the plot or anything: a stock M2 works wonderfully well.
Owl – half size – left
For example, a half-scale cushwa owl printed in PLA at 165 °C with no bed cooling and these Slic3r parameters:
500 mm/s move
300 mm/s infill
200 mm/s solid infill
100 mm/s internal perimeter
50 mm/s bottom layer
30 mm/s external perimeter
1 mm retract @ 300 mm/s
The beak came out slightly droopy and each downward-pointing feather dangles a glittery drop. There’s room for improvement, but that’s pretty good a week after opening a box o’ parts…
Somehow, we wound up with a broom handle and a broom head, the former missing a threaded stub that was firmly lodged in the latter. A few minutes of Quality Shop Time sawed off the end of the handle and unscrewed the stub to produce this array of fragments:
Broken broom handle thread
It’s a cylindrical Thing tailor-made for (or, back in the day, by!) a lathe. My lathe has quick-change gears that can actually cut a 5 TPI thread, but that seems like a lot of work for such a crude fitting. Instead, an hour or so of desk work produced this:
Broom Handle Screw – solid model – overview
Some after-the-fact search-fu revealed that the thread found on brooms and paint rollers is a 3/4-5 Acme. Machinery’s Handbook has 13 pages of data for various Acme screw threads, making a distinction between General Purpose Acme threads and Stub Acme Threads: GP thread depth = 0.5 × pitch, Stub = 0.3 × pitch. For a 5 TPI thread = 0.2 inch pitch, that’s GP = 0.1 inch vs. Stub = 0.06 inch.
I measured a 5.0 mm pitch (which should be 5.08 mm = 0.2 inch exactly) and a crest-to-root depth of 1.4 mm = 0.055 inch, which makes them look like 3/4-5 Stub Acme threads. But, I didn’t know that at the time; a simple half-cylinder 2.5 mm wide and 1.25 mm tall was a pretty close match to what I saw on the broken plastic part.
Although OpenSCAD’s MCAD library has some screw forms, they’re either machine screws with V threads or ball screws with spheres. The former obviously weren’t appropriate and the latter produced far too many facets, so I conjured up a simpler shape: 32 slightly overlapping cylinders per turn, sunk halfway in the shaft at their midpoint, and tilted at the thread’s helix angle.
Broom Handle Screw – thread model closeup
The OpenSCAD source code has a commented-out section that removes a similar shape from the shaft between the raised thread, but that brought the rendering to its knees. Fortunately, it turned out to be unnecessary, but it’s there if you want it.
With the shaft diameter set to the “root diameter” of the thread and the other dimensions roughly matching the broken plastic bits, this emerged an hour later:
Broom handle screw plug – as built
The skirt thread was 0.25 to 0.30 mm thick, so the first-layer height tweak and packing density adjustments worked fine and all the dimensions came out perfectly. The cylindrical thread form doesn’t have much overhang and the threads came out fine; I think the correct straight-sided form would have more problems.
The hole down the middle accommodates a 1/4-20 bolt that applies enough clamping force to keep the shaft in compression, which ought to prevent it from breaking in normal use. I intended to use a hex bolt, but found a carriage bolt that was exactly the right length and had a head exactly the same diameter as the shaft, so I heated it with a propane torch and mushed its square shank into the top of the hexagonal bolt hole (the source code now includes a square recess):
Broom handle screw plug – in handle
The dimples on the side duplicate the method that secured the original plastic piece: four dents punched into the metal handle lock the plastic in place. It seems to work reasonably well, though, and is certainly less conspicuous than the screws I’d use.
Screwing it in place shows that it’s slightly too long (I trimmed the length in the source code):
Broom handle installed
It’s back in service, ready for use…
The OpenSCAD source code:
// Broom Handle Screw End Plug
// Ed Nisley KE4ZNU March 2013
// Extrusion parameters must match reality!
// Print with +1 shells and 3 solid layers
ThreadThick = 0.25;
ThreadWidth = 2.0 * ThreadThick;
HoleWindage = 0.2;
function IntegerMultiple(Size,Unit) = Unit * ceil(Size / Unit);
Protrusion = 0.1; // make holes end cleanly
//----------------------
// Dimensions
PI = 3.14159265358979;
PostOD = 22.3; // post inside metal handle
PostLength = 25.0;
FlangeOD = 24.0; // stop flange
FlangeLength = 3.0;
PitchDia = 15.5; // thread center diameter
ScrewLength = 20.0;
ThreadFormOD = 2.5; // diameter of thread form
ThreadPitch = 5.0;
BoltOD = 7.0; // clears 1/4-20 bolt
BoltSquare = 6.5; // across flats
BoltHeadThick = 3.0;
RecessDia = 6.0; // recesss to secure post in handle
OALength = PostLength + FlangeLength + ScrewLength; // excludes bolt head extension
$fn=8*4;
echo("Pitch dia: ",PitchDia);
echo("Root dia: ",PitchDia - ThreadFormOD);
echo("Crest dia: ",PitchDia + ThreadFormOD);
//----------------------
// Useful routines
module Cyl_Thread(pitch,length,pitchdia,cyl_radius,resolution=32) {
Cyl_Adjust = 1.25; // force overlap
Turns = length/pitch;
Slices = Turns*resolution;
RotIncr = 1/resolution;
PitchRad = pitchdia/2;
ZIncr = length/Slices;
helixangle = atan(pitch/(PI*pitchdia));
cyl_len = Cyl_Adjust*(PI*pitchdia)/resolution;
union() {
for (i = [0:Slices-1]) {
translate([PitchRad*cos(360*i/resolution),PitchRad*sin(360*i/resolution),i*ZIncr])
rotate([90+helixangle,0,360*i/resolution])
cylinder(r=cyl_radius,h=cyl_len,center=true,$fn=12);
}
}
}
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);
}
module ShowPegGrid(Space = 10.0,Size = 1.0) {
Range = floor(50 / Space);
for (x=[-Range:Range])
for (y=[-Range:Range])
translate([x*Space,y*Space,Size/2])
%cube(Size,center=true);
}
//-------------------
// Build it...
ShowPegGrid();
difference() {
union() {
cylinder(r=PostOD/2,h=PostLength);
cylinder(r=PitchDia/2,h=OALength);
translate([0,0,PostLength])
cylinder(r=FlangeOD/2,h=FlangeLength);
translate([0,0,(PostLength + FlangeLength)])
Cyl_Thread(ThreadPitch,(ScrewLength - ThreadFormOD/2),PitchDia,ThreadFormOD/2);
}
translate([0,0,-Protrusion])
PolyCyl(BoltOD,(OALength + 2*Protrusion),6);
translate([0,0,(OALength - BoltHeadThick)])
PolyCyl(BoltSquare,(BoltHeadThick + Protrusion),4);
// translate([0,0,(PostLength + FlangeLength + ThreadFormOD)])
// Cyl_Thread(ThreadPitch,(ScrewLength - ThreadFormOD/2),PitchDia,ThreadFormOD/2);
for (i = [0:90:270]) {
rotate(i)
translate([PostOD/2,0,PostLength/2])
sphere(r=RecessDia/2,$fn=8);
}
}
This receipt from a recent trip to the scrap metal dealer explains everything I’ve read about what happens when “cheap commodities” become “precious metals”…
That having been the case for some years, the weighman now scans your (well, my) drivers license to establish traceability in the event the metal turns out to be stolen, with your ID printed on the receipt. The receipt turns into cash at a fortress-like ATM structure out front, far from the actual metal-handling operation.
Despite having a computerized metal scale below what looks to be a cable modem bolted to the wall of the small-lot bay, EMR has no web presence whatsoever. That’s not yet a crime, but …
Some explanations:
B241 = brass plumbing fittings, chrome OK
CABL1 = house wiring and other copper-heavy cable
CABL2 = electronic gadget cables & connectors
C273 = pure copper with no fittings or solder, no enameled wire
C275 = copper bonded to any other metal or coated with insulation
We immediately converted those two Grants into a tank of gas and two bags of groceries, so the day came out about even.
While extricating the sawhorses from the garage, one of the bright yellow cap strips fell off. Whether by coincidence or not, it was the same one I’d previously repaired after sawing completely through the poor thing, but this time the failure came from what’s called inherent vice in the molded bracket-and-pin feature that holds the cap in place:
Fractured sawhorse top pin
I filed a flat on the top of the bracket, drilled a 4-40 clearance hole, and then held everything in place while drilling a 4-40 tapping hole into the sawhorse. There was just enough plastic to make all that work, at least for the not very strenuous conditions it should experience around here:
Fractured sawhorse top pin – with screw
While trying to reassemble the cap, I discovered why the bracket broke. The yellow cap has a bulkhead with an opening for the pin, plus a solid bulkhead that butts against the hinge along the top of the sawhorse. The bulkheads lie too close together: you simply cannot get the opening over the pin on this end with the cap parallel to the top of the sawhorse, which you must do in order to get the pin in the corresponding hole on that end.
Evidently they had the same problem at the factory and “solved” it by melting the bulkhead with a hot blade:
Sawhorse top cover – factory bodge
That didn’t really help me, but I carved off a few more slices to weaken the solid bulkhead enough to bend it around the hinge. I think the strain involved in the original assembly, plus what happened when I had to take it apart to fix the sawed-off end, weakened the bracket enough to snap off at some point over the winter.
Mad Phil asked me to replace the bulb in a lamp along the walkway to their garage, which turned into a bit of a circus: the bulb had shattered, leaving only the base in the socket. After clearing away the rubble, I was confronted with this:
Corroded lamp socket
I removed the entire lamp housing, laid it out on my workbench, and eventually resorted to jamming needle-nose pliers into the base and forcibly unscrewing it. That worked:
Corroded lamp base
Fortunately, the aluminum lamp base had corroded against the brass socket, not the other way around, so buffing the socket with a brass wheel in a Dremel handset and polishing the base contacts brought it back to life.