B4-size Light Pad: Stabilizing the USB Connector

What used to be a “light box” had become a “light pad” powered through a USB Micro-B connector on the side. Unfortunately, the pad’s 5 mm thickness allows for very little mechanical reinforcement around the USB jack, while providing infinite opportunity to apply bending force. Over the course of the last half-dozen years (during which the price has dropped dramatically, despite recent events), the slightest motion flickered the LEDs.

So I squished the jack’s metal shell back into shape, found a short right-angle USB cable, and conjured a reinforcing fixture from the vasty digital deep:

LitUp LED Light Pad
LitUp LED Light Pad

The plate fits under the light pad, where a strip of super-sticky duct tape holds it in place:

LitUp Light Pad USB jack reinforcement - bottom
LitUp Light Pad USB jack reinforcement – bottom

The USB plug fits between the two blocks with hot-melt glue holding it in place and filling the gap between the plug and the pad.

I’d like to say it’s more elegant than the cable redirection for my tablet, but anything involving black electrical tape and hot-melt glue just isn’t in the running for elegant:

LitUp Light Pad USB jack reinforcement - top
LitUp Light Pad USB jack reinforcement – top

On the other paw, that socket ought to last pretty nearly forever, which counts for a whole lot more around here.

The retina-burn orange tape patches on the connector eliminate all the fumbling inherent to an asymmetric connector with invisible surface features. The USB wall wart on the other end of the cable sports similar markings.

The OpenSCAD source code as a GitHub Gist:

// Bracket to protect USB jack on LitUp LED Pad
// Ed Nisley KE4ZNU 2022-03-28
Protrusion = 0.1; // make holes end cleanly
Pad = [10.0,30.0,1.2];
Plug = [8.0,10.5 + 0.5,8.0];
BasePlate = [Pad.x + Plug.x,Pad.y,Pad.z];
//----------
// Create parts
module Stiffener() {
difference() {
union() {
translate([-Pad.x,-BasePlate.y/2,0])
cube(BasePlate,center=false);
translate([0,-Pad.y/2,0])
cube([Plug.x,Pad.y,Plug.z],center=false);
}
translate([-Protrusion,-Plug.y/2,-Protrusion])
cube(Plug + [2*Protrusion,0,Plug.z],center=false);
}
}
//----------
// Build them
Stiffener();

Craftsman Hedge Trimmer: Biennial Laying On Of Hands Repair

Once again, the hedge trimmer failed to turn on with the switch pressed, so I took it apart, did nothing, and had thing start working again:

Craftsman Hedge Trimmer - innards exposed
Craftsman Hedge Trimmer – innards exposed

It finally penetrated my dim consciousness: perhaps the switch is fine and a carbon brush (or two) has lost contact with the commutator atop a layer of oil and dust.

So a year from now when this happens again, try jamming a screwdriver through a vent slot and moving the motor a few degrees to jostle the crud.

If it works, that would be much easier than taking it apart!

Garage Door Opener Battery Life

The keypad for the garage door opener didn’t cooperate one cold evening, so the first thing to check is the battery:

Garage Door Opener battery change
Garage Door Opener battery change

Given that it lacks a scrawled date, it’s the original battery dating back to late 1998 when I replaced the defunct opener that Came With The House™.

It was down to 8.3 V on that sunny afternoon and, surely, not nearly enough in the dark of a wintry night.

Even I can’t complain about that kind of battery life …

Engineer’s Boot

The rivet holding the lace eyelet in place disintegrated:

Engineers Boot
Engineers Boot

A flat head 6-32 screw fit neatly inside the original grommet, making it flush on the side that matters and putting a stylin’ nyloc nut in full view.

When the only tool you have is a Basement Shop, pretty nearly everything looks like a project … and is fixable, too!

GCMC XY Axis Calibration Target

The CNC-3018XL drawing the scales on a Tek Circuit Computer disagreed with the MPCNC cutting the perimeter. The Y axis edges looked OK:

Tek CC - 2021-11 - Y detail
Tek CC – 2021-11 – Y detail

But the cut on the X axis edges went too close to the tips:

Tek CC - 2021-11 - X detail
Tek CC – 2021-11 – X detail

I conjured a calibration target to help measure the two machines:

Cal Target - CNC3018XL
Cal Target – CNC3018XL

The X- side of the plot gives the general idea:

CNC-3018XL - Backlash Test - 400step-mm
CNC-3018XL – Backlash Test – 400step-mm

