The Smell of Molten Projects in the Morning

Ed Nisley's Blog: Shop notes, electronics, firmware, machinery, 3D printing, laser cuttery, and curiosities. Contents: 100% human thinking, 0% AI slop.

Category: Machine Shop

Mechanical widgetry

  • 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,
               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();
    }
    
  • 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])
    translate([x*Space,y*Space,Size/2])
    %cube(Size,center=true);
    
    }
    
    ShowPegGrid();
    cube(2,center=true);
    
  • 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.

  • 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?)

  • Thing-O-Matic: Bicolored Prints

    This isn’t rocket science and it’s certainly not original, but I finally screwed up enough courage to start routinely swapping in a new filament color without pulling out the old one. The trick is to cut both ends flush (with a flush-cutting wire cutter) and maintain gentle pressure on the new filament so it slides right into the grip of the extruder drive gear.

    Seeing as how I need tchotchkes in a big way, I run off a plate of Chalk People whenever it’s time for a new color:

    Multicolored Chalk People
    Multicolored Chalk People

    The transition between yellow and black was rather weird. Fortunately, the gory details remain hidden inside that quartet of Chalk Women.

    These have all the right attributes for a tchotchke: fast printing, not much plastic, smooth edges, a little fill to show how it works, a few small defects for education.

  • Reversal Zits: Temperature Variations

    Just for completeness, it turns out that extrusion temperature doesn’t have any effect on Reversal zits. A while back I dropped the standard temperature from 210 °C to 190 °C in one fell swoop and it didn’t change anything worth mentioning, let alone the zittage.

    The white one was hotter, the orange one is cooler:

    Octopodes - Temperature variation
    Octopodes – Temperature variation

    The zits are pretty much due to Reversal followed by in-plane motion, it seems to me.

    A dramatically lower extrusion temperature works fine for smaller objects, but I’d expect very large objects to delaminate like crazy. The Barbie Pistol was, IIRC, printed at 220 °C, and it had some troubles.

    It’s also worth noting that the indicated temperature has only a casual relationship to the actual extrusion temperature. I’ve put considerable effort into electrically insulating and thermally bonding the thermocouple to the Thermal Core, so I think it’s a good indicator, but your results will certainly differ.