-
MPCNC: Linear Bearing Pen Holder
The simplest way to push a pen (or similar thing) downward with constant force may be to hold it in a linear bearing with a weight on it, so I gimmicked up a proof-of-concept. The general idea is to mount the pen so its axis coincides with the DW660 spindle, so as to have the nib trace the same path:

DW660 Pen Holder – unweighted The puck mimics the shape of the DW660 snout closely enough to satisfy the MPCNC’s tool holder:

DW660 Pen Holder – Slic3r The pen holder suffers from thin walls constrained by the 10 mm (-ish) pen OD and the 12 mm linear bearing ID, to the extent the slight infill variations produced by the tapered pen outline change the OD. A flock of 16 mm bearings, en route around the planet even as I type, should provide more meat.
In any event, 3D printing isn’t noted for its perfect surface finish, so I applied an epoxy layer and rotated the holder as it cured:

DW660 Pen Holder – epoxy coating After letting it cure overnight, I ran a lathe tool along the length to knock down the high spots and set the OD to 11.9+ mm. Although the result turns out to be a surprisingly nice fit in the bearing, there’s no way epoxy can sustain the surface load required for the usual precision steel-on-steel fit.
A plastic pen in a plastic holder weighs 8.3 g, which isn’t quite enough to put any force on the paper. Copper weighs 9 g/cm³ = 9 mg/mm³ and 10 AWG wire is 2.54 mm OD = 5 mm², so it’s 45 mg/mm: to get 20 g, chop off 450 mm of wire.
I chopped off a bit more than that, straightened it, annealed it, and wound it around a random contestant from the Bucket o’ Sticks with an OD just over the pen OD:

DW660 Pen Holder – copper weight forming The helix is 13.5 mm down the middle of the turns and 14 turns long (trimmed of the tail going into the chuck and fudging the tail sticking out as a partial turn), so it’s 593 mm long and should weigh 26.7 g. It actually weighs 27.6 g: close enough.
Which is enough to overcome stiction due to the holder’s surface roughness, but the mediocre epoxy-on-balls fit allows the pen point to wander a bit too much for good results.
The prospect of poking precise holes into 16 mm drill rod seems daunting, but, based on what I see here, it will produce much better results: rapid prototyping FTW!
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// MPCNC Pen Holder for DW660 Mount // Ed Nisley KE4ZNU – 2018-03-05 Layout = "Build"; // Build, Show // Puck, MountBase, BuildBase // Pen, PenAdapter, BuildAdapter /* [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 WallThick = 3.0; // minimum thickness / width Screw = [3.0,7.0,25.0]; // holding it all together, OD = washer Insert = [3.0,4.4,4.5]; // brass insert Bearing = [12.0,21.0,30.0]; // LM12UU bearing body, ID = rod OD PenTravel = 5.0; // vertical pen travel allowance NumSides = 8*4; // cylinder facets //—– // Define shapes //– Sakura Micron fiber-point pen ExpRP = 0.30; // expand critical sections (by radius) //– pen locates in holder against end of outer body PenOutline = [ [0,0], // 0 fiber pen tip [0.6/2,0.0],[0.6/2,0.9], // 1 … cylinder [1.5/2,0.9],[1.5/2,5.3], // 3 tip surround [4.7/2,5.8], // 5 chamfer [4.9/2,12.3], // 6 nose // [8.0/2,12.3],[8.0/2,13.1], // 7 latch ring // [8.05/2,13.1],[8.25/2,30.5], // 9 actual inner body [8.4/2 + ExpRP,12.3],[8.4/2 + ExpRP,30.5], // 7 inner body – clear latch ring [9.5/2 + ExpRP,30.9], // 9 outer body – location surface! [9.8/2 + ExpRP,60.0], // 10 outer body – length > Body [7.5/2,60.0], // 11 arbitrary length, much longer than bearing [7.5/2,59.0], // 12 end of reservoir [0,59.0] // 13 fake reservoir ]; PenNose = PenOutline[6][1]; PenLocate = PenOutline[9][1]; // 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 Key = [Snout[ID],25.7,Snout[LENGTH] + Lip]; // rectangular key module DW660Puck() { 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=Lip + Snout[LENGTH],$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]) PolyCyl(Bearing[OD],2*Bearing[LENGTH],NumSides); } } //– Sakura drawing pen body & polygon shape module Pen() { rotate_extrude($fn=NumSides) polygon(points=PenOutline); polygon(points=PenOutline); } //– Pen holder AdapterRing = [Bearing[ID],Bearing[OD],4.0]; AdapterOAL = Bearing[LENGTH] + PenTravel + AdapterRing[LENGTH]; module PenAdapter() { difference() { union() { PolyCyl(Bearing[ID],AdapterOAL,NumSides); translate([0,0,AdapterOAL – AdapterRing[LENGTH]]) cylinder(d=AdapterRing[OD],h=AdapterRing[LENGTH],$fn=NumSides); } translate([0,0,-(PenNose + Protrusion)]) Pen(); } } //—– // Build it if (Layout == "Puck") DW660Puck(); if (Layout == "MountBase") MountBase(); if (Layout == "Pen") Pen(); if (Layout == "PenAdapter") PenAdapter(); if (Layout == "Show") MountBase(); if (Layout == "BuildBase" || Layout == "Build") translate([0,-Snout[OD]/2,0]) MountBase(); if (Layout == "BuildAdapter" || Layout == "Build") translate([0,Snout[OD]/2,AdapterOAL]) rotate([180,0,0]) PenAdapter();