Advertisements

Archive for April, 2015

HP 7475A Plotter: Full-up Sakura Micron Pen Tests

The HP 7475A plotter comes with a transparent smoke-brown plastic flip-up lid covering the carousel and pen holder, presumably to keep dust and fingers out of the moving parts. That lid also has has the side effect of limiting the pen length, presumably because HP didn’t want the 7475A to eat into their large-format plotter market. In any event, removing the lid leaves another barrier to longer pens: the rugged plastic case between the carousel and the pen holder.

Well, seeing as how this puppy has been fully depreciated, a bit of pull saw work opened that opportunity:

HP 7475A - long pen case cut

HP 7475A – long pen case cut

Despite appearances, all six Sakura Micron pens emerge vertical & parallel from their adapters in the carousel:

HP 7475A - Sakura 01 and 005 pens in carousel

HP 7475A – Sakura 01 and 005 pens in carousel

They pass neatly through the new channel:

HP 7475A - cover mod for long pens

HP 7475A – cover mod for long pens

And produce reasonable lines, with motion blur catching the pen holder in the midst of a pen-up / pen-down twitch:

HP7475A - Sakura Micro Pen Adapter - self-test plot

HP7475A – Sakura Micro Pen Adapter – self-test plot

That’s from an earlier test, before I sawed the slot in the case, with all the machinery behind the pen holder in full view.

The test plot, with the proper pen colors and widths loaded in the carousel, looks pretty good:

HP7475A - Sakura Micro Pens - self-test plot

HP7475A – Sakura Micro Pens – self-test plot

The pen holder wasn’t intended to support a long pen, so that shaft tends to torque the pen tip out of position, particularly while drawing characters:

HP 7475A - long black pen - misalignment

HP 7475A – long black pen – misalignment

The various pen tips don’t all point to the same place:

HP 7475A - long RGBK pen misalignment

HP 7475A – long RGBK pen misalignment

That could be non-concentric pen adapters, misalignment in the pen holder, or slightly off-center pen nibs. The offsets between the colors remains consistent in all the bar-chart columns, so the pen adapters aren’t shifting in the holder.

The worst-case error between bar-chart rectangles amounts to 0.5 mm parallel to the pen holder motion and 0.8 mm parallel to the paper motion. In round numbers, the pen tip is 30 mm from the flange, so moving it 0.5 mm to the side tips the pen 1°. The flange is 17 mm OD, which means a 1° tilt raises one edge by 0.3 mm or both edges by ±0.15 mm. Given a 0.25 mm 3D printed thread thickness, that’s certainly within reach of a random plastic blob.

Looking closely at the printed-and-glued flange shows plenty of room for misunderstanding betwixt pen and holder, even after cleaning off all that PETG hair:

HP7475A - Sakura Micro Pen Adapter - vs HP pen

HP7475A – Sakura Micro Pen Adapter – vs HP pen

Given that the Sakura pens aren’t intended for this application, a slight tip misalignment due to body molding tolerances isn’t unreasonable; a perfect adapter might not solve the problem.

The HP maintenance manual lists a BASIC program to produce a test plot that verifies pen alignment, although the prospect of transliterating 2+ pages of quoted strings from a scanned document doesn’t fill me with desire.

Advertisements

, ,

7 Comments

HP 7475A Plotter: Sakura Micron Pen Adapter

More digital caliper work produced this model of a Sakura Pigma Micron pen:

HP7475A - Sakura Micro Pen Body - solid model

HP7475A – Sakura Micron Pen Body – solid model

It’s much shorter than the actual pen, because there’s nothing happening beyond the top of the original HP pen body that will serve as an adapter holding this pen in the plotter. As before, the tip of the pen is at Z=0.

Some of the diameter values include a small Finagle Constant to provide a close sliding fit:

//-- Sakura Micron fiber-point pen

ExpRP = 0.15;						// 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.5],			//  9 outer body - location surface!
	[9.8/2 + ExpRP,50.0],			// 10 outer body - length > Body
	[7.5/2,50.0],					// 11 arbitrary length
	[7.5/2,49.0],					// 12 end of reservoir
	[0,49.0]						// 13 fake reservoir
	];

PenNose = PenOutline[6];
PenLatch = PenOutline[7];

PenOAL = PenOutline[11][HEIGHT];

The model excludes the latching ring that secures the pen cap, mostly because the fit was already snug enough.

Subtracting the Sakura pen from the HP pen body produces the adapter:

