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:
// 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(); | |
} |
Is taunting Murphy really a good idea? [grin]
Good point. The Principle of the Universal Conservation of Perversity says something even more awful will happen as a direct result of my preventing an origin error.
Which is what happened yesterday. I tried engraving the label side of a scrap CD, only to (re)discover the brittleness of lacquer-over-aluminum. The diamond bit scribed about halfway around the perimeter and suddenly my world is covered in glitter. Including, of course, the sticky mat under the CD.
Final score: Murphy 1, me -1. It’s a zero-sum game, at best.
Quality shop time :)
Where did the hardened shaft come from?
I think eBay: it’s plain old RepRap-style 3D printer guide rail. Not particularly straight, of course, but close enough for my simple needs.