Ed’s Low-Effort High Traction Bread

Being that type of guy, perhaps I snug the plastic film over the top of the mixing bowl a bit too securely:

Yeast at work
Yeast at work

The dough descends from my High-Traction Bread, prepared with my low-effort version of the NY Times no-knead recipe.

The current dramatis personae:

  • 2 cups whole wheat flour (coarse grind OK)
  • 1 cup bread flour
  • ½ cup rye flour
  • ½ cup whey protein (dry milk powder OK)
  • 1 tsp yeast
  • 1 tsp salt
  • 1-½ cup warmish water

Let the mixer work on the dry ingredients for a while, then slowly pour the water into the bowl. The dough will (probably) become a thick batter, which is perfectly OK. Cover with plastic wrap as above, let it sit from afternoon until the next morning, plop the dough / batter on a floured silicone sheet, chivvy it into a lump, cover with the wrap, let it sit for a couple more hours.

Fire the oven to 450 °F, get the pot crazy hot, plop the lump inside, cook 25 minutes covered and 10 more uncovered, dump on a rack, slice off a QC sample, slather with butter, enjoy.

Makes a 700 gram = 24 ounce loaf lump: 1600 kcal, 320 g carb, 90 g protein. A serving might be a scant two ounces: 135 kcal, 26 g carb, 7 g protein.

Not keto-oid, but it’ll keep you warm in the Basement Laboratory.

You may safely ignore all recommendations concerning exact times, temperatures, and suchlike; this ain’t no damn fainting-flower souffle.

You could get used to it …

Handle With Care – FRAGILE – Thank You

I wonder if somebody took careful aim at this particular corner:

FRAGILE package damage
FRAGILE package damage

Well, it arrived in a more-or-less timely manner, unlike some packages and letters we’ve both sent and received of late. Tracking data suggests packages can vanish for days at a time, teleport to distant sorting centers, and sometimes loop between centers.

The USPS may simply have run out of people willing to work under the current conditions.

Mesa 5i25 Superport: Reflash and Step-Direction Pin Swap

For reasons lost in the mists of time, the DB-25 pinout used in the Sherline CNC Driver Box is kinda-sorta the same as everybody else’s DB-25 pinout, with minor difference of swapping the Step and Direction pins on each axis. This made no difference with the LinuxCNC parallel port driver, because (nearly) all pins are alike to it, but having recently found the Mesa 5i25 Everything I/O card and being desirous of upgrading to the latest & Greatest LinuxCNC, I figured why not throw all the balls in the air at once?

Although it’s theoretically possible to recompile the FPGA source code to swap the pins, the least horrible alternative was converting a null modem (remember null modems?) into a passthrough pinswapper:

DB-25 Parallel Adapter - Step-Direction pin swap
DB-25 Parallel Adapter – Step-Direction pin swap

Make sure you put jumper W2 in the DOWN position to route pins 22-25 to DC ground, rather than +5 V. W1 does the same for the internal header, herein unused, but it’s in the same position just for neatness.

Similarly, put both W3 and W4 in their UP position to enable +5 V tolerance, connect the pullups to +5 V, and enable the pullups, thereby keeping the Sherline logic happy.

Jumper W5 must be UP in order to have the thing work.

The relevant diagram:

Mesa 5i25 - jumper locations
Mesa 5i25 – jumper locations

Flashing the 5i25 with the Probotix PBX-RF firmware produced the best fit to a simple parallel port:

sudo mesaflash --verbose --device 5i25 --write 5i25/configs/hostmot2/5i25_prob_rfx2.bit
sudo mesaflash --verbose --device 5i25 --reload

The mesaflash utility and all the BIT files come from their 5i25.zip file with all the goodies.

The Gecko G540 pinout came in a close second and, should the Sherline box go toes-up, I’ll probably replace it with a G540 and (definitely) rewire the steppers from Sherline’s unipolar drive to bipolar drive mode.

The 5i25 pinout now looks like this:


halcmd: loadrt hostmot2
Note: Using POSIX realtime
hm2: loading Mesa HostMot2 driver version 0.15