HP7475A - Sakura Micro Pen Adapter - solid model

HP7475A – Sakura Micro Pen Adapter – solid model

The plug floating overhead and the cap standing on the bottom are frills that I added after the first few iterations. The plug seals the cut-off sections of the pen body, assuming that you will cut the pens to a more plotter-friendly length, and you’ll need two of them… a fact that didn’t penetrate my thick skull until I was confronted with the two ends of a cut-up pen. The flange on the bottom of the cap provides enough of a grip that you can actually pull the cap off; depending on the tolerances, it will be a very tight fit on the pen.

The solid model pieces rearranged for printing:

HP7475A - Sakura Micro Pen Adapter - build layout

HP7475A – Sakura Micro Pen Adapter – build layout

As before, splitting the HP pen body in the middle of the flange makes it build-able without supports. The first few passes didn’t include any of the other parts and had a slightly longer lower section (left front):

HP7475A - Sakura Micro Pen Adapter - on platform

HP7475A – Sakura Micro Pen Adapter – on platform

I used Sakura Micron pens because they’re slightly smaller than my usual Sharpie Ultra Fine Point pens; Mary had been sketching quilting patterns with them. The difference between the Sakura and HP pen ODs amounts to barely more two filament widths, less than 1 mm:

HP 7475A - Sakura Pen Adapter - Slic3r Preview

HP 7475A – Sakura Pen Adapter – Slic3r Preview

Fortunately, Slic3r can dynamically adjust the thread width to eliminate voids between parallel outer walls with less than a thread width between them.

The interior step near the bottom of the part at the rear right in the picture locates the Sakura pen body inside the HP shell. In principle, that will put the tip at the same location as the HP pen tip, although making that happen required a bit of measurement fine-tuning:

HP7475A - Sakura Micro Pen Adapter - vs HP pen

HP7475A – Sakura Micro Pen Adapter – vs HP pen

I started out gluing the adapter halves together around a Sakura pen serving as a mandrel, but that didn’t work out well:

HP7475A - Sakura Micro Pen Adapter - gluing on pen

HP7475A – Sakura Micro Pen Adapter – gluing on pen

Although the IPS 4 adhesive didn’t attack the pen body, getting all the parts flying in formation required more dexterity than I could muster, plus that tape snippet didn’t seal the tip well at all. After doing a few adapters like that, I broke down and machined a steel mandrel with diameters matching the Sakura pen:

HP7475A - Sakura Micro Pen Adapter - mandrel

HP7475A – Sakura Micro Pen Adapter – mandrel

No, you can’t 3D print the mandrel.

You can see the discontinuities in the adapter shell, showing the internal step (in the right half) and the transition from 3D Honeycomb infill (just left of the flange) to a single thread of infill between the two outer walls (the rest of the left half).

After a few iterations, a full-length pen in an adapter produced some rather good-looking lines, if I do say so myself:

HP7475A - Sakura Micro Pen Adapter - first lines

HP7475A – Sakura Micro Pen Adapter – first lines

That’s done in Etch A Sketch mode with the plotter’s front-panel buttons. The blob under the pen tip shows why you can’t let the pen linger on the paper for more than an instant…

But, hey, it worked!

The OpenSCAD source code is in the HP pen body post.

8 Comments

HP 7475A Plotter: OEM Pen Body Model

You can buy new plotter pens for HP 7475A plotters at a bit over four bucks apiece and new-old-stock HP pens appear on eBay with similar prices, but what’s the fun in that?

You can refill the HP pens with liquid ink and continue plotting until the fiber tip wears out. That would limit me to the CMYK inkjet inks on the shelf, although I suppose investing in drafting inks might be amusing.

You can get refillable Koh-I-Noor pens and adapters, intended for specialized paper / vellum, at nearly $100 all-in per pen, plus ink & supplies, plus a hassle factor exceeding that of the continuous flow ink system on the Epson R380.

However, it should be feasible to build an adapter to hold an ordinary, albeit skinny, drawing / drafting pen, perhaps chopped down to be only a bit longer than the OEM plotter pens. That has the advantage of using cheap & readily available materials, doesn’t require much capital outlay, and, come to think of it, gives me a Digital Machinist column topic… [grin]

This is not, by any stretch of the imagination, a novel idea.

