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: Improvements

Making the world a better place, one piece at a time

  • Newmowa NP-BX1: Video Duration vs Charge

    Newmowa NP-BX1: Video Duration vs Charge

    Having run the Newmowa NP-BX1 batteries through my old Sony HDR-AS30V helmet camera a few times, a plot seemed in order:

    Newmowa NP-BX1 video duration vs charge
    Newmowa NP-BX1 video duration vs charge

    The cluster of dots shows most of our rides last about an hour.

    The line is an eyeballometrical fit, slightly coerced to pass through the origin because that’s where it should go.

    The 9.1 mA·hr/min slope is in reasonable agreement with past results, given different batteries and charger. The Keweisi meter emerged first from the box.

    Straining the hr/min dimensional nonsense out of the slope suggests the camera averages 550 mA and 1.9 W. Derating those by a few percent to account for the recharge efficiency might be in order, but they’re surely in the right ballpark.

  • Epoxy Mixing Rack

    Epoxy Mixing Rack

    First you mix the epoxy, then you blend in the dye, then you dispense it into the thing you are making. If you’re using many colors, this is obviously not the right way to go about it:

    Acrylic Coaster - epoxy coloring
    Acrylic Coaster – epoxy coloring

    A bit of pondering converted some scrap MDF into a rack holding the little cups and dispensing pipettes:

    Epoxy Mixing Rack
    Epoxy Mixing Rack

    The bar magnet holds the backplate against a bench block to keep it at right angles to the base while the adhesive cures. The base is three layers of MDF with no, small, and large holes fitting the cups. I expect many epoxy spills; scrap MDF reduces deep emotional bonding to the result.

    The LightBurn project has the sign outline as a tool layer to simplify aligning the victims with the laser path, plus one layer defining the cuts for the three plates. I exported it as an SVG image with the same information as colored vectors for use in whatever laser control program you might use.

    The SVG image as a GitHub Gist:

    Loading
    Sorry, something went wrong. Reload?
    Sorry, we cannot display this file.
    Sorry, this file is invalid so it cannot be displayed.
  • Coaster Generator: Simple Petals

    Coaster Generator: Simple Petals

    Having figured out how to intersect a line with a circle, I figured I could do it twice to put arcs on both the inside and the outside of each petal:

    Chipboard coaster - double arcs
    Chipboard coaster – double arcs

    As before, scribbling markers on plain chipboard makes for a … subdued … coaster, so I tried chipboard with one white surface:

    Chipboard coaster - plain vs white
    Chipboard coaster – plain vs white

    Much better.

    Clamping the coaster produces a flatter result:

    Chipboard coaster - clamping
    Chipboard coaster – clamping

    With the risk of squishing excess glue through the kerf:

    Chipboard coaster - excess glue
    Chipboard coaster – excess glue

    That’s the same coaster as in the first picture, carefully arranged with light reflecting off the flat glue surface. In real life, the nearly transparent glue doesn’t look nearly so awful, but smoothing much less glue than seems necessary across the bottom disk suffices.

    The geometry doodle with the arcs:

    Chipboard coaster - double arc petal geometry doodle
    Chipboard coaster – double arc petal geometry doodle

    I suppose I should refactor the code with a quadratic solver returning a list of roots, but copypasta suffices for now.

    The GCMC and Bash source code as a GitHub Gist:

    #!/bin/bash
    # Simple petals test piece
    # Ed Nisley KE4ZNU – 2022-07-01
    Flags='-P 4 –pedantic' # quote to avoid leading hyphen gotcha
    SVGFlags='-P 4 –pedantic –svg –svg-no-movelayer –svg-opacity=1.0 –svg-toolwidth=0.2'
    # Set these to match your file layout
    ProjPath='/mnt/bulkdata/Project Files/Laser Cutter/Coasters/Source Code'
    LibPath='/opt/gcmc/library'
    ScriptPath=$ProjPath
    Script='Simple Petals.gcmc'
    [ -z "$1" ] && petals="6" || petals="$1"
    fn=Petals-$petals.svg
    echo Output: $fn
    gcmc $SVGFlags \
    -D "NumPetals=$petals" \
    –include "$LibPath" \
    "$ScriptPath"/"$Script" > "$fn"
    view raw petals.sh hosted with ❤ by GitHub
    // Simple Petals Test Piece
    // Ed Nisley KE4ZNU
    // 2022-07-12 Simplest possible petals
    layerstack("Frame","Petals","Rim","Base","Center","Tool1"); // SVG layers map to LightBurn colors
    //—–
    // Library routines
    include("tracepath.inc.gcmc");
    include("tracepath_comp.inc.gcmc");
    include("varcs.inc.gcmc");
    include("engrave.inc.gcmc");
    FALSE = 0;
    TRUE = !FALSE;
    //—–
    // Command line parameters
    // -D various useful tidbits
    // add unit to speeds and depths: 2000mm / -3.00mm / etc
    if (!isdefined("OuterDia")) {
    OuterDia = 100.0mm;
    }
    if (!isdefined("CenterDia")) {
    CenterDia = 25.0mm;
    }
    if (!isdefined("NumPetals")) {
    NumPetals = 6;
    }
    if (!isdefined("Sash")) {
    Sash = 5.0mm;
    }
    // Petal values
    PetalAngle = 360.0deg/NumPetals; // subtended by inner sides
    PetalHA = PetalAngle/2;
    PetalOD = OuterDia – 2*Sash;
    PetalID = CenterDia + 2*Sash;
    PetalOAL = OuterDia/2 – Sash – (Sash/2)/sin(PetalHA);
    //message("petalOAL: ",PetalOAL);
    // Find petal vertices
    P0 = [(Sash/2) / sin(PetalHA),0.0mm];
    t1 = tan(PetalHA);
    sc = (Sash/2) / cos(PetalHA);
    if (P0.x < PetalID/2) {
    a = 1 + pow(t1,2);
    b = -2 * t1 * sc;
    c = pow(sc,2) – pow(PetalID/2,2);
    xp = (-b + sqrt(pow(b,2) – 4*a*c))/(2*a);
    xn = (-b – sqrt(pow(b,2) – 4*a*c))/(2*a);
    y = xp*t1 – sc;
    if (FALSE) {
    message("a: ",a);
    message("b: ",b);
    message("c: ",c);
    message("p: ",xp," n: ",xn," y: ",y);
    }
    P1 = [xp,y];
    }
    else {
    P1 = P0;
    }
    a = 1 + pow(t1,2);
    b = -2 * t1 * sc;
    c = pow(sc,2) – pow(PetalOD/2,2);
    if (FALSE) {
    message("a: ",a);
    message("b: ",b);
    message("c: ",c);
    }
    xp = (-b + sqrt(pow(b,2) – 4*a*c))/(2*a);
    xn = (-b – sqrt(pow(b,2) – 4*a*c))/(2*a);
    y = to_mm(sqrt(pow(PetalOD/2,2) – pow(xp,2)));
    //message("p: ",xp," n: ",xn," y: ",y);
    P2 = [xp,y];
    PetalWidth = 2*P2.y;
    P3 = [PetalOD/2,0.0mm];
    if (FALSE) {
    message("P0: ",P0);
    message("P1: ",P1);
    message("P2: ",P2);
    message("P3: ",P3);
    }
    // Construct paths
    PetalPoints = {P1,P2};
    OutArc = varc_cw([P2.x,-P2.y] – P2,PetalOD/2);
    OutArc += P2;
    PetalPoints += OutArc;
    if (P0 != P1) {
    PetalPoints += {[P1.x,-P1.y]};
    InArc = varc_ccw(P1 – [P1.x,-P1.y],PetalID/2);
    InArc += [P1.x,-P1.y];
    PetalPoints += InArc;
    }
    else {
    PetalPoints += {P0};
    }
    //— Lay out the frame
    linecolor(0xff0000);
    layer("Frame");
    if (CenterDia) {
    goto([CenterDia/2,0mm]);
    circle_cw([0mm,0mm]);
    }
    repeat(NumPetals;i) {
    a = (i-1)*PetalAngle;
    tracepath(rotate_xy(PetalPoints,a));
    }
    goto([OuterDia/2,0]);
    circle_cw([0mm,0mm]);
    //— Lay out internal pieces for oriented cutting
    // baseplate
    layer("Base");
    relocate([OuterDia + 2*Sash,0]);
    goto([OuterDia/2,0]);
    circle_cw([0mm,0mm]);
    // central circle
    if (CenterDia) {
    layer("Center");
    relocate([OuterDia/2 + Sash,-(OuterDia – CenterDia)/2]);
    goto([CenterDia/2,0mm]);
    circle_cw([0mm,0mm]);
    }
    // petals
    layer("Petals");
    repeat(NumPetals;i) {
    org = [PetalWidth/2 – OuterDia/2,-(OuterDia + Sash)];
    relocate([(i-1)*(PetalWidth + Sash) + org.x,org.y]);
    tracepath(rotate_xy(PetalPoints,90deg));
    }
    // Debugging by printf()
    if (FALSE) {
    layer("Tool1");
    linecolor(0xff1f00);
    goto([Sash/2,0mm]);
    circle_cw([0mm,0mm]);
    goto(P0);
    circle_cw([0mm,0mm]);
    goto([0,0]);
    move([OuterDia/2,0]);
    goto([0,0]);
    move(OuterDia/2 * [cos(PetalHA),sin(PetalHA)]);
    goto(P2);
    move_r([0,-PetalWidth/2]);
    }
  • Onion Maggot Flies vs. Sticky Traps: Round 2

    Onion Maggot Flies vs. Sticky Traps: Round 2

    Mary decided the second round of sticky traps had collected enough Onion Maggot Flies (and other detritus) to warrant replacement, so this season will have three sets of cards.

    The two sides of each card after about a month in the garden:

    • VCCG Onion Card A - 2022-07-17
    • VCCG Onion Card B - 2022-07-17
    • VCCG Onion Card C - 2022-07-17
    • VCCG Onion Card D - 2022-07-17
    • VCCG Onion Card E - 2022-07-17
    • VCCG Onion Card F - 2022-07-17

    There are many flies that look (to me) like Onion Maggot Flies, in contrast with the first round of cards which had far fewer flies after about six weeks in the bed.

    Some could be Cabbage Maggot Flies, but my fly ID hand is weak.

    One of the frames screwed to a fence post suffered a non-fatal mishap, so I made and deployed a seventh trap. We’re pretty sure the garden has enough flies to go around.

  • LitUp LED Light Pad: Direct Wiring

    LitUp LED Light Pad: Direct Wiring

    Unfortunately, reinforcing the USB Micro-B jack on the side of the LitUp LED Light Pad only delayed the inevitable: the light became erratic even without the slightest touch. The pad consists of three acrylic sheets glued together around the entire perimeter, so there’s no way to get access to the no-user-serviceable-parts within. Apparently, you’re supposed to just throw it out.

    On the other paw, it’s already dead, so there’s nothing to lose:

    LitUp LED Light Pad - failed USB jack
    LitUp LED Light Pad – failed USB jack

    A little deft razor knife work chopped through the rear sheet without doing any (more) damage to the PCB within. The LEDs can still be convinced to light, but the USB jack is definitely wrecked.

    Applying some ChipQuik let me extract the jack without (too much) more damage. Rather than replace it, I just soldered a pigtail USB cable to the obvious PCB pads:

    LitUp LED Light Pad - direct power wiring
    LitUp LED Light Pad – direct power wiring

    If I’d noticed that little solder ball, I’d have removed it before filling the cavity with hot melt glue and squishing the cut-out piece of white acrylic in place.

    A little black duct tape should keep the wiring stable enough for the foreseeable future:

    LitUp LED Light Pad - redirected cable
    LitUp LED Light Pad – redirected cable

    That was another (relatively) easy zero-dollar repair that should not be necessary.

  • Please Close The Gate Signage: Painted

    Please Close The Gate Signage: Painted

    It seems two months of sunlight will fade laser charred MDF down to its original state:

    Please Close The Gate - unpainted faded
    Please Close The Gate – unpainted faded

    That’s through a thick layer of indoor urethane sealant slathered over MDF without any surface prep. Obviously, not removing the char had no effect on the outcome. On the upside, the urethane did a great job of protecting the MDF from rainfall.

    So. Back to the shop.

    Lacking wider masking tape, two strips of tape laid along a cut-to-suit slab of fresh MDF will serve as a paint mask:

    Please Close The Gate - masked engraving
    Please Close The Gate – masked engraving

    Belatedly I Learned: cut the tape close to the edge, then fold it under so the autofocus pen can’t possibly snag it en passant.

    Shoot the entire surface with a couple of black enamel rattlecan coats:

    Please Close The Gate - masked paint
    Please Close The Gate – masked paint

    Yes, the engraved areas look reddish, most likely due to another complete lack of surface prep. Perhaps brushing / vacuuming / washing would remove some of the char, but let’s see how it behaves with no further attention.

    Peel the tape, weed the letters / antlers, slather on a coat of urethane, and it looks downright bold:

    Please Close The Gate - sealed
    Please Close The Gate – sealed

    Of course, if those two tape strips don’t exactly abut, the paint produces a nasty line:

    Please Close The Gate - mask gap
    Please Close The Gate – mask gap

    Should you overlap the strips a wee bit to ensure cleanliness, the engraved surface will then have a noticeable (in person, anyhow) discontinuity due to the laser losing energy in two tape layers, which wouldn’t matter in this application. We defined the few paint lines as Good Enough™ for the purpose; a strip of absurdly wide masking tape is now on hand in anticipation of future need.

    Burnishing the tape might have prevented paint bleed around the engraved areas:

    Please Close The Gate - paint creep
    Please Close The Gate – paint creep

    But, given that I was painting raw / unfinished MDF with an unsmooth surface, burnishing probably wouldn’t produce a significantly better outcome.

    By popular request, the new signs sit a few grids lower on the gates:

    Please Close The Gate - fresh painted
    Please Close The Gate – fresh painted

    Perhaps these will outlast the garden season …

  • OMTech 60 W Laser: Air Assist Pump Filter

    OMTech 60 W Laser: Air Assist Pump Filter

    The air assist pump sits in the right rear of the OMTech laser’s main compartment:

    OMTech 60W laser - Z motor - air pump
    OMTech 60W laser – Z motor – air pump

    Where it is, of course, exposed to all the usual dust / fragments / fumes / smoke generated by laser cutting & engraving, enhanced by my attention to getting good air flow over the platform. The picture shows the base plate in as-delivered condition, which it will never resemble ever again.

    The problem: any crud in the air can clog the pump or contaminate the laser focus lens.

    Four screws into threaded holes hold the pump to the base plate, secured with jam nuts on the outside.

    The air inlet is a round fitting centered on the bottom of the pump housing:

    OMTech 60 W Laser Air Assist - pump inlet
    OMTech 60 W Laser Air Assist – pump inlet

    You’ll note the out-of-focus crud scattered on the base plate.

    The general idea is to drill a hole through the base plate, put a snorkel on the inlet, and have it inhale fresh, relatively clean, basement air from outside the cabinet. The trick will be not touching the base plate with anything solid, because the pump vibrates like crazy; its four squishy standoffs do a great job of isolating the tremors from the base screwed to the laser cabinet.

    Having a few other things going on at the moment, I just laid two generous wads of cheesecloth where they can filter the bigger chunks out of the air stream:

    OMTech 60 W Laser Air Assist - cheesecloth filter installed
    OMTech 60 W Laser Air Assist – cheesecloth filter installed

    The air flow meter says the pump still delivers 12 l/m to the nozzle, so the cheesecloth has no effect compared to four or five feet of 4 mm ID tubing.

    A doodle summarizes the inlet fitting dimensions:

    OMTech 60 W Laser Air Assist - pump inlet fitting measurements
    OMTech 60 W Laser Air Assist – pump inlet fitting measurements

    That looks like a 3D printed disk with a snout for a short air hose should do the trick, with a thin gasket sealing the disk to the fitting.

    Now I can throw that piece of paper out …