|
// Drag Knife Holder using LM12UU linear bearing |
|
// Ed Nisley KE4ZNU – 2019-04-26 |
|
// 2019-06-01 Taper the nose |
|
|
|
Layout = "Build"; // [Build, Show, Puck, Mount, Plate] |
|
|
|
/* [Extrusion] */ |
|
|
|
ThreadThick = 0.25; // [0.20, 0.25] |
|
ThreadWidth = 0.40; // [0.40] |
|
|
|
/* [Hidden] */ |
|
|
|
Protrusion = 0.1; // [0.01, 0.1] |
|
|
|
HoleWindage = 0.2; |
|
|
|
inch = 25.4; |
|
|
|
function IntegerMultiple(Size,Unit) = Unit * ceil(Size / Unit); |
|
|
|
ID = 0; |
|
OD = 1; |
|
LENGTH = 2; |
|
|
|
//- 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); |
|
} |
|
|
|
//- Dimensions |
|
|
|
// Basic shape of DW660 snout fitting into the holder |
|
// Lip goes upward to lock into MPCNC mount |
|
|
|
Snout = [44.6,50.0,9.6]; // LENGTH = ID height |
|
Lip = 4.0; // height of lip at end of snout |
|
|
|
// Knife holder & suchlike |
|
|
|
KnifeBody = [12.0,18.0,2.0]; // body OD, flange OD, flange thickness |
|
|
|
Spring = [9.5,10.0,3*ThreadThick]; // compression spring loading knife blade |
|
|
|
PinAccess = 4.0; // hole to reach knife ejection pin |
|
|
|
WallThick = 4.0; // minimum thickness / width |
|
|
|
Screw = [4.0,8.5,25.0]; // thread ID, washer OD, length |
|
|
|
Insert = [4.0,6.0,10.0]; // brass insert |
|
|
|
Bearing = [12.0,21.0,30.0]; // linear bearing body |
|
|
|
Plate = [PinAccess,Snout[OD] – WallThick,WallThick]; // spring reaction plate |
|
|
|
echo(str("Plate: ",Plate)); |
|
|
|
SpringSeat = [0.56,7.2,2*ThreadThick]; // wire = ID, coil = OD, seat depth = length |
|
|
|
PuckOAL = max(Bearing[LENGTH],(Snout[LENGTH] + Lip)); // total height of DW660 fitting |
|
echo(str("PuckOAL: ",PuckOAL)); |
|
Key = [Snout[ID],25.7,(Snout[LENGTH] + Lip)]; // rectangular key |
|
|
|
NumScrews = 3; |
|
|
|
//ScrewBCD = 2.0*(Bearing[OD]/2 + Insert[OD]/2 + WallThick); |
|
ScrewBCD = (Snout[ID] + Bearing[OD])/2; |
|
|
|
NumSides = 9*4; // cylinder facets (multiple of 3 for lathe trimming) |
|
|
|
module DW660Puck() { |
|
|
|
translate([0,0,PuckOAL]) |
|
rotate([180,0,0]) { |
|
cylinder(d=Snout[OD],h=Lip/2,$fn=NumSides); |
|
translate([0,0,Lip/2]) |
|
cylinder(d1=Snout[OD],d2=Snout[ID],h=Lip/2,$fn=NumSides); |
|
cylinder(d=Snout[ID],h=(Snout[LENGTH] + Lip),$fn=NumSides); |
|
translate([0,0,(Snout[LENGTH] + Lip) – Protrusion]) |
|
cylinder(d1=Snout[ID],d2=2*WallThick + Bearing[OD],h=PuckOAL – (Snout[LENGTH] + Lip),$fn=NumSides); |
|
intersection() { |
|
translate([0,0,0*Lip + Key.z/2]) |
|
cube(Key,center=true); |
|
cylinder(d=Snout[OD],h=Lip + Key.z,$fn=NumSides); |
|
} |
|
} |
|
} |
|
|
|
module MountBase() { |
|
|
|
difference() { |
|
DW660Puck(); |
|
|
|
translate([0,0,-Protrusion]) // bearing |
|
PolyCyl(Bearing[OD],2*PuckOAL,NumSides); |
|
|
|
for (i=[0:NumScrews – 1]) // clamp screws |
|
rotate(i*360/NumScrews) |
|
translate([ScrewBCD/2,0,-Protrusion]) |
|
rotate(180/8) |
|
PolyCyl(Insert[OD],2*PuckOAL,8); |
|
} |
|
} |
|
|
|
module SpringPlate() { |
|
difference() { |
|
cylinder(d=Plate[OD],h=Plate[LENGTH],$fn=NumSides); |
|
|
|
translate([0,0,-Protrusion]) // ejection pin hole |
|
PolyCyl(PinAccess,2*Plate[LENGTH],NumSides); |
|
|
|
translate([0,0,Plate[LENGTH] – Spring[LENGTH]]) // spring retaining recess |
|
PolyCyl(Spring[OD],Spring[LENGTH] + Protrusion,NumSides); |
|
|
|
for (i=[0:NumScrews – 1]) // clamp screws |
|
rotate(i*360/NumScrews) |
|
translate([ScrewBCD/2,0,-Protrusion]) |
|
rotate(180/8) |
|
PolyCyl(Screw[ID],2*PuckOAL,8); |
|
|
|
if (false) |
|
for (i=[0:NumScrews – 1]) // coil positioning recess |
|
rotate(i*360/NumScrews) |
|
translate([ScrewBCD/2,0,-Protrusion]) |
|
rotate(180/8) |
|
PolyCyl(SpringSeat[OD],SpringSeat[LENGTH] + Protrusion,8); |
|
|
|
} |
|
} |
|
|
|
//—– |
|
// Build it |
|
|
|
if (Layout == "Puck") |
|
DW660Puck(); |
|
|
|
if (Layout == "Plate") |
|
SpringPlate(); |
|
|
|
if (Layout == "Mount") |
|
MountBase(); |
|
|
|
if (Layout == "Show") { |
|
MountBase(); |
|
translate([0,0,1.6*PuckOAL]) |
|
rotate([180,0,0]) |
|
SpringPlate(); |
|
} |
|
|
|
if (Layout == "Build") { |
|
translate([0,Snout[OD]/2,PuckOAL]) |
|
rotate([180,0,0]) |
|
MountBase(); |
|
translate([0,-Snout[OD]/2,0]) |
|
SpringPlate(); |
|
} |