Posts Tagged Repairs

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

,

3 Comments

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…

,

2 Comments

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…

5 Comments

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

,

6 Comments

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

, , ,

2 Comments

Sienna Hood Rod Pivot: PETG Edition

Our Larval Engineer reports that the PLA pivot for the Sienna’s hood rod didn’t survive contact with the van’s NYS Inspection. I’m not surprised, as PLA tends to be brittle and the inspection happened on a typical February day in upstate New York. Seeing as how PETG claims to be stronger and more durable than PLA, I ran off some replacements:

Toyota Sienna hood rod pivot - small - PETG

Toyota Sienna hood rod pivot – small – PETG

The square cap fit snugly over the bottom of the post; PETG tolerances seem pretty much the same as for PLA.

A slightly larger loop may be more durable, so I changed one parameter in the OpenSCAD code to get this:

Toyota Sienna Hood Rod Pivot - up-armored - solid model

Toyota Sienna Hood Rod Pivot – up-armored – solid model

Which printed just like you’d expect:

Toyota Sienna hood rod pivot - large - PETG hairs

Toyota Sienna hood rod pivot – large – PETG hairs

Despite the hairs stretching between each part, the nozzle didn’t deposit any boogers during the print. The top and bottom use Hilbert Curve infill, which looks pretty and keeps the nozzle from zipping back and forth quite so much; perhaps that’s a step in the right direction.

Tapping the holes for 6-32 stainless machines screws went easily enough:

Toyota Sienna hood rod pivot - PETG - assembled

Toyota Sienna hood rod pivot – PETG – assembled

She gets one of each and I keep the others for show-n-tell sessions.

The OpenSCAD source code, which differs from the original by a constant or two:

// Sienna Hood Rod Pivot
// Ed Nisley KE4ZNU November 2013

//- Extrusion parameters must match reality!
//  Print with 2 shells and 3 solid layers

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

ShellOD = 20.0;
ShellID = 8.75;
ShellLength = 10.0;

TaperLength = 1.5;
TaperID = 11.4;

BaseWidth = 20.0;
BaseThick = 3.0;

PegSide = 9.5;					// mounting peg through sheet metal
PegLength = 7.0;
PegCornerTrim = 0.75;
PegHoleOD = 0.107*inch;			//  6-32 tap hole

PegTrimSide = sqrt(2)*PegSide - PegCornerTrim;

ClampWall = 3.0;				// clamping cap under sheet metal
ClampHoleOD = 0.150*inch;		//  6-32 clearance hole
ClampCap = 3.0;					// solid end thickness

PanelThick = 2.0;				// sheet metal under hood

NumSides = 6*4;

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

}

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

//ShowPegGrid();

// pivot

translate([-ShellOD,0,0])
	difference() {
		union() {
			cylinder(r=ShellOD/2,h=ShellLength,$fn=NumSides);		// housing
			translate([-ShellOD/2,0,0])								// filler
				cube([ShellOD,(ShellOD/2 + BaseThick),ShellLength],center=false);
			translate([0,(ShellOD/2 + BaseThick/2),ShellLength/2])	// foot
				cube([BaseWidth,BaseThick,ShellLength],center=true);

			translate([0,											// peg
						(ShellOD/2 + PegLength/2 + BaseThick - Protrusion),
						PegSide/2])
				intersection() {
					cube([PegSide,(PegLength + Protrusion),PegSide],center=true);
					rotate([0,45,0])
						cube([PegTrimSide,2*PegLength,PegTrimSide],center=true);
				}
		}

		PolyCyl(ShellID,ShellLength,NumSides);		// central hole

		translate([0,0,-Protrusion])				// end bevels
			cylinder(r1=TaperID/2,r2=ShellID/2,h=(TaperLength + Protrusion),$fn=NumSides);
		translate([0,0,(ShellLength + Protrusion)])
			rotate([180,0,0])
				cylinder(r1=TaperID/2,r2=ShellID/2,h=(TaperLength + Protrusion),$fn=NumSides);

		translate([0,0,PegSide/2])					// screw tap hole
			rotate([-90,0,0])
				PolyCyl(PegHoleOD,(ShellOD + BaseThick + PegLength),6);

	}

// anchor cap

translate([2*PegSide,0,0])
	difference() {
		translate([0,0,(PegLength + ClampCap)/2])					// overall shape
			cube([(PegSide + ClampWall),(PegSide + ClampWall),(PegLength + ClampCap)],center=true);
		translate([0,0,(PegLength/2 + ClampCap + Protrusion)])		// peg cutout
			cube([(PegSide + ThreadWidth),(PegSide + ThreadWidth),(PegLength + Protrusion)],center=true);
		translate([0,0,-Protrusion])								// screw clearance
				PolyCyl(ClampHoleOD,2*PegLength,6);
	}

, ,

Leave a comment

LED Bulb in High-Vibration Environment

The garage door opener just ate another rough-duty bulb, so let’s see how a $7 LED bulb fares:

Walmart 60 W LED Bulb - garage door opener

Walmart 60 W LED Bulb – garage door opener

It has no external heatsink fins and the color temperature looks just like the old-school incandescent bulb it’s replacing, so they’re getting a clue about what’s acceptable to ordinary folks.

That’s equivalent to a 60 W incandescent bulb, too, at least according to the package:

Walmart 60 W LED Bulb - package data

Walmart 60 W LED Bulb – package data

I love the “Return the package and reciept for replacement or money back” part…

,

13 Comments