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.

Author: Ed

  • Water Heater Anode Rod Access Done Right

    For reasons I won’t go into, I just installed another water heater. This one, nominally a GE that’s made by Rheem, has a perfectly aligned anode rod access port. This view shows the insulation filling the port, after removing the plastic cap:

    GE Water Heater Anode Rod - as shipped
    GE Water Heater Anode Rod – as shipped

    A bit of excavation reveals the top of the rod:

    GE Water Heater Anode Rod - excavated
    GE Water Heater Anode Rod – excavated

    And the 1-1/16 six-point socket fits exactly through the port and mates perfectly with the rod:

    GE Water Heater Anode Rod - socket in place
    GE Water Heater Anode Rod – socket in place

    Unlike the never-sufficiently-to-be-damned Whirlpool, no metalwork is required.

    Oh, and they have a very nice drain valve at the bottom, with wide opening that shouldn’t clog with the slightest trace of sediment:

    GE Water Heater Anode Rod - drain valve
    GE Water Heater Anode Rod – drain valve

    Overall, it looks like a definite win.

  • Repairing Yet Another Garden Sprayer

    Evidently, it’s impossible to make a spring both good and noncorrosive:

    Garden sprayer - corroded spring
    Garden sprayer – corroded spring

    I found a suitable (i.e., good, but rust-prone) spring in the Big Box o’ Medium Springs:

    Garden sprayer - spring replaced
    Garden sprayer – spring replaced

    Unlike the repair for that sprayer, this spring turned out to be long enough to work perfectly. I have no idea how long I can keep this up, but … at least I’m now keeping pace with the failures.

  • Water Heater Thermophile

    One of my fundamental rules is that you should never, ever look inside the water lines serving your faucets. Having recently replaced a water heater, I had to violate that rule and discovered this growth inside the flex tube at the hot water outlet:

    Growth in Hot Water Heater Tube
    Growth in Hot Water Heater Tube

    Anything that can thrive in 120 °F water gets my grudging respect.

    Scrubbing it with a toothbrush produced gray sludge that rinsed right out, so I guess it’s all good now…

  • CNC Platform Corner Clip Fixture

    This is a classic case of investing more time and effort creating the fixture than machining the parts.

    Start by squaring up the block, which came from the end of a random chunk of smoke gray polycarbonate, with two 10-32 holes matching the tooling plate hole spacing:

    Corner Clip Fixture - squaring
    Corner Clip Fixture – squaring

    Then drill-and-tap four holes:

    Corner Clip Fixture - tapping
    Corner Clip Fixture – tapping

    The left station will be for drilling the blanks clamped under a sacrificial sheet, so those screw holes aren’t used for anything other than clearance; the top millimeter will get chewed up pretty quickly. The screws in the right station will clamp a stack of drilled blanks under a cover plate. If I went into production, I could see using both stations for both functions, but …

    There’s a locating pip in the front left corner that works perfectly with laser alignment:

    Corner Clip Fixture - aligning
    Corner Clip Fixture – aligning

    The blank sheets show where they’d be located for drilling, minus the sacrificial sheet and its clamps that you’ll see below.

    The G54 coordinate system origin sits at the locating pip. The G-Code then slaps a G55 origin at each of the two stations in turn to simplify their coordinates, with offsets from M54:

    • Drilling = (+5,+5)
    • Milling = (+40,+5)

    With all that in hand: stack, clamp, and drill some blanks:

    Corner Clip Fixture - drilling
    Corner Clip Fixture – drilling

    I tried milling a single drilled blank with a sacrificial plastic top plate:

    Corner Clip Fixture - first milling setup
    Corner Clip Fixture – first milling setup

    But that didn’t work well. I don’t know if this was due to an inept combination of climb milling, using the wrong speed / feed / material / cutter, and just poor style, but the edges of the blank mashed against the clamp plate and curled, instead of cutting cleanly:

    Corner Clip Fixture - rounded-over milled edges
    Corner Clip Fixture – rounded-over milled edges

    So I made a pair of aluminum plates to clamp both sides of the blanks, then milled another stack:

    M2 platform clips - milling edges
    M2 platform clips – milling edgesM2 platform clips – milling edges

    That worked quite well, although the top and bottom clips needed some slight attention from a riffler file and I did break the edges on all the clips. This shows four new clips along with a hand-cut prototype:

    Corner Clip Fixture - end result
    Corner Clip Fixture – end result

    So I made a dozen more clips, picked the best eight for two sets, sent one set to Dan, installed the other, and … now I have a bunch of spares.

    I suppose I should sell clip sets on Etsy / eBay to all the other M2 owners, but I have no idea how to price ’em. If you want some fancy corner clips, send whatever you think they’re worth … [grin]

  • Makergear M2: CNC Platform Corner Clips

    The CNC version of the corner clips looks much better than the prototypes:

    M2 glass retaining clip
    M2 glass retaining clip

    Tightening the screws until the clip just flattens puts enough force on the glass + heat spreader stack to hold it firmly against the balls in the bottom pad. The solid rubber L-shaped bumpers and screws hold the glass in position against XY forces… and the whole affair looks much better than the original (and perfectly serviceable) bulldog clips. These clips free up the entire surface of the glass plate, minus four 12 mm triangles that you could, if you were desperate, print right over.

    Although it’d be easier to just hack out an angular clip, I wrote a bit of G-Code to put a nice radius on each corner. The clip sits atop the rubber bumper with a 0.5 mm margin to keep the metal edges away from fingers; they’re smooth, but it’s still a strip of 6 mil (= 0.15 mm) phosphor bronze and feels a lot like a knife edge if you press hard enough.

    The radius on the three outside corners is a special-case solution of the general circle-through-three-points problem, taking advantage of the symmetry and right-triangle-ness of the corners. This sketch shows the details:

    M2 Platform Clip Doodles 4 - corner fairing with margin
    M2 Platform Clip Doodles 4 – corner fairing with margin

    The two corners on the bevel over the glass plate have a fixed radius. I reworked my original fairing arc solution for outside cutting and doodled it up for this situation:

    M2 Platform Clip Doodles 5 - bevel full solution
    M2 Platform Clip Doodles 5 – bevel full solution

    The outside corner radius worked out to 5 mm and I set the bevel radius at 3 mm. I think the latter made those corners a bit too sharp, but it’s Good Enough for my simple needs.

    Drilling and machining the clips required a fixture:

    M2 platform clips - milling edges
    M2 platform clips – milling edges

    That’s a story for another day.

    I used cutter diameter compensation to mill the edges, starting oversize by 1.5 mm and working downward by 0.5 mm on each pass to the actual diameter. That gradually trimmed off the edges without any excitement, so I could start with rough-trimmed stock and not worry about precision hand trimming.

    I thought climb milling (CW around the part) would produce better results, but it tended to smear the phosphor bronze against the fixture:

    M2 Corner Clips - Climb milling tool paths
    M2 Corner Clips – Climb milling tool paths

    Conventional milling (CCW around the part) actually worked, but it required fancier entry and exit moves:

    M2 Corner Clips - Conventional milling tool paths
    M2 Corner Clips – Conventional milling tool paths

    This part is the kind and size of machining perfectly suited to a Sherline CNC mill…

    The LinuxCNC G-Code source:

    ( M2 Build Platform Corner Clips )
    ( Ed Nisley - KE4ZNU - July 2013 )
    ( Fixture origin at right-front corner pip )
    
    ( Flow Control )
    #<_Do_Drill> = 0		( Drill two holes in clip )
    #<_Do_Mill> = 1			( Mill clip outline )
    #<_Climb_Mill> = 0		( 0 = conventional 1 = climb)
    
    ( Fixture info )
    #<_Drill_X_Fixture> = 5.0	( Drill station origin )
    #<_Drill_Y_Fixture> = 5.0
    
    #<_Drill_Num> = 30			( Drill number in tool table)
    #<_Drill_Retract> = 15
    #<_Drill_Depth> = -1.0
    #<_Drill_Feed> = 300
    #<_Drill_Speed> = 3000
    
    #<_Mill_X_Fixture> = 40.0	( Mill station origin )
    #<_Mill_Y_Fixture> = 5.0
    
    #<_Mill_Num> = 3			( Mill number in tool table)
    #<_Mill_Dia> = 4.60			( actual tool diameter)
    #<_Mill_Dia_Incr> = 0.50
    #<_Mill_Dia_Steps> = 3
    #<_Mill_Retract> = 15
    #<_Mill_Depth> = -0.5
    #<_Mill_Feed> = 300
    #<_Mill_Speed> = 8000
    
    (----------------)
    
    (  Initialize first tool length at probe switch )
    (     Assumes G59.3 is still in machine units, returns in G54 )
    (  ** Must set these constants to match G20 / G21 condition! )
    
    #<_Probe_Speed>     = 400            ( set for something sensible in mm or inch )
    #<_Probe_Retract>   =   1            ( ditto )
    
    O<Probe_Tool> SUB
    
    G49                     ( clear tool length compensation )
    G30                     ( move above probe switch )
    G59.3                   ( coord system 9 )
    
    G38.2 Z0 F#<_Probe_Speed>           ( trip switch on the way down )
    G0 Z[#5063 + #<_Probe_Retract>]     ( back off the switch )
    G38.2 Z0 F[#<_Probe_Speed> / 10]    ( trip switch slowly )
    
    #<_ToolZ> = #5063                    ( save new tool length )
    
    G43.1 Z[#<_ToolZ> - #<_ToolRefZ>]    ( set new length )
    
    G54                     ( coord system 0 )
    G30                     ( return to safe level )
    
    O<Probe_Tool> ENDSUB
    
    (-------------------)
    (-- Initialize first tool length at probe switch )
    
    O<Probe_Init> SUB
    
    #<_ToolRefZ> = 0.0      ( set up for first call )
    
    O<Probe_Tool> CALL
    
    #<_ToolRefZ> = #5063    ( save trip point )
    
    G43.1 Z0                ( tool entered at Z=0, so set it there )
    
    O<Probe_Init> ENDSUB
    
    (-------------------)
    (-- Mill one pass around outline with tool diameter passed in #1 )
    
    O<MillOutline> SUB
    
    #<X_Size> = 22.0		( size of support spider pad = nominal clip size )
    #<Y_Size> = 22.0
    #<Base_Bevel> = 3.2		( X or Y length of corners clipped from spider pad )
    
    #<Bevel_Size> = 9.0		( remaining part of trimmed edges on clip )
    #<Bevel_Radius> = 3.0	( fairing radius at bevel corners on clip)
    
    #<R_Div_Root2> = [#<Bevel_Radius> / SQRT[2]]
    #<R_1M_Recip_R2> = [#<Bevel_Radius> * [1 - 1/SQRT[2]]]
    #<R_Root2_M1> = [#<Bevel_Radius> * [SQRT[2] - 1]]
    
    #<Margin> = 0.5			( recess inside of nominal )
    
    #<X_Min> = [#<Margin>]
    #<X_Max> = [#<X_Size> - #<Margin>]
    
    #<Y_Min> = [#<Margin>]
    #<Y_Max> = [#<Y_Size> - #<Margin>]
    
    #<Corner_Rad> = [[#<Margin> * [1 - SQRT[2]] + [#<Base_Bevel> / SQRT[2]]] / [SQRT[2] - 1]]
    
    O<Climb> IF [#<_Climb_Mill>]
    
    G0 X#<X_Min> Y[#<Y_Max> + 3*#<_Mill_Dia>]
    G1 Z#<_Mill_Depth> F#<_Mill_Feed>
    
    G41.1 D#1
    
    G3 X[#<X_Min>] Y#<Y_Max> I0 J[0-1.5*#<_Mill_Dia>]	( cutter comp on: entry move)
    
    G1 X[#<Bevel_Size> - #<R_Root2_M1>]
    G2 X[#<Bevel_Size> + #<R_1M_Recip_R2>] Y[#<Y_Max> - #<R_1M_Recip_R2>] J[0-#<Bevel_Radius>]
    
    G1 X[#<X_Max> - #<R_1M_Recip_R2>] Y[#<Bevel_Size> + #<R_1M_Recip_R2>]
    G2 X#<X_Max> Y[#<Bevel_Size> - #<R_Root2_M1>] I[0-#<R_Div_Root2>] J[0-#<R_Div_Root2>]
    
    G1 Y[#<Y_Min> + #<Corner_Rad>]
    G2 X[#<X_Max> - #<Corner_Rad>] Y#<Y_Min> I[0-#<Corner_Rad>] J0
    
    G1 X[#<X_Min> + #<Corner_Rad>]
    G2 X#<X_Min> Y[#<Y_Min> + #<Corner_Rad>] I0 J#<Corner_Rad>
    
    G1 Y[#<Y_Max> - #<Corner_Rad>]
    G2 X[#<X_Min> + #<Corner_Rad>] Y#<Y_Max> I#<Corner_Rad> J0
    
    G40
    
    G0 X#<X_Min> Y[#<Y_Max> + 3*#<_Mill_Dia>]
    (G3 X#<Bevel_Size> Y[#<Y_Max> + 3*#<_Mill_Dia>] I0 J[1.5*#<_Mill_Dia>])	( cutter comp off: safe exit)
    
    G0 X#<X_Min>			( return to start)
    
    O<Climb> ELSE
    
    G0 X#<X_Size> Y[#<Y_Size> + #1/2]
    
    G1 Z#<_Mill_Depth> F#<_Mill_Feed>
    
    G42.1 D#1
    
    G1 X#<Bevel_Size> Y[#<Y_Max>]	( cutter comp on: entry move)
    
    G1 X[#<X_Min> + #<Corner_Rad>]
    G3 X#<X_Min> Y[#<Y_Max> - #<Corner_Rad>] I0 J[0-#<Corner_Rad>]
    
    G1 Y[#<Y_Min> + #<Corner_Rad>]
    G3 X[#<X_Min> + #<Corner_Rad>] Y[#<Y_Min>] I#<Corner_Rad> J0
    
    G1 X[#<X_Max> - #<Corner_Rad>]
    G3 X[#<X_Max>] Y[#<Y_Min> + #<Corner_Rad>] I0 J#<Corner_Rad>
    
    G1 Y[#<Bevel_Size> - #<R_Root2_M1>]
    G3 X[#<X_Max> - #<R_1M_Recip_R2>] Y[#<Bevel_Size> + #<R_1M_Recip_R2>] I[-#<Bevel_Radius>]
    
    G1 X[#<Bevel_Size> + #<R_1M_Recip_R2>] Y[#<Y_Max> - #<R_1M_Recip_R2>]
    G3 X[#<Bevel_Size> - #<R_Root2_M1>] Y#<Y_Max> I[-#<R_Div_Root2>] J[-#<R_Div_Root2>]
    
    G2 Y[#<Y_Max> + 3*#<_Mill_Dia>] J[#<_Mill_Dia>*1.5]		( get away from corner)
    G40
    
    G0 X#<X_Size>					( cutter comp off: safe exit)
    G0 Y[#<Y_Size> + #1/2]			( return to start)
    
    O<Climb> ENDIF
    
    O<MillOutline> ENDSUB
    
    (----------------)
    ( Start machining... )
    
    G17 G40 G49 G54 G80 G90 G94 G99	( reset many things )
    
    G21								( metric! )
    G91.1 							( incremental arc centers)
    
    (msg,Verify: G30.1 position in G54 above tool change switch? )
    M0
    (msg,Verify: fixture origin XY touched off? )
    M0
    (msg,Verify: Current tool Z=0 touched off? )
    M0
    
    ( Set up probing)
    O<Probe_Init> CALL
    T0 M6
    
    (---- Drill holes)
    
    O<DoDrill> IF [#<_Do_Drill>]
    
    (debug,Insert drill tool = #<_Drill_Num>)
    T#<_Drill_Num> M6
    O<Probe_Tool> CALL
    (debug,Set spindle to #<_Drill_Speed> rpm )
    M0
    
    G0 X#<_Drill_X_Fixture> Y#<_Drill_Y_Fixture>
    G0 Z#<_Drill_Retract>
    
    G10 L20 P2 X0 Y0 Z#<_Drill_Retract>	( P2 = G55)
    G55					( drill station coordinates )
    
    G81 X5.0 Y15.0 Z#<_Drill_Depth> R#<_Drill_Retract> F#<_Drill_Feed>
    
    G81 X15.0 Y5.0
    
    G54
    
    O<DoDrill> ENDIF
    
    (---- Mill outline )
    ( Start with large diameter and end with actual diameter to trim in stages)
    
    O<DoMill> IF [#<_Do_Mill>]
    
    (debug,Insert mill tool = #<_Mill_Num>)
    T#<_Mill_Num> M6
    O<Probe_Tool> CALL
    (debug,Set spindle to #<_Mill_Speed> rpm )
    M0
    
    G0 X#<_Mill_X_Fixture> Y#<_Mill_Y_Fixture>
    G0 Z#<_Mill_Retract>
    
    G10 L20 P2 X0 Y0 Z#<_Mill_Retract>	( P2 = G55)
    G55					( mill station coordinates )
    
    #<PassCount> = 0
    
    O<MillLoop> DO
    #<Diameter> = [#<_Mill_Dia> + [#<_Mill_Dia_Steps> - #<PassCount>]*#<_Mill_Dia_Incr>]
    
    O<MillOutline> CALL [#<Diameter>]
    
    #<PassCount> = [#<PassCount> + 1]
    O<MillLoop> WHILE [#<PassCount> LE #<_Mill_Dia_Steps>]
    
    ( Finishing pass with zero cut )
    O<MillOutline> CALL [#<Diameter>]
    
    G0 Z#<_Mill_Retract>
    G54
    
    O<DoMill> ENDIF
    
    G30
    
    (msg,Done!)
    M2
    

    The rest of the doodles, which don’t match up with the final G-Code because they represent the earliest versions of the layout:

    M2 Platform Clip Doodles 1 - overall layout
    M2 Platform Clip Doodles 1 – overall layout
    M2 Platform Clip Doodles 2 - bevel
    M2 Platform Clip Doodles 2 – bevel
    M2 Platform Clip Doodles 3 - corner fairing without margin
    M2 Platform Clip Doodles 3 – corner fairing without margin
  • Makergear M2: Prototype Corner Clips

    In the course of normal events around here, the M2 gets tipped to one side or the other. Every time that happens, I rediscover the blindingly obvious fact that there’s nothing holding the glass build plate and the heater to the support spider:

    M2 build platform corner
    M2 build platform corner

    A few minutes with a metric ruler produced some useful dimensions for the ends of the spider’s arms:

    M2 Platform Support Spider Pad Dimensions
    M2 Platform Support Spider Pad Dimensions

    The Big Box o’ Foamy Things emitted a mouse pad (remember mouse pads?) of exactly the right thickness to bring the corner pads just barely above the level of the glass plate, thus allowing for slight compression:

    M2 corner bumpers
    M2 corner bumpers

    That’s a 1/8 inch hole punch, which is close enough to the M3 screw diameter in foam rubber. It worked fine for the balls in the corner support pads, too.

    The long-suffering shop scissors produced results about as pretty as one might expect:

    img_3157 - M2 platform retaining clips - raw cut
    img_3157 – M2 platform retaining clips – raw cut

    Which is to say, not very.

    The material is 6 mil (about 0.15 mm) phosphor bronze, nice and springy. Combined with ripply edges and sharp corners, you get perfectly serviceable serrated knife blades suitable for use in traditional shop ceremonies of ritual scarification of the fingertips.

    I stacked the slips, clamped them to the Sherline’s table between sacrificial plastic sheets, used manual CNC to poke a pair of #31 holes (0.120 inch, about the right clearance for M3 screws) at the right spots, and then stacked everything up on the M2:

    M2 platform retaining clip oops - in place
    M2 platform retaining clip oops – in place

    The alert reader will notice a third #31 hole at the wrong spot, which was the first one I drilled and partially explains the lack of pictures of the operation.

    Sighting across the platform shows that the clip doesn’t lie quite flat on the glass, due to the scissors-cut bending:

    M2 platform retaining clip - edge view
    M2 platform retaining clip – edge view

    However, four of these clips hold the glass firmly to the heat spreader and eliminate the need for the stock bulldog clips, which is what I wanted to find out.

    But they’re ugly and I don’t want to explain that extra hole…

  • Makergear M2: Platform Support Balls

    After adding the insulation below the M2’s build platform heater, I punched a hole in each of the support pads and inserted a 1/8 inch bearing ball:

    M2 HBP support balls
    M2 HBP support balls

    The pads measure just slightly less than 1/8 inch thick, so the balls support the aluminum heat spreader plate. Unlike the pads, the balls hold the plate at a constant distance from the spider which shouldn’t vary with mechanical load.

    As nearly as I can tell, generic rubber expands by maybe 100 parts per million per degree C, so a 3 mm slab might expand by all of 0.02 mm over a 70 °C range: temperature obviously doesn’t make much difference. However, I’m about to add some hold-down clamps to keep the glass plate firmly in place and that pressure might squish the pads.

    Obviously, putting a steel ball between two aluminum plates isn’t something you’d do in a high-stress machine, but the balls must support only the platform and won’t get any shock loading: any shock strong enough to indent the aluminum will probably shatter the glass. I’m pretty sure there won’t be enough motion in the XY plane to produce any wear, either.

    Four points do not define a plane, but the spider and the spreader seem close enough to being planar that all four balls make firm contact. The M2 really does have a good mechanical foundation!