There’s a vague notion of converting the plotter into a vinyl / paper / stencil cutter, although I expect the snap-in pen holder can’t exert enough lateral force to hold a cutting knife in position, nor enough downward force to push the blade through the vinyl / paper / whatever. But ya never know until you try.

So, we begin…

A bit of digital caliper work provides a list of points defining the OEM pen body outline:

RADIUS = 0; // subscript for radius values
HEIGHT = 1; // ... height above Z=0

BodyOutline = [						// X values = (measured diameter)/2, Y as distance from tip
	[0.0,0.0],						//  0 fiber pen tip
//	[2.0/2,1.4],					//  1 ... taper (not buildable)
	[1.0/2,0.005],					//  1 ... faked point to remove taper
	[2.0/2,0.0],[2.0/2,2.7],		//  2 ... cylinder
	[3.7/2,2.7],[3.7/2,4.45],		//  4 tip surround
	[4.8/2,5.2],					//  6 chamfer
	[6.5/2,11.4],					//  7 rubber seal face
	[8.9/2,11.4],					//  8 cap seat
	[11.2/2,15.9],					//  9 taper to body
	[11.5/2,28.0],					// 10 lower body
	[13.2/2,28.0],[16.6/2,28.5],	// 11 lower flange = 0.5
	[16.6/2,29.5],[13.2/2,30.0],	// 13 flange rim = 1.0
	[11.5/2,30.0],					// 15 upper flange = 0.5
	[11.5/2,43.25],					// 16 upper body
	[0.0,43.25]						// 17 lid over reservoir
	];

Rather than computing the radius by hand, it’s easier to just divide the easily measured diameter by two and be done with it.

The point array defines a polygon in the XY plane:

HP7475A - HP Plotter Pen Body - plane polygon

HP7475A – HP Plotter Pen Body – plane polygon

Then you feed that polygon into a rotate_extrude(), which spins up a reasonable simulacrum of a plotter pen:

HP7475A - HP Plotter Pen Body - solid model

HP7475A – HP Plotter Pen Body – solid model

I picked the coordinates to put the tip at (0,0,0) and converted the tapered fiber nib into a plain cylinder.

That shape is obviously impossible to print without vast amounts of support, but splitting it across the middle of the flange and rearranging the pieces works just fine:

HP7475A - HP Plotter Pen Body - build layout

HP7475A – HP Plotter Pen Body – build layout

A pair of alignment pin holes simplifies gluing the parts back together:

HP7475A - HP Plotter Pen Body - solid model - bottom

HP7475A – HP Plotter Pen Body – solid model – bottom

There’s a subtle problem lurking in that flange, which is 2.0 mm thick at the base and 1.0 mm thick at the rim. Splitting it in half requires each part to build correctly from an integral number of thread layers, so you must use a thread thickness (that’s in the Z direction) that divides evenly into the required height. I’ve been using 0.2 mm, which would produce a 1.2 mm rim.

Slicing at 0.25 mm produced a 2.1 mm flange with a 1.1 mm rim, suggesting that:

I could apply a Slic3r Modifier Mesh to print the flange with 0.10 mm layers, but that seems like entirely too much effort right now.

At the other end of the model, converting the tapered tip into a blunt cylinder didn’t save it from melting down:

HP 7475A Plotter Pen - solid PETG

HP 7475A Plotter Pen – solid PETG

It might be possible to reduce the printing speed enough to produce that tiny cylinder, but I needed just the upper body to verify that it fit correctly into the carousel:

HP 7475A Plotter Pen Body - in carousel

HP 7475A Plotter Pen Body – in carousel

As you’d expect, the rubber boots that used to seal the pen tips have long since rotted out:

HP 7475A Carousel Rubber Boots

HP 7475A Carousel Rubber Boots

You can find sources for those boots, but at $252 (marked down to $144!) each, perhaps it’d be more feasible to gimmick up a two-part mold and cast silicone rubber duplicates; I could sell a set of six for $200 and get rich. Heck, I could even undercut their $40.32 two-year protection plan by a considerable margin.

Anyhow, the pen holder plucked it out of the carousel just like a real HP pen:

HP 7475A Plotter Pen Body - in holder

HP 7475A Plotter Pen Body – in holder

Note that the carousel and pen holder contact the flange and the cylindrical body, not either of the tapered sections down to the tip. That means I can carve away the entire bottom part of the body to make a drawing pen adapter…

The OpenSCAD source code includes a bunch of features & parts I’ll describe in the next few posts, but which certainly should not be regarded as final copy:

// HP7475A plotter pen adapters
// Ed Nisley KE4ZNU April 2015

Layout = "BuildBody";		// ShowKnife BuildKnife KnifeAdapter
							// ShowPen BuildPen Plug
							// ShowBody BuildBody
							// Pen Knife
							// Stabilizer BuildStabilizer

//- Extrusion parameters must match reality!

ThreadThick = 0.25;
ThreadWidth = 0.40;

HoleWindage = 0.2;

Protrusion = 0.1;			// make holes end cleanly

inch = 25.4;

function IntegerMultiple(Size,Unit) = Unit * ceil(Size / Unit);

//----------------------
// Dimensions
// Z=0 at pen tip!

NumSides = 8*4;						// number of sides on each "cylinder"

RADIUS = 0;							// subscript for radius values
HEIGHT = 1;							//   ... height above Z=0

//-- Original HP plotter pen, which now serves as a body for the actual pen

BodyOutline = [						// X values = (measured diameter)/2, Y as distance from tip
	[0.0,0.0],						//  0 fiber pen tip
//	[2.0/2,1.4],					//  1 ... taper (not buildable)
	[1.0/2,0.005],					//  1 ... faked point to remove taper
	[2.0/2,0.0],[2.0/2,2.7],		//  2 ... cylinder
	[3.7/2,2.7],[3.7/2,4.45],		//  4 tip surround
	[4.8/2,5.2],					//  6 chamfer
	[6.5/2,11.4],					//  7 rubber seal face
	[8.9/2,11.4],					//  8 cap seat
	[11.2/2,15.9],					//  9 taper to body
	[11.5/2,28.0],					// 10 lower body
	[13.2/2,28.0],[16.6/2,28.5],	// 11 lower flange = 0.5
	[16.6/2,29.5],[13.2/2,30.0],	// 13 flange rim = 1.0
	[11.5/2,30.0],					// 15 upper flange = 0.5
	[11.5/2,43.25],					// 16 upper body
	[0.0,43.25]						// 17 lid over reservoir
	];

TrimHeight = BodyOutline[9][HEIGHT];		// cut off at top of lower taper
SplitHeight = (BodyOutline[11][HEIGHT] + BodyOutline[14][HEIGHT])/2;	// middle of flange

FlangeOD = 2*BodyOutline[13][RADIUS];
FlangeTop = BodyOutline[15][HEIGHT];

BodyOD = 2*BodyOutline[16][RADIUS];
BodyOAL = BodyOutline[17][HEIGHT];

echo(str("Trim: ",TrimHeight));
echo(str("Split: ",SplitHeight));

BuildSpace = FlangeOD;

//-- Sakura Micron fiber-point pen

ExpRP = 0.15;						// 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.5],			//  9 outer body - location surface!
	[9.8/2 + ExpRP,50.0],			// 10 outer body - length > Body
	[7.5/2,50.0],					// 11 arbitrary length
	[7.5/2,49.0],					// 12 end of reservoir
	[0,49.0]						// 13 fake reservoir
	];

PenNose = PenOutline[6];
PenLatch = PenOutline[7];

PenOAL = PenOutline[11][HEIGHT];

PlugOutline = [
	[0,0],							// 0 center of lid
	[9.5/2,0.0],[9.5/2,1.0],		// 1 lid rim
	[7.8/2,1.0],					// 3 against end of pen
	[7.3/2,6.0],					// 4 taper inside pen
	[5.3/2,6.0],					// 5 against ink reservoir
	[4.0/2,1.0],					// 6 taper to lid
	[0.0,1.0]						// 7 flat end of taper
	];

PlugOAL = PlugOutline[5][HEIGHT];

//   cap locates against end of inner body at latch ring
//-- cap origin is below surface to let pen tip be at Z=0

CapGap = 1.0;						// gap to adapter body when attached
CapGripHeight = 2.0;				// thickness of cap grip flange
CapTipClearance = 1.0;				// clearance under fiber tip

CapOffset = -(CapGripHeight + CapTipClearance);	// align inside at pen tip Z=0

CapOutline = [
	[0,CapOffset],									// 0 base
	[FlangeOD/2,CapOffset],							// 1 finger grip flange
	[FlangeOD/2,CapOffset + CapGripHeight],			// 2  ... top
	[BodyOD/2,CapOffset + CapGripHeight],			// 3 shaft
	[BodyOD/2,TrimHeight - CapGap],					// 4  ... top with clearance
	[PenLatch[RADIUS],TrimHeight - CapGap],			// 5 around pen latch ring
	[PenLatch[RADIUS],PenNose[HEIGHT]],				// 6  ... location surface!
	[PenNose[RADIUS] + ExpRP,PenNose[HEIGHT]],		// 7 snug around  nose
	[PenNose[RADIUS] + ExpRP,-CapTipClearance],		// 8 clearance around tip
	[0,-CapTipClearance],							// 9  ... bottom
	];

//-- Drag knife holder

ExpRK = 0.30;						// expand critical sections (by radius)
AdjLen = 2.0;						// allowance for adjustment travel

KnifeOutline = [
	[0,0],							//  0 blade point (actually 0.25 mm offset)
	[1.0/2,0.0],					//  1  ... blunt end
	[1.0/2,4.0],					//  2  ... cylinder
	[2.0/2,4.0],					//  3 shank
	[2.0/2,5.9],					//  4  .. at bearing
	[6.0/2,5.9],					//  5 holder - shell
	[7.3/2 + ExpRK,8.3],			//  6 holder - taper to body
	[7.3/2 + ExpRK,21.0 - AdjLen],	//  7 holder body
	[8.8/2 + ExpRK,22.0 - AdjLen],	//  8 holder - threads bottom
	[8.8/2 + ExpRK,25.0],[9.0/2 + ExpRK,26.0],		//  9 clear threads to reduce friction
	[9.0/2 + ExpRK,32.0],[8.8/2 + ExpRK,33.0],		// 11  ... end clearance
	[8.8/2 + ExpRK,42.5 - AdjLen],	// 13 holder - threads top = locknut bottom
	[12.5/2,42.5 - AdjLen],			// 14 knurled locknut - adjustment travel
	[12.5/2,45.8],					// 15 knurled locknut - top
	[11.0/2,45.8],					// 16 holder - adjusting knurl
	[11.0/2,52.0],					// 17 holder - top surface
	[3.0/2,52.0],[3.0/2,57.2],		// 18 spring post
	[0.0,57.2]						// 19 end of post
	];

ThreadLength = KnifeOutline[13][HEIGHT] - KnifeOutline[8][HEIGHT];

//-- Plotter pen holder stabilizer

HolderPlateThick = 3.0;				// thickness of plate atop holder
RimHeight = 5.0;					// rim around sides of holder
RimThick = 2.0;

HolderOrigin = [17.0,12.2,0.0];		// center of pen relative to polygon coordinates

HolderZOffset = 30.0;				// top of holder in pen-down position
HolderTopThick = 1.7;				// top of holder to top of pen flange
HolderCylinderLength = 17.0;		// length of pen support structure

HolderKnifeOffset = -2.0;			// additional downward adjustment range (not below top surface)

LockScrewInset = 3.0;				// from right edge of holder plate
LockScrewOD = 2.0;					// tap for 2.5 mm screw

// Beware: update hardcoded subscripts in Stabilizer() when adding / deleting point entries 

HolderPlate = [
	[8.6,18.2],[8.6,23.9],			// 0 lower left corner of pen recess
	[13.9,23.9],[13.9,30.0],		// 2
//	[15.5,30.0],[15.5,25.0],		// 4 omit middle of support beam
//	[20.4,25.0],[20.4,30.0],		// 6
	[22.7,30.0],[22.7,27.5],		// 4
	[35.8,27.5],[35.8,20.7],		// 6 spring box corner
	[43.0,20.7],					// 8
	[31.5,0.0],						// 9
//	[24.5,0.0],[24.5,8.0],			// 10 omit pocket above pen clamp
//	[22.5,10.0],[22.5,16.5],		// 12
//	[20.5,18.2]						// 14
	[13.6,0.0],						// 10
	[8.6,5.0]						// 11
	];

BeamWidth = HolderPlate[4][0] - HolderPlate[2][0];

//----------------------
// Useful routines

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);
}

//- Locating pin hole with glue recess
//  Default length is two pin diameters on each side of the split

PinOD = 1.75;
PinOC = BodyOD / 2;

module LocatingPin(Dia=PinOD,Len=0.0) {

	PinLen = (Len != 0.0) ? Len : (4*Dia);

	translate([0,0,-ThreadThick])
		PolyCyl((Dia + 2*ThreadWidth),2*ThreadThick,4);

	translate([0,0,-2*ThreadThick])
		PolyCyl((Dia + 1*ThreadWidth),4*ThreadThick,4);

	translate([0,0,-(Len/2 + ThreadThick)])
		PolyCyl(Dia,(Len + 2*ThreadThick),4);

}

module LocatingPins(Length) {
	for (i=[-1,1])
	translate([0,i*PinOC/2,0])
		rotate(180/4)
		LocatingPin(Len=Length);
}

//----------------------
// Basic shapes

//-- HP plotter pen body

module Body() {
	render(convexity=3)
		rotate_extrude($fn=NumSides)
			polygon(points=BodyOutline);
}

//-- HP plotter pen holder
//   the trim block offsets use magic numbers from the HolderPlate outline

module Stabilizer() {

	difference() {
		union() {
			translate(-HolderOrigin)													// put center of pen at origin
				difference() {
						render(convexity=4)
						linear_extrude(height=(HolderPlateThick + RimHeight))			// overall flange around edges
							offset(r=RimThick)
									polygon(points=HolderPlate);

						render(convexity=4)
						translate([0,0,-Protrusion])									// recess for pen holder plate
							linear_extrude(height=(RimHeight + Protrusion))
								polygon(points=HolderPlate);

						translate([HolderPlate[7][0] - Protrusion,HolderPlate[7][1] - Protrusion,-Protrusion])	// trim spring box from top plate
							cube([30,20,(RimHeight + HolderPlateThick + 2*Protrusion)]);

						translate([27.0,HolderPlate[6][1] - Protrusion,-Protrusion])	// trim pivot plate clearance
							cube([30,20,(RimHeight + HolderPlateThick + 2*Protrusion)]);

						translate([HolderPlate[2][0],20,-Protrusion])					// trim left support beam
							cube([BeamWidth,20,(RimHeight + Protrusion)]);

						translate([HolderPlate[9][0] - LockScrewInset,RimThick,RimHeight - HolderTopThick - LockScrewOD/2])												// lock screw on front edge
							rotate([90,0,0])
								rotate(180/4)
									PolyCyl(LockScrewOD,3*RimThick);					// hold-down screw hole
				}

			translate([0,0,(RimHeight - HolderCylinderLength + Protrusion)])
				cylinder(d=BodyOD,h=HolderCylinderLength + Protrusion,$fn=NumSides);				// surround knife threads
		}

		translate([0,0,-HolderZOffset + HolderKnifeOffset])
			Knife();
	}
}

//-- Sakura drawing pen body

module Pen() {
	rotate_extrude($fn=NumSides)
		polygon(points=PenOutline);
}

//-- Plug for top of Sakura pen

module Plug() {
	render(convexity = 2)
		rotate_extrude($fn=NumSides)
			polygon(points=PlugOutline);
}

//-- Cap for tip of Sakura pen

module Cap() {
	render(convexity = 2)
		rotate_extrude($fn=NumSides)
			polygon(points=CapOutline);
}

//-- Sakura pen adapter

module PenAdapter(TrimZ = false) {

Trans = TrimZ ? - TrimHeight : 0;

	render(convexity=5)
		translate([0,0,Trans])
			difference() {
				Body();
				Pen();
				translate([0,0,TrimHeight/2])
					cube([2*FlangeOD,2*FlangeOD,TrimHeight],center=true);
			}
}

//-- Roland knife body

module Knife() {
	render(convexity=3)
		rotate_extrude($fn=NumSides)
			polygon(points=KnifeOutline);
}

//-- Roland knife adapter

module KnifeAdapter(TrimZ = false) {

Trans = TrimZ ? - TrimHeight : 0;

	render(convexity=5)
		translate([0,0,Trans])
			difference() {
				Body();
				Knife();
				translate([0,0,TrimHeight/2])
					cube([2*FlangeOD,2*FlangeOD,TrimHeight],center=true);
			}
}

//----------------------
// Build it

if (Layout == "Pen")
	Pen();

if (Layout == "Knife")
	Knife();

if (Layout == "Stabilizer")
	Stabilizer();

if (Layout == "ShowBody")
	Body();

if (Layout == "BuildBody")
	difference() {
		union() {
			translate([BuildSpace,0,-SplitHeight])
				Body();
			rotate([180,0,0])
				translate([-BuildSpace,0,-SplitHeight])
					Body();
		}
		translate([0,0,-BodyOAL])
			cube(2*BodyOAL,center=true);
		for (i = [-1,1])
			translate([i*BuildSpace,0,0])
				LocatingPins(5.0);
	}

