Skip to content

Instantly share code, notes, and snippets.

@ednisley
Created July 1, 2016 23:50
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ednisley/3abd52a288b9f90c9e07aeb246042eb6 to your computer and use it in GitHub Desktop.
Save ednisley/3abd52a288b9f90c9e07aeb246042eb6 to your computer and use it in GitHub Desktop.
OpenSCAD source code: shop vacuum adapters for PVC pipe fittings
// Vacuum Hose Fittings
// Ed Nisley KE4ZNU July 2016
Layout = "FVacFitting"; // PVCtoHose ExpandRing PipeToPort FVacPipe FVacFitting
//- Extrusion parameters must match reality!
// Print with 2 shells and 3 solid layers
ThreadThick = 0.25;
ThreadWidth = 0.40;
HoleWindage = 0.2;
Protrusion = 0.1; // make holes end cleanly
//----------------------
// Dimensions
ID = 0;
OD = 1;
LENGTH = 2;
Pipe = [34.0,(41.0 + HoleWindage),16.0]; // 1 inch PVC pipe fitting
VacPortSander = [30.0,31.3,25]; // vacuum port on belt sander (taper ID to OD over length)
VacNozzle = [30.1,31.8,30.0]; // nozzle on vacuum hose (taper ID to OD over length)
MINOR = 0;
MAJOR = 1;
PITCH = 2;
FORM_OD = 3;
HoseThread = [32.0,(37.0 + HoleWindage),4.25,(1.8 + 0.20)]; // vacuum tube thread info
NumSegments = 64; // .. number of cylinder approximations per turn
$fn = NumSegments;
ThreadLength = 4 * HoseThread[PITCH];
ScrewOAL = ThreadLength + HoseThread[PITCH];
WallThick = 2.5;
echo(str("Pitch dia: ",HoseThread[MAJOR]));
echo(str("Root dia: ",HoseThread[MAJOR] - HoseThread[FORM_OD]));
echo(str("Crest dia: ",HoseThread[MAJOR] + HoseThread[FORM_OD]));
//----------------------
// Wrap cylindrical thread segments around larger plug cylinder
module CylinderThread(Pitch,Length,PitchDia,ThreadOD,PerTurn,Chirality = "Right") {
CylFudge = 1.02; // force overlap
ThreadSides = 6;
RotIncr = 1/PerTurn;
PitchRad = PitchDia/2;
Turns = Length/Pitch;
NumCyls = Turns*PerTurn;
ZStep = Pitch / PerTurn;
HelixAngle = ((Chirality == "Left") ? -1 : 1) * atan(Pitch/(PI*PitchDia));
CylLength = CylFudge * (PI*(PitchDia + ThreadOD) / PerTurn) / cos(HelixAngle);
for (i = [0:NumCyls-1]) {
Angle = ((Chirality == "Left") ? -1 : 1) * 360*i/PerTurn;
translate([PitchRad*cos(Angle),PitchRad*sin(Angle),i*ZStep])
rotate([90+HelixAngle,0,Angle]) rotate(180/ThreadSides)
cylinder(r1=ThreadOD/2,
r2=ThreadOD/(2*CylFudge),
h=CylLength,
center=true,$fn=ThreadSides);
}
}
//-- PVC fitting to vacuum hose
module PVCtoHose() {
Fitting = [34.0,41.0,16.0]; // 1 inch PVC elbow
Adapter = [HoseThread[MAJOR],(Fitting[OD] + 2*WallThick + HoleWindage),(ScrewOAL + Fitting[LENGTH])]; // dimensions for entire fitting
union() {
difference() {
cylinder(d=Adapter[OD],h=Adapter[LENGTH]); // overall fitting
translate([0,0,-Protrusion]) // remove thread pitch dia
cylinder(d=HoseThread[MAJOR],h=(ScrewOAL + 2*Protrusion));
translate([0,0,(ScrewOAL - Protrusion)]) // remove PVC fitting dia
cylinder(d=(Fitting[OD] + HoleWindage),h=(Fitting[LENGTH] + 2*Protrusion));
}
translate([0,0,HoseThread[PITCH]/2]) // add the thread form
CylinderThread(HoseThread[PITCH],ThreadLength,HoseThread[MAJOR],HoseThread[FORM_OD],NumSegments,"Left");
}
}
//-- Expander ring from small OD to large ID PVC fittings
// So a small elbow on the bandsaw fits into the hose adapter, which may not be long-term useful
module ExpandRing() {
Fitting_L = [34.0,41.0,16.0]; // 1 inch PVC pipe elbow
Fitting_S = [26.8,32.8,17]; // 3/4 inch PVC elbow
difference() {
cylinder(d1=Fitting_L[OD],d2=(Fitting_L[OD] - HoleWindage),h=Fitting_L[LENGTH]); // overall fitting
translate([0,0,-Protrusion])
cylinder(d=(Fitting_S[OD] + HoleWindage),h=(Fitting_L[LENGTH] + 2*Protrusion));
}
}
//-- 1 inch PVC pipe into vacuum port
// Stick this in the port, then plug a fitting onto the pipe section
module PipeToPort() {
Pipe = [26.5,33.5,20.0]; // 1 inch Schedule 40 PVC pipe
difference() {
union() {
cylinder(d=Pipe[OD],h=(Pipe[LENGTH] + Protrusion));
translate([0,0,(Pipe[LENGTH] - Protrusion)])
cylinder(d1=VacNozzle[OD],d2=VacNozzle[ID],h=VacNozzle[LENGTH]);
}
translate([0,0,-Protrusion])
cylinder(d=Pipe[ID],h=(Pipe[LENGTH] + VacNozzle[LENGTH] + 2*Protrusion));
}
}
//-- Female Vac outlet inside PVC pipe
// Plug this into PVC fitting, then plug hose + nozzle into outlet
module FVacPipe() {
Pipe = [26.5,33.5,20.0]; // 1 inch Schedule 40 PVC pipe
difference() {
cylinder(d=Pipe[OD],h=VacPortSander[LENGTH]);
translate([0,0,-Protrusion])
cylinder(d1=VacPortSander[ID],d2=VacPortSander[OD],h=(VacPortSander[LENGTH] + 2*Protrusion));
}
}
//-- Female Vac outlet on 3/4 inch fitting OD
// Jam this onto OD of fitting, plug hose + nozzle into outlet
module FVacFitting() {
Adapter = [26.5,(33.5 + 2*WallThick),17.0]; // overall adapter
VacPortSander = [30.0,31.3,25]; // vacuum port on belt sander (taper ID to OD over length)
Fitting = [26.8,32.8,17]; // 3/4 inch PVC elbow
TaperLength = 5.0; // inner taper to avoid overhang
difference() {
cylinder(d=Adapter[OD],h=Adapter[LENGTH]); // overall fitting
translate([0,0,-Protrusion])
cylinder(d=(Fitting[OD] + HoleWindage),h=(Adapter[LENGTH] + 2*Protrusion));
}
translate([0,0,Adapter[LENGTH]])
difference() {
cylinder(d=Adapter[OD],h=TaperLength);
translate([0,0,-Protrusion])
cylinder(d1=(Fitting[OD] + HoleWindage),d2=VacPortSander[ID],h=(TaperLength + 2*Protrusion));
}
translate([0,0,(TaperLength + Adapter[LENGTH])]) // vac fitting
difference() {
cylinder(d=Adapter[OD],h=VacPortSander[LENGTH]);
translate([0,0,-Protrusion])
cylinder(d1=VacPortSander[ID],d2=VacPortSander[OD],h=(VacPortSander[LENGTH] + 2*Protrusion));
}
}
//----------
// Build things
if (Layout == "PVCtoHose")
PVCtoHose();
if (Layout == "ExpandRing") {
ExpandRing();
}
if (Layout == "PipeToPort") {
PipeToPort();
}
if (Layout == "FVacPipe") {
FVacPipe();
}
if (Layout == "FVacFitting") {
FVacFitting();
}
@ednisley
Copy link
Author

ednisley commented Jul 1, 2016

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment