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

  • Round Soaker Hose Clamp

    Round Soaker Hose Clamp

    An aging round soaker hose sprang a leak large enough to gouge a crater under a tomato plant, so I conjured a short clamp from the longer round hose splints:

    Soaker Hose Clamp - round - installed
    Soaker Hose Clamp – round – installed

    The shiny stuff is the plastic backing on strips of silicone tape intended to prevent the high-pressure water from squirting through the porous 3D printed plastic. The fat drop hanging from the hose shows some leakage around the tape; an occasional drop is perfectly OK.

    The leak faces the round side of the bottom half of the clamp, which probably doesn’t make any difference.

    I hope the washers occupy enough of the minimal surface to render aluminum backing plates superfluous:

    Soaker Hose Clamp - round - kitted
    Soaker Hose Clamp – round – kitted

    Creating the 3D model required nothing more than shortening the original splint to 30 mm with two screws along each side. While I was at it, I had Slic3r make three clamps to put two in the Garden Dedicated Hydraulic Repair Kit for later use:

    Round Soaker Hose Splice - 30mm - Slic3r
    Round Soaker Hose Splice – 30mm – Slic3r

    Change two lines in the OpenSCAD code and it’s done.

    Also: clamps for flat soaker hoses.

  • Tour Easy Daytime Running Light: Second Fracture

    Tour Easy Daytime Running Light: Second Fracture

    While clearing some overhanging brush along the rail trail, I probably wedged a branch between the LC40 flashlight and the fairing:

    Fairing Flashlight Mount - brush clearing
    Fairing Flashlight Mount – brush clearing

    Aaaand twisted it enough to fracture the mount:

    Fairing Flashlight Mount - another fracture
    Fairing Flashlight Mount – another fracture

    A closer look shows the infill just ripped apart:

    Fairing Flashlight Mount - another failure - detail
    Fairing Flashlight Mount – another failure – detail

    I can’t be sure that’s what happened, because the mount actually failed several miles later, after I hit one of the potholes along Raymond Avenue. Fortunately, I saw it swinging away from the fairing, hanging by its last few threads, and managed to grab it before it vanished.

    Fairing Flashlight Mount - Catch a Falling Mount
    Fairing Flashlight Mount – Catch a Falling Mount

    I set Slic3r for 30% infill on the replacement, but the running light been riding my fairing for three years and seems strong enough under normal use.

  • Quilting Hexagon Template Generator: Knobless Half-Triangle

    Quilting Hexagon Template Generator: Knobless Half-Triangle

    Although I’d put the same knob on the half-triangle end piece template as on the equilateral triangle template for piecing hexagons into strips, Mary decided a flat chip would be easier to use:

    Quilting Hex Template - family - knobless half-triangle
    Quilting Hex Template – family – knobless half-triangle

    Bonus: you can now flip it over to cut the other half-triangles, if you haven’t already figured out how to cut two layers of fabric folded wrong sides together.

    While I was at it, the knob on the triangle became optional, too. Flipping that one doesn’t buy you much, though.

    The OpenSCAD source as a GitHub Gist has been ever so slightly tweaked:

    // Quilting – Hexagon Templates
    // Ed Nisley KE4ZNU – July 2020
    // Reverse-engineered to repair a not-quite-standard hexagon quilt
    // Useful geometry:
    // https://en.wikipedia.org/wiki/Hexagon
    /* [Layout Options] */
    Layout = "Build"; // [Build, HexBuild, HexPlate, TriBuild, TriPlate, EndBuild, EndPlate]
    //——-
    //- Extrusion parameters must match reality!
    // Print with 2 shells
    /* [Hidden] */
    ThreadThick = 0.25;
    ThreadWidth = 0.40;
    HoleFinagle = 0.2;
    HoleFudge = 1.00;
    function HoleAdjust(Diameter) = HoleFudge*Diameter + HoleFinagle;
    Protrusion = 0.1; // make holes end cleanly
    function IntegerMultiple(Size,Unit) = Unit * ceil(Size / Unit);
    inch = 25.4;
    //——-
    // Dimensions
    /* [Layout Options] */
    FinishedWidthInch = 2.75;
    FinishedWidth = FinishedWidthInch * inch;
    SeamAllowanceInch = 0.25;
    SeamAllowance = SeamAllowanceInch * inch;
    TemplateThick = 3.0;
    TriKnob = true;
    EndKnob = false;
    /* [Hidden] */
    FinishedSideInch = FinishedWidthInch/sqrt(3);
    FinishedSide = FinishedSideInch * inch;
    echo(str("Finished side: ",FinishedSideInch," inch"));
    CutWidth = FinishedWidth + 2*SeamAllowance;
    CutSide = CutWidth/sqrt(3);
    echo(str("Cut side: ",CutSide / inch," inch"));
    // Make polygon-circles circumscribe the target widths
    TemplateID = FinishedWidth / cos(180/6);
    TemplateOD = CutWidth / cos(180/6);
    /* [Hidden] */
    TriRadius = FinishedSide/sqrt(3);
    TriPoints = [[TriRadius,0],
    [TriRadius*cos(120),TriRadius*sin(120)],
    [TriRadius*cos(240),TriRadius*sin(240)]
    ];
    echo(str("TriPoints: ",TriPoints));
    EndPoints = [[TriRadius,0],
    [TriRadius*cos(120),TriRadius*sin(120)],
    [TriRadius*cos(120),0]
    ];
    echo(str("EndPoints: ",EndPoints));
    TipCutRadius = 2*(TriRadius + SeamAllowance); // circumscribing radius of tip cutter
    TipPoints = [[TipCutRadius,0],
    [TipCutRadius*cos(120),TipCutRadius*sin(120)],
    [TipCutRadius*cos(240),TipCutRadius*sin(240)]
    ];
    HandleHeight = 1 * inch;
    HandleLength = (TemplateID + TemplateOD)/2;
    HandleThick = IntegerMultiple(3.0,ThreadWidth);
    HandleSides = 12*4;
    StringDia = 4.0;
    StringHeight = 0.6*HandleHeight;
    DentDepth = HandleThick/4;
    DentDia = 15 * DentDepth;
    DentSphereRadius = (pow(DentDepth,2) + pow(DentDia,2)/4)/(2*DentDepth);
    KnobOD = 15.0; // Triangle handle
    KnobHeight = 20.0;
    //——-
    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=HoleAdjust(FixDia)/2,h=Height,$fn=Sides);
    }
    //——-
    // Hex template
    module HexPlate() {
    difference() {
    cylinder(r=TemplateOD/2,h=TemplateThick,$fn=6);
    translate([0,0,-Protrusion])
    cylinder(r=TemplateID/2,h=(TemplateThick + 2*Protrusion),$fn=6);
    }
    for (i=[1:6/2])
    rotate(i*60)
    translate([0,0,TemplateThick/2])
    cube([HandleLength,HandleThick,TemplateThick],center=true);
    }
    module HexHandle() {
    difference() {
    rotate([90,0,0])
    scale([1,HandleHeight/(TemplateOD/2),1])
    rotate(180/HandleSides)
    cylinder(d=HandleLength,h=HandleThick,center=true,$fn=HandleSides);
    translate([0,0,-HandleHeight])
    cube([2*TemplateOD,2*TemplateOD,2*HandleHeight],center=true);
    translate([0,HandleThick,StringHeight])
    rotate([90,090,0])
    rotate(180/8)
    PolyCyl(StringDia,2*HandleThick,8);
    for (j=[-1,1]) {
    translate([0,j*(DentSphereRadius + HandleThick/2 – DentDepth),StringHeight])
    rotate(180/48)
    sphere(r=DentSphereRadius,$fn=48);
    }
    }
    }
    module HexTemplate() {
    HexPlate();
    HexHandle();
    }
    //——-
    // Triangle template
    module TriPlate() {
    linear_extrude(height=TemplateThick)
    intersection() {
    offset(delta=SeamAllowance) // basic cutting outline
    polygon(points=TriPoints);
    rotate(180)
    polygon(points=TipPoints);
    }
    }
    module TriTemplate() {
    union() {
    if (TriKnob)
    cylinder(d=KnobOD,h=KnobHeight,$fn=HandleSides);
    TriPlate();
    }
    }
    //——-
    // End piece template
    module EndPlate() {
    linear_extrude(height=TemplateThick)
    intersection() {
    offset(delta=SeamAllowance) // basic cutting outline
    polygon(points=EndPoints);
    rotate(180)
    polygon(points=TipPoints);
    }
    }
    module EndTemplate() {
    union() {
    if (EndKnob)
    translate([0,(TriRadius/2)*sin(30),0])
    cylinder(d=KnobOD,h=KnobHeight,$fn=HandleSides);
    EndPlate();
    }
    }
    //——-
    // Build it!
    if (Layout == "HexPlate")
    HexPlate();
    if (Layout == "HexBuild")
    HexTemplate();
    if (Layout == "TriPlate")
    TriPlate();
    if (Layout == "TriBuild")
    TriTemplate();
    if (Layout == "EndPlate")
    EndPlate();
    if (Layout == "EndBuild")
    EndTemplate();
    if (Layout == "Build") {
    translate([1.5*TriRadius,-TriRadius,0])
    rotate(180/6)
    TriTemplate();
    translate([-1.5*TriRadius,-TriRadius,0])
    rotate(180/6)
    EndTemplate();
    translate([0,TemplateOD/2,0])
    HexTemplate();
    }

  • Power Outage

    Power Outage

    Just before Tropical Storm Isaias rolled through, my hygrometer reached a new high:

    Pre-Isaias humidity
    Pre-Isaias humidity

    The National Weather Service reported 99% at the airport a few miles away, so the meter’s calibration seems about right.

    Shortly thereafter, the humidity dropped to the mid-70s as the wind picked up and, over the next few hours, falling branches took out vast swaths of Central Hudson’s electrical infrastructure. My little generator saved our refrigerator & freezer during 15 hours of outage; three days later, thousands of folks around us still have no power.

    A confluence of other events, none nearly so dramatic, will throttle my posting over the next two weeks.

    We’re OK and hope you’re OK, too …

  • EonSmoke Vape Debris

    EonSmoke Vape Debris

    Being the type of guy who uses metal bits & pieces, I thought this might be a useful aluminum rod:

    EonSmoke vape stick
    EonSmoke vape stick

    It turns out to be an aluminum tube holding a lithium cell and a reservoir of oily brown juice:

    EonSmoke - peeled open
    EonSmoke – peeled open

    The black plastic cap read “EonSmoke”, which led to a defunct website at the obvious URL. Apparently, EonSmoke went toes-up earlier this year after ten years of poisoning their customers, most likely due to “competitor litigation”.

    The black cap held what looks like a pressure switch:

    EonSmoke - switch
    EonSmoke – switch

    Suck on the icky end of the tube to activate the switch, pull air past the battery (?), pick up some toxic vapor around the heater, and carry it into your lungs:

    EonSmoke - reservoir heater
    EonSmoke – reservoir heater

    Maybe there’s a missing mouthpiece letting you suck on the icky end, activate the switch, pull vapor through the heater, and plate your lungs with toxic compounds. I admit certain aspects of my education have been sadly neglected.

    The lithium cell was down to 1.0 V, with no overdischarge protection and no provision for charging, so it’s a single-use item. I’m sure the instructions tell you to recycle the lithium cell according to local and state regulations, not toss it out the window of your car.

    I had to wash my hands so hard

  • Shuttles Game: Tapered Pegs

    Shuttles Game: Tapered Pegs

    As is all too common with 3D printed replacement parts done remotely, the first Shuttles game pegs didn’t quite fit into the game board’s holes. Fortunately, living in the future means rapid prototyping and quick turnaround:

    Shuttles Game pegs - tapered - solid model
    Shuttles Game pegs – tapered – solid model

    They’re slightly smaller, tapered toward the bottom, and take slightly less time to print.

    The OpenSCAD code in the GitHub Gist now has has the tweaks.

  • Extruder Clog

    Extruder Clog

    The test pieces for the Mesh Screen Frame came out a bit short:

    Extruder Clog - failed print
    Extruder Clog – failed print

    Which turned out to be the M2’s first extruder clog in a long, long time. The printer shut down normally, with no error messages, and the objects look fine as far as they go, making the diagnosis fairly simple.

    Just to be sure, I verified:

    It’s worth noting I use only PETG plastic from a single supplier, so Slic3r uses set-and-forget temperature and speed values, and I manually change colors only on those rare occasions when color matters. Most clogs occur after switching from a higher- to a lower-temperature plastic (PETG to PLA), where a chunk of soft-but-not-molten plastic jams in the nozzle; not the situation here.

    Unscrew the clamp screw enough to release the spring pressure on the idler bearing:

    Makergear M2 - spring-loaded filament drive
    Makergear M2 – spring-loaded filament drive

    Undo the various screws holding the block to the drive gear housing and pull it off. The drive block looked fine, with a clear round hole along the entire filament path, so that’s not the problem.

    The filament snippet sticking up out of the hot end also looked fine, apart from the expected drive gear gouge, with nice serrations below that point into the hot end. It’s the third filament from the top in this group photo:

    Extruder Clog - filament snippets
    Extruder Clog – filament snippets

    Although it’s called a “cold pull“, you can’t yank a solid hunk of plastic out of the hot end. Warming the PETG to around 200 °C and pulling the snippet out produced the long tapered end shown above.

    I rammed another snippet into the hot end to bond with whatever was inside:

    Extruder Clog - PETG pull
    Extruder Clog – PETG pull

    Which produced the top snippet above, with no particular trouble found.

    Repeating the process with some nylon (?) cleaning filament:

    Extruder Clog - cleaner pull
    Extruder Clog – cleaner pull

    In need of more traction, I sank a #60 twist drill into the molten plastic:

    Extruder Clog - drill bit insertion
    Extruder Clog – drill bit insertion

    Let things cool a bit, haul it out (it’s halfway in the picture above), and we’re making progress:

    Extruder Clog - drill bit extraction
    Extruder Clog – drill bit extraction

    I warmed the PETG-encrusted bit over a butane flame, wiped it on a shop rag to get most of the plastic off, then drilled a few holes in a hardwood block.

    Note that a #60 drill (40 mil = 1 mm) is much much much larger than the nozzle hole:

    Extruder Clog - nozzle view
    Extruder Clog – nozzle view

    The vertiginous view looks downward into a small hand-held mirror.

    Although some folks swear by 0.3 mm carbide drills for nozzle cleaning, I doubt I could avoid wrecking that nice round 0.35 mm hole. The new red silicone coat has chipped from around the nozzle over the last few sessions, so it’s no longer wiping the top layer.

    During all this flailing, something that might have been a glass fiber emerged from the nozzle while shoving one of those PETG snippets into the hot end. Of course, when I pried it out of the goo with tweezers, it snapped away into the clutter, never to be seen again. Despite being covered in PETG, it was a rigid sliver, rather than the gooey extruded thread. Perhaps the whisker extending from the PETG surrounding the drill bit was a similar fiber, but I didn’t notice it at the time.

    One of the PETG cold warm pulls contained two brownish lumps:

    Extruder Clog - PETG inclusions
    Extruder Clog – PETG inclusions

    This chunk doesn’t appear in the group portrait. It’s obviously been melted, measures a bit under 1.75 mm diameter, and the drive gear tooth marks show it passed through the filament drive block under motor control, most likely retraction.

    Passing the Xacto Knife of Inquiry through the leftmost lump split it neatly in two. The left section:

    Extruder Clog - PETG inclusion - section L
    Extruder Clog – PETG inclusion – section L

    And the right section:

    Extruder Clog - PETG inclusion - section R
    Extruder Clog – PETG inclusion – section R

    In person, the sections look like granular / burned residue surrounded by clear PETG. I’d expect anything burned to come from inside the hot end, but I don’t know how those lumps would get surrounded by nice, clear PETG inside a reasonably cylindrical section with drive gear notches.

    Anyhow, the clog has now Gone Away™ and the M2 extrudes just fine. I’ll declare victory and move on …