The instructions for the Photo Backdrop frame (upon which we hang Mary’s quilts for photos) suggest the crossbar fits on like this:

The slot in the bottom is wider than the M10 stud, so the crossbar tends to flop around while assembling it overhead. I immediately replaced the wingnut with a chunky knob for better griptitude, but was never happy with how poorly the whole thing fit together.
This is dramatically better:

The crossbar is upside-down from the OEM instructions, but the bottom of the gray plug holds the tube firmly to the tripod while the nut seats firmly on the plug’s flat top:

A snippet of 3M 300LSE adhesive sheet holds the plug in place, so that’s one less thing to fiddle with on each end.
The solid model holds no surprises:

Of course, it builds with the flat end downward.
The OpenSCAD source code as a GitHub Gist:
| // Photo backdrop fitting | |
| // Ed Nisley – KE4ZNU | |
| // 2026-07-01 | |
| include <BOSL2/std.scad> | |
| Layout = "Show"; // [Build,Show] | |
| /* [Hidden] */ | |
| ID = 0; | |
| OD = 1; | |
| LENGTH = 2; | |
| HoleWindage = 0.2; | |
| Protrusion = 0.01; | |
| NumSides = 3*2*4; | |
| Clearance = 0.3; | |
| $fn=NumSides; | |
| Tube = [23.0 – HoleWindage,1*INCH,100.0]; // arbitrary length | |
| Aperture = [24.0,15.0,100.0]; // oblong nut hole, arbitrary Z | |
| Washer = [10.5,20.0,1.5]; // M10 | |
| //—– | |
| // Define things | |
| module Fitting() { | |
| difference() { | |
| union() { | |
| intersection() { | |
| xcyl(Tube[LENGTH],d=Tube[ID]); | |
| cuboid(Aperture,rounding=Aperture.y/2,edges="Z"); | |
| } | |
| cuboid([Aperture.x,Aperture.y,Tube[OD]/2],rounding=Aperture.y/2,edges="Z",anchor=BOTTOM); | |
| } | |
| cyl(Aperture.z,d=Washer[ID]); | |
| } | |
| } | |
| //—– | |
| // Build things | |
| if (Layout == "Show") { | |
| Fitting(); | |
| } | |
| if (Layout == "Build") { | |
| up(Tube[OD]/2) | |
| xrot(180) | |
| Fitting(); | |
| } | |
Spam comments get trashed, so don’t bother. Comment moderation may cause a delay.