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.

The New Hotness

  • Kenmore 158: NEMA 23 Motor Adapter

    After removing the AC motor from the sewing machine, I wondered if a NEMA 23 stepper motor would fit:

    Kenmore 158 - NEMA 23 stepper - trial fit
    Kenmore 158 – NEMA 23 stepper – trial fit

    Huh. Who’d’a thunk it? That’s just too good to pass up…

    Although you wouldn’t use PLA for the real motor mount, this was easy:

    Drive Motor Mount - solid model
    Drive Motor Mount – solid model

    And the whole affair fits pretty much like you’d expect:

    Kenmore 158 - NEMA 23 stepper - on adapter
    Kenmore 158 – NEMA 23 stepper – on adapter

    The NEMA 23 motor doesn’t have the same end profile as the AC motor and the adapter plate gets in the way of the pulley, but flipping the pulley end-for-end perfectly aligned the belt.

    For whatever it’s worth, here’s how I removed the pressed-on gear from the shaft:

    NEMA 23 Stepper - removing gear
    NEMA 23 Stepper – removing gear

    I’m pretty sure I have a little gear puller somewhere, but it’s not where I expected to find it, which means it could be anywhere.

    Much to my astonishment, the shafts on both motors are exactly 1/4″ inch. I filed a flat on the shaft to avoid having the setscrew goober the poor thing.

    A stepper isn’t the right hammer for this job, because it can’t possibly reach 8000 rpm, but it’ll be good enough to explore the parameter space and weed out the truly stupid mistakes. A brushless DC motor from halfway around the planet would fit in the same spot.

    The OpenSCAD source code:

    // NEMA 23 Stepper Mounting Plate
    // Ed Nisley - KE4ZNU - June 2014
    
    Layout = "Build";			// Build Show 
    
    //- Extrusion parameters must match reality!
    //  Print with 4 shells and 3 solid layers
    
    ThreadThick = 0.20;
    ThreadWidth = 0.40;
    
    HoleWindage = 0.2;			// extra clearance
    
    Protrusion = 0.1;			// make holes end cleanly
    
    AlignPinOD = 1.70;			// assembly alignment pins: filament dia
    
    inch = 25.4;
    
    function IntegerMultiple(Size,Unit) = Unit * ceil(Size / Unit);
    
    //----------------------
    // Dimensions
    // Origin at bottom front corner of plate as mounted on machine
    //	motor mounted on rear surface, so recess is on that side
    
    PlateThick = 4.0;				// overall plate thickness
    
    SlotOffset = [10.0,13.0,0];		// center nearest origin, motor in X+,Y+ direction
    SlotSize = [8.0,25.0];			// diameter of mounting screw , overall end-to-end length
    
    CutoutOffset = [0.0,40.0,0];	// cutout around machine casting
    CutoutSize = [18.0,18.0];
    
    MotorBase = 58.0;				// square base plate side
    MotorHoleOC = 47.2;				// hole center-to-center spacing
    MotorHoleOffset = MotorHoleOC/2;
    MotorHoleDia = 5.0;
    MotorBaseCornerRadius = (MotorBase - MotorHoleOC)/2;
    
    FlangeWidth = 20.0;				// mounting flange
    
    MotorCenter = [(FlangeWidth + MotorBase/2),(MotorBase/2),0];		// XY of shaft centerline
    
    MotorShaftDia = 7.0;			// allow some clearance
    
    HubDia = 38.5;					// allow some clearance
    HubHeight = 1.8;
    
    //----------------------
    // 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) {
    
      RangeX = floor(100 / Space);
      RangeY = floor(125 / Space);
    
    	for (x=[-RangeX:RangeX])
    	  for (y=[-RangeY:RangeY])
    		translate([x*Space,y*Space,Size/2])
    		  %cube(Size,center=true);
    
    }
    
    //----------------------
    // Build it!
    
    module BasePlate() {
    
    	difference() {
    //		cube([(MotorCenter[0] + MotorBase/2),MotorBase,PlateThick],center=false);
    		linear_extrude(height = PlateThick) {
    			hull() {
    				translate([MotorBaseCornerRadius,MotorBaseCornerRadius])
    					circle(r=MotorBaseCornerRadius);
    				translate([MotorBaseCornerRadius,MotorBase - MotorBaseCornerRadius])
    					circle(r=MotorBaseCornerRadius);
    				translate([FlangeWidth + MotorBase - MotorBaseCornerRadius,MotorBase - MotorBaseCornerRadius])
    					circle(r=MotorBaseCornerRadius);
    				translate([FlangeWidth + MotorBase - MotorBaseCornerRadius,MotorBaseCornerRadius])
    					circle(r=MotorBaseCornerRadius);
    			}
    		}
    
    		translate(MotorCenter - [0,0,Protrusion]) {
    			rotate(180/8)
    				PolyCyl(MotorShaftDia,(PlateThick + 2*Protrusion),8);		// shaft hole
    			PolyCyl(HubDia,(HubHeight + Protrusion));						// hub recess
    			for (x=[-1,1] , y=[-1,1]) {
    				translate([x*MotorHoleOffset,y*MotorHoleOffset,0])
    					rotate(180/8)
    						PolyCyl(MotorHoleDia,(PlateThick + 2*Protrusion),8);
    			}
    		}
    
    		translate(SlotOffset - [0,0,Protrusion]) {							// adjustment slot
    			linear_extrude(height = (PlateThick + 2*Protrusion))
    				hull() {
    					circle(d=SlotSize[0]);
    					translate([0,(SlotSize[1] - SlotSize[0])])
    						circle(d=SlotSize[0]);
    
    				}
    		}
    
    		translate(CutoutOffset - [Protrusion,0,Protrusion])
    			linear_extrude(height = (PlateThick + 2*Protrusion))
    				square(CutoutSize + [Protrusion,Protrusion]);
    	}
    }
    
    ShowPegGrid();
    
    if (Layout == "Show") {
    	BasePlate();
    }
    
    if (Layout == "Build") {
    	translate([-(SlotOffset[0] + MotorBase/2),MotorBase/2,PlateThick])
    		rotate([180,0,0])
    			BasePlate();
    }