Along the same lines as the MPCNC pen holder, I now have one for the 3018:

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:

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:

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:

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:

I figured things would eventually go badly if I trimmed enough ink-filled crimps:

The OpenSCAD source code as a GitHub Gist:
| // 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(); | |
| } |
Comments
6 responses to “CNC 3018-Pro: Collet Pen Holder”
[…] length ($131=338) and puts the G54 coordinate at the new middle, with the Z-axis origin kissing the ball-point pen on the new […]
[…] superscripts, but the characters already live at the small end of what’s do-able with a ballpoint pen cartridge. Engraving will surely work better, but stylin’ exponents are definitely in the nature of […]
[…] Shared bon Soft Solder: […]
[…] Cheap Chinese 1.0 mm pen cartridge […]
[…] Fine Pilot V5 pens have a 0.5 mm ball, in contrast to the 1.0 mm ball in the cheap pens I’ve been using, so they should produce much finer […]
[…] For reference, the cheap pens use a collet holder: […]