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

  • Watts 9D-M3 Backflow Preventer Valve: Failure & Aggravation

    This Watts 9D-M3 Backflow Preventer Valve feeds water into our furnace, provides an overpressure relief, and prevents heating loop water from re-entering the potable water supply.

    Watts 9D-M3 Backflow Preventer Valve
    Watts 9D-M3 Backflow Preventer Valve

    The vertical pipe leads downward near the floor, underneath which sits the small plastic bucket I provided to catch the occasional drip. Recently we had an all-hands scramble to soak up a pool of water spreading across the floor from the overflowing bucket, across the aisle, and below the shafts-and-rods-and-tubes-and-pipes storage rack. Evidently the occasional drip became a steady drip while we weren’t watching; not a catastrophic flood, but far more water than we want on the floor.

    This is the inlet valve, which is basically a flapper. You can’t see the fine cracks around the central mount, but they’re all over the inner half of the ring.

    Watts 9D-M3 - Inlet valve
    Watts 9D-M3 – Inlet valve

    And this is the outlet valve, which has pretty much disintegrated. Note the outer rim peeled back under my thumb:

    Watts 9D-M3 - Outlet valve
    Watts 9D-M3 – Outlet valve

    A complete new valve is $40, in stock and ready for pickup at Lowe’s, but all I really needed was the failed rubber flapper valves, which they don’t carry. A few minutes of searching reveals the Watts 0886011 Repair Kit, which has all of the interior parts.

    Pop Quiz: How much does the repair kit cost?

    Answer: Starts at $38 plus shipping and goes up from there. Cheap aftermarket kits run $20 and up, but they’re all out of stock.

    Now that, party people, is the sort of thing that ticks me right off.

    Perhaps the local HVAC / plumbing supply stores have such kits in stock? To quote: “They may exist, but we don’t have them.”

    I don’t see any way to homebrew new flapper valves, so it’s off to Lowe’s we go…

    It would seem to me that these things shouldn’t fail after a mere decade of service. I thought that about the CdS flame sensor that crapped out in the middle of a sub-zero January cold snap while I was at Cabin Fever some years ago, too.

  • NP-FS11 Batteries: Final Capacity

    Having rebuilt the rebuilt packs, the dead cells (with arbitrary IDs) look like this:

    NP-FS11 - Old Packs
    NP-FS11 – Old Packs

    These are the bare cells, without the protection circuit in series, so the voltage is a bit higher than the camera will see. One is completely dead and two of them appear to have about 1 A·h of capacity, but the discharge voltage evidently drops below what the camera considers acceptable.

    They’d work fine driving a less fussy load, though…

  • EAGLE 6.x Invalid Device Names: Repair Thereof

    It seems that a much older version of Eagle allowed device names along the lines of ELECTRET MIC that contained blanks and worked perfectly at the time. Since then, the rules changed to prohibit blanks, but the EAGLE 5.x series evidently allowed those names to exist as long as they weren’t used in the schematic or touched in the library editor. In 6.x, however, you can’t even load the library without triggering an error message.

    Because 6.x won’t load the library, you can’t use the library editor to remove the blank.

    Because the most recent version of 5.x kvetches about the blank, you can’t use the library editor to remove the blank.

    Having only two offending device names, I figured I could use a hex editor to jam a hyphen in place of the blanks and be done with it. Come to find out that EAGLE (wisely) wraps a checksum around the binary library file to detect such changes and prevent the files from loading. I think that’s an excellent idea, even if it was inconvenient in this situation.

    Fortunately, 6.x both complains about the problem and offers up a “text editor” window with the complete XML source code for the library that it converted from the 5.x binary format.

    So:

    • Copy-and-paste the text into an editor that supports highlighted XML editing
    • Find the offending device names
    • Change the blanks to hyphens
    • Rename the original custom.lbr to custom.lbr.bin
    • Save the modified XML as custom.lbr

    Done!

  • Harbor Freight Bar Clamp: Handle Hole Support Plugs

    Having printed up three of those handles for Show-n-Tell, I preemptively installed one in the hasn’t-failed-yet clamp, and poked the support out of another to show how it works. They’re just the cutest little buttons:

    HF bar clamp handle - support plug
    HF bar clamp handle – support plug

    The fins are a touch under 4.5 mm end-to-end and 1 mm (2 × 0.5 mm) across, with layer thickness = 0.25 mm. The first layer fill looks a bit lackadaisical, but the bottom of the surrounding handle came out glass-solid with barely visible joints between the threads, so the settings work fine for larger objects.

    HF Bar Clamp - support - solid model
    HF Bar Clamp – support – solid model

    The tip of each fin has a scar where the overlying perimeter thread bonded to it. Skeinforge is set to extrude the perimeter first, which would squirt that circle (well, pentagon) into mid-air… which is why this support plug lies in wait below.

  • Computer Amusements

    A friend asked me to scrub and rebuild an ancient IBM Thinkpad 760XD (there were good reasons for this task that aren’t relevant here), which led to a blast from the past:

    Windows 98 Welcome
    Windows 98 Welcome

    After Windows settled down from its obligatory reboots, installing the exceedingly complex MWave DSP drivers from three diskettes (!) produced this classic result:

    Windows 98 - BSOD
    Windows 98 – BSOD

    Ordinarily, I’d suggest installing some flavor of Linux, but the 760XD’s BIOS can’t boot from either CD or USB, so you’d be forced to sneak the install files onto the hard drive, hand-craft a suitable boot diskette (!), and then perpetrate some serious fiddling around. That made even less sense than (re-)installing Windows 98.

    However, given that exposing a fresh Windows 98 installation to the 2012 Internet would resemble tossing a duckling into a brush chipper, we agreed that this laptop’s next experience should be at an upcoming e-waste recycling event.

    The next morning confronted me with this delightful reminder that nobody knows how to handle boot-time errors, not even on a 2011 PC:

    Lenovo - USB Keyboard not found
    Lenovo – USB Keyboard not found

    The keyboard cable had gotten dislodged when the USB hub fell from its perch along the back edge of the desk. It’s fine now…

  • Geek Accessories: Cases Therefore

    Mary made me several presents early this year: a new belt pack, a camera case for the Canon SX230HS, and a touchup for the Zire 71 case:

    Belt pack - camera case - PDA case
    Belt pack – camera case – PDA case

    The belt pack has an interior lining with many side pockets for the stuff I deem essential; it’s also large enough to hold both the camera and the PDA when I’m out biking around. The camera case includes a pocket nestling a battery against the camera’s front side, beside the lens cap. The Zire case, well, at some point I suppose I’ll be forced to get a phone, but, until then, this will suffice.

    They’re all made from coated pack cloth, not that I expect to dunk myself in water (or that it’d do any good), but it seems to never wear out.

    *hugs*

    (And, yes, it probably should be “Therefor”, but …)

  • Harbor Freight Bar Clamp: New Handle

    Conjuring up a replacement handle for that broken Harbor Freight bar clamp turned out to be easier than I expected:

    HF bar clamp handle - installed
    HF bar clamp handle – installed

    The thing omits the original’s fancy edge rounding, because I just hit the finger grips with a rat-tail file after it cooled:

    HF bar clamp handle - build platform
    HF bar clamp handle – build platform

    The solid model uses OpenSCAD’s hull() operation for the beak and straight side of the handle, with a handful of circles chopping out the recesses. The rightmost arc lies tangent to the near side of the beak, so as to join without a stress-raiser bump:

    HF Bar Clamp - support - solid model
    HF Bar Clamp – support – solid model

    The little yellow doodad is (a duplicate of) the support structure inside the pivot hole that prevents the middle section from drooping. It’s easier to see from the bottom:

    HF Bar Clamp - solid model - bottom
    HF Bar Clamp – solid model – bottom

    Removing the plug required nothing more than a fat pin punch and a whack from a brass hammer, with the plug centered over a hole in a random chunk of aluminum (with many other holes):

    HF bar clamp handle - support plug removed
    HF bar clamp handle – support plug removed

    Much to my delight, the holes & pivot recesses came out exactly the right size on the first version, with HoleWindage = 0.2. What’s new & different: that the first layer height has stabilized at 0.25 mm and the first few layers don’t get squished.

    I built three more handles in one setup, just to have some show-n-tell objects, with one prepped and on hot standby should the other Harbor Freight handle break. If these handles break, something aluminum on the Sherline will be in order.

    Now that clamp can go back into the collection. Puzzle: which one isn’t like the other ones?

    Too many bar clamps
    Too many bar clamps

    I should’a used Safety Orange filament, eh?

    [Update: xylitol designed a much better looking version that should be a drop-in replacement. Perhaps you can print it standing on edge (or end) to eliminate the support structures?]

    The OpenSCAD source code:

    // Handle for Harbor Freight bar clamp
    // Ed Nisley KE4ZNU - Jan 2012
    
    Layout = "Show";                // Build Show
    
    Support = true;
    SupportColor = "Yellow";
    
    //- Extrusion parameters must match reality!
    //  Print with +1 shells and 3 solid layers
    //  Use infill solidity = 0.5 or more...
    
    ThreadThick = 0.25;
    ThreadWidth = 2.0 * ThreadThick;
    
    HoleWindage = 0.2;
    
    Protrusion = 0.1;           // make holes end cleanly
    
    CircleSides = 4*8;
    $fn = CircleSides;
    
    //-------
    // Handle dimensions
    
    OALength = 49;
    OAThickness = 6.0;
    
    BodyWidth = 12;
    
    BeakRadius = 12;                            // hole to tip
    BeakEndRadius = 1.0;                        // roundness of tip
    BeakIncludedAngle = 40;
    BeakAngle = 55;
    BeakAdder = [2.0,1.0];                      // additional meat on outer and upper sides
    
    BeakHalfWidth = IntegerMultiple(BeakRadius*sin(BeakIncludedAngle/2),ThreadWidth);
    
    PivotXY = BeakRadius*[cos(BeakAngle),sin(BeakAngle)]; // pivot hole offset from beak tip
    
    PivotShaftDia = 2.6;
    PivotRecessDia = 5.0;
    PivotRecessDepth = 2.5;
    
    NumScallops = 3;
    ScallopRadius = [5,9,9];        // first scallop must be tangent to beak!
    ScallopX = [-((ScallopRadius[0] + BeakHalfWidth)*cos(90 - (BeakAngle - BeakIncludedAngle/2))),
                -17.5,-31.5];
    ScallopY = [-((ScallopRadius[0] + BeakHalfWidth)*sin(90 - (BeakAngle - BeakIncludedAngle/2))),
                -12,-12];
    
    echo(str("Scallops R=",ScallopRadius," X=",ScallopX," Y=",ScallopY));
    
    TailOuterRadius = 12;
    TailInnerRadius = 22;
    
    //-------
    
    function IntegerMultiple(Size,Unit) = Unit * ceil(Size / Unit);
    
    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);
    
    }
    
    //-------
    // Bits and pieces
    
    module Pivot() {
    
      translate([0,0,-Protrusion])
        PolyCyl(PivotShaftDia,(OAThickness + 2*Protrusion));
    
      translate([0,0,(OAThickness - PivotRecessDepth)])
        PolyCyl(PivotRecessDia,(PivotRecessDepth + Protrusion));
    
      translate([0,0,-Protrusion])
        PolyCyl(PivotRecessDia,(PivotRecessDepth + Protrusion));
    
    }
    
    module HandleBlock() {
    
      hull() {                            // beak
        cylinder(r=BeakHalfWidth,h=OAThickness);
        translate(BeakAdder)
          cylinder(r=BeakHalfWidth,h=OAThickness);
        translate([(PivotXY[0] - BeakEndRadius*cos(BeakAngle)),
                  -(PivotXY[1] - BeakEndRadius*sin(BeakAngle))])
          cylinder(r=BeakEndRadius,h=OAThickness);
      }
    
      hull() {                            // straight body edge
        translate(BeakAdder)
          cylinder(r=BeakHalfWidth,h=OAThickness);
        translate([-(OALength - PivotXY[0] - TailOuterRadius),BeakAdder[1]])
          cylinder(r=BeakHalfWidth,h=OAThickness);
      }
    
      translate([ScallopX[0],0,0])        // scalloped edge tips
        rotate(180)
          cube([(OALength - PivotXY[0] + ScallopX[0] - TailOuterRadius),
                (BodyWidth/2 - ThreadWidth),      // small Finagle constant = flat tips
                OAThickness],center=false);
    
      translate([-(OALength - PivotXY[0] - TailOuterRadius),        // tail
                (BeakHalfWidth + BeakAdder[1] - TailOuterRadius)])
        rotate(180)
          intersection() {
            cylinder(r=TailOuterRadius,h=OAThickness);
            translate([0,-TailOuterRadius])
              cube([TailOuterRadius,2*TailOuterRadius,OAThickness]);
          }
    
    }
    
    module SupportPlug() {
    
      color(SupportColor)
      union() {
        cylinder(r=IntegerMultiple((PivotRecessDia - ThreadWidth),ThreadWidth)/2,
                  h=2*ThreadThick);
        for (Index=[0,1])
          rotate(Index*90)
            translate([0,0,(PivotRecessDepth - ThreadThick)/2])
              cube([(PivotRecessDia - ThreadWidth - 2*Protrusion),
                    2*ThreadWidth,(PivotRecessDepth - ThreadThick)],
                  center=true);
      }
    }
    
    //------
    
    module Handle() {
    
        difference() {
          HandleBlock();
    
          translate([-(OALength - PivotXY[0] - TailOuterRadius),    // trim tail tip
                    -(PivotXY[1] - ThreadWidth),
                    -Protrusion])
            rotate(180)
              cube([TailOuterRadius,TailOuterRadius,(OAThickness + 2*Protrusion)]);
    
          for (Index=[0:NumScallops-1]) {
            translate([ScallopX[Index],ScallopY[Index],-Protrusion])
              cylinder(r=ScallopRadius[Index],h=(OAThickness + 2*Protrusion));
          }
    
          Pivot();
        }
    
        if (Support)                    // choose support to suit printing orientation
          SupportPlug();
    }
    
    //-------
    
    ShowPegGrid();
    
    if (Layout == "Show") {
      translate([OALength/3,10,0])
        Handle();
      translate([10,0,0])
        SupportPlug();
    }
    
    if (Layout == "Build")
      translate([OALength/3,0,0])
        Handle();
    

    The original doodles, which I started by scanning an unbroken handle and overlaying a grid, then scaling the grid so the end-to-end measurement worked out to the proper number of millimeters:

    Handle dimension doodles
    Handle dimension doodles