-
CNC 3018-Pro: Collet Pen Holder
Along the same lines as the MPCNC pen holder, I now have one for the 3018:

CNC3018 – Collet pen holder – assembled The body happened to be slightly longer than two LM12UU linear bearings stacked end-to-end, which I didn’t realize must be a constraint until I was pressing them into place:

CNC 3018-Pro Collet Holder – LM12UU – solid model In the unlikely event I need another one, the code will sprout a
max()function in the appropriate spot.Drilling the aluminum rod for the knurled ring produced a really nice chip:

CNC3018 – Collet pen holder – drilling knurled ring Yeah, a good drill will produce two chips, but I’ll take what I can get.
There’s not much left of the original holder after turning it down to 8 mm so it fits inside the 12 mm rod:

CNC3018 – Collet pen holder – turning collet OD Confronted by so much shiny aluminum, I realized I didn’t need an 8 mm hole through the rod, so I cut off the collet shaft and drilled out the back end to clear the flanges on the ink tubes:

CNC3018 – Collet pen holder – drilling out collet I figured things would eventually go badly if I trimmed enough ink-filled crimps:

Collet holder – pen cartridge locating flanges The OpenSCAD source code as a GitHub Gist:
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters// Collet Pen Holder in LM12UU linear bearings for CNC3018 // Ed Nisley KE4ZNU – 2019-10-30 Layout = "Build"; // [Build, Show, Base, Mount, Plate] /* [Hidden] */ ThreadThick = 0.25; // [0.20, 0.25] ThreadWidth = 0.40; // [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 PenOD = 3.5; // pen cartridge diameter Bearing = [12.0,21.0,30.0]; // linear bearing body SpringSeat = [0.56,10.0,3*ThreadThick]; // wire = ID, coil = OD, seat depth = length WallThick = 4.0; // minimum thickness / width Screw = [3.0,6.75,25.0]; // holding it all together, OD = washer Insert = [3.0,5.5,8.2]; // brass insert //Insert = [4.0,6.0,10.0]; Clamp = [43.2,44.5,34.0]; // tool clamp ring, OD = clearance around top LipHeight = IntegerMultiple(2.0,ThreadThick); // above clamp for retaining BottomExtension = 25.0; // below clamp to reach workpiece MountOAL = LipHeight + Clamp[LENGTH] + BottomExtension; // total mount length echo(str("Mount OAL: ",MountOAL)); Plate = [1.5*PenOD,Clamp[ID] – 0*2*WallThick,WallThick]; // spring reaction plate NumScrews = 3; ScrewBCD = Bearing[OD] + Insert[OD] + 2*WallThick; echo(str("Retainer max OD: ",ScrewBCD – Screw[OD])); NumSides = 9*4; // cylinder facets (multiple of 3 for lathe trimming) // Basic mount shape module CNC3018Base() { translate([0,0,MountOAL – LipHeight]) cylinder(d=Clamp[OD],h=LipHeight,$fn=NumSides); translate([0,0,MountOAL – LipHeight – Clamp[LENGTH] – Protrusion]) cylinder(d=Clamp[ID],h=(Clamp[LENGTH] + 2*Protrusion),$fn=NumSides); cylinder(d1=Bearing[OD] + 2*WallThick,d2=Clamp[ID],h=BottomExtension + Protrusion,$fn=NumSides); } // Mount with holes & c module Mount() { difference() { CNC3018Base(); translate([0,0,-Protrusion]) // bearing PolyCyl(Bearing[OD],2*MountOAL,NumSides); for (i=[0:NumScrews – 1]) // clamp screws rotate(i*360/NumScrews) translate([ScrewBCD/2,0,MountOAL – Clamp[LENGTH]]) rotate(180/8) PolyCyl(Insert[OD],Clamp[LENGTH] + Protrusion,8); } } module SpringPlate() { difference() { cylinder(d=Plate[OD],h=Plate[LENGTH],$fn=NumSides); translate([0,0,-Protrusion]) PolyCyl(Plate[ID],2*MountOAL,NumSides); translate([0,0,Plate.z – SpringSeat[LENGTH]]) // spring retaining recess PolyCyl(SpringSeat[OD],SpringSeat[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*MountOAL,8); } } //—– // Build it if (Layout == "Base") CNC3018Base(); if (Layout == "Mount") Mount(); if (Layout == "Plate") SpringPlate(); if (Layout == "Show") { Mount(); translate([0,0,1.25*MountOAL]) rotate([180,0,0]) SpringPlate(); } if (Layout == "Build") { translate([0,-0.75*Clamp[OD],MountOAL]) rotate([180,0,0]) Mount(); translate([0,0.75*Plate[OD],0]) SpringPlate(); }