-
MPCNC Collet Pen Holder: LM12UU Edition
Encouraged by the smooth running of the LM12UU drag knife mount, I chopped off another length of 12 mm shaft:
The MicroMark Cut-off saw was barely up to the task; I must do something about its craptastic “vise”. In any event, the wet rags kept the shaft plenty cool and the ShopVac hose directly behind the motor sucked away all of the flying grit.
The reason I used an abrasive wheel: the shaft is case-hardened and the outer millimeter or two is hard enough to repel a carbide cutter:
Fortunately, the middle remains soft enough to drill a hole for the collet pen holder, which I turned down to a uniform 8 mm (-ish) diameter:
Slather JB Kwik epoxy along the threads, insert into the shaft, wipe off the excess, and it almost looks like a Real Product:
The far end of the shaft recesses the collet a few millimeters to retain the spring around the pen body, which will also require a knurled ring around the outside so you (well, I) can tighten the collet around the pen tip.
Start the ring by center-drilling an absurdly long aluminum rod in the steady rest:
Although it’s not obvious, I cleaned up the OD before applying the knurling tool:
For some unknown reason, it seemed like a Good Idea to knurl without the steady rest, perhaps to avoid deepening the ring where the jaws slide, but Tiny Lathe™ definitely wasn’t up to the challenge. The knurling wheels aren’t quite concentric on their bores and their shafts have plenty of play, so I got to watch the big live center and tailstock wobbulate as the rod turned.
With the steady rest back in place, drill out the rod to match the shaft’s 12 mm OD:
All my “metric” drilling uses hard-inch drills approximating the metric dimensions, of course, because USA.
Clean up the ring face, file a chamfer on the edge, and part it off:
Turn some PVC pipe to a suitable length, slit one side so it can collapse to match the ring OD, wrap shimstock to protect those lovely knurls, and face off all the ugly:
Tweak the drag knife’s solid model for a different spring from the collection and up the hole OD in the plate to clear the largest pen cartridge in the current collection:
Convince all the parts to fly in formation, then measure the spring rate:
Which works out to be 128 g + 54 g/mm:
I forgot the knurled ring must clear the screws and, ideally, the nyloc nuts. Which it does, after I carefully aligned each nut with a flat exactly tangent to the ring. Whew!
A closer look at the business end:
The shaft has 5 mm of travel, far more than enough for the MPCNC’s platform. Plotting at -1 mm applies 180 g of downforce; the test pattern shown above varies the depth from 0.0 mm in steps of -0.1 mm; anything beyond -0.2 mm gets plenty of ink.
Now I have a pen holder, a diamond scribe, and a drag knife with (almost) exactly the same “tool offset” from the alignment camera, thereby eliminating an opportunity to screw up.
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 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(); }












