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.

Category: Machine Shop

Mechanical widgetry

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

  • Basement Safe Humidity: Sealing the Door

    My assumption that the basement document safe had an effective door seal turned out to be wrong, so I replaced the bagged desiccant with a tray of granules, sealed the door with masking tape, and tried again:

    Basement Safe Humidity - 2012-01-12
    Basement Safe Humidity – 2012-01-12

    The jagged black curve shows the Basement Laboratory temperature trending toward the usual mid-50s winter level. The dead-flat horizontal blue line at 15% RH shows the tray of desiccant can keep up with whatever air leakage might occur around the tape and through the floor bolts.

    I cannot find the table (that I once had and know exists somewhere) which lists various desiccants and their terminal humidity levels in a sealed container.  I’m pretty sure the low humidity means it’s one of the clay-based desiccants, not silica gel.

  • Power Supply Banana Jack Misfit

    After butchering that fancy Tektronix test lead thing for the SMD tweezers, I hung the bitter end in my cable tangle. Turns out I needed a power cord to bring up the brassboard of the Wouxun GPS interface, so I soldered it up, went to plug it in, and … the Tek plugs didn’t fit the plated supply jacks.

    Power Supply Banana Jacks
    Power Supply Banana Jacks

    Now, if I had to choose whether Tek plugs are oversized or Made In China jacks are undersized, well, you can probably guess my answer.

    Turns out that the jacks should be 4 mm ID, which is actually a 5/32 hard-inch size because banana jacks date back to the days before millimeters became a force to be reckoned with. They were actually 3.8 mm ID, which wouldn’t usually matter except for the fact that the Tek plugs have a nice solid bullet end that’s just about exactly 4 mm OD.

    So I chucked up a 5/32 inch drill, perched the power supply on a block of wood (to clear the fuse & cord in on the back panel) on the drill press table, and hand-held it while clearing out the holes with a low spindle speed. You can see the nice, shiny brass inside those jacks in the photo; they used to have lumpy silvery plating inside that was probably responsible for much of the 0.2 mm shrinkage.

    The jacks also don’t have the usual crosswise hole near the base to accept a bare wire, which is an occasional nuisance. I was tempted to drill that hole, but decided I’ll leave that project for another time.

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

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

  • Reversal Zits: Extruder Pressure vs. Flow vs. Acceleration

    Pondering the Reversal Zittage Bestiary led me to wonder about the formal relationship between pressure and flow in a viscous fluid passing through a nozzle. I’ll cheerfully admit my never-very-puissant fluid dynamics fu has become way rusty and, this being the first time I’ve collected all this stuff in one place, there’s certainly something I’m overlooking (to put it charitably), but here goes…

    Assuming that (semi-)molten plastic:

    Counterargument:

    The hot end contains about 20 mm of molten filament, which is 140 mm3 of 3 mm filament. During filament swaps, the filament pushes back about 2 mm = 14 mm3 without any external force, so there’s about 10% springiness in the hot end. That suggests the plastic really isn’t incompressible. Some of the springiness may come from the PTFE tube expanding against the surrounding metal tube, but the fact that the (solidified) molten zone has a larger diameter than the rest of the filament says the PTFE expansion is not very dynamic: the filament solidified at zero pressure.

    Boldly assuming incompressiblity anyway, the always-right-and-never-lies Wikipedia tells us that the equations of state boil down to the Stokes Equations, herewith directly cribbed:

    \boldsymbol{\nabla}p = \mu \nabla^2 \mathbf{u} + \mathbf{f}
    \boldsymbol{\nabla}\cdot\mathbf{u}=0

    That’s using this symbology, typographically modified to eliminate the need for embedded graphics:

    • The del operator represents the spatial gradient
    • ∇p = pressure gradient
    • u = fluid velocity
    • ∇·u = divergence of velocity (pointiness)
    • 2 u = Laplacian of velocity (sharpness of pointiness)
    • μ = dynamic viscosity
    • f = applied force

    Under the breathtakingly aggressive simplifying assumption that we can model slices across the extruder’s nozzle as nearly 2D radially symmetric pipes with a teeny frustum shape, we have a mostly one-dimensional situation:

    • The first equation says that axial pressure gradient is directly proportional to the applied force, which makes sense, plus a huge term due to the nozzle shape (how abruptly the velocity gradient changes)
    • The second equation is a generalization of GladOS‘s explanation of the conservation of momentum across Portal transfers: Speedy thing goes in, speedy thing comes out. For slightly conical slices, the axial speed increases as the radial area decreases, but the overall velocity gradient comes out zero.

    All the force f comes from a stepper motor ramming filament into the hot end:

    • To a good first order approximation, stepper motor torque is proportional to winding current.
    • For a given filament diameter, drive wheel diameter, and speed, a constant-current stepper applies constant force to the filament.
    • Stepper power being roughly constant for a given current, the available force varies inversely with rotational speed.

    Vigorous handwaving

    The low Reynolds number says the inertial forces don’t amount to squat, so everything depends on viscous flow. There’s nothing to accelerate; try accelerating a spoon through honey.

    Given a desired velocity u (mostly axial, for a particular extruding speed) and a nozzle, the first equation says the required force varies linearly with the pressure gradient ∇p. The gradient runs from atmospheric pressure on one end to the molten pool on the other, with the steepest change in the narrowest part of the nozzle. This suggests a short nozzle aperture is good.

    Conversely, a long smooth nozzle reduces ∇2 u by reducing abrupt velocity changes. For a given ∇p, the required force varies directly with the second (spatial) derivative of the velocity; lower velocity doesn’t mean lower force, but smoother changes (and their derivatives) certainly do.

    During reversal, the extruder must produce a negative ∇p very quickly to inhale the filament and prevent drooling. Assuming ∇p has the same order of magnitude in both directions (thus, different signs), changing the fluid velocity will produce huge changes in ∇2 u.

    Fluid compressibility means that, during the early part of the reversal operation, moving the filament doesn’t change the pressure by very much at all: the first equation remains pretty much constant.

    Caveats

    The Stokes equations are time-invariant: the velocity is a constant. So we’re looking at the steady state and making dangerous assumptions about changing conditions.

    The force variation seems linear with pressure gradient around a given flow, which is comforting: at least it’s not quadratic or something even more horrible.

    Given the low Reynolds number, even moderate flow variations should be roughly linear, as the velocity gradients won’t change much with changing velocity.

    This explains why Reversal Zittage gets so much worse at higher speeds: the extruder operates under constant (and, at least in my TOM, low) power that can keep pace with normal extrusion, but doesn’t have an order of magnitude more force in reserve for retraction.

  • 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