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:

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

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:

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:

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:
// 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(); |