Tour Easy: Another Rear Fender Bracket

All the work on Mary’s bike reminded me of the rear fender bracket I meant to install on mine, with more clearance for the strut stabilizing the under-seat packs:

Tour Easy Rear Fender Bracket - long setback - solid model - show
Tour Easy Rear Fender Bracket – long setback – solid model – show

Rather than glue a PETG filament snippet into a screw, I turned a little Delrin plug:

Tour Easy Rear Fender Bracket - screw insert
Tour Easy Rear Fender Bracket – screw insert

It’s ready for installation when I’m willing to put the bike up on the rack and pull the rear wheel:

Tour Easy Rear Fender Bracket - screw detail
Tour Easy Rear Fender Bracket – screw detail

That’s actually the second iteration for the screw, as the first suffered a lethal encounter with the Greater Shopvac. I know exactly where it is, but I’m not going there …

M2 Nozzle Clog: FOD

This happened while switching from natural to black PETG:

M2 nozzle clog - exterior
M2 nozzle clog – exterior

A closer look:

M2 nozzle clog - exterior detail
M2 nozzle clog – exterior detail

Those pix happened after trying to extract whatever-it-is with tweezers, so it’s definitely something with a higher melting point than PETG.

Removing the (warm) nozzle with the block held in a vise reveals a tuft of something:

M2 nozzle clog - interior
M2 nozzle clog – interior

The tuft accumulated several turns while unthreading the nozzle from the hot end.

Heating the nozzle a bit more released the tuft:

M2 nozzle clog - extracted tuft
M2 nozzle clog – extracted tuft

The black-to-clear transition tailing off at the bottom came from the PETG around the tuft in the cone-shaped end of the nozzle above the aperture. The 100 mil squares suggest the tuft was a distinct entity, rather than a collection of threads, and might have been over 5 mm long.

Perhaps a fragment of PTFE or another high-melting-point plastic?

Reassemble in reverse order, reset the nozzle to Z=0 on the platform, and it’s all good.

Tour Easy: Bafang 48 V 11.6 A·h Battery Mount

Bafang BBS02 batteries should mount on the water bottle bosses along a more-or-less standard bicycle’s downtube, which a Tour Easy recumbent has only in vestigial form. The battery does, however, fit perfectly along the lower frame tubes:

Tour Easy Bafang mid-drive - battery
Tour Easy Bafang mid-drive – battery

You might be forgiven for thinking Gardner Martin (not to be confused with Martin Gardner of Scientific American fame) designed the Tour Easy frame specifically to hold that battery, but the design dates back to the 1970s and it’s just a convenient coincidence.

The battery slides into a flat baseplate and locks in place, although it’s definitely not a high-security design. Mostly, the lock suffices to keep honest people honest and prevent the battery from vibrating loose while riding:

Tour Easy Bafang battery mount - baseplate installed
Tour Easy Bafang battery mount – baseplate installed

The flat enclosure toward the rear was obviously designed for more complex circuitry than it now contains:

Tour Easy Bafang battery mount - interior
Tour Easy Bafang battery mount – interior

Those are all neatly drilled and tapped M3 machine screw holes. The cable has no strain relief, despite the presence of suitable holes at the rear opening. I tucked the spare cable inside, rather than cut it shorter, under the perhaps unwarranted assumption they did a good job crimping / soldering the wires to the terminals.

The red frame tubes are not parallel, so each of the four mounting blocks fits in only one location. They’re identified by the side-to-side tube measurement at their centerline and directional pointers:

Bafang Battery Mount - Show bottom
Bafang Battery Mount – Show bottom

The first three blocks have a hole for the mounting screw through the battery plate. The central slot fits around the plate’s feature for the recessed screw head. The two other slots clear the claws extending downward from the battery into the plate:

Bafang Battery Mount - Show view
Bafang Battery Mount – Show view

The rear block has a flat top and a recessed screw head, because the fancy metal enclosure doesn’t have a screw hole:

Tour Easy Bafang battery mount - top detail
Tour Easy Bafang battery mount – top detail

I thought of drilling a hole through the plate, but eventually put a layer of carpet tape atop the block to encourage it to not slap around, as the whole affair isn’t particularly bendy. We’ll see how well it works on the road.

I had intended to put an aluminum plate across the bottom to distribute the clamping force from the screw, but found a suitable scrap of the institutional-grade cafeteria tray we used as a garden cart seat:

Tour Easy Bafang battery mount - bottom detail
Tour Easy Bafang battery mount – bottom detail

I traced around the block, bandsawed pretty close to the line, then introduced it to Mr Disk Sander for final shaping.

The round cable runs from the rear wheel speed sensor through all four blocks to join the motor near the bottom bracket. Because a recumbent bike’s rear wheel is much further from its bottom bracket, what you see is actually an extension cable with a few extra inches doubled around its connection just ahead of the battery.

Each of the four blocks takes about an hour to print, so I did them individually while making continuous process improvements to the solid model:

Bafang Battery Mount - Build view
Bafang Battery Mount – Build view

The heavy battery cable runs along the outside of the left frame tube, with enough cable ties to keep it from flopping around:

Tour Easy Bafang battery mount - bottom view
Tour Easy Bafang battery mount – bottom view

I wanted to fit it between the tubes, but there just wasn’t enough room around the screw in the front block where the tubes converge. It’s still pretty well protected and should be fine.

The chainline worked out much better than I expected:

Tour Easy Bafang battery mount - chainline
Tour Easy Bafang battery mount – chainline

That’s with the chain on the lowest (most inboard) rear sprocket, so it’s as close to the battery as it gets. I’m sure the battery will accumulate oily chain grime, as does everything else on a bike.

Lithium batteries have a vastly higher power density than good old lead acid batteries, but seven pounds is still a lot of weight!

The OpenSCAD source code as a GitHub Gist:

// Tour Easy Bafang Battery Mount
// Ed Nisley KE4ZNU 2021-04
Layout = "Build"; // [Frame,Block,Show,Build,Bushing,Cateye]
FrameWidths = [60.8,62.0,63.4,66.7]; // last = rear overhang support block
Support = true;
//- Extrusion parameters must match reality!
/* [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);
ID = 0;
OD = 1;
LENGTH = 2;
//----------
// Dimensions
// Bike frame lies along X axis, rear to +X
FrameTube = [350,22.6 + HoleWindage,22.6 + HoleWindage]; // X = longer than anything else
FrameAngle = atan((65.8 - 59.4)/300); // measured distances = included angle between tubes
TubeAngle = FrameAngle/2; // .. frame axis to tube
FrameSides = 24;
echo(str("Frame angle: ",FrameAngle));
SpeedOD = 3.5; // speed sensor cable along frame
PowerOD = 6.7; // power cable between frame tubes
BatteryBoss = [5.5,16.0,2.5]; // battery mount boss, center is round
BossSlotOAL = 32.0; // .. end bosses are elongated
BossOC = 65.0; // .. along length of mount
LatchWidth = 10.0; // battery latches to mount plate
LatchThick = 1.5;
LatchOC = 56.0;
WallThick = 5.0; // thinnest wall
Block = [25.0,78.0,FrameTube.z + 2*WallThick]; // must be larger than frame tube spacing
echo(str("Block: ",Block));
// M5 SHCS nyloc nut
Screw = [5.0,8.5,5.0]; // OD, LENGTH = head
Washer = [5.5,10.1,1.0];
Nut = [5.0,9.0,5.0];
// 10-32 Philips nyloc nut
Screw10 = [5.2,9.8,3.6]; // OD, LENGTH = head
Washer10 = [5.5,11.0,1.0];
Nut10 = [5.2,10.7,6.2];
Kerf = 1.0; // cut through middle to apply compression
CornerRadius = 5.0;
EmbossDepth = 2*ThreadThick; // lettering depth
//----------------------
// 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(d=(FixDia + HoleWindage),h=Height,$fn=Sides);
}
// clamp overall shape
module ClampBlock() {
difference() {
hull()
for (i=[-1,1], j=[-1,1])
translate([i*(Block.x/2 - CornerRadius),j*(Block.y/2 - CornerRadius),-Block.z/2])
cylinder(r=CornerRadius,h=Block.z,$fn=4*8);
translate([0,0,-(Block.z/2 + Protrusion)])
rotate(0*180/6)
PolyCyl(Screw[ID],Block.z + 2*Protrusion,6);
cube([2*Block.x,2*Block.y,Kerf],center=true);
translate([0,-(Block.y/2 - PowerOD + Protrusion/2),-PowerOD/2])
cube([2*Block.x,2*PowerOD + Protrusion,PowerOD],center=true);
}
}
// frame tube layout with measured side-to-side width
module Frame(Outer = FrameWidths[0],AdjustDia = 0.0) {
TubeOC = Outer - FrameTube.y/cos(TubeAngle); // increase dia for angle
for (i=[-1,1])
translate([0,i*TubeOC/2,0])
rotate([0,90,i*TubeAngle]) rotate(180/FrameSides)
cylinder(d=FrameTube.z + AdjustDia,h=FrameTube.x,center=true,$fn=FrameSides);
}
// complete clamp block
module Clamp(Outer = FrameWidths[0]) {
TubeOC = Outer - FrameTube.y/cos(TubeAngle); // increase dia for angle
difference() {
ClampBlock();
Frame(Outer);
translate([0,(TubeOC/2 - FrameTube[OD]/2),-SpeedOD/2])
cube([2*Block.x,2*SpeedOD,SpeedOD],center=true);
translate([0,15,Block.z/2 - EmbossDepth/2 + Protrusion])
cube([9.0,8,EmbossDepth],center=true);
translate([0,22,-Block.z/2 + EmbossDepth/2 - Protrusion])
cube([9.0,26,EmbossDepth],center=true);
if (Outer == FrameWidths[len(FrameWidths) - 1]) { // special rear block
translate([0,0,Block.z/2 - 2*Screw10[LENGTH]])
PolyCyl(Washer10[OD],2*Screw10[LENGTH] + Protrusion,6);
}
else { // other blocks have channels
translate([0,0,Block.z/2 - BatteryBoss[LENGTH]/2 + Protrusion])
cube([BossSlotOAL,BatteryBoss[OD],BatteryBoss[LENGTH] + Protrusion],center=true);
for (i=[-1,1])
translate([0,i*LatchOC/2,Block.z/2 - LatchThick/2 + Protrusion])
cube([BossSlotOAL,LatchWidth,LatchThick + Protrusion],center=true);
}
}
translate([0,15,Block.z/2 - EmbossDepth])
linear_extrude(height=EmbossDepth)
rotate(90)
text(text="^",size=5,spacing=1.00,font="Bitstream Vera Sans:style=Bold",
halign="center",valign="center");
translate([0,22,-Block.z/2])
linear_extrude(height=EmbossDepth)
rotate(-90) mirror([0,1,0])
text(text=str("^ ",Outer),size=4.5,spacing=1.00,font="Bitstream Vera Sans:style=Bold",
halign="center",valign="center");
if (Support)
color("Yellow") {
NumRibs = 7;
RibOC = Block.x/(NumRibs - 1);
intersection() {
translate([0,0,Block.z/2 + Kerf/2])
cube([2*Block.x,2*Block.y,Block.z],center=true);
union() for (j=[-1,1]) {
translate([0,j*TubeOC/2,Kerf/2])
cube([1.1*Block.x,FrameTube.y - 2*ThreadThick,4*ThreadThick],center=true);
for (i=[-floor(NumRibs/2):floor(NumRibs/2)])
translate([i*RibOC,j*TubeOC/2,0])
rotate([0,90,0]) rotate(180/FrameSides)
cylinder(d=FrameTube.z - 2*ThreadThick,h=2*ThreadWidth,$fn=FrameSides,center=true);
}
}
}
}
// Half clamp sections for printing
module HalfClamp(i = 0, Section = "Upper") {
render()
intersection() {
translate([0,0,Block.z/4])
cube([Block.x,Block.y,Block.z/2],center=true);
if (Section == "Upper")
translate([0,0,-Kerf/2])
Clamp(FrameWidths[i]);
else
translate([0,0,Block.z/2])
Clamp(FrameWidths[i]);
}
}
// Handlebar bushing for controller
BushingSize = [16.0,22.2,15.0];
module Bushing() {
difference() {
cylinder(d=BushingSize[OD],h=BushingSize[LENGTH],$fn=24);
translate([0,0,-Protrusion])
cylinder(d=BushingSize[ID],h=2*BushingSize[LENGTH],$fn=24);
translate([0*(BushingSize[OD] - BushingSize[ID])/4,0,BushingSize[LENGTH]/2])
cube([2*BushingSize[OD],2*ThreadWidth,2*BushingSize[LENGTH]],center=true);
}
}
// Cateye cadence sensor bracket
module Cateye() {
Pivot = [3.0,10.0,8.0];
Slot = [4.2,14.0,14.0];
Clip = [8.0,Slot.y,Slot.z + Pivot[OD]/2];
translate([0,0,Clip.z])
difference() {
union() {
translate([0,0,-Clip.z/2])
cube(Clip,center=true);
translate([-Clip.x/2,0,0])
rotate([0,90,0])
cylinder(d=Clip.y,h=Clip.x,$fn=12);
}
translate([-Clip.x,0,0])
rotate([0,90,0]) rotate(180/6)
PolyCyl(3.0,2*Clip.x,6);
translate([0,0,-(Clip.z - Slot.z/2)])
cube(Slot + [0,Protrusion,Protrusion],center=true);
}
}
//----------
// Build them
if (Layout == "Frame")
Frame();
if (Layout == "Block")
ClampBlock();
if (Layout == "Bushing")
Bushing();
if (Layout == "Cateye")
Cateye();
if (Layout == "Upper" || Layout == "Lower")
HalfClamp(0,Layout);
if (Layout == "Show") {
Clamp();
color("Red", 0.3)
Frame();
}
if (Layout == "Build") {
n = len(FrameWidths);
gap = 1.2;
for (i=[0:n-1]) {
j = i - ceil((n-1)/2);
translate([-gap*Block.y/2,j*gap*Block.x,0])
rotate(90)
HalfClamp(i,"Upper");
translate([gap*Block.y/2,j*gap*Block.x,0])
rotate([0,0,90])
HalfClamp(i,"Lower");
}
}

Tour Easy Rear Fender Bracket: More Cable Clearance

Most likely due to the fiddling around the larger rear brake noodle, the 3D printed bracket holding the fender to the frame failed:

Tour Easy Rear Fender Bracket - failed joint
Tour Easy Rear Fender Bracket – failed joint

Hey, it lasted for six years.

Making another one just like the other one, but with a little more clearance for the brake cable fittings, required a few tweaks to the solid model:

Rear Fender Bracket - more clearance
Rear Fender Bracket – more clearance

It’s slightly less chunky and holds the fender a bit closer to the tire:

Tour Easy Rear Fender Bracket - new vs old clearance
Tour Easy Rear Fender Bracket – new vs old clearance

The piece over on the left cupping the fender wasn’t broken, so I scuffed up the mating surfaces, applied a layer of JB Plastic Bonder (my new go-to adhesive for printed stuff), clamped it overnight, and it looked OK.

While that was curing, I shortened the screw holding the clamp to the bike frame:

Tour Easy Rear Fender Bracket - cutoff wheel dust collection
Tour Easy Rear Fender Bracket – cutoff wheel dust collection

The shop vac nozzle does a great job of collecting all the abrasive dust; highly recommended.

Because I had a dollop of adhesive left over, I applied a 1.8 mm drill (from a set of metric bits I’d been meaning to buy for far too long) to the screw:

Tour Easy Rear Fender Bracket - screw drilling
Tour Easy Rear Fender Bracket – screw drilling

And glued a snippet of pretty blue PETG filament in the hole:

Tour Easy Rear Fender Bracket - frame screw PETG insert
Tour Easy Rear Fender Bracket – frame screw PETG insert

As far as I can tell, this will have no effect on the screw’s goodness, but it makes me feel better about crunching it onto the frame.

Installation goes like you’d expect and there’s now enough clearance to keep the brake hardware off the bracket:

Tour Easy Rear Fender Bracket - installed
Tour Easy Rear Fender Bracket – installed

I replaced the boot while installing the larger noodle; perhaps I should have trimmed most of it away.

The riding season is upon us!

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;
translate([-hr,-hr,0])
linear_extrude(height=t,convexity=3)
offset(r=ofs)
import(
file="/mnt/bulkdata/Project Files/Tektronix Circuit Computer/Firmware/TekCC-Cursor-Mark.svg",
center=false);
}
//----------------------
// Show-n-Tell cursor
module Cursor() {
difference() {
CursorSVG(CursorThick,0.0);
translate([0,0,-Protrusion])
rotate(180/6)
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])
cylinder(r=CornerRad,h=Fixture.z,$fn=24);
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])
translate([x,y,0])
cylinder(d=4*ThreadWidth,h=1,$fn=6);
# for (x=[-30.0,130.0,150.0])
translate([x,0,0])
cylinder(d=4*ThreadWidth,h=1,$fn=6);
*/
for (pt=Screws)
translate(pt + [0,0,-Protrusion])
rotate(180/6)
PolyCyl(ScrewClear,Fixture.z + 2*Protrusion,6);
}
}
}
//----------------------
// Build it
if (Layout == "Cursor") {
Cursor();
}
if (Layout == "Show") {
rotate([0*90,0,0]) {
Fixture();
color("Green",0.3)
translate(-FixtureGrid/2 + CursorOffset + [0,0,Fixture.z + Gap])
Cursor();
}
}
if (Layout == "Build"){
// rotate(90)
Fixture();
}

