Ed Nisley's Blog: Shop notes, electronics, firmware, machinery, 3D printing, laser cuttery, and curiosities. Contents: 100% human thinking, 0% AI slop.
A permutation of our *cough* computing resources put the diminutive Lenovo Ideacentre Q150 flat on a desktop, where it was at risk of falling off due to the weight of the cables. It came with a VESA monitor mount bracket designed under the assumption that monitor manufacturers would provide an unused VESA socket and a completely separate desk stand mount, which turned out to be incorrect for all of the monitors in my collection. The IBM (pre Lenovo) monitor it was now driving, however, had exposed screws on its VESA mount, so I adapted a quartet of hulking standoffs to hold the Q150 far enough away to clear the desk stand.
One end had 4-40 tapped holes that I drilled out to clear the VESA mount’s M4x0.7 screws; I sawed the heads off four M4 screws and epoxied them in place. The other end had 8-32 studs that I cut down to fit inside the Q150’s dished mounting bracket:
VESA Mount – standoffs
Working around the mount, one standoff at a time, avoided having to lay the monitor flat on the desk:
VESA Mount – standoffs on monitor
A bit of jiggling put the bracket on the standoffs, held in place by the 8-32 nuts:
Lenovo Q150 VESA Mount on monitor
And then the Q150 snapped into place:
Lenovo Q150 – on VESA Mount
It’s captured by a thumbscrew in the bottom left corner (visible in the previous photo), so it can’t fall out.
Took longer to take the pix and write this up than to finish the project… probably because there wasn’t a trace of CNC in sight.
Being in the market for some more-or-less industrial stepper driver bricks, here’s a summary of what’s currently available on eBay from the usual vendors, copied-and-pasted directly from the descriptions with some fluff removed:
M542 Stepper Driver Board Controller
Supply voltage from 20V DC to 50V DC
Output current from 1.0A to 4.5A
Self-adjustment technology, full to half current self-adjustment when motors from work to standstill via switching off SW4
Pure-sinusoidal current control technology
Pulse input frequency up to 300 KHz
TTL compatible and optically isolated input
Automatic half-current reduction as long as switching off SW4 when motors stop
16 selectable resolutions in decimal and binary, up to 51,200 steps/rev
Suitable for 2-phase and 4-phase motors
Support PUL/DIR and CW/CCW modes
Short-voltage, over-voltage, over-current and short-circuit protection, protect the PC, motors, driver etc from being damaged
M542H Stepper Driver Board Controller
Supply voltage from 20V DC to 100V DC
Output current from 1.0A to 4.5A
Self-adjustment technology, full to half current self-adjustment when motors from work to standstill via switching off SW4
Pure-sinusoidal current control technology
Pulse input frequency up to 300 KHz
TTL compatible and optically isolated input
Automatic half-current reduction as long as switching off SW4 when motors stop
16 selectable resolutions in decimal and binary, up to 51,200 steps/rev
Suitable for 2-phase and 4-phase motors
Support PUL/DIR and CW/CCW modes
Short-voltage, over-voltage, over-current and short-circuit protection, protect the PC, motors, driver etc from being damaged
2M542 Stepper Driver Board Controller
Suitable for 2-phase hybrid stepper motors (Outer diameter: 57,86mm)
H bridge bipolar constant phase flow subdivision driver
In round numbers, the M542 seems to be the basic driver for NEMA 17 / 23 /34 steppers. Remember that current isn’t proportional to frame size.
The M542H has a higher voltage limit that may be more useful with larger / multiple-stack motors; higher voltage = higher di/dt for a given inductance = same di/dt for higher inductance.
The 2M542 seems to be slightly different from both of its siblings: higher minimum voltage, slightly lower maximum current, slower step frequency. Many of the listings apply both M542 and 2M542 to the same hardware in the same listing, so it’s not clear what you’d get in the box. Ask first, trust-but-verify?
The MA860H seems appropriate for NEMA 34 / 42 and up , due to the much higher minimum current.
The 2M420 seems to be intended for NEMA 17 /23 class steppers. It’s not available from nearly as many suppliers.
The 2M982 looks like another NEMA 34 /42 and up driver.
The DM1182 seems strictly from industrial, but if you don’t know what you need, it’s a do-it-all killer.
As with all eBay listings, the picture need not match the description and neither may match what actually arrives in the box from halfway around the planet.
We recently replaced a defunct can opener with an OXO opener that removes can lids without creating razor-sharp edges. Unfortunately, the knob doesn’t agree well with Mary’s hand, so I laid out a prototype doorknob-shaped cap (and also removed all the can lids that confronted her):
OXO Can Opener Knob
It prints in four parts: the flat cover and three pillars, with two filament snippets aligning each pillar. The internal openings of this model do not fit the OXO knob’s lobes correctly; a Dremel sanding drum worked wonderfully well to make it fit. The next version should have much smaller pillar bases with a bit more clearance at the top: measurements from the as-adapted pillars will be in order.
Gluing everything together once again justifies having Too Many Clamps:
OXO Can Opener – gluing knob cover
I intended to secure cap to knob with 2-56 screws in those recessed holes and even went so far as to flatten the top of the knob’s lobes in preparation for drilling:
OXO Can Opener – knob flats
However, Dragorn of Kismet gave me a few packets of only slightly outdated Sugru (a great idea that’s far too spendy and short-lived for my shop) that solved the problem:
OXO Can Opener – knob cover with silicone tape
The silicone tape wrap greatly improves the griptitude.
Early returns indicate this works reasonably well, but the top should be more rounded and tapered. It goes without saying that black filament would be much less ugly…
The OpenSCAD source code, with the caveat that the as-printed knob won’t fit without considerable abrasive adjustment:
// OXO Softworks Can Opener
// Enlarged & rounded knob
// Ed Nisley KE4ZNU December 2012
include </mnt/bulkdata/Project Files/Thing-O-Matic/MCAD/units.scad>
include </mnt/bulkdata/Project Files/Thing-O-Matic/Useful Sizes.scad>
// Layout options
Layout = "Cap";
// Overall layout: Build1 Build2
// Parts: Cap Knob
//- Extrusion parameters must match reality!
// Print with +1 shells and 3 solid layers
ThreadThick = 0.25;
ThreadWidth = 2.0 * ThreadThick;
HoleWindage = 0.2;
function IntegerMultiple(Size,Unit) = Unit * ceil(Size / Unit);
Protrusion = 0.1; // make holes end cleanly
//----------------------
// Dimensions
TriLobeRad = 37.5; // radius: center to end of lobe
TriLobeOD = 2*TriLobeRad;
TriLobePeakRad = 23.0; // radius: center to peak height
TriLobeHeight = 22.5;
WingArcRad2 = 48; // Arc between knob lobes, top
WingArcRad1 = WingArcRad2 - 5; //
WingArcOffset = 14.0; // Knob center to arc2 radius
KnobOD1 = 70; // maximum dia without chamfer
KnobOD2 = 65; // top dia
KnobSides = 3*4; // maintain 3-side symmetry
DomeHeight = 8; // dome shape above lobes
KnobHeight = DomeHeight + TriLobeHeight;
DomeOD = KnobOD2 + (KnobOD1 - KnobOD2)*(DomeHeight/KnobHeight);
DomeArcRad = (pow(KnobHeight,2) + pow(DomeOD,2)/4) / (2*DomeHeight);
ScrewDia = Tap2_56;
ScrewHeadDia = Head2_56;
ScrewBase = 0.6*DomeHeight - Head2_56Thick;
AlignPinDia = 3.0;
AlignPinCircleRad = 0.55*(WingArcOffset + KnobOD2/2);
AlignPinDepth = 3.0;
//----------------------
// Useful routines
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=(FixDia + HoleWindage)/2,
h=Height,
$fn=Sides);
}
module ShowPegGrid(Space = 10.0,Size = 1.0) {
Range = floor(50 / Space);
for (x=[-Range:Range])
for (y=[-Range:Range])
translate([x*Space,y*Space,Size/2])
%cube(Size,center=true);
}
//-------------------
// Component parts
module TriKnob() {
intersection() {
difference(convexity=3) {
translate([0,0,-Protrusion])
cylinder(r=TriLobeRad,h=(TriLobeHeight + 2*Protrusion));
for (i=[-1:1])
rotate(i*120)
translate([(WingArcOffset + WingArcRad2),0,-TriLobeHeight/2])
cylinder(r1=WingArcRad1,r2=WingArcRad2,h=2*TriLobeHeight);
}
translate([0,0,TriLobeHeight/2])
cube([2*KnobOD1,2*KnobOD2,TriLobeHeight],center=true);
}
}
module KnobCap() {
difference() {
intersection() {
translate([0,0,(KnobHeight-DomeArcRad)])
rotate(180/KnobSides)
sphere(r=DomeArcRad,$fa=180/KnobSides);
difference(convexity=4) {
rotate(180/KnobSides)
cylinder(r1=KnobOD1/2,r2=KnobOD2/2,h=KnobHeight,$fn=KnobSides);
TriKnob();
}
rotate(180/KnobSides)
cylinder(r1=KnobOD2/2,r2=KnobOD1/2,h=KnobHeight,$fn=KnobSides);
}
for (i=[-1:1])
rotate(i*120) {
translate([-TriLobePeakRad,0,0]) {
PolyCyl(ScrewDia,KnobHeight);
translate([0,0,TriLobeHeight + ScrewBase])
PolyCyl(ScrewHeadDia,KnobHeight);
}
}
for (i=[-1:1]) for (j=[-1,1])
rotate(i*120 + j*(270/KnobSides))
translate([AlignPinCircleRad,0,(TriLobeHeight - AlignPinDepth - Protrusion)])
PolyCyl(AlignPinDia,2*(AlignPinDepth + Protrusion));
}
}
//----------------------
// Build it!
ShowPegGrid();
if (Layout == "Cap")
difference() {
KnobCap();
cylinder(r=KnobOD1,h=Protrusion/2,center=true);
}
if (Layout == "Knob")
TriKnob();
if (Layout == "Build1")
translate([0,0,-TriLobeHeight])
difference() {
KnobCap();
translate([0,0,(TriLobeHeight - Protrusion)/2])
cube([2*KnobOD1,2*KnobOD2,TriLobeHeight+Protrusion],center=true);
}
if (Layout == "Build2")
translate([0,0,TriLobeHeight])
rotate([180,0,0])
difference() {
KnobCap();
translate([0,0,(TriLobeHeight + TriLobeHeight/2)])
cube([2*KnobOD1,2*KnobOD2,TriLobeHeight],center=true);
}
Our Larval Engineer received a logic probe / pulser set for Christmas:
RSR Logic Probe Pulser Set – with formed covers
They’re the low-cost RSR-611 and -620 from the usual eBay vendor, not my ancient HP10525/10526 set, but they should suffice. Perhaps nobody uses logic probes these days, what with most of the parts being too small for even a needle tip, but …
Anyhow, they didn’t have caps over the sharp probe tips, so I rummaged around until I found the stash of cigar tubes (some of which went into that air flow straightener) that were about the right size. I thought about 3D printing an adapter between tubes and probes:
RSR Probe Cap Adapter – solid model
It’s actually a subtractive kind of thing, with a model of the probe tip subtracted from a suitable cylindrical object:
RSR Logic Probe – solid model
But then I realized the tubes were thermoplastic, held each one over a stove burner until the open end went transparent and droopy, rammed it down over the probe tip, and trimmed off the ragged edge. Worked fine, fits securely, and even looks pretty good:
RSR Covers – detail
I’ll never print the adapters, but maybe one of us will tweak the model to do something else…
The OpenSCAD source code:
// RSR Logic Probe / Pulser Cap
// Ed Nisley KE4ZNU December 2012
// Adapts cigar tube to probe body
// Layout options
Layout = "Build";
// Overall layout: Show Build
// Parts: Probe
//- Extrusion parameters must match reality!
// Print with +1 shells and 3 solid layers
ThreadThick = 0.25;
ThreadWidth = 2.0 * ThreadThick;
HoleWindage = 0.2;
function IntegerMultiple(Size,Unit) = Unit * ceil(Size / Unit);
Protrusion = 0.1; // make holes end cleanly
//----------------------
// Dimensions
ProbeDia = 18.0; // dia of main body
ProbeTipDia = 6.8; // dia at end of plastic cone
ProbeTipLen = 30.0; // length of metal ferrule + tip
ProbeConeLen = 17.5; // cone taper length
TubeOD = 17.25;
TubeWall = 0.50;
TubeID = TubeOD - 2*TubeWall;
TubeLen = 15; // slip fit over tube body
BodyLen = 20; // slip fit over probe body
WallThick = 3.5*ThreadWidth; // basic adapter wall thickness
AdapterLen = TubeLen + BodyLen;
AdapterOD = ProbeDia + 2*WallThick;
AdapterSides = 4*4;
//----------------------
// Useful routines
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=(FixDia + HoleWindage)/2,
h=Height,
$fn=Sides);
}
module ShowPegGrid(Space = 10.0,Size = 1.0) {
Range = floor(50 / Space);
for (x=[-Range:Range])
for (y=[-Range:Range])
translate([x*Space,y*Space,Size/2])
%cube(Size,center=true);
}
module Probe() {
union() {
cylinder(r=((ProbeDia + HoleWindage)/2),
h=(BodyLen + 1.2*Protrusion),$fn=2*AdapterSides);
translate([0,0,(BodyLen + Protrusion)])
cylinder(r1=(ProbeDia + HoleWindage)/2,
r2=ProbeTipDia/2,
h=ProbeConeLen,$fn=2*AdapterSides);
cylinder(r=ProbeTipDia/2,h=(BodyLen + ProbeConeLen + ProbeTipLen),$fn=2*AdapterSides);
}
}
module ProbeSleeve() {
difference() {
cylinder(r=AdapterOD/2,h=AdapterLen);
translate([0,0,-Protrusion])
Probe();
PolyCyl((TubeOD + HoleWindage),(AdapterLen + Protrusion),2*AdapterSides);
}
}
//----------------------
// Build it!
ShowPegGrid();
if (Layout == "Show")
ProbeSleeve();
if (Layout == "Build")
translate([0,0,AdapterLen])
rotate([180,0,0])
ProbeSleeve();
if (Layout == "Probe")
Probe();
The pushbutton switch on the end cap of a cheap LED flashlight became intermittent, for reasons that should be obvious:
LED Flashlight switch – intact
Pulling the spring contact out revealed the usual situation inside:
LED Flashlight switch – spring removed
I thought that the discolorations around the central plug indicated a solder joint between the two, but the scratches showed that the plug was actually a press-fit plastic cylinder. Having nothing to lose, I pried the rubber dome off the outside of the switch, balanced the cap’s outer rim on the bench vise, centered an aluminum cylinder over the switch post, and gave it a hammer shot:
LED Flashlight switch – guts
It appears the Basement Warehouse Wing inventory lacks a push-on switch that fits the cap, so this one goes on the pile of potentially useful parts. If a suitable switch appears, I know what to do with it, but if I should need a nice aluminum cylinder that fits a trio of AA cells before then, well …
This switch controlled an outlet, so I’m sure it’s hot-switched far too many vacuum cleaners, clothes irons, and suchlike over the last half century or so.
Our house is a bit fancier and originally had top-of-the-line mercury-wetted switches: the contacts sealed in the capsule don’t burn, but the springy supporting structures outside the capsule eventually wear out.
They’re still more reliable than X10 switches, though.
Which small spot on this hot-air furnace heat exchanger isn’t like all the other small spots?
Pinhole in furnace heat exchanger
Correct! The orange one at the corner of the rectangular exhaust gas flue that’s lit up like the sun, because you’re looking directly into the oil burner flame.
With the fire off and everything cooled down, it looked like this:
Pinhole in furnace heat exchanger – detail
Now, this calls for a new furnace (because replacing the heat exchanger costs as much as a new furnace), but as it turns out this was in an unoccupied house during the week before Christmas. So I scrubbed off the debris with a steel brush, bent up a snippet of 2 mil brass shimstock to fit the corner, applied a layer of JB Industro-Weld epoxy to the problem, and positioned 200 W of incandescent bulbs to help it cure slightly sooner than forever:
Furnace heat exchanger – temporary fix
That is most certainly not a final repair, not just because the heat exchanger’s normal operating temperature exceeds the epoxy’s 500 °F rating, but because where there’s one pinhole there’s bound to be more. The goal was to let us keep the furnace running until we could schedule the replacement after the holidays. Remember, the building isn’t occupied and neither of the smoke / CO detectors went off at any point in the proceedings.