if (Layout == "Plug")
	Plug();

if (Layout == "KnifeAdapter")
	KnifeAdapter();

if (Layout == "ShowPen") {

	color("AntiqueWhite") {
		Pen();
		translate([-1.5*BodyOD,0,0])
			Pen();
	}
	color("Magenta",0.35) {
		translate([0,0,PlugOAL + PenOAL + 3.0])
			rotate([180,0,0])
				Plug();
		PenAdapter();
		Cap();
	}
	color("Magenta") {
		translate([1.5*BodyOD,0,PlugOAL + PenOAL + 3.0])
			rotate([180,0,0])
				Plug();
		translate([1.5*BodyOD,0,0]) {
			PenAdapter();
			Cap();
		}
	}

}

if (Layout == "ShowKnife") {

	color("Goldenrod") {
		Knife();
		translate([-1.5*BodyOD,0,0])
			Knife();
	}
	color("Magenta",0.35)
		KnifeAdapter();
	color("Magenta") {
		translate([1.5*BodyOD,0,0])
			KnifeAdapter();
	}

}

if (Layout == "BuildPen") {

	translate([0,BuildSpace/2,0])
		Plug();
	translate([0,-BuildSpace/2,-CapOffset])
		Cap();

	difference() {
		union() {
			translate([BuildSpace,0,-SplitHeight])
				PenAdapter(false);
			rotate([180,0,0])
				translate([-BuildSpace,0,-SplitHeight])
					PenAdapter(false);
		}
		translate([0,0,-BodyOAL])
			cube(2*BodyOAL,center=true);
	}

}

if (Layout == "BuildKnife") {

	difference() {
		union() {
			translate([BuildSpace,0,-SplitHeight])
				KnifeAdapter(false);
			rotate([180,0,0])
				translate([-BuildSpace,0,-SplitHeight])
					KnifeAdapter(false);
		}
		translate([0,0,-BodyOAL])
			cube(2*BodyOAL,center=true);
	}

}

if (Layout == "BuildStabilizer") {

	translate([0,0,(HolderPlateThick + RimHeight)])
		rotate([0,180,0])
			Stabilizer();
}

,

10 Comments

HP 7475A Plotter: Rehabilitation

[Update: Wecome Hackaday! You may want to look at:

Searching for 7475a will bring up many, many other posts]

After mentioning that I wished I still had my HP 7475A plotter, Dithermaster sent me one from his heap. As he explained, a mouse family had used it as a combination hotel-granary-latrine:

HP 7475A - chassis latrine

HP 7475A – chassis latrine

For whatever it’s worth, if you must get a bazillion seeds out of a plotter, ship it halfway across the continent: UPS performs a lengthy three-axis vibration test that shakes all the loose bits through the vents.

You’ll probably want the original HP 7475A documentation from the (unofficial) HP Computer Museum before digging in. Not mentioned anywhere: the two washers at the rear edge of the case are not identical. The one holding the power supply in place is slightly longer than the one at the serial connector. Mine are now color-coded to their locations.

A critter whizzed on U13, the serial adapter chip, just beyond the big black filter capacitor:

HP 7475A - PCB latrine area

HP 7475A – PCB latrine area

I rinsed everything (except, no fool I, the membrane keypad at the front of the PCB) with warm water, flushed the latrine areas with dilute baking soda (alkaline, to neutralize the urea), rinsed with hot water, blew-dry with compressed air, then let the pieces sit for a few days.

After reassembly, the plotter didn’t start up. It’s a third of a century old, what did you expect?

Measuring the electrolytic capacitors showed they were all in surprisingly good condition, with only C27 and C34 (on this Option 001 = RS-232 board) having moderately high ESR. They’re the pale blue axial caps just right of the heatsink, both 22 μF 25 V:

  • C27: Processor Reset timing (U14 – p. 6-27/6-28)
  • C34: +5 V filter cap (U21 – power supply p. 6-31)

The corresponding caps on the Option 002 = HP-IB board are C20 and C25. FWIW, if you have an HP-IB plotter, you should probably just hack an Arduino into the motor control connections and run it with Grbl; you’d get a bare-bones plotter eating G-Code, not HP-GL, but that’s not entirely a Bad Thing. Adapting the tool change code to handle the pen carousel is left as an exercise for the desperate.

