HP 7475A Plotter: Rehabilitation

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…

12 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.”

4 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

Silhouette Eyeglasses: Second Temple Repair

As we expected, the remaining temple of Mary’s Silhouette glasses broke, a bit over a year from the previous repair, and this repair proceeded along the same lines as the previous fix.

Cross-drill a brass tube for the teeny screws:

Silhouette temple repair - cross-drilling brass tube

Silhouette temple repair – cross-drilling brass tube

I don’t recall having to do quite this much filing to make the screws fit, but they don’t call ’em “needle files” for nothin':

Silhouette temple repair - filing screw holes

Silhouette temple repair – filing screw holes

Trim the tube to the proper length by chucking it in the Sherline, rotating the spindle by hand, and filing a notch just below the jaws:

Silhouette temple repair - trimming tube

Silhouette temple repair – trimming tube

Then file the end flat, countersink it just a bit, and ream out the hole to fit the broken end of the earpiece. This one didn’t quite fit the tubing, but we’re talking a few mils of tolerance on a bent piece of titanium. Rough up the end of the earpiece, degrease everything, and a few dabs of epoxy suffice for another Steampunk repair:

Silhouette temple repair - finished

Silhouette temple repair – finished

The original fix continues to hold, but … this can’t go on.

 

4 Comments

Monthly Image: Left Cross

It’s the start of a new riding season and we’re returning from a concert at Vassar. I’m cranking 20+ mph, pushed by a gusty tailwind.

T minus 7 seconds:

Cedar Valley Rd - Left Cross - T-7

Cedar Valley Rd – Left Cross – T-7

The white car approaches the intersection a bit faster than usual, which leads me to expect a New York State Rolling Stop-and-Go right turn directly in front of me.

T minus 5 seconds:

Cedar Valley Rd - Left Cross - T-5

Cedar Valley Rd – Left Cross – T-5

The white car slows enough that I now expect a stop with the front end well onto the shoulder. A quick check in the mirror shows no traffic behind me: I can take the lane if needed. This intersection always has a large gravel patch spanning the shoulder, so I must move closer to the fog line anyway.

T minus 2 seconds:

Cedar Valley Rd - Left Cross - T-2

Cedar Valley Rd – Left Cross – T-2

The white car comes to a full stop, not too far onto the shoulder, and my fingers come off the brakes. I gotta work on that fingers-up position, though.

Whoops, a classic left cross from the black SUV!

T minus 1 second:

Cedar Valley Rd - Left Cross - T-1

Cedar Valley Rd – Left Cross – T-1

I’m now braking hard, barely to the left of the gravel patch.

T zero:

Cedar Valley Rd - Left Cross - T-0

Cedar Valley Rd – Left Cross – T-0

Well, that was close.

Somewhat to my surprise, the white car hasn’t crept any further onto the shoulder.

The SUV driver gives me a cheery wave, as if to thank me for not scratching the doors. I never make hand gestures, but I did tell him he does nice work.

It’s hard to not see a faired long-wheelbase recumbent, head-on in bright sunlight, not to mention that I’m wearing my new Sugoi Zap Bike Jacket in Super Nova retroreflective lime green with retroreflective lime green utility gloves.

I. Am. Visible. In. Any. Light. Dammit.

It is, apparently, easy to mis-judge a bike’s speed, although driver-ed courses used to recommend that you err on the side of not trying to beat an oncoming vehicle. Perhaps that recommendation has become inoperative?

The corresponding maneuver by a car passing you is known as a right hook.

Memo to Self: Always look at the license plate to give the camera a straight-on picture.

, ,

15 Comments

Tour Easy Rear Fender Bracket

I’d originally secured the rear fender to the steel strap connecting the chainstays on Mary’s Tour Easy with a cable tie: small, simple, light weight, reliable. Unfortunately, that put the end of the fender just slightly lower than the strap and, I fear, sprayed water all over the strap, where it worked its way through a paint flaw and rusted the steel under the paint. A simple metal clip would chew its way through the pain[t] on the strap, so, seeing as how we’re living in the future…

The C-shaped block on the top grips the steel cross-strap, the trough fits the fender’s curve, the little spider supports the inside of the nut recess, and a pair of alignment pin holes (one visible) help during gluing:

Tour Easy Rear Fender Bracket - solid model - show

Tour Easy Rear Fender Bracket – solid model – show

Although it’s tempting to 3D print both parts as a single unit, laying them out like this aligns the threads for best strength in each piece:

Tour Easy Rear Fender Bracket - solid model - build

Tour Easy Rear Fender Bracket – solid model – build

Pressing the bracket on the glass slab (flat side up, nubblies on the bottom) with the clamps in place finished the job. The slightly crushed support spider from the nut recess sits in the foreground:

Tour Easy rear fender bracket - gluing

Tour Easy rear fender bracket – gluing

Magenta PETG matches the red Tour Easy paint surprisingly well:

Tour Easy - rear fender bracket - installed - top

Tour Easy – rear fender bracket – installed – top

From below, you can see why the top block can’t extend all the way to the bottom of the fender mount:

Tour Easy rear fender bracket - installed

Tour Easy rear fender bracket – installed

That rubber boot needs replacing in the worst possible way, but I didn’t have anything suitable on hand and wouldn’t dismount that cable even if I had; cables never go back on properly.

Alas, because the brakes weren’t mounted when I did the measurements, I had to build one to find out why a long block wouldn’t work:

Tour Easy rear fender bracket - long back

Tour Easy rear fender bracket – long back

The screw atop the block (on the left in that picture) presses a small plastic slug against the steel strap, in the hopes it won’t chew through the paint quite as rapidly. The screws & nuts are stainless, so at least they’ll survive for a while.

