Skip to content

Instantly share code, notes, and snippets.

@ednisley
Created June 26, 2019 17:10
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ednisley/259023957b11ed0d310fef70f0e91497 to your computer and use it in GitHub Desktop.
Save ednisley/259023957b11ed0d310fef70f0e91497 to your computer and use it in GitHub Desktop.
OpenSCAD source code: 3 mm collet pen holder in LM12UU linear bearing
// Collet pen cartridge holder using LM12UU linear bearing
// Ed Nisley KE4ZNU - 2019-04-26
// 2019-06 Adapted from LM12UU drag knife holder
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
// Holder & suchlike
Spring = [8.8,10.0,3*ThreadThick]; // compression spring loading knife blade
PenShaft = 4.5; // hole to pass pen cartridge
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 = [PenShaft,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;
echo(str("Screw BCD: ",ScrewBCD));
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]) // pen cartridge hole
PolyCyl(PenShaft,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();
}
@ednisley
Copy link
Author

More details on my blog at https://wp.me/poZKh-8gH

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment