Descending from the previous bearings / sleeves / bushings, I added a rib to hold them in place as the rod slides back and forth while fiddling with fabric:

An idealized serving suggestion:

Which might count as the “better design” I expected it would need.
They’re still almost invisible in use:

Which is as it should be: inconspicuous, no more black dust, and E-Z rotation.
The modified OpenSCAD source code is added to the original GitHub Gist:
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| // Bushing for HQ Sixteen table rods | |
| // Ed Nisley – KE4ZNU | |
| // 2026-02-20 | |
| // 2026-09-29 add retaining rib | |
| include <BOSL2/std.scad> | |
| Layout = "Show"; // [Show,Build] | |
| /* [Hidden] */ | |
| ID = 0; | |
| OD = 1; | |
| LENGTH = 2; | |
| HoleWindage = 0.2; | |
| Protrusion = 0.1; | |
| NumSides = 8*3*2*4; | |
| $fn=NumSides; | |
| Rod = [25.0,28.7,100.0]; // very short rod | |
| Sleeve = [Rod[OD] + 0.3,31.2 – 0.2,9.0]; // LENGTH = overall | |
| Rim = [Sleeve[ID],Sleeve[OD] + 6.0,0.6]; | |
| LockRing = [Sleeve[ID],Sleeve[OD] + 2*(1.0),4.0]; // locks sleeve on plate | |
| IdlerLength = 15.0; // far right end of rods | |
| NumSlots = 2*4; | |
| Kerf = 1.0; | |
| Gap = 5.0; | |
| module Bushing(oal,lk=false) { | |
| difference() { | |
| union() { | |
| tube(oal,id=Sleeve[ID],od=Sleeve[OD],anchor=BOTTOM); | |
| tube(Rim[LENGTH],id=Rim[ID],od=Rim[OD],anchor=BOTTOM); | |
| if (lk) | |
| up(oal) | |
| tube(LockRing[LENGTH],id=LockRing[ID],od=LockRing[OD],chamfer=LockRing[LENGTH]/3,anchor=TOP); | |
| } | |
| for (a=[0:NumSlots-1]) | |
| zrot(a*360/NumSlots) | |
| up(oal/4 + Rim[LENGTH]) | |
| right(Sleeve[ID]/2) | |
| cuboid([Sleeve[OD],Kerf,oal],anchor=BOTTOM); | |
| } | |
| } | |
| //—– | |
| // Build things | |
| if (Layout == "Show") { | |
| color("Gray",0.5) | |
| xcyl(Rod[LENGTH],d=Rod[OD]); | |
| right(Rod[LENGTH]/3) | |
| zrot(180) yrot(90) | |
| Bushing(Sleeve[LENGTH]); | |
| left(Rod[LENGTH]/3) | |
| yrot(90) | |
| Bushing(IdlerLength,lk=true); | |
| } | |
| if (Layout == "Build") { | |
| right(Rim[OD]/2 + Gap/2) | |
| Bushing(Sleeve[LENGTH]); | |
| left(Rim[OD]/2 + Gap/2) | |
| Bushing(IdlerLength,lk=true); | |
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| // Bearing sleeve for HQ Sixteen table rods | |
| // Ed Nisley – KE4ZNU | |
| // 2026-02-20 | |
| include <BOSL2/std.scad> | |
| Layout = "Show"; // [Show,Build] | |
| /* [Hidden] */ | |
| ID = 0; | |
| OD = 1; | |
| LENGTH = 2; | |
| HoleWindage = 0.2; | |
| Protrusion = 0.1; | |
| NumSides = 8*3*2*4; | |
| $fn=NumSides; | |
| Rod = [25.0,28.7,100.0]; // very short rod | |
| Sleeve = [Rod[OD] + 0.3,31.2 – 0.2,9.0]; // LENGTH = overall | |
| Rim = [Sleeve[ID],Sleeve[OD] + 6.0,0.6]; | |
| IdlerLength = 15.0; | |
| NumSlots = 2*4; | |
| Kerf = 1.0; | |
| Gap = 5.0; | |
| module Bearing(oal) { | |
| difference() { | |
| union() { | |
| tube(oal,id=Sleeve[ID],od=Sleeve[OD],anchor=BOTTOM); | |
| tube(Rim[LENGTH],id=Rim[ID],od=Rim[OD],anchor=BOTTOM); | |
| } | |
| for (a=[0:NumSlots-1]) | |
| zrot(a*360/NumSlots) | |
| up(oal/4 + Rim[LENGTH]) | |
| right(Sleeve[ID]/2) | |
| cuboid([Sleeve[OD],Kerf,oal],anchor=BOTTOM); | |
| } | |
| } | |
| //—– | |
| // Build things | |
| if (Layout == "Show") { | |
| color("Gray",0.5) | |
| xcyl(Rod[LENGTH],d=Rod[OD]); | |
| right(Rod[LENGTH]/3) | |
| yrot(90) | |
| Bearing(Sleeve[LENGTH]); | |
| left(Rod[LENGTH]/3) | |
| yrot(90) | |
| Bearing(IdlerLength); | |
| } | |
| if (Layout == "Build") { | |
| right(Rim[OD]/2 + Gap/2) | |
| Bearing(Sleeve[LENGTH]); | |
| left(Rim[OD]/2 + Gap/2) | |
| Bearing(IdlerLength); | |
| } |
Spam comments get trashed, so don’t bother; you’re not as clever as you think. Comment moderation may cause a delay.