Torchiere Lamp Shade 2

Three and a half years later, the shade on the living room’s other torchiere lamp crumbled at a touch:

Torchiere Lamp Shade 2 - crumbled
Torchiere Lamp Shade 2 – crumbled

Because I live in the future and had solved this problem in the past, eight hours of print time produced a second shade:

Torchiere Lamp Shade 2 - on platform
Torchiere Lamp Shade 2 – on platform

I sliced the same STL file with PrusaSlicer to get G-Code incorporating whatever configuration changes I’ve made to the M2 over the years and include any slicing algorithm improvements; the OpenSCAD code remains unchanged.

The as-printed shade had pretty much the same crystalline aspect as the first one:

Torchiere Lamp Shade 2 - no epoxy
Torchiere Lamp Shade 2 – no epoxy

Smoothing a layer of white-tinted epoxy over the interior while spinning it slowly in the mini-lathe calmed it down enough for our simple needs, although the picture I tried to take didn’t show much difference.

That was easy …

Photo Backdrop: Wingnut Upgrade

You’re supposed to secure the photo backdrop’s top crossbar to the uprights by fiddling with a wingnut, which you must do while reaching over your head. Emart apparently realized this operation was fraught with peril, because the package contains four wingnuts. After setting it up once, I replaced the wingnuts with finger-friendly knobs containing acorn nuts:

Photo Backdrop - thumbscrew vs printed knob
Photo Backdrop – thumbscrew vs printed knob

The upright pole ends in an M10×1.5 stud, which fits the biggest acorn nuts in the Warehouse Wing.

The knobs come from Thingiverse, although the OpenSCAD program required a bit of rework to make it compatible with the current version. Fiddling around with the Customizer parameters produced a Good Enough knob:

M10x1.5 Acorn Nut knob - solid model
M10x1.5 Acorn Nut knob – solid model

I pulled the acorn nut into the knob using the upright pole hardware to keep it aligned. Spin the wingnut on the stud “backwards”, add the washer, push the nut slightly into the knob to get it started, then thread it onto the stud:

Photo Backdrop - knob nut seating - 1
Photo Backdrop – knob nut seating – 1

Turn the knob to pull the nut inward until the stud hits the inside of the nut:

Photo Backdrop - knob nut seating - 2
Photo Backdrop – knob nut seating – 2

Unthread the nut a bit, run the wingnut out to meet the bottom of the knob, and repeat the operation until the nut bottoms out inside the knob:

Photo Backdrop - knob nut seated
Photo Backdrop – knob nut seated

Toss the wingnuts into the Warehouse Wing against later use.

Bonus project: on the other end of the upright, you’ll find it impossible to actually lock the leg carrier against the pole:

Photo Backdrop - tripod leg lock
Photo Backdrop – tripod leg lock

The plastic fitting is … generously … sized around the 25 mm OD upright pole and requires more compression than I could produce with my puny fingers. It turns out the 18 mm OD leg tube exactly fills the space available inside the fitting, so you (well, I) must squash the steel tube in order to close the fitting on the pole.

Remove the wingnut + screw to free the end of the leg, stick an inch of the leg into the bench vise’s soft jaws, and mash gently to about 16 mm across the holes; it’ll expand slightly in the other direction. Reassemble in reverse order and discover the thumbscrew now squeezes the fitting exactly as it should.

There might be more finishing to do when we actually hang a quilt from the stand, but at least it’s now usable.

Sheesh and similar remarks.