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

  • Can Opener Gear Rebuild

    Cleaning up the wrecked gears on the can opener made it painfully obvious that I had to conjure at least one gear to get the poor thing working again:

    Can opener - gears and cutters
    Can opener – gears and cutters

    Fortunately, those are more in the line of cogs, rather than real gears, so I decided a crude hack would suffice: drill a pattern of holes to define the openings between the teeth, file / grind the teeth reasonably smooth, and then tweak the shape to suit.

    Fitting some small number-size drills between the remains of the teeth showed:

    • A #52 = 52.0 mil = 1.32 mm drill matched the root curvature
    • A #28 = 140.5 mil = 3.57 mm drill was tangent to the small drill and the tooth walls

    Neither of those count as precision measurements, particularly given the ruined teeth, but they’re close enough for a first pass.

    The OEM drive gear (on the right) has the teeth bent upward to mate with the cutter gear (on the left), but under normal gripping force, the teeth don’t mesh securely and tend to slide over / under / past each other. However, if I were to cut the drive gear from a metal sheet that’s thick enough to engage both the root and the crest of the cutter gear, that should prevent all the slipping & sliding. Some eyeballometric guesstimation suggested 2.5 mm would be about right and the Basement Laboratory Stockpile produced a small slab of 100 mil = 2.54 mm aluminum sheet.

    However, the center part of the gear must have the same thickness as the OEM gear to keep the drive wheel at the same position relative to the cutter blade, which means a bit of pocket milling. I have some small ball burrs that seemed like they might come in handy.

    A recent thread on the LinuxCNC mailing list announced Bertho Stultien’s gcmc, the G-Code Meta Compiler, and this looked like a golden opportunity to try it out. Basically, gcmc lets you write G-Code programs in a C-like language that eliminates nearly all the horrendous syntactic noise of raw G-Code. I like it a lot and you’ll be seeing more of it around here…

    The gcmc source code, down below, include a function that handles automatic tool height probing, using that simple white-goods switch. The literal() function emits whatever you hand it as text for the G-Code file, which is how you mechanize esoteric commands that gcmc doesn’t include in its repertoire. It’s basically the same as my bare G-Code probe routine, but now maintains a state variable that eliminates the need for separate first-probe and subsequent-probe entry points.

    One point that tripped me up, even though I should know better: because gcmc is a compiler, it can’t read G-Code parameters that exist only when LinuxCNC (or whatever) is interpreting the G-Code. You can write parameters with values computed at compile time, but you can’t read and process them in the gcmc program.

    Anyhow, the first pass produced an array of holes that, as I fully expected, weren’t quite right:

    Can opener gear - first hole pattern
    Can opener gear – first hole pattern

    The second pass got the root and middle holes tangent to each other:

    Can opener gear - second hole pattern
    Can opener gear – second hole pattern

    It also ran a center drill pass for those tiny little holes to prevent their drill from wandering about. The other drills are about the same size as the center drill, so they’re on their own.

    The rosette around the central hole comes from sweeping the burr in a dozen overlapping circles tangent to the outer diameter, then making a cleanup pass around the OD:

    Can opener gear - 12 leaf rosette
    Can opener gear – 12 leaf rosette

    Incidentally, that stray hole between the two patterns came from the aluminum sheet’s previous life, whatever it may have been. There are three other holes, two of which had flat washers taped to them, so your guess is as good as mine. That’s my story and I’m sticking with it.

    Introducing the sheet to Mr Bandsaw and cutting through the outer ring produced a bizarre snowflake:

    Can opener gear - cut out
    Can opener gear – cut out

    Cutting off the outer ring of holes turned the incipient gear body into a ragged shuriken:

    Can opener gear - isolated
    Can opener gear – isolated

    A few minutes of increasingly deft Dremel cutoff wheel work, poised on the bench vise over the shopvac nozzle to capture the dust, produced a credible gear shape:

    Can opener gear - first pass
    Can opener gear – first pass

    Iterating through some trial fits, re-grinds, and general fiddling showed that the center pocket was too shallow. The cutter wheel should slightly clear the drive wheel, but it’s an interference fit:

    Can opener gear - trial fit
    Can opener gear – trial fit

    Which, of course, meant that I had to clamp the [mumble] thing back in the Sherline and re-mill the pocket. The trick is to impale it on the wrong end of a suitable drill, clamp it down, and touch off that spot as the origin:

    Can opener gear - re-centering
    Can opener gear – re-centering

    I took the opportunity to switch to a smaller ball and make 16 little circles to clear the pocket:

    Can Opener Gear - 16 leaf rosette
    Can Opener Gear – 16 leaf rosette

    Now that’s better:

    Can opener gear - deeper pocket
    Can opener gear – deeper pocket

    Another trial fit showed that everything ended up in the right place:

    Can opener gear - final fit
    Can opener gear – final fit

    I gave it a few cranks, touched up any cogs that clashed with the (still misshapen) cutter gear, applied it to a randomly chosen can, and it worked perfectly:

    • Squeeze the levers to easily punch through the lid
    • Crankety crank on the handle, while experiencing none of the previous drama
    • The severed lid falls into the can

    Which is exactly how it’s supposed to work. What’s so hard about that?

    What you can’t see in that picture is the crest of the lowest cutter gear tooth fitting just above the bottom of the drive gear root. Similarly, the crest of the highest drive gear tooth remains slightly above the cutter root. That means the cutter gear teeth always engage the drive gear, there’s no slipping & sliding, and it’s all good.

    Aluminum isn’t the right material for a gear-like object meshed with a steel counterpart, but it’s easy to machine on a Sherline. I’ll run off a few more for show-n-tell and, if when this one fails, I’ll have backup.

    The gcmc source code:

    // Can opener drive gears
    //	Ed Nisley KE4ZNU - February 2014
    //	Sherline CNC mill with tool height probe
    //	XYZ touchoff origin at center on fixture surface
    
    DO_DRILLCENTER	= 1;
    DO_MILLCENTER	= 1;
    DO_DRILLINNER	= 1;
    DO_DRILLOUTER	= 1;
    DO_DRILLTIPS	= 1;
    
    //----------
    // Overall dimensions
    
    GearThick = 2.54;			// overall gear thickness
    GearCenterThick = 1.75;		// thickness of gear center
    
    GearTeeth = 12;				// number of teeth!
    ToothAngle = 360deg/GearTeeth;
    GearOD = 22.0;				// tooth tip
    GearID = 13.25;				// tooth root
    
    SafeZ = 20.0;				// guaranteed to clear clamps
    TravelZ = GearThick + 1.0;	// guaranteed to clear plate
    
    //----------
    // Tool height probe
    //	Sets G43.1 tool offset in G-Code, so our Z=0 coordinate always indicates the touchoff position
    
    ProbeInit = 0;					// 0 = not initialized, 1 = initialized
    ProbeSpeed = 400.0mm;
    ProbeRetract = 1.0mm;
    
    PROBE_STAY = 0;					// remain at probe station
    PROBE_RESTORE = 1;				// return to previous location after probe
    
    function ProbeTool(RestorePos) {
    
    local WhereWasI;
    
    	WhereWasI = position();
    
    	if (ProbeInit == 0) {		// probe with existing tool to set Z=0 as touched off
    		ProbeInit++;
    		literal("#<_Probe_Speed> = ",to_none(ProbeSpeed),"\n");
    		literal("#<_Probe_Retract> = ",to_none(ProbeRetract),"\n");
    		literal("#<_ToolRefZ> = 0.0 \t; prepare for first probe\n");
    		ProbeTool(PROBE_STAY);
    		literal("#<_ToolRefZ> = #5063 \t; save touchoff probe point\n");
    		literal("G43.1 Z0.0 \t; set zero offset = initial touchoff\n");
    	}
    	elif (ProbeInit == 1) {		// probe with new tool, adjust offset accordingly
    		literal("G49 \t; clear tool length comp\n");
    		literal("G30 \t; move over probe switch\n");
    		literal("G59.3 \t; use coord system 9\n");
    		literal("G38.2 Z0 F#<_Probe_Speed> \t; trip switch on the way down\n");
    		literal("G0 Z[#5063 + #<_Probe_Retract>] \t; back off the switch\n");
    		literal("G38.2 Z0 F[#<_Probe_Speed> / 10] \t; trip switch slowly\n");
    		literal("#<_ToolZ> = #5063 \t; save new tool length\n");
    		literal("G43.1 Z[#<_ToolZ> - #<_ToolRefZ>] \t; set new length\n");
    		literal("G54 \t; return to coord system 0\n");
    		literal("G30 \t; return to safe level\n");
    	}
    	else {
    		error("*** ProbeTool sees invalid ProbeInit: ",ProbeInit);
    		comment("debug,*** ProbeTool sees invalid ProbeInit: ",ProbeInit);
    		ProbeInit = 0;
    	}
    
    	if (RestorePos == PROBE_RESTORE) {
    		goto(WhereWasI);
    	}
    
    }
    
    //----------
    // Utility functions
    
    function WaitForContinue(MsgStr) {
    	comment(MsgStr);
    	pause();
    }
    
    function CueToolChange(MsgStr) {
    	literal("G0 Z" + SafeZ + "\n");
    	literal("G30\n");
    	WaitForContinue(MsgStr);
    }
    
    function ToolChange(Info,Name) {
    	CueToolChange("msg,Insert " + to_mm(Info[TOOL_DIA]) + " = " + to_in(Info[TOOL_DIA]) + " " + Name);
    	ProbeTool(PROBE_STAY);
    
    	WaitForContinue("msg,Set spindle to " + Info[TOOL_SPEED] + " rpm");
    	feedrate(Info[TOOL_FEED]);
    }
    
    function GetAir() {
    	goto([-,-,SafeZ]);
    }
    
    //-- compute drill speeds & feeds based on diameter
    //		rule of thumb is 100 x diameter at 3000 rpm for real milling machines
    //		my little Sherline's Z axis can't produce enough thrust for that!
    
    MaxZFeed = 600.0mm;				// fastest possible Z feed
    
    TOOL_DIA = 0;					// Indexes into DrillParam() result
    TOOL_SPEED = 1;					//  spindle RPM
    TOOL_FEED = 2;					//	linear feed
    TOOL_TIP = 3;					//	length of 118 degreee drill tip
    
    function DrillParam(Dia) {
    local RPM,Feed,Tip,Data,Derating;
    
    	Derating = 0.25;			// derate from (100 x diameter) max feed
    
    	RPM = 3000.0;				// default 3 k rpm
    
    	Feed = Derating * (100.0 * Dia);
    	if (Feed > MaxZFeed) {
    		RPM *= (MaxZFeed / Feed);	//  scale speed downward to fit
    		Feed = MaxZFeed;
    	}
    
    	Tip = (Dia/2) * tan(90deg - 118deg/2);
    	Data = [Dia,RPM,Feed,Tip];
    
    	message("DrillParam: ",Data);
    	return Data;
    }
    
    //-- peck drilling cycle
    
    function PeckDrill(Endpt,Retract,Peck) {
    	literal("G83 X",to_none(Endpt[0])," Y",to_none(Endpt[1])," Z",to_none(Endpt[2]),
    			" R",to_none(Retract)," Q",to_none(Peck),"\n");
    }
    
    //----------
    // Make it happen
    
    literal("G99\t;  retract to R level, not previous Z\n");
    
    WaitForContinue("msg,Verify: G30 position in G54 above tool change switch?");
    
    WaitForContinue("msg,Verify: fixture origin XY touched off at center of gear?");
    
    WaitForContinue("msg,Verify: Z touched off on top surface at " + GearThick + "?");
    ProbeTool(PROBE_STAY);
    
    //-- Drill center hole
    
    if (DO_DRILLCENTER) {
    
    	DrillData = DrillParam(5.0mm);
    	ToolChange(DrillData,"drill");
    
    	goto([0,0,-]);
    	goto([-,-,TravelZ]);
    
    	drill([0,0,-1.5*DrillData[TOOL_TIP]],TravelZ,DrillData[TOOL_DIA]);
    	GetAir();
    
    }
    
    //-- Drill inner ring
    
    if (DO_DRILLINNER) {
    
    	DrillData = DrillParam(1.32mm);
    
    	RingRadius = GearID/2.0 + DrillData[TOOL_DIA]/2.0;		// center of inner ring holes
    	HolePosition = [RingRadius,0mm,-1.5*DrillData[TOOL_TIP]];
    
    //	but first, center-drill to prevent drifting
    
    	CDData = DrillParam(1.00mm);			// pretend it's a little drill
    	CDData[TOOL_FEED] = 100mm;				//  ... use faster feed
    
    	CDPosition = HolePosition;				// use center drill coordinates
    	CDPosition[2] = GearThick - 0.25mm;		//  ... just below surface
    
    	ToolChange(CDData,"center drill");
    
    	goto([0,0,-]);
    	goto([-,-,TravelZ]);
    
    	for (Tooth = 0 ; Tooth < GearTeeth ; Tooth++) {
    		drill(CDPosition,TravelZ,2*TravelZ);		// large increment ensures one stroke
    		CDPosition = rotate_xy(CDPosition,ToothAngle);
    	}
    
    //	now drill the holes
    
    	ToolChange(DrillData,"drill");
    
    	goto([0,0,-]);
    	goto([-,-,TravelZ]);
    
    	for (Tooth = 0 ; Tooth < GearTeeth ; Tooth++) {
    		PeckDrill(HolePosition,TravelZ,DrillData[TOOL_DIA]);
    		HolePosition = rotate_xy(HolePosition,ToothAngle);
    	}
    
    	GetAir();
    
    }
    
    //-- Mill center recess
    
    if (DO_MILLCENTER) {
    
    	MillData = [4.50mm,3000,250.0mm,0.0mm];			// spherical ball burr
    
    	Delta = GearThick - GearCenterThick;							// depth to be milled away
    	Inset = sqrt(2.0*Delta*(MillData[TOOL_DIA]/2) - pow(Delta,2));	// toll axis to milled edge
    
    	ToolChange(MillData,"ball burr");
    
    	goto([0,0,-]);							// above central hole
    	goto([0,0,GearThick]);					// vertically down to flush with surface
    	move([0,0,GearCenterThick]);			// into gear blank
    
    	for (Angle = 0.0deg; Angle < 360.0deg; Angle+=360.0deg/16) {	// clear interior
    		circle_cw((GearID/2 - Inset)/2,Angle);
    	}
    
    	move_r([(GearID/2 - Inset),0.0,0.0]);							// clean rim
    	circle_ccw([0.0,0.0,GearCenterThick],2);
    
    	GetAir();
    
    }
    
    //-- Drill outer ring
    
    if (DO_DRILLOUTER) {
    
    	RingRadius += DrillData[TOOL_DIA]/2;		// at OD of inner ring holes
    
    	DrillData = DrillParam(3.18mm);
    	RingRadius += DrillData[TOOL_DIA]/2.0;		// center of outer ring holes
    	HolePosition = [RingRadius,0mm,-1.5*DrillData[TOOL_TIP]];
    
    	ToolChange(DrillData,"drill");
    
    	for (Tooth = 0 ; Tooth < GearTeeth ; Tooth++) {
    		PeckDrill(HolePosition,TravelZ,DrillData[TOOL_DIA]);
    		HolePosition = rotate_xy(HolePosition,ToothAngle);
    	}
    
    	GetAir();
    
    }
    
    //-- Drill to locate gear tooth tip end
    
    if (DO_DRILLTIPS) {
    
    	DrillData = DrillParam(4.22mm);
    
    	RingRadius = GearOD/2.0 + DrillData[TOOL_DIA]/2.0;		// tangent to gear tooth tip
    	HolePosition = [RingRadius,0mm,-1.5*DrillData[TOOL_TIP]];
    	HolePosition = rotate_xy(HolePosition,ToothAngle/2);	// align to tooth
    
    	ToolChange(DrillData,"drill");
    
    	for (Tooth = 0 ; Tooth < GearTeeth ; Tooth++) {
    		PeckDrill(HolePosition,TravelZ,DrillData[TOOL_DIA]);
    		HolePosition = rotate_xy(HolePosition,ToothAngle);
    	}
    
    	GetAir();
    
    }
    
    literal("G30\n");
    comment("msg,Done!");
    

    The original doodle that suggested the possibility:

    Can Opener Gears - Doodle 1
    Can Opener Gears – Doodle 1

    The chord equation at the bottom shows how to calculate the offset for the ball burr, although it turns out there’s no good way to measure the cutting diameter of the burr and it’s not really spherical anyway.

    A more detailed doodle with the key line at a totally bogus angle:

    Can Opener Gears - Doodle 2
    Can Opener Gears – Doodle 2

    The diagram in the lower right corner shows how you figure the length of the tip on a 118° drill point, which you add to the thickness of the plate in order to get a clean hole.

  • Chocolate Molds: Positives Ready

    After all the height map tweaking, Slic3r duplicated the Tux and SqWr STL positive models, distributed them on the platform, and the small molds printed out easily enough:

    Tux SqWr positive molds - as built
    Tux SqWr positive molds – as built

    The larger pin plate wasn’t quite as successful. Despite what this might look like, that’s the same black PLA as the smaller molds:

    Mold peg plate - repaired
    Mold peg plate – repaired

    I used 10% infill density, which was structurally good enough for a very light slab, but it left large gaps near the side walls that the top fill didn’t quite cover. Part of the problem was that the walls, being cylindrical sections, kept overhanging toward the inside, leaving the top fill nothing to grab around the nearly tangential perimeter. I think printing the slab upside-down, with the top surface against the platform, would solve that problem and also produce a glass-smooth surface under the positive molds.

    I took the easy way out by troweling JB KwikWeld epoxy into the holes, smoothing it, and sanding the surfaces more-or-less smooth. That should suffice to cast the negative mold in silicone over everything, but it sure ain’t pretty:

    Mold plate with Tux SqWr positives in place
    Mold plate with Tux SqWr positives in place

    The molds are just sitting on their pegs and haven’t been taped in place; the lower-left Tux appears to be making a break for freedom.

    The Mighty Thor will do the silicone negative mold… and the further I stay away from the chocolate tempering & pouring process, the better it’ll be for all parties concerned.

     

  • Kenmore Model 158 Speed Control: Carbon Disk Replacement

    The speed control pedal on Mary’s sewing machine once again started racing away from a dead stop, which we now know means more disks inside the carbon pile rheostat have disintegrated. It looked pretty much the same as when I took it apart in 2009:

    Rheostat graphite wafers and contacts
    Rheostat graphite wafers and contacts

    This time, it had one cracked wafer and several thin ones, reducing the length of the stacks so much that the pedal exerted very little force (thus, not starting the motor) before the shorting contacts caused a runaway.

    Back then, I’d machined two brass disks to fill the empty space:

    Rheostat with brass spacer button
    Rheostat with brass spacer button

    A rough measurement showed I’d have to double their thickness to about 7 mm each, but it seemed like replacing high-resistance carbon with low-resistance brass wasn’t a Good Idea, at least when taken to an extreme. Not knowing what would count as an extreme in this situation, I decided to replace the brass disks with graphite cylinders sized to fill up the empty space.

    The Little Box o’ Machinable Graphite produced a small bar, from which I sliced a square with jeweler’s pull saw:

    Machineable Graphic - rough-sawn slab
    Machineable Graphic – rough-sawn slab

    Cutting that in half, then one of the bars in half, produced a pair of cubes:

    Machineable Graphic - cubes
    Machineable Graphic – cubes

    I tried sanding off the corners:

    Machineable Graphic - sanded cube
    Machineable Graphic – sanded cube

    After it became painfully obvious that process would take just slightly less than forever, I deployed the Dremel sanding drum:

    Machineable Graphic - cylinders
    Machineable Graphic – cylinders

    Much to my surprise, the shop vacuum didn’t quite inhale the cloth, I didn’t drop either of the cylinders into its gaping maw or sand away my fingertips, and the cylinders emerged more-or-less good looking. I sanded the faces reasonably smooth and parallel, removed a few high spots left by the Dremel, and the cylinders slid neatly into the holes in the ceramic rheostat.

    I felt a definite kinship with those guys in the rackets (not squash, as I once knew) court under the stadium seats…

    I put the cylinders at the end of the stacks, against the graphite buttons (shown in the top picture), and left the disks to settle themselves against the brass contacts. In retrospect, I should have put the cylinders against the brass, so that the inevitable erosion will chew on the (relatively) easily replaced bulk cylinders.

    Each graphite cylinder displaced six disks, so now I have some spares for next time. I’m certain that the graphite has lower resistance than the equivalent length of disks, but it’s probably higher than the same length of brass. I was not going to slice those cylinders into disks.

    After vigorous and repeated handwashing with gritty cleaner after leaving the Basement Laboratory Workshop, the pedal assembly went back together smoothly and, once again, operates the way it should: controllable smooth low speeds, crazy-fast high speeds, and a steady transition between the two. Mary has resumed quilting up a storm.

    That shop vacuum may never forgive me, but it totally eliminated all the carbon dust from the work area. The filter started out coated with a generous layer of dust and crud, so I’m pretty sure it collected most of the very fine dust, too.

    I briefly considered using the lathe, but came to my senses.

    The cheap way to do AC motor speed control involves a triac chopping the sine wave, so as to produce all manner of hash above and beyond the usual motor commutation noise. It occurs to me that the sewing machine has a universal motor that would run just as happily on 120 V DC as it does on AC, so a cheap 120 V DC supply (around 2 A should suffice) from the usual eBay supplier and a high voltage MOSFET on a generous heatsink would work even better. One might even get by with just a full-wave rectifier bridge and pulsating DC.

    The rheostat doesn’t dissipate more than a few watts, I think, so thermal management should not pose a serious problem.

    The motor rating says it’s good for 1 A, which means the power should be less than a few tens of watts. Some resistance and current measurements are in order.

    You can actually buy replacement pedals, but what’s the fun in that?

  • Can Opener Drive Gear: FAIL

    The fancy OXO can opener doesn’t work well on #10 cans, so we bought a not-bottom-dollar can opener with comfy handles to replace the one that convinced us to get the OXO. After maybe a year, tops, it gradually stopped working well, too, which prompted a trip to the Basement Shop Workbench.

    The symptoms:

    • The handle wouldn’t move the cutter during maybe 1/4 of its revolution
    • It pushed the handles apart during another quarter turn

    Look carefully and you’ll see the teeth sticking out slightly more on the right side of the drive wheel:

    Can opener - drive gear misalignment
    Can opener – drive gear misalignment

    When those protruding teeth line up with the gear behind the cutter wheel, the handles open and the drive wheel loses its grip. When the low side lines up with the cutter gear, the gears very nearly disengage.

    Taking it apart shows that both “gears” (which is using the term loosely) have been pretty well chewed up:

    Can opener - gears and cutters
    Can opener – gears and cutters

    Destroying those gears should require a lot more strength than either of us can deploy on a regular basis, which suggests they used mighty soft steel. It’s not obvious, but the drive gear hole is just slightly larger than the screw thread OD; it doesn’t ride on an unthreaded part of the screw shaft.

    I’m not in the mood for gear cutting right now, so I filed down the wrecked teeth and buttoned them up with some attention to centering the gear. The can opener works, but sheesh this is getting tedious…

  • Using a 3-way X10 Wall Switch As a 2-way Switch

    The pushbutton on the X10 wall switch controlling the fiercely incandescent lamp over the kitchen table has gotten erratic, so I dug into the Big Box o’ X10 Crap for a replacement. Turns out The Box has only 3-way switches, but the lamp needs a standard two-wire switch.

    The instruction sheet shows this diagram:

    X10 3-way Wall Switch Wiring
    X10 3-way Wall Switch Wiring

    The pushbutton on the CS277 “Companion” switch connects the red lead to the two blue leads. The blue leads are always connected together and carry the lamp current, so the red lead is just a signal from the remote button.

    The WS477 “Master” switch will work as an ordinary switch if you cap the red lead with a wire nut and tuck it into the box.

    Done!

  • 2000 Toyota Sienna: Replacing the Bank 1 Sensor 2 Oxygen Sensor

    Shortly after replacing the battery, the dreaded Malfunction Indicator Lamp popped on with a P0420 error code that, according to the Nice Man at Autozone, translates into “low catalytic converter efficiency”. A bit of diagnostic sleuthing reported that the most likely cause was an exhaust leak, followed by an out-of-calibration downstream oxygen sensor, followed by a bad converter. Internet lore has it that replacing the cat cracker is a dealer-only event (here in New York State, with a van sporting the California emissions package) that costs upwards of $2 k, which seems excessive for a 14-year-old van.

    Actually, the most probable cause was replacing the battery: the brief power outage wipes out the stored performance data for the emissions control machinery. Because we make only short trips and it’s been bitterly cold, the algorithms may conclude the converter’s dead when it’s just a matter of measuring the variables under suboptimal conditions.

    With all that in mind, after a peek under the van ruled out the exhaust leak, I decided to replace the oxygen sensor. All this happened during a week when the outdoor temperature hovered around 10 °F = -12 °C, but the forecast called for an atypical January day with a high of 55 °F = 13 °C; I might not get a second chance before the annual inspection came due in February.

    The sensor is relatively cheap (about $70 at the local Autozone) and, entirely unlike Bank 1 Sensor 1, readily accessible on the tailpipe downstream of the cat cracker:

    Sienna Bank 1 Sensor 2 - in place
    Sienna Bank 1 Sensor 2 – in place

    The OEM sensor cable runs in a sheath held to the chassis with a plastic clamp:

    Sienna Bank 1 Sensor 2 - cable clamp
    Sienna Bank 1 Sensor 2 – cable clamp

    Jamming a small screwdriver into the clamp released the tongue and the sheath. The sheath vanishes into the van’s interior through a squishy rubber boot, with a crimped metal band joining the two:

    Sienna Bank 1 Sensor 2 - floor boot
    Sienna Bank 1 Sensor 2 – floor boot

    Internet lore would have you believe you can replace the sensor without removing the front passenger seat, but it’s much easier if you remove the four bolts, disconnect the seat sensor, and lay the seat on its back:

    Sienna Bank 1 Sensor 2 - interior connector
    Sienna Bank 1 Sensor 2 – interior connector

    More fiddly-diddly with the screwdriver under the van wrecked the band enough to separate sheath from boot, at which point deploying the BFW with the magic oxygen sensor socket showed that the anti-seize compound on the sensor’s thread worked as intended: after one oomph the sensor turned out by hand.

    Then you just punch the boot through the floor and bring it all inside to splice new sensor onto OEM connector. Standardization is a wonderful thing; the sensor cable may use any one of eight color codes. The Toyota OEM sensor was a “Type B” that matches up with the Bosch replacement sensor thusly:

    • Heater = two black leads ↔ two white leads
    • Signal = blue lead ↔ black lead
    • Ground = white lead ↔ gray lead

    Although the splice block has water-resistant seals, I figured putting it inside the van couldn’t possibly be a Bad Idea, so there it is, nestled snugly into the recess in the floor:

    Sienna Bank 1 Sensor 2 - splice block
    Sienna Bank 1 Sensor 2 – splice block

    Picked up a nice new Autel AL519 OBD Code Scanner from the usual Amazon vendor, reset the trouble code, drove to-and-from Squidwrench (across the river, just barely far enough to reset the performance data), and so far it’s All Good. The motivation for getting my very own scanner, rather than returning to Autozone, is that the AL519 can do real-time graphing and data capture from various sensors, so I can perform Science! should the spirit move me.

    The AL519 has a USB connection that appears as a USB serial device but, alas, the relentlessly Windows-centric host program won’t run under Wine.

  • Whirlpool Refrigerator Drawer Strut Repair

    The strut supporting the two drawers in the bottom of the refrigerator came out in two pieces during a recent cleaning session. To judge from the condition of the joint, I’d done this once before in its history:

    Refrigerator strut - tab clamps
    Refrigerator strut – tab clamps

    That tab inserts into a slot in the front of the elaborate frame that supports the drawers, where it’s captured by a metal bar. Should you lift the rear of the strut without first removing the bar, the tab snaps off at the base. I’ve annotated the top of the strut in the hopes of reminding me the next time around.

    A pair of bumps at the front of the drawer guides should hold the drawers closed, but it’s pretty obvious that’s not working as intended:

    Refrigerator strut - worn retainers
    Refrigerator strut – worn retainers

    I shaped strips of phosphor bronze spring stock around the bumps:

    Refrigerator strut - phosphor bronze covers - top
    Refrigerator strut – phosphor bronze covers – top

    The bottom view shows they’re held in place by crimps and a generous dollop of faith:

    Refrigerator strut - phosphor bronze covers - bottom
    Refrigerator strut – phosphor bronze covers – bottom

    That should serve until I know whether the plastic drawer rail will carve through the metal. The drawers slide out with much more enthusiasm now, so it’s a Good Thing until something else breaks.

    Yes, this is the refrigerator with the Freezer Dog