I replaced the offending caps with 33 μF 50 V radial caps from the heap:

HP 7475A - re-capped PCB

HP 7475A – re-capped PCB

And then it performed its Demonstration Plot (load paper, hold down P1 + P2 buttons, turn on power) perfectly. The fossilized pens left no trace behind; we all expected that.

The serial port connection on the back required, from bottom to top:

All of which came from the Big Box o’ Serial Adapters and produced this rather unsteady ziggurat:

HP 7475A - serial port adapters - typical

HP 7475A – serial port adapters – typical

Seeing as how I’ve been adapting serial connections since before the HP 74754A was a thing, the Adapter Box has All! The! Adapter! Genders! plus Der Blinkenlights! They don’t come in nearly as handy nowadays, though, which is a Good Thing.

Some optimization pared down the ziggurat and added a short extension cable:

HP 7475A - serial port adapters - hardcore

HP 7475A – serial port adapters – hardcore

Eventually, I’ll build a custom cable, but it’s good enough for now.

The switches select 9600 b/s serial data in 8N1 format. Yes, the plotter tops out at 9600 b/s, but remember we’re dealing with a pen plotter that executes terse ASCII commands. It offers both XON/XOFF and DTR/DSR hardware handshaking to prevent overruning the internal 1 kB buffer, plus a myriad other software-selectable options relevant to long-forgotten datacomm systems.

Lest I forget, dots now mark the switch settings for 9600 8N1, A (letter) paper, US (inch) units, direct serial connection:

HP 7475A - DIP switch settings

HP 7475A – DIP switch settings

And then it Just Worked: type IN;SP1; into minicom and the plotter grabs Pen 1. The rest is a simple matter of software.

Now, to deal with the pen situation…

18 Comments

Engineering Book Costs

Clearing off the shelves produced a book I haven’t opened in a loooong time:

Vector Mechanics for Engineers - cover

Vector Mechanics for Engineers – cover

The price sticker shows that textbooks have always been expensive:

Vector Mechanics for Engineers - price tag

Vector Mechanics for Engineers – price tag

The first line looks like a date and, indeed, I took “Principles of Mechanics” in Spring 1974, so that book would cost $88.08 in 2015 dollars, based on the official CPI calculator.

It’s harder to figure college costs, but the old rule of thumb says it’s a factor of two higher than the CPI. A bit of successive approximation with a compound interest calculator suggests an annual inflation of 3.9% and 7.8% says the book would cost $403 today.

Which, it turns out, isn’t all that much higher than what our Larval Engineer has been paying for the fatter textbooks in her engineering courses.

Even using today’s worthless dollars, that’s still a chunk o’ change…

Memo to Self: As the bumper sticker puts it, “If you think education is expensive, try ignorance.”

10 Comments

Bike Rack in the Easter Season

OK, I’ll admit we weren’t on our bikes:

Easter-theme bike rack

Easter-theme bike rack

The next week, however, we were, and we leaned our bikes against the wall, because:

  • Long-wheelbase recumbents don’t fit into that kind of rack anyway
  • Even if they did, they’d block the entire sidewalk

Leave a comment

Kenmore 158 UI: Pastel Buttons

The user community asked for toned-down buttons, in place of my rather garish color scheme. A bit of twiddling with the Hue parameter produced these buttons:

Kenmore 158 UI - Pastel Buttons

Kenmore 158 UI – Pastel Buttons

Which look pretty good in context:

Kenmore 158 UI - Pastel buttons

Kenmore 158 UI – Pastel buttons

The Bash script, which includes Unicode characters that may confuse your browser:

ND=50
./mkBFam.sh NdDn  $ND ⤓ 
./mkBFam.sh NdUp  $ND ⤒
./mkBFam.sh NdAny $ND ⛀ 80 80 40
#./mkBFam.sh NdAny $ND  ⛂ 80 80 40
#./mkBFam.sh NdAny $ND 🍥 80 80 40

PD=14
./mkBFam.sh PdOne $PD One 120 80 
./mkBFam.sh PdFol $PD Follow 120 80 
./mkBFam.sh PdRun $PD Run 120 80 

SM=44
./mkBFam.sh SpMax $SM  🏃 80 80 40
./mkBFam.sh SpMed $SM  🐇 80 80 40
./mkBFam.sh SpLow $SM  🐌

montage *bmp -tile 3x -geometry +2+2 Buttons.png
display Buttons.png

So far, so good…

, ,

Leave a comment