-
Dirt Devil Vacuum Tool Adapters
Being the domain expert for adapters between a new vacuum cleaner and old tools, this made sense (even though it’s not our vacuum):

Dirt Devil Nozzle Bushing – solid model The notch snaps into a Dirt Devil Power Stick vacuum cleaner and the tapered end fits a variety of old tools for other vacuum cleaners:

Dirt Devil Nozzle Bushing top view – solid model Having some experience breaking thin-walled adapters, these have reinforcement from a PVC tube:

Dirt Devil adapter – parts A smear of epoxy around the interior holds the tube in place:

Dirt Devil adapters – assembled Building the critical dimensions with a 3D printed part simplified the project, because I could (and did!) tweak the OpenSCAD code to match the tapers to the tools. Turning four of those tubes from a chunk of PVC conduit, however, makes a story for another day.
The OpenSCAD source code as a 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// Dirt Devil nozzle adapter // Ed Nisley KE4ZNU 2021-10 // Tool taper shift Finesse = -0.1; // [-0.5:0.1:0.5] // PVC pipe liner PipeOD = 28.5; /* [Hidden] */ //- Extrusion parameters ThreadThick = 0.25; ThreadWidth = 0.40; HoleWindage = 0.2; function IntegerMultiple(Size,Unit) = Unit * ceil(Size / Unit); Protrusion = 0.1; // make holes end cleanly //———————- // Dimensions TAPER_MIN = 0; TAPER_MAX = 1; TAPER_LENGTH = 2; Socket = [36.0,37.0,40.0]; LockringDia = 33.5; LockringWidth = 4.5; LockringOffset = 2.5; Tool = [Finesse,Finesse,0] + [30.0,31.1,30.0]; AdapterOAL = Socket[TAPER_LENGTH] + Tool[TAPER_LENGTH]; NumSides = 36; $fn = NumSides; //———————- // 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); } //——————- // Define it! module Adapter() { difference() { union() { difference() { cylinder(d1=Socket[TAPER_MIN],d2=Socket[TAPER_MAX],h=Socket[TAPER_LENGTH]); translate([0,0,LockringOffset]) cylinder(d=2*Socket[TAPER_MAX],h=LockringWidth); } cylinder(d=LockringDia,h=Socket[TAPER_LENGTH]); translate([0,0,LockringOffset + 0.75*LockringWidth]) cylinder(d1=LockringDia,d2=Socket[TAPER_MIN],h=0.25*LockringWidth); translate([0,0,Socket[TAPER_LENGTH]]) cylinder(d1=Tool[TAPER_MAX],d2=Tool[TAPER_MIN],h=Tool[TAPER_LENGTH]); } translate([0,0,-Protrusion]) PolyCyl(PipeOD,AdapterOAL + 2*Protrusion,NumSides); } } //———————- // Build it! Adapter(); The taper in the code almost certainly won’t fit whatever tool you have: measure thrice, print twice, and maybe fit once …