halcmd: loadrt hm2_pci
hm2_pci: loading Mesa AnyIO HostMot2 driver version 0.7
hm2_pci: discovered 5i25 at 0000:04:02.0
hm2/hm2_5i25.0: Low Level init 0.15
hm2/hm2_5i25.0: 34 I/O Pins used:
hm2/hm2_5i25.0:     IO Pin 000 (P3-01): IOPort
hm2/hm2_5i25.0:     IO Pin 001 (P3-14): PWMGen #0, pin Out0 (PWM or Up) (Output)
hm2/hm2_5i25.0:     IO Pin 002 (P3-02): StepGen #0, pin Step (Output)
hm2/hm2_5i25.0:     IO Pin 003 (P3-15): IOPort
hm2/hm2_5i25.0:     IO Pin 004 (P3-03): StepGen #0, pin Direction (Output)
hm2/hm2_5i25.0:     IO Pin 005 (P3-16): PWMGen #0, pin Out1 (Dir or Down) (Output)
hm2/hm2_5i25.0:     IO Pin 006 (P3-04): StepGen #1, pin Step (Output)
hm2/hm2_5i25.0:     IO Pin 007 (P3-17): IOPort
hm2/hm2_5i25.0:     IO Pin 008 (P3-05): StepGen #1, pin Direction (Output)
hm2/hm2_5i25.0:     IO Pin 009 (P3-06): StepGen #2, pin Step (Output)
hm2/hm2_5i25.0:     IO Pin 010 (P3-07): StepGen #2, pin Direction (Output)
hm2/hm2_5i25.0:     IO Pin 011 (P3-08): StepGen #3, pin Step (Output)
hm2/hm2_5i25.0:     IO Pin 012 (P3-09): StepGen #3, pin Direction (Output)
hm2/hm2_5i25.0:     IO Pin 013 (P3-10): IOPort
hm2/hm2_5i25.0:     IO Pin 014 (P3-11): Encoder #0, pin A (Input)
hm2/hm2_5i25.0:     IO Pin 015 (P3-12): Encoder #0, pin B (Input)
hm2/hm2_5i25.0:     IO Pin 016 (P3-13): Encoder #0, pin Index (Input)
hm2/hm2_5i25.0:     IO Pin 017 (P2-01): IOPort
hm2/hm2_5i25.0:     IO Pin 018 (P2-14): PWMGen #1, pin Out0 (PWM or Up) (Output)
hm2/hm2_5i25.0:     IO Pin 019 (P2-02): StepGen #4, pin Step (Output)
hm2/hm2_5i25.0:     IO Pin 020 (P2-15): IOPort
hm2/hm2_5i25.0:     IO Pin 021 (P2-03): StepGen #4, pin Direction (Output)
hm2/hm2_5i25.0:     IO Pin 022 (P2-16): PWMGen #1, pin Out1 (Dir or Down) (Output)
hm2/hm2_5i25.0:     IO Pin 023 (P2-04): StepGen #5, pin Step (Output)
hm2/hm2_5i25.0:     IO Pin 024 (P2-17): IOPort
hm2/hm2_5i25.0:     IO Pin 025 (P2-05): StepGen #5, pin Direction (Output)
hm2/hm2_5i25.0:     IO Pin 026 (P2-06): StepGen #6, pin Step (Output)
hm2/hm2_5i25.0:     IO Pin 027 (P2-07): StepGen #6, pin Direction (Output)
hm2/hm2_5i25.0:     IO Pin 028 (P2-08): StepGen #7, pin Step (Output)
hm2/hm2_5i25.0:     IO Pin 029 (P2-09): StepGen #7, pin Direction (Output)
hm2/hm2_5i25.0:     IO Pin 030 (P2-10): IOPort
hm2/hm2_5i25.0:     IO Pin 031 (P2-11): Encoder #1, pin A (Input)
hm2/hm2_5i25.0:     IO Pin 032 (P2-12): Encoder #1, pin B (Input)
hm2/hm2_5i25.0:     IO Pin 033 (P2-13): Encoder #1, pin Index (Input)
hm2/hm2_5i25.0: registered
hm2_5i25.0: initialized AnyIO board at 0000:04:02.0

P3 is the DB-25 on the back panel and P2 is the internal IDC header.

Tek Circuit Computer: V Engraved Hairlines

Without much in the way of fixturing, a small V engraving bit cuts surprisingly nice hairlines:

Hairline tests - V tool 4 kRPM 12 24 IPM - full crop
Hairline tests – V tool 4 kRPM 12 24 IPM – full crop

It’s an anonymous HSS bit similar to the fancy ones with “blue nano” or “titanium” coatings, which I’m sure have the same effectiveness as the “gold” coating on audio plugs and jacks.

The tip is pretty close to the stated 0.1 mm. The included V angle looks like 22.5°, but the descriptions use the half angle, so it’s either a generous 10° or a scant 15°, take your pick.