The vertical lines consist of two halves, drawn in order from left to right on the top and right to left on the bottom, meeting in the middle at the Y=0 axis. If they do, in fact, meet in the middle, then there’s no problem with backlash.

The 25 mm distance between adjacent lines verifies the linear calibration; the total distance along the X and Y axes provides more travel for more error accumulation.

The circles provide some reassurance the machine can draw a smooth circle, because they come from GRBL’s (or whatever) G2 G-Code commands, not a linear approximation.

Spoiler: after a considerable amount of drawing, measuring, and muttering, the problem emerged from the CNC-3018XL’s X-axis leadscrew:

Cal Target - 400 step-mm - merged
Cal Target – 400 step-mm – merged

It’s half a millimeter short on each end!

More on this tomorrow …

The GCMC source code as a GitHub Gist:

(epilog begins)
(bCNC may regard plot as done before this returns)
M2
(epilog ends)
view raw epilog.gcmc hosted with ❤ by GitHub
(prolog begins)
G17 (XY plane)
G21 (mm)
G40 (no cutter comp)
G49 (no tool length comp)
G80 (no motion mode)
G90 (abs distance)
G94 (units per minute)
(prolog ends)
view raw prolog.gcmc hosted with ❤ by GitHub
// Grid pattern to check XY scaling
// Ed Nisley KE4ZNU - 2021-11
// gcmc -P 4 --pedantic --prolog prolog.gcmc --epilog epilog.gcmc --output 'Scale Grid.ngc' 'Scale Grid.gcmc'
include("engrave.inc.gcmc");
FALSE = 0;
TRUE = !FALSE;
//-----
// Define useful constants
SafeZ = [-,-,10.0mm]; // above all obstructions
TravelZ = [-,-,2.0mm]; // within engraving / milling area
PenZ = [-,-,-1.0mm]; // depth for good inking
PenSpeed = 2000mm;
//-----
// Overall values
PlotSize = [250mm,200mm,-];
comment("PlotSize: ",PlotSize);
GridSize = [25mm,25mm,-];
Margins = [5mm,5mm,-];
CenterOD = 5.0mm;
TextFont = FONT_HSANS_1_RS; // single stroke stick font
TextSize = 3.0 * [1.0mm,1.0mm];
//-----
// Draw it
feedrate(PenSpeed);
comment("Draw title info");
tp = scale(typeset("Scale & Backlash Test Pattern",TextFont),TextSize);
tp += [-PlotSize.x/2 + GridSize.x/2,PlotSize.y/2 - GridSize.y/2,-];
engrave(tp,TravelZ.z,PenZ.z);
tp = scale(typeset("Grid " + GridSize,TextFont),TextSize);
tp += [-PlotSize.x/2 + GridSize.x/2,PlotSize.y/2 - GridSize.y/2 - 1.5*TextSize.y,-];
engrave(tp,TravelZ.z,PenZ.z);
tp = scale(typeset("F " + PenSpeed + "/min",TextFont),TextSize);
tp += [-PlotSize.x/2 + GridSize.x/2,PlotSize.y/2 - GridSize.y/2 - 3.0*TextSize.y,-];
engrave(tp,TravelZ.z,PenZ.z);
tp = scale(typeset("Ed Nisley - KE4ZNU",TextFont),TextSize);
tp += [-PlotSize.x/2 + GridSize.x/2,-(PlotSize.y/2 - GridSize.y/2),-];
engrave(tp,TravelZ.z,PenZ.z);
tp = scale(typeset("softsolder.com",TextFont),TextSize);
tp += [-PlotSize.x/2 + GridSize.x/2,-(PlotSize.y/2 - GridSize.y/2 + 1.5*TextSize.y),-];
engrave(tp,TravelZ.z,PenZ.z);
comment("Mark center point");
goto(SafeZ);
goto([CenterOD/2,0,-]);
move(PenZ);
circle_cw([0,0]);
comment("Label axes");
tp = scale(typeset("X+",TextFont),TextSize);
tp += [GridSize.x + 0.5*TextSize.x,-TextSize.y/2,-];
engrave(tp,TravelZ.z,PenZ.z);
tp = scale(typeset("Y+",TextFont),TextSize);
tp += [-TextSize.x/2,GridSize.y + 0.5*TextSize.y,-];
engrave(tp,TravelZ.z,PenZ.z);
comment("Draw left-to-right");
tp = scale(typeset("L to R →",TextFont),TextSize);
tp += [-PlotSize.x/2 + GridSize.x/2 - tp[-1].x/2,GridSize.y/2,-];
engrave(tp,TravelZ.z,PenZ.z);
goto([-(PlotSize.x/2 + Margins.x),GridSize.y,-]);
for (p=[-PlotSize.x/2,GridSize.y,-] ; p.x <= PlotSize.x/2 ; p.x += GridSize.x ) {
comment(" p: ",p);
goto(p);
move(PenZ);
move_r([-,-GridSize.y,-]);
goto(TravelZ);
}
comment("Draw right-to-left");
tp = scale(typeset("R to L ←",TextFont),TextSize);
tp += [PlotSize.x/2 - GridSize.x/2 - tp[-1].x/2,-GridSize.y/2,-];
engrave(tp,TravelZ.z,PenZ.z);
goto([(PlotSize.x/2 + Margins.x),-GridSize.y,-]);
for (p=[PlotSize.x/2,-GridSize.y,-] ; p.x >= -PlotSize.x/2 ; p.x -= GridSize.x ) {
comment(" p: ",p);
goto(p);
move(PenZ);
move_r([-,GridSize.y,-]);
goto(TravelZ);
}
comment("Draw bottom-to-top");
tp = scale(typeset("B to T ↑",TextFont),TextSize);
tp += [-GridSize.x/2 - tp[-1].x/2,-(PlotSize.y/2 - TextSize.y),-];
engrave(tp,TravelZ.z,PenZ.z);
goto([-GridSize.x,-(PlotSize.y/2 + Margins.y),-]);
for (p=[-GridSize.x,-PlotSize.y/2,-] ; p.y <= PlotSize.y/2 ; p.y += GridSize.y ) {
comment(" p: ",p);
goto(p);
move(PenZ);
move_r([GridSize.x,-,-]);
goto(TravelZ);
}
comment("Draw top-to-bottom");
tp = scale(typeset("T to B ↓",TextFont),TextSize);
tp += [GridSize.x/2 - tp[-1].x/2,(PlotSize.y/2 - 1.5*TextSize.y),-];
engrave(tp,TravelZ.z,PenZ.z);
goto([GridSize.x,(PlotSize.y/2 + Margins.y),-]);
for (p=[GridSize.x,PlotSize.y/2,-] ; p.y >= -PlotSize.y/2 ; p.y -= GridSize.y ) {
comment(" p: ",p);
goto(p);
move(PenZ);
move_r([-GridSize.x,-,-]);
goto(TravelZ);
}
comment("Draw circles");
maxr = (PlotSize.x < PlotSize.y) ? PlotSize.x/2 : PlotSize.y/2;
for (r=GridSize.x/2 ; r <= maxr ; r += GridSize.x) {
comment(" r: ",r);
goto([-r,0,-]);
move(PenZ);
circle_cw([0,0,-]);
goto(TravelZ);
}
goto(SafeZ);
goto([0,0,-]);
view raw Scale Grid.gcmc hosted with ❤ by GitHub

