NEMA 17 Stepper Motor Mount

This mount will hold a NEMA 17 stepper firmly in place so I can attach things to the shaft:

NEMA 17 Mount on build plate
NEMA 17 Mount on build plate

The baseplate holes fit 10-32 screws, which work in the plastic sheet that will go below this thing, and the motor mount plate holes fits 3 mm bolts for the motors. Washers under the heads, of course. Build with three additional shells, three solid layers, and 0.25 fill for useful rigidity; the flanges came out completely solid.

Somewhat to my surprise, this didn’t show any signs of delamination due to the rather low 190 °C extrusion temperature. The flanges aren’t all that massive, though, so perhaps trouble still lies await.

The OpenSCAD solid model uses subtractive construction, for reasons that I’ll go into later:

NEMA 17 Stepper Mount - solid model
NEMA 17 Stepper Mount - solid model

The OpenSCAD source code:

// NEMA 17 stepper mount for dynamometer
// Ed Nisley KE4ZNU August 2011

include </home/ed/Thing-O-Matic/lib/MCAD/units.scad>

//-- Layout Control

Layout = "Build";				// Build Show

//-- Extrusion parameters

ThreadThick = 0.33;
ThreadWT = 2.0;
ThreadWidth = ThreadThick * ThreadWT;

HoleWindage = 0.3;			// enlarge hole dia by this amount

function IntegerMultiple(Size,Unit) = Unit * ceil(Size / Unit);

//-- Useful sizes

Tap10_32 = 0.159 * inch;
Clear10_32 = 0.190 * inch;
Head10_32 = 0.373 * inch;
Head10_32Thick = 0.110 * inch;
Nut10_32Dia = 0.433 * inch;
Nut10_32Thick = 0.130 * inch;

NEMA17_ShaftDia = 5.0;
NEMA17_ShaftLength = 24.0;
NEMA17_PilotDia = 0.866 * inch;
NEMA17_PilotLength = 0.080 * inch;
NEMA17_BCD = 1.725 * inch;
NEMA17_BoltDia = 3.5;
NEMA17_BoltOC = 1.220 * inch;

//-- Mount Sizes

MountWidth = IntegerMultiple(NEMA17_BCD,ThreadWidth);		// use BCD for motor clearance
MountThick = IntegerMultiple(8.0,ThreadThick);				// for stiffness

MountBoltDia = 3.0;

StandThick = IntegerMultiple(5.0,ThreadWidth);				// baseplate

StrutThick = IntegerMultiple(4.0,ThreadWidth);				// sides holding motor mount

UprightLength = MountWidth + 2*StrutThick;

StandBoltHead = IntegerMultiple(Head10_32,5);				// bolt head rounded up
StandBoltOC = IntegerMultiple(UprightLength + 2*StandBoltHead,5);

StandLength = StandBoltOC + 2*StandBoltHead;
StandWidth = IntegerMultiple(2*StandBoltHead,ThreadThick);

StandBoltClear = (StandLength - UprightLength)/2;			// flat around bolt head

MotorRecess = StandWidth - MountThick;

echo(str("Stand Base: ",StandLength," x ",StandWidth," x ",StandThick));
echo(str("Stand Bolt OC: ",StandBoltOC));
echo(str("Strut Thick: ",StrutThick));

//-- Convenience values

Protrusion = 0.1;		// make holes look good and joints intersect properly

BuildOffset = 3 * ThreadWidth;

// 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,

module ShowPegGrid(Space = 10.0,Size = 1.0) {

  Range = floor(50 / Space);

	for (x=[-Range:Range])
	  for (y=[-Range:Range])


// Combined stand and mounting plate

module Combined() {

