High Impact Art: Smashed Glass Coaster Meniscus Removal

After using the smashed glass coaster for a while, the beveled epoxy meniscus around the perimeter proved itself more annoying than expected:

Glass Coaster - second test
Glass Coaster – second test

So I clamped it to the Sherline’s tooling plate and milled off the rim:

Smashed Glass Coaster - meniscus removal
Smashed Glass Coaster – meniscus removal

Given the Sherline’s cramped work envelope, all the action took place along the rearmost edge, requiring eight reclampings indexed parallel to the table with a step clamp.

The cutter cleared off everything more than 0.3 mm above the surface of the glass chunks. I could probably have gone another 0.1 mm lower, but chopping the bit into the edge of a shattered glass fragment surely wouldn’t end well.

Polishing the dark gray milled surface might improve it slightly, at the risk of scuffing whatever poured epoxy stands slightly proud of the glass:

Smashed Glass Coaster - leveled edge
Smashed Glass Coaster – leveled edge

Perhaps if I define it to be a border, everybody will think it was intentional.

Rounded Petal Acrylic Coaster

Having gotten the rounded-petal pattern generator working, applying it to acrylic sheets seemed reasonable:

Cut Acrylic Coaster - top cleaned
Cut Acrylic Coaster – top cleaned

The petals stand slightly proud of the black top frame, as the colored sheets were marginally thicker than the black sheet, but it looks OK in person. They’re all epoxied to a transparent base plate, so the bottom view is pretty much the same:

Cut Acrylic Coaster - bottom
Cut Acrylic Coaster – bottom

Because the bottom is perfectly smooth, I think it looks better than the top, which shows irregularities around the petals where the epoxy didn’t quite fill the gaps. There is one small bubble you won’t notice if I don’t tell you about it.

I laid a small bead of epoxy around the perimeter of the base, laid the black frame in place, ran a bead along the midline of each petal shape plus a drop in the round part, laid the petals in place, and hoped I didn’t use too much epoxy. It turned out all right, with only a few dribbles down the edge that wiped off easily enough.

I peeled the protective plastic off the top while the epoxy was still tacky, which pulled far too many fine filaments across the surface:

Cut Acrylic Coaster - frayed top
Cut Acrylic Coaster – frayed top

After the final cure, I managed to scrape most of them off with a thumbnail; I hope to never make that mistake again.

As you might expect, acrylic plastic’s pure saturated colors wipe the floor with Sharpie-scribbled white chipboard:

Chipboard coaster - rounded petals - front vs back cut
Chipboard coaster – rounded petals – front vs back cut

The black frame makes the whole thing overly dark, so the next attempt should use white or perhaps a transparent layer atop a mirror base.

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

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:

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

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

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

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.