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

  • Makergear M2: Re-Relocated Z-min Platform Height Switch

    A few trips with the M2 convinced me that the cable to the relocated Z-min switch along the front of the X gantry needed a clip on each end and should not run under the gantry. This time I used the full width of the steel strap and bashed a neater curve around a length of drill rod:

    M2 Z-min Cable Clip - forming
    M2 Z-min Cable Clip – forming

    The new clips look a bit better with straight edges:

    M2 Z-min Cable Clips - old vs new
    M2 Z-min Cable Clips – old vs new

    The top view shows the new clips and cable location:

    M2 Z-min Switch - top view
    M2 Z-min Switch – top view

    While I was at it, I trimmed the edges off the switch mounting block. Rather than figure out the trig required to hack off the corners, I applied linear_extrude() to a polygon() defined by some obvious points, then poked the same holes in the block:

    Z-min Front Mount Switch Block - chamfer - solid model
    Z-min Front Mount Switch Block – chamfer – solid model

    It pretty much vanishes in the top view, but here’s a view from the +Y end of the platform:

    M2 Z-min Switch - bottom view
    M2 Z-min Switch – bottom view

    Despite all that maneuvering, the G92 Z-4.55 touchoff value remained the same!

    If you’ve forgotten why all this makes sense, it’s a first pass at detecting the actual build platform position. The stock M2 uses that switch to detect the top of a screw attached to the Z-axis stage, which means it can’t sense the actual platform. The Z-min switch I added to the Thing-O-Matic convinced me that was the only way to fly; given the TOM’s plywood-and-acrylic frame, it was essentially mandatory.

    Mounting the switch on the extruder would allow probing the entire platform, which would allow on-the-fly correction for both average height and (non-)flatness, but that’s a whole ‘nother project.

    The OpenSCAD source code:

    // Block to mount M2 Z-min switch on X gantry
    // Ed Nisley KE4ZNU - Oct 2013
    
    //- Extrusion parameters - must match reality!
    
    ThreadThick = 0.25;
    ThreadWidth = 0.40;
    
    function IntegerMultiple(Size,Unit) = Unit * ceil(Size / Unit);
    
    Protrusion = 0.1;
    
    HoleWindage = 0.2;
    
    //- Sizes
    
    SwitchLength = 20.0;					// switch size across front of block
    
    SwitchScrewOD = 2.05;					// microswitch screw tapping
    SwitchScrewOC = 9.5;					//  ... on-center spacing
    
    GantryScrewOD = 3.0;					// X rail screw clearance
    GantryScrewOC = 25.0;					//  ... on-center spacing along X
    GantryScrewOffset = 12.0;				//  ... Y offset from gantry front
    
    BlockSize = [1.5*GantryScrewOC,17.0,5.0];			// XYZ dimensions as mounted
    HalfBlock = BlockSize/2;
    
    SwitchScrewLength = BlockSize[1] - 5*ThreadWidth;	// net length of switch screws
    echo("Max switch screw length: ",SwitchScrewLength + 5.0);		// ... allow switch thickness
    
    ChamferAngle = atan((BlockSize[0] - SwitchLength)/(BlockSize[1]/2));
    echo("Chamfer Angle: ",ChamferAngle);
    
    //- Adjust hole diameter to make the size come out right
    
    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);
    }
    
    //- Put peg grid on build surface
    
    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);
    
    }
    
    //- Define basic block shape
    
    module BaseBlock() {
    	translate([0,-GantryScrewOffset,0])
    		linear_extrude(height=BlockSize[2])
    		polygon(points=[[-HalfBlock[0],BlockSize[1]],
    						[HalfBlock[0],BlockSize[1]],
    						[HalfBlock[0],HalfBlock[1]],
    						[SwitchLength/2,0],
    						[-SwitchLength/2,0],
    						[-HalfBlock[0],HalfBlock[1]]
    						]);
    }
    
    //- Build it
    
    ShowPegGrid();
    
    difference() {
    	BaseBlock();
    	for (i=[-1,1]) {
    		translate([i*GantryScrewOC/2,0,-Protrusion])
    			rotate(-90)
    				PolyCyl(GantryScrewOD,(BlockSize[2] + 2*Protrusion));
    		translate([i*SwitchScrewOC/2,-(GantryScrewOffset + Protrusion),BlockSize[2]/2])
    			rotate([-90,0,0])
    				rotate(90)
    					PolyCyl(SwitchScrewOD,(SwitchScrewLength + Protrusion));
    	}
    }