  difference() {
	  cube([(MountWidth + StandThick),StandLength,StandWidth],center=true);
	translate([-Protrusion/2,0,StandWidth - (MotorRecess - Protrusion)/2])
	  cube([(MountWidth + Protrusion),MountWidth,(MotorRecess + Protrusion)],center=true);
	translate([0,0,-Protrusion])				// pilot hole
	  PolyCyl(NEMA17_PilotDia,(MountThick + 2*Protrusion));
	for (x=[-1,1])								// motor bolt holes
	  for (y=[-1,1])
		  PolyCyl(MountBoltDia,(MountThick + 2*Protrusion));
	for (y=[-1,1])								// cutouts over bolts
				y*((StandLength - StandBoltClear)/2 + Protrusion),
		cube([(MountWidth + Protrusion),
			 (StandBoltClear + Protrusion),
			 (StandWidth + 2*Protrusion)],center=true);
	for (y=[-1,1])								// stand bolt holes
	  translate([(MountWidth/2 - Protrusion),y*StandBoltOC/2,StandWidth/2])
		  PolyCyl(Clear10_32,StandThick + 2*Protrusion,8);



// Lash everything together


if (Layout == "Build") {

if (Layout == "Show") {
  translate([-StandWidth/2,0,(StandThick + MountWidth/2)])

Revised OpenSCAD Layout Grid

Following the suggestions in the comments to my previous attempt at an OpenSCAD layout grid, this pass works better:

  • Leave it turned on all the time
  • Parameterized everything
  • Useful default values
  • Less obtrusive

It looks about the same as before, only now it’s transparent gray. The 2-unit cube in the middle marks the “your object goes there” spot; the % prefix on the grid cubes causes OpenSCAD to ignore them.

OpenSCAD Build Surface Grid - revised
OpenSCAD Build Surface Grid - revised

The OpenSCAD source code:

module ShowPegGrid(Space = 10.0,Size = 1.0) {

Range = floor(50 / Space);

for (x=[-Range:Range])
for (y=[-Range:Range])



Thing-O-Matic: Wiper Rebuild Doodles

Unlike most folks, it seems, I’m a big fan of automatic wiping at the start of each print. It’s particularly important with the Z-min platform height switch, because a little ABS snot on the end of the nozzle changes the initial layer thickness in a bad way: additional height at the switch reduces the first layer thickness.

The problem is that the default wiper position at the right front corner of the platform requires a cutout in the build plates and the wiper gets in the way of the first several layers of very large objects.

I’m thinking of moving the wiper to the center rear of the platform, sticking out beyond the plates. There’s a convenient hole in the HBP platform for a mounting bracket, it won’t hit either of the Z axis rods at either end of the X axis travel, and maybe it’ll be low enough to stay out of the way.

In the nature of a prototype, I smoothed a layer of Permatex copper-loaded silicone gasket compound into the corner of an old dental floss container to get a more-or-less right-angled shape:

Silicone-copper wiper - curing
Silicone-copper wiper - curing

That’s much thicker than the usual gasket that you’re supposed to make from this stuff, so I let it cure for a few days before popping it out, then another few days to get into that big lump in the corner. As expected, it doesn’t stick to polyethylene at all.

After trimming, it looks more like a wiper blade, albeit with Orc Engineering artistic sensibilities:

Trimmed wiper
Trimmed wiper

It’s fairly soft stuff, which is what you want in a gasket, so it’ll require support on the bottom and back. Right now, I’m not sure which is which, which is why I troweled the stuff into the mold with one thick side and one thin side.

A simple bent-metal bracket should do the trick, with a screw in a hole punched through the wiper blade mounting the whole affair to the HBP plywood. Of course, it’d be even better with a printed bracket.

The silicone’s temperature rating goes up to 700 C for intermittent use, which sounds about right for this application.

Opossum in the Attic!

Quite some years ago, before I stapled a wad of steel wool in the hole gnawed in the corner of the garage door, the scrabble of little feet in the attic meant it was time to re-bait the mouse traps. Then, one night, we heard the scrabble of big feet in the attic…

This is the point where the horror film audience starts chanting “Don’t open the door! Don’t open the door!“, but, to our credit, we did not don our skimpiest underwear before venturing into the attic. We didn’t encounter any zombies, either, but we did find this chap:

Opossum in attic
Opossum in attic

This is about as far north as opossums get; their ears suffer frostbite over the winters and get all raggedy, hence the pink teddy bear aspect. These are not, however, cute and cuddly critters.

The house has a full hip roof with a four-foot soffit over the patio, which must be the best place for a ‘possum to hang out:

Opossum in attic soffit
Opossum in attic soffit

Some quick searches with the usual keywords suggested leaving the lights on and playing loud music, so we deployed several shoplights and a radio turned up all the way. It took two or three days, but eventually Mary spotted the critter on its way out of the garage… and now we don’t leave the garage door open any longer than needed.

FWIW, the path from the garage to the attic requires climbing those shelves, scaling three feet of vertical plasterboard wall, then crawling through a (now securely closed) vent hatch.

Exposed Stepper Motor Windings

Got a stepper motor from halfway around the planet from the usual eBay source, intended for a direct-drive extruder (at some point). This one has integral wire leads, which is fine with me, but the opening in the rear endcap reveals a bit more of the innards than one usually sees:

ACT 17HS5425 stepper - exposed winding
ACT 17HS5425 stepper - exposed winding

Yup, that’s one winding peeking out. Although the wire insulation should take care of anything conductive, I’d expect the same casual attention to detail in the winding terminals.

I’d worry more if this were being used in a metal-cutting operation, but a snippet of heatshrink tubing and a blob of hot-melt glue seem in order.

For what it’s worth, the motor is an ACT 17HS5425:

  • 1.8°/step
  • 48 mm case length
  • 3.1 V
  • 2.5 A
  • 1.25 Ω
  • 1.8 mH
  • 48 oz·in holding torque
  • 2.8 oz·in detent torque
  • 68 oz·in rotor torque

No torque curves and nothing more in the way of a datasheet.

Tour Easy: Squeaky Pedal

Of late my Tour Easy has developed a squeak at the pedal-go-round rate. It has Performance Bike Campus pedals, with SPD cleats on one side and a rat-trap surface on the other, and only the SPD side squeaked.

Turns out that the two little mounting screws holding the cleat dingus worked their way loose.

SPD pedal screws
SPD pedal screws

I should probably ease some lube under that plate, just to be sure, but the simple fix worked fine…

(And, yeah, I should clean it, just once, to see what it’s like, right?)

Upholstered Mouse Nest

After rearranging the pressure washer pipes, I hauled the grill out on the driveway and opened the lid. My Shop Assistant denied putting that ball of fuzz in there:

Wool ball in propane grill
Wool ball in propane grill

Gingerly prying it open revealed a mouse-sized pocket in the middle:

Wool ball interior
Wool ball interior

And a bit of investigation uncovered the source of the batting. Evidently, the corner seam of the ancient lawn couch thing (which came with the house and has been unused for over a decade) sitting on the patio had burst, leaving just enough room for an industrious mouse:

Source of the wool ball
Source of the wool ball

They’d been camping inside the cushion at least over the winter and evidently used the far corner as their latrine. We bagged the whole cushion and added it to the van full of trash headed for the town’s bulk collection, which fortunately occurred that weekend.

Now, to haul the frame to the metal recycler and take advantage of the current commodity price bubble…