The curve in the trough comes from the chord equation applied to these crude measurements:

Tour Easy Rear Fender Bracket - measurement doodle

Tour Easy Rear Fender Bracket – measurement doodle

Fortunately, it’s tucked into a spot where nobody ever looks…

The OpenSCAD source code:

// Tour Easy rear fender bracket
// Ed Nisley KE4ZNU March 2015

Layout = "Build";		// Build Show TabHolder Block

//- 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

PlateWidth = 45;		// Tour Easy frame plate
PlateDepth = 17;
PlateThick = 3.3;		//  ... allow for a bit of crud

TabWidth = 32;			// fender tab
TabLength = 40;
TabThick = 1.5;
TabDepth = 8;

ChordM = TabDepth - TabThick;	// find fender tab's radius of curvature
ChordC = TabWidth;

TabRadius = ((ChordM * ChordM) + (ChordC * ChordC)/4) / (2 * ChordM);
echo(str("Fender radius: ", TabRadius));

FenderOffset = -25.0;		// from bottom of frame plate

ScrewClear = 5.0;			// close enough to 10-32
ScrewTap = ScrewClear - 1.0;

NutThick = 3.1;				// 10-32 nut
NutOD = 9.5;				//  ... across flats

Chamfer = 5.0;					// edge chamfer

BlockSlab = 10.0;
BlockWidth = TabWidth;
BlockDepth = PlateDepth + BlockSlab;
BlockHeight = TabLength + PlateThick + BlockSlab;

BlockOutline = [
	[TabDepth/2,0],
	[TabDepth/2,TabLength],
	[PlateDepth,TabLength],
	[PlateDepth,TabLength + PlateThick],
	[0,TabLength + PlateThick],
	[0,BlockHeight - Chamfer],
	[Chamfer,BlockHeight],
	[BlockDepth - Chamfer,BlockHeight],
	[BlockDepth,BlockHeight - Chamfer],
	[BlockDepth,TabLength - BlockSlab + Chamfer],
	[BlockDepth - Chamfer,TabLength - BlockSlab],
	[BlockSlab + Chamfer,TabLength - BlockSlab],
	[BlockSlab,TabLength - BlockSlab - Chamfer],
//	[BlockSlab,Chamfer],								// full-length tab (TrimBlock = false)
//	[BlockSlab - Chamfer,0],							//   ""
	[TabDepth/2,TabLength - BlockSlab - Chamfer]		// trim lower tab (TrimBlock = true)
	];

TrimBlock = true;

BuildGap = 5.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 = TabLength / 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([i*PinOC/2,0,0])
		rotate(180/4)
		LocatingPin(Len=Length);
}

//----------------------
// Pieces

module TabHolder() {

	difference() {
		translate([-TabWidth/2,-TabLength,0])
			cube([TabWidth,TabLength,2*TabDepth],center=false);

		translate([0,-TabLength/4,0])
			LocatingPins(5.0);

if (!TrimBlock)
		translate([0,-3*TabLength/4,0])
			LocatingPins(5.0);

		translate([0,FenderOffset,-Protrusion])
			rotate(180/6)
				PolyCyl(ScrewClear,3*TabDepth,6);

if (TrimBlock)
		translate([0,FenderOffset,-Protrusion])
			rotate(180/6)
				PolyCyl(NutOD,NutThick + Protrusion,6);

		translate([0,TabLength,TabRadius + TabDepth/2])
			rotate([90,0,0])
				rotate(180/(6*4))
					cylinder(r=TabRadius,h=3*TabLength,$fn=6*4);
	}

if (TrimBlock)
	color("Yellow")
	translate([0,FenderOffset,0])
		for (Seg=[0:5]) {
			rotate(30 + 360*Seg/6)
			cube([NutOD/2,
				2*ThreadWidth,
				(NutThick - ThreadThick)],center=false);
		}

}

module Block() {

	difference() {
		linear_extrude(height=BlockWidth,convexity=3)
			polygon(points=BlockOutline);

if (!TrimBlock)
		translate([TabDepth/2,TabLength/4,BlockWidth/2])
			rotate([0,90,0])
				LocatingPins(5.0);

		translate([TabDepth/2,3*TabLength/4,BlockWidth/2])
			rotate([0,90,0])
				LocatingPins(5.0);

		translate([-BlockDepth,TabLength + FenderOffset,BlockWidth/2])
			rotate([0,90,0])
				rotate(180/6)
					PolyCyl(ScrewClear,3*BlockDepth,6);

		translate([PlateDepth/2,BlockHeight - BlockSlab - Protrusion,BlockWidth/2])
			rotate([-90,0,0])
					PolyCyl(ScrewTap,2*BlockSlab,6);

if (!TrimBlock)
		translate([(BlockSlab - NutThick),(TabLength + FenderOffset),BlockWidth/2])
			rotate([0,90,0])
				rotate(180/6)
					PolyCyl(NutOD,NutThick + Protrusion,6);

	}

}

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

if (Layout == "TabHolder")
	TabHolder();

if (Layout == "Block")
	Block();

if (Layout == "Show") {
	translate([0,BlockWidth/2,0])
		rotate([90,0,0]) {
			color("Magenta")
				Block();
			color("Orange")
				translate([0,TabLength,TabWidth/2])
					rotate([0,-90,0])
						TabHolder();
		}
}

if (Layout == "Build") {

	translate([-BuildGap,0,0])
		rotate(-90)
			TabHolder();

	translate([BuildGap,TrimBlock ? -BlockHeight/1.5 : -BlockHeight/3,0])
		Block();
}

,

2 Comments