The Smell of Molten Projects in the Morning

Ed Nisley's Blog: Shop notes, electronics, firmware, machinery, 3D printing, laser cuttery, and curiosities. Contents: 100% human thinking, 0% AI slop.

Tag: Repairs

If it used to work, it can work again

  • 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…

  • 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.

     

  • 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();
    }
    
  • Tour Easy Chainstay Rust Repair

    While replacing the well-worn sprocket / chain / chainrings on Mary’s bike, I finally got around to repairing some damaged paint tucked in an inconvenient spot…

    Over the years, a flaw in the paint underneath the strap connecting the chainstays on Mary’s Tour Easy let in enough moisture to dislodge the paint over a considerable area. I chipped off the loose paint and used Evapo-Rust to convert the oxide to phosphate; there’s not much damage to the steel parts, despite what it may look like in the pictures.

    A top view from the right rear, minus the wheel & fender, looking toward the left chainstay:

    Tour Easy - rusted chainstay strap
    Tour Easy – rusted chainstay strap

    Two epoxy fillets in the concave sections where the strap meets the chainstays should eliminate problems in those sections forever more:

    Tour Easy - chainstay strap - epoxy fillet
    Tour Easy – chainstay strap – epoxy fillet

    Some rusty-metal primer and a few coats of red paint conceal most of the ugliness:

    Tour Easy - rear fender bracket - installed - top
    Tour Easy – rear fender bracket – installed – top

    It’ll never be mistaken for showroom quality, but our bikes are tools, not art objects.

    The obviously 3D printed red block in the middle of the strap holds the fender in place, about which more tomorrow…

  • Whirlpool Refrigerator Drawer Strut Re-Re-Repair

    Well, another year, another deep-cleaning session, another break in the strut holding up the drawers in the Whirlpool refrigerator:

    Whirlpool refrigerator drawer strut - clamped
    Whirlpool refrigerator drawer strut – clamped

    This time, there’s a fixture positioning the tab in the proper orientation while the solvent evaporates. The two bottom clamps hold an aluminum plate against the top (far side) of the strut, with the top-center clamp holding the tab against a steel block shimmed with cardboard to get the correct angle. The other two clamps squash the tab against the joint, which is well-soaked with IPS 4 adhesive.

    I replaced the right-side guide plate, originally made from phosphor bronze strip, with some thicker steel strip. The bronze strip collapsed into the worn section of the plastic bump that appeared in the previous post:

    Refrigerator strut - worn retainers
    Refrigerator strut – worn retainers

    I’ve written bigger caution messages on the top of the strut in red letters, but we think it’s getting on time for a whole new refrigerator…

  • It Wasn’t Quite Touching, So Ship It

    Picked up a Prime Switched Outlet to help tame the U2711 monitor’s DisplayPort incompatibility and, being that type of guy, had to open it up to see what’s inside.

    Good thing I did:

    Prime Switched Outlet - stray wire strand
    Prime Switched Outlet – stray wire strand

    Admittedly, white is neutral, so that stray wire would should just pop the GFI, but, still …

    You can wind up with events like this:

    Burnt outlet expander
    Burnt outlet expander
  • Epson S5 Projector Foot Repair

    First up: it’s not our projector, which means the usual Rules of Engagement do not apply.

    A few small black plastic fragments fell out of the Epson S5 projector’s carry bag, the front foot wouldn’t remain extended, and, as one might expect, the two incidents were related. Mary needed it for the gardening class she was teaching the next evening, sooooo

    A pair of plastic snaps release the entire foot assembly from the front of the projector:

    Epson S5 Projector Foot - assembled
    Epson S5 Projector Foot – assembled

    It became obvious that we didn’t have all the fragments, but it was also obvious that, even if we had the pieces, a glued assembly wouldn’t last very long.

    The threaded plastic stem surrounds a steel pin that’s visible when you remove the rubber foot pad. That pin holds the latch on the end of the stem outward, so that the stem can’t fall out. Drive out the pin with a (wait for it) pin punch inserted from the foot pad end, which reveals the broken plastic doodad:

     

    Epson S5 Projector Foot - stem removed
    Epson S5 Projector Foot – stem removed

    Release the latches on the gray handle and the intricate half-nut that engages the threaded stem slides out:

    Epson S5 Projector Foot - disassembled
    Epson S5 Projector Foot – disassembled

    A plastic spring in the boxy shell pushes the gray handle and half-nut against the stem, holding the stem in place. Pushing the gray handle upward (on the projector, downward in the picture, yes, your fingertip can feel those ribs just fine) pulls the half-nut away from the stem and lets the stem slide freely. With the stem extended, the projector leans on the stem, pushes it against the half-nut, and you can fine-tune the angle by turning the stem; the splines around the rubber foot encourage that. You can pull the stem outward without activating the latch, which probably broke the fragile plastic plate.

    A doodle showing the estimated measurements, plus three 3D printed prototypes required to get a good fit:

    Epson S5 Projector Foot - measurements and versions
    Epson S5 Projector Foot – measurements and versions

    The solid model looks about like you’d expect:

    Epson S5 Projector foot latch - solid model
    Epson S5 Projector foot latch – solid model

    The first version (leftmost of the three sitting on the doodle, above) had angled ends on the tabs that I intended to match up with the stubs remaining on the OEM latch. The part fit better with shorter tabs and the angles vanished on third version; the statements remain in the OpenSCAD source, but the short tabs render them moot.

    Apparently I got the cooling & fan & minimum layer time pretty close to right for PETG, as each of those three towers printed singly with no slumping:

    Epson S5 Projector Foot - V1 on platform
    Epson S5 Projector Foot – V1 on platform

    The third version snapped into place, with a square of tapeless sticky on the back to help keep it there. The obligatory Kapton tape helps retain it, but I have no illusions about the permanence of this repair:

    Epson S5 Projector Foot - repair installed
    Epson S5 Projector Foot – repair installed

    Because I know the problem will happen again, I called for backup:

    Epson S5 Projector Foot - 5 copies
    Epson S5 Projector Foot – 5 copies

    That’s with Hilbert Curve top / bottom fill, three top / bottom layers, 20% rectilinear infill, and two perimeters. Extruder at 250 °C, platform at 90 °C, hairspray for adhesion.

    Note, however, the hair-fine strings connecting the towers. Retraction must be just about right, as shown by the overall quality of the objects, but PETG comes out really stringy. Choosing an infill pattern to minimize retraction seems like a big win; relatively sparse 3D Honeycomb works well on larger objects, but these were so small that straight line fill fit better. The flat plates on the bottom consist of five completely solid layers of PETG.

    Reports from the field indicate complete success: whew!

    One could, of course, just buy a replacement from the usual eBay supplier, if one were so inclined.

    The OpenSCAD source code:

    // Epson S5 projector foot latch repair
    // Ed Nisley KE4ZNU - March 2015
    
    Layout = "Build";
    
    //- Extrusion parameters must match reality!
    
    ThreadThick = 0.25;
    ThreadWidth = 0.40;
    
    HoleWindage = 0.2;
    
    Protrusion = 0.1;			// make holes end cleanly
    
    function IntegerMultiple(Size,Unit) = Unit * ceil(Size / Unit);
    
    //----------------------
    // Dimensions
    
    Plate = [16.7,9.0,1.25];
    
    Block = [12.5,2.5,10.0];
    
    HoleDia = 7.7;
    HoleRadius = HoleDia/2;
    
    HoleOffset = 3.5 + HoleDia/2;					// +Y edge to hole center
    HoleSides = 8;
    
    StubLeft= 9.5;
    StubLeftAngle = asin((StubLeft - HoleOffset) / (HoleRadius));
    
    StubRight = 9.1;
    StubRightAngle = asin((StubRight - HoleOffset) / (HoleRadius));
    
    //----------------------
    // 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);
    }
    
    module ShowPegGrid(Space = 10.0,Size = 1.0) {
    
      Range = floor(50 / Space);
    
    	for (x=[-Range:Range])
    	  for (y=[-Range:Range])
    		translate([x*Space,y*Space,Size/2])
    		  %cube(Size,center=true);
    
    }
    
    module RodSupport() {
    	difference() {
    		union() {
    			translate([0,(HoleOffset-Plate[1]/2),Plate[2]/2])
    				cube(Plate,center=true);
    			translate([0,HoleOffset-Block[1]/2,-(Block[2] - Protrusion)/2])
    				cube(Block + [0,0,Protrusion],center=true);
    		}
    		translate([0,0,-2*Block[2]])
    			rotate(180/HoleSides)
    				PolyCyl(HoleDia,4*Block[2],HoleSides);
    		rotate(StubLeftAngle)
    			translate([-2*HoleDia,-HoleDia,-Protrusion])
    			cube([2*HoleDia,HoleDia,Plate[2] + 2*Protrusion],center=false);
    		rotate(-StubRightAngle)
    			translate([0,-HoleDia,-Protrusion])
    				cube([2*HoleDia,HoleDia,Plate[2] + 2*Protrusion],center=false);
    
    	}
    }
    
    //----------------------
    // Build it
    
    //ShowPegGrid();
    
    if (Layout == "Show")
    	RodSupport();
    
    if (Layout == "Build")
    	translate([0,0,Plate[2]])
    		rotate([0,180,0])
    			RodSupport();