It’s turning at 4000 RPM in the Sherline spindle, which is much too slow for such a tiny cut. No coolant, nothing fancy.

The lower left group ran at increasing depths from 0.0 to about 0.6 mm, with the deepest one looking surprisingly good.

It’s all manual jogging at either 12 or 24 inch/min and, when you (well, I) count the swirls across those 100 mil grids, the spindle really is turning at 4 kRPM. Gotta love it when the numbers work out!

These are obviously the best-looking hairlines yet, so I must tweak the GCMC source to do the right thing with the existing fixture.

Tek Circuit Computer: Sawed Hairline Fixture

This is a fixture to hold a cursor for an Homage Tektronix Circuit Computer while a tiny circular saw blade cuts a narrow flat-bottomed trench:

Tek CC - sawed cursor - Sherline setup
Tek CC – sawed cursor – Sherline setup

Each of the 123 blocks is held to the Sherline tooling plate with a 10-32 SHCS in a little aluminum pin, with another threaded pin for the screw holding the fixture on the side. The minimal top clearance provided some of the motivation behind making those pins in the first place; there’s no room for the usual threaded stud sticking out of the block with a handful of washers under the nut.

The fixture has locating slots (scribbled with black Sharpie) to touch off the spindle axis and the saw blade at the XZ origin at the pivot hole center. Touching off the saw blade on the cursor surface sets Y=0, although only a few teeth will go ting, so the saw must be spinning.

I cut the first slot under manual control to a depth of 0.3 mm on a scrap cursor with a grotty engraved hairline:

Tek CC - first sawed cursor - detail
Tek CC – first sawed cursor – detail

It looks better than I expected with some red lacquer crayon scribbled into it:

Tek CC - first sawed cursor - vs scribed
Tek CC – first sawed cursor – vs scribed

A few variations of speed and depth seem inconclusive, although they look more consistent and much smoother than the diamond-drag engraved line with red fill:

Tek CC - sawed cursor test - magnified
Tek CC – sawed cursor test – magnified

The saw produces a ramp at the entry and exit which I don’t like at all, but the cut is, overall, an improvement on the diamond point.

The OpenSCAD source code as a GitHub Gist:

// Sawing fixtures for Tek Circuit Computer cursor hairline
// Ed Nisley KE4ZNU Jan 2021
// Rotated 90° and screwed to 123 blocks for sawing
Layout = "Show"; // [Show, Build, Cursor]
Gap = 4.0;
/* [Hidden] */
ThreadThick = 0.25;
ThreadWidth = 0.40;
HoleWindage = 0.2;
Protrusion = 0.1; // make holes end cleanly
inch = 25.4;
function IntegerMultiple(Size,Unit) = Unit * ceil(Size / Unit);
module PolyCyl(Dia,Height,ForceSides=0) { // based on nophead's polyholes
Sides = (ForceSides != 0) ? ForceSides : (ceil(Dia) + 2);
FixDia = Dia / cos(180/Sides);
cylinder(d=(FixDia + HoleWindage),h=Height,$fn=Sides);
// Dimensions
CursorHubOD = 1.0*inch; // must match SVG hub OD
CursorThick = 0.71; // including protective layers
HairlineMin = 48.4188; // extent of hairline
HairlineMax = 97.4250;
HairlineDepth = 0.20;
PocketDepth = 0.75*CursorThick; // half above surface for taping
PocketClear = 0.25; // E-Z insertion clearance
TableOC = [1.16*inch,1.16*inch]; // Sherline tooling plate grid
BlockOC = [(9/16)*inch,(9/16)*inch]; // 123 block hole grid
BlockOffset = [(3/8)*inch,(3/8)*inch]; // .. block edge to hole center
ScrewClear = 5.0; // … screw clearance
CursorOffset = [2*BlockOC.x,0,0]; // hub center relative to leftmost screw
FixtureGrid = [5*TableOC.x,0,0]; // size in Table grid units
Screws = [ // relative to leftmost screw
[0,0,0], // on table grid
CursorOffset, // on block grid
[FixtureGrid.x,0,0] // on table grid
echo(str("Screw centers: ",Screws));
CornerRad = 10.0; // corner radius
Fixture = [2*CornerRad + FixtureGrid.x,2*CornerRad + CursorHubOD,5.0];
echo(str("Fixture plate: ",Fixture));
// Import SVG of cursor outline
// Requires our CursorHubOD to match actual cut outline
// Hub center at origin
module CursorSVG(t=CursorThick,ofs=0.0) {
hr = CursorHubOD/2;
file="/mnt/bulkdata/Project Files/Tektronix Circuit Computer/Firmware/TekCC-Cursor-Mark.svg",
// Show-n-Tell cursor
module Cursor() {
difference() {
PolyCyl(ScrewClear,CursorThick + 2*Protrusion,6);
// Sawing fixture for cursor hairline
// Plate center at origin
module Fixture() {
difference() {
hull() // basic plate shape
for (i=[-1,1], j=[-1,1])
translate([i*(Fixture.x/2 - CornerRad),j*(Fixture.y/2 - CornerRad),0])
translate([0,0,Fixture.z - ThreadThick/2 + Protrusion/2]) // will be Z=0 index
cube([2*Fixture.x,ThreadWidth,ThreadThick + Protrusion],center=true);
translate(-FixtureGrid/2) {
translate(CursorOffset + [0,0,Fixture.z - 2*PocketDepth])
difference() {
CursorSVG(2*PocketDepth + Protrusion,PocketClear);
CursorSVG(PocketDepth + Protrusion,-PocketClear);
translate([CursorOffset.x,0,Fixture.z - ThreadThick/2 + Protrusion/2]) // will be front X=0 index
cube([ThreadWidth,2*Fixture.y,ThreadThick + Protrusion],center=true);
translate([CursorOffset.x,Fixture.y/2 - ThreadThick/2 + Protrusion/2,0]) // will be top X=0 index
cube([ThreadWidth,ThreadThick + Protrusion,2*Fixture.z],center=true);
translate([CursorOffset.x + HairlineMin,0,Fixture.z - ThreadThick/2 + Protrusion/2]) // hairline min
cube([ThreadWidth,2*Fixture.y,ThreadThick + Protrusion],center=true);
translate([CursorOffset.x + HairlineMax,0,Fixture.z - ThreadThick/2 + Protrusion/2]) // hairline min
cube([ThreadWidth,2*Fixture.y,ThreadThick + Protrusion],center=true);
# translate(CursorOffset + [0,0,Fixture.z - 2*ThreadThick]) { // alignment pips
for (x=[-20.0,130.0], y=[-30.0,0.0,30.0])
# for (x=[-30.0,130.0,150.0])
for (pt=Screws)
translate(pt + [0,0,-Protrusion])
PolyCyl(ScrewClear,Fixture.z + 2*Protrusion,6);
// Build it
if (Layout == "Cursor") {
if (Layout == "Show") {
rotate([0*90,0,0]) {
translate(-FixtureGrid/2 + CursorOffset + [0,0,Fixture.z + Gap])
if (Layout == "Build"){
// rotate(90)

Fuvaly Bucked Lithium AA Cells

Behold lithium battery technology, a USB charger, and a buck voltage converter mashed into an AA alkaline package:

Fuvaly Bucked Lithium AA - label
Fuvaly Bucked Lithium AA – label

Those are two of a quartet bought from a randomly named Amazon seller to appease my ancient venerable classic Sony DSC-H5’s need for more voltage than new and freshly charged NiMH AA cells can provide for more than a few tens of minutes.

The label claims 1500 mA·h, not the 1120 mA·h I measured:

Fuvaly Bucked Li AA - mAh - 2021-02
Fuvaly Bucked Li AA – mAh – 2021-02

My numbers would be higher with a load less than 500 mA. I doubt the 2.5 A maximum current rating.

The claim of 2.25 W·h is rather optimistic:

Fuvaly Bucked Li AA - 2021-02
Fuvaly Bucked Li AA – 2021-02

Back of the envelope: 2.25 W·h at 1.5 V equals 1.5 A·h, all right. If you squint carefully, though, the output voltages run around 1.4 V, some of which is surely IR drop in my battery holder & test wiring, but it still knocks nearly 10% off the wattage and doesn’t seem to add to the runtime.

The camera’s battery charge indicator will obviously show Full right up until it shuts off, but I’ve always carried a spare pair of cells in my pocket anyway.

Recharging them with a USB meter in series required 425 to 600 mA·h at about 4.8 V, so about 2.5 W·h.

Enlarging the instructions from the back of the box, should they become useful:

Fuvaly Bucked Lithium AA - Instructions
Fuvaly Bucked Lithium AA – Instructions

Nowhere does the package mention the “brand name”, manufacturer, specifications, or much of anything substantial. I suppose anybody selling white-label products appreciates this level of detail.