MPCNC: Re-Improved Endstop Switch Mount

As part of entombing the endstop PCBs in epoxy, I tweaked the switch mounts to (optionally) eliminate the screw holes and (definitely) rationalize the spacings:

MPCNC MB Endstop Mount - No screws
MPCNC MB Endstop Mount – No screws

The sectioned view shows the cable tie slot neatly centered between the bottom of the switch terminal pit and the EMT rail, now with plenty of meat above the cable tie latch recess. The guide ramp on the other side has a more-better position & angle, too.

A trial fit before dabbing on the epoxy:

MPCNC - Endstop Mount for epoxy coating - trial fit
MPCNC – Endstop Mount for epoxy coating – trial fit

The 3M black foam tape works wonderfully well!

After the epoxy cures, it’s all good:

MPCNC - Epoxy-coated Endstop - Installed
MPCNC – Epoxy-coated Endstop – Installed

The OpenSCAD source code as a GitHub Gist:

// MPCNC Endstop Mount for Makerbot PCB on EMT tubing
// Ed Nisley KE4ZNU - 2017-12-04
/* [Build Options] */
Layout = "Show"; // [Build, Show, Block]
Holes = false; // holes for switch screws
Section = true; // show internal details
/* [Extrusion] */
ThreadThick = 0.25; // [0.20, 0.25]
ThreadWidth = 0.40; // [0.40]
function IntegerMultiple(Size,Unit) = Unit * ceil(Size / Unit);
/* [Hidden] */
Protrusion = 0.01; // [0.01, 0.1]
HoleWindage = 0.2;
ID = 0;
OD = 1;
LENGTH = 2;
/* [Sizes] */
RailOD = 23.5; // actual rail OD
SwitchHeight = 8.0; // switch PCB distance from rail OD
Strap = [5.5,50,2.0]; // nylon strap securing block to rail
StrapHead = [8.2,3.0,5.5]; // recess for strap ratchet head
Screw = [2.0,3.6,7.0]; // thread dia, head OD, screw length
HoleOffset = [2.5,19.0/2]; // PCB mounting holes from PCB edge, rail center
SwitchClear = [6.0,15,3.0]; // clearance around switch pins
SwitchOffset = [6.0,0]; // XY center of switch from holes
StrapHeight = (SwitchHeight - SwitchClear[2])/2; // strap center from rail
Block = [16.4,26.0,RailOD/2 + SwitchHeight]; // basic block shape
//- 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);
}
//- Shapes
// Main block constructed centered on XY with Z=0 at top of rail
module PCBBlock() {
difference() {
translate([-Block[0]/2,-Block[1]/2,-RailOD/2])
cube(Block,center=false);
translate([(SwitchOffset[0] + HoleOffset[0] - Block[0]/2),
SwitchOffset[1],
(SwitchHeight - SwitchClear[2]/2 + Protrusion/2)])
cube(SwitchClear + [0,0,Protrusion],center=true);
if (Holes)
for (j=[-1,1])
translate([HoleOffset[0] - Block[0]/2,j*HoleOffset[1],(Block[2]/2 - Screw[LENGTH])])
rotate(180/6)
if (true) // true = loose fit
PolyCyl(Screw[ID],Screw[LENGTH] + Protrusion,6);
else
cylinder(d=Screw[ID],h=Screw[LENGTH] + Protrusion,$fn=6);
translate([0,0,StrapHeight])
cube(Strap,center=true);
translate([0, // strap head recess
(Block[1]/2 - StrapHead[1]/2 + Protrusion),
StrapHeight - Strap[2]/2 + StrapHead[2]/2])
cube(StrapHead + [0,Protrusion,0],center=true);
StrapAngle = atan((StrapHeight + RailOD/4)/Strap[2]); // a reasonable angle
echo(str("Strap Angle: ",StrapAngle));
translate([0,-(Block[1]/2 - Strap[2]/(2*sin(StrapAngle))),StrapHeight])
rotate([StrapAngle,0,0])
translate([0,-Strap[1]/2,0])
cube(Strap,center=true);
if (Section)
translate([Block[0]/2,0,0])
cube(Block + [0,2*Protrusion,2*Block[2]],center=true);
}
}
module Mount() {
difference() {
translate([0,0,RailOD/2])
PCBBlock();
rotate([0,90,0])
cylinder(d=RailOD,h=3*Block[0],center=true);
}
}
//- Build things
if (Layout == "Show") {
Mount();
color("Yellow",0.5)
rotate([0,90,0])
cylinder(d=RailOD,h=3*Block[0],center=true);
}
if (Layout == "Block")
PCBBlock();
if (Layout == "Build")
translate([0,0,Block[2]])
rotate([180,0,0])
Mount();