This mount will hold a NEMA 17 stepper firmly in place so I can attach things to the shaft:
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:
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,
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);
}
//----------------------
// Combined stand and mounting plate
module Combined() {
difference() {
translate([StandThick/2,0,StandWidth/2])
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])
translate([x*NEMA17_BoltOC/2,y*NEMA17_BoltOC/2,-Protrusion])
PolyCyl(MountBoltDia,(MountThick + 2*Protrusion));
for (y=[-1,1]) // cutouts over bolts
translate([-Protrusion/2,
y*((StandLength - StandBoltClear)/2 + Protrusion),
StandWidth/2])
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])
rotate([0,90,0])
PolyCyl(Clear10_32,StandThick + 2*Protrusion,8);
}
}
//----------------------
// Lash everything together
ShowPegGrid();
if (Layout == "Build") {
translate([0,0,0])
Combined();
}
if (Layout == "Show") {
translate([-StandWidth/2,0,(StandThick + MountWidth/2)])
rotate([0,90,0])
Combined();
}



#1 by George Martin on 23-August-2011 - 16:43
Is this part stiff enough to use directly in the system?
#2 by Ed on 23-August-2011 - 21:00
For my purposes, yes indeed!
Two of ‘em will turn into a simpleminded dynamometer, so it’s pure torque loading. The face of the motor stiffens the plate between the uprights very nicely.
I think it’d have trouble with axial loads and I wouldn’t want to run it with a pulley imposing much of a radial load, but for pure torque, it’ll do fine.
#3 by George Martin on 24-August-2011 - 07:27
Sort of like an engine block stiffens the F1 cars.
You mechanical guys are nuts. wink, wink, nod, nod
#4 by John Abella (@johnabella) on 11-October-2011 - 13:56
Ed – I’m blatantly misusing your mount here: http://www.thingiverse.com/thing:12403 – works great, btw.
#5 by Ed on 12-October-2011 - 15:10
Oh, I don’t know, it seems happy enough… you can’t be treating it all that badly!
That’s a neat gadget; I like the combination of tech foundation and artsy results.
#6 by zenwebb on 15-March-2012 - 19:27
Where can we download the “units.scad” file referenced?
#7 by Ed on 15-March-2012 - 19:50
It’s part of the MCAD library collection that’s now included with OpenSCAD, although apparently only in the source distribution down near the bottom of http://www.openscad.org, not the precompiled binaries. The original version is at github.com/D1plo1d/MCAD.