Sheath Your Blades!

Trigger warning: gore.

A week ago I milled a stack of cursor blanks, then engraved a test hairline on a scrap cursor to make sure everything was ready:

Cursor V-bit setup
Cursor V-bit setup

After raising the spindle a few inches, I reached across the table, peeled the tape, and, as I pulled my hand back with the finished cursor, snagged the back of my left index finger on the V bit.

So. Much. Blood.

Urgent Care PA: “You may have nicked the tendon. Get thee hence to the Hospital Trauma Center.”

Trauma Center MD: “See that white fiber down in there? That’s the extensor ligament. Looks OK and should heal fine.”

Me: “Urp.”

Trauma Center MD: “Unless you’re one of the 20% who get an infection.”

Me: “Unless I’m one of the few who contract an MRSA infection, then just up and die.”

Trauma Center MD: “Well, yes, there’s that. If the wound swells or smells bad, come back here quickly.”

Dutchess County is now on the trailing edge of the Omicron wave, but the Trauma Center is attached to the Emergency Room and had a steady stream of customers arriving by ambulance. While being entirely content to not be their most urgent case, I had plenty of time to examine the wide variety of instruments parked in the room with me:

Nameless Hospital Cart
Nameless Hospital Cart

I’m on a ten-day regimen of surprisingly inexpensive Amoxicillin + Clavulanate Potassium capsules, which is apparently what it takes to knock down a potential infection these days.

Five days later, it looks like I should pull through:

Lacerated Left Index Finger
Lacerated Left Index Finger

So I hereby swear a mighty oath on the bones of my ancestors to always sheath my blades. You should, too.

But we all knew that last week, didn’t we?