diff --git a/.gitignore b/.gitignore index 5d381cc..c0c51bf 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,7 @@ +*.3mf +*.stl +*.gcode + # ---> Python # Byte-compiled / optimized / DLL files __pycache__/ diff --git a/bedclip/README.md b/bedclip/README.md new file mode 100644 index 0000000..21d8ccb --- /dev/null +++ b/bedclip/README.md @@ -0,0 +1,10 @@ +bedclip for clipping stuff like my glasses to the rail on the headboard of my bed. + +bedclip_thin_backhook7 is the most recent redesign, it (and likely any future designs) implement some important differences from previous attempts. + +* It is designed with an aggressive inward rake on both of the clip arms +* It relies on the flexibility of PETG to snap firmly onto the rail (which varies in width slightly from one side to the other) +* It applies tension near the bottom of the clip and pulls itself onto the rail when , unlike prior designs which seated firmly but had a tendency for the back to pop up onto a diagonal under tension. +* The hook is bigger to make it easier to hook stuff onto it blindly. + +Overall as of version 7, it's working quite well and is quite stable and secure across the whole rail. \ No newline at end of file diff --git a/bedclip/bedclip.scad b/bedclip/bedclip.scad new file mode 100644 index 0000000..83f3ee7 --- /dev/null +++ b/bedclip/bedclip.scad @@ -0,0 +1,41 @@ +raild = 64.9; +railh = 18.5; +clipt = 7; + +module rail_latch(x, y, z, m) { + difference() { + cube([x,y,z], center=true); + translate([0*-m,0,10-z]) rotate([0,25*-m,0]) cube([x+1,y+1,z], center=true); + //translate([5*-m,0,30.8-z]) rotate([0,5*-m,0]) cube([x+1,y+1,10], center=true); + //translate([5*-m,0,30.8-z]) rotate([0,25*-m,0]) cube([x+1,y+1,10], center=true); + + } + +} +module rail_clip() { + //cube([raild, clipt, railh], center=true); + union() { + translate([raild/2+2,0,-5]) rotate([0,5,0]) rail_latch(5,5,30,1); + translate([-raild/2-2,0,-5]) rotate([0,-5,0]) rail_latch(5,5,30,-1); + translate([0,0,railh/2+3.5]) cube([76.5,5,7], center=true); + + } +}; + +module hook() { + union() { + translate([0,0,3.251]) cube([3,3,6.502], center=true); + //translate([0,0,6.5+1.5]) cube([3,3,3], center=true); + //translate([5,0,6.5+1.5]) rotate([0,90,0]) rotate([0,0,45]) cylinder(h=7,d1=4.2, d2=1, center=true, $fn=4); + translate([2.5,0,6.5+1.5]) cube([8,3,3], center=true); + } +} + +module hooked_rail_clip() { + union() { + translate([-38,1,10]) rotate([0,-90,0]) hook(); + rail_clip(); + } +} + +hooked_rail_clip(); \ No newline at end of file diff --git a/bedclip/bedclip_thin.scad b/bedclip/bedclip_thin.scad new file mode 100644 index 0000000..66862ed --- /dev/null +++ b/bedclip/bedclip_thin.scad @@ -0,0 +1,42 @@ +raild = 64.9; +railh = 18.5; +clipt = 7; +clipt = 3; + +module rail_latch(x, y, z, m) { + difference() { + cube([x,y,z], center=true); + translate([0*-m,0,10-z]) rotate([0,25*-m,0]) cube([x+1,y+1,z], center=true); + //translate([5*-m,0,30.8-z]) rotate([0,5*-m,0]) cube([x+1,y+1,10], center=true); + //translate([5*-m,0,30.8-z]) rotate([0,25*-m,0]) cube([x+1,y+1,10], center=true); + + } + +} +module rail_clip() { + //cube([raild, clipt, railh], center=true); + union() { + translate([raild/2+2,0,-5]) rotate([0,5,0]) rail_latch(5,clipt,30,1); + translate([-raild/2-2,0,-5]) rotate([0,-5,0]) rail_latch(5,clipt,30,-1); + translate([0,0,railh/2+3.5]) cube([76.5,clipt,7], center=true); + + } +}; + +module hook() { + union() { + translate([0,0,3.251]) cube([3,3,6.502], center=true); + //translate([0,0,6.5+1.5]) cube([3,3,3], center=true); + //translate([5,0,6.5+1.5]) rotate([0,90,0]) rotate([0,0,45]) cylinder(h=7,d1=4.2, d2=1, center=true, $fn=4); + translate([2.5,0,6.5+1.5]) cube([8,3,3], center=true); + } +} + +module hooked_rail_clip() { + union() { + translate([-38,1,10]) rotate([0,-90,0]) hook(); + translate([0,1,0]) rail_clip(); + } +} + +hooked_rail_clip(); \ No newline at end of file diff --git a/bedclip/bedclip_thin_backhook.scad b/bedclip/bedclip_thin_backhook.scad new file mode 100644 index 0000000..6b8e666 --- /dev/null +++ b/bedclip/bedclip_thin_backhook.scad @@ -0,0 +1,55 @@ +raild = 64.9; +railh = 18.5; +clipt = 7; +clipt = 3; + +module rail_latch(x, y, z, m) { + rotate([0,m*5,0]) difference() { + cube([x,y,z], center=true); + translate([0*-m,0,10-z]) rotate([0,25*-m,0]) cube([x+1,y+1,z], center=true); + //translate([5*-m,0,30.8-z]) rotate([0,5*-m,0]) cube([x+1,y+1,10], center=true); + //translate([5*-m,0,30.8-z]) rotate([0,25*-m,0]) cube([x+1,y+1,10], center=true); + + } + +} +module back_latch(x, y, z, m) { + + union() { + translate([0,0,-8]) cube([x+2.5,y,z+15], center=true); + translate([-3,0,-29]) cube([x+2.5,y,3], center=true); + translate([-2.35,0,-25.9]) rotate([0,30,0]) cube([x+0.5,y,7], center=true); + //translate([0*-m,0,10-z]) rotate([0,25*-m,0]) cube([x+1,y+1,z], center=true); + //translate([5*-m,0,30.8-z]) rotate([0,5*-m,0]) cube([x+1,y+1,10], center=true); + //translate([5*-m,0,30.8-z]) rotate([0,25*-m,0]) cube([x+1,y+1,10], center=true); + + } + +} +module rail_clip() { + //cube([raild, clipt, railh], center=true); + union() { + translate([raild/2+2,0,-5]) back_latch(5,clipt,30,1); + translate([-raild/2-2,0,-5]) rail_latch(5,clipt,30,-1); + translate([0,0,railh/2+3.5]) cube([76.5,clipt,7], center=true); + + } +}; + +module hook() { + union() { + translate([0,0,3.251]) cube([3,3,6.502], center=true); + //translate([0,0,6.5+1.5]) cube([3,3,3], center=true); + //translate([5,0,6.5+1.5]) rotate([0,90,0]) rotate([0,0,45]) cylinder(h=7,d1=4.2, d2=1, center=true, $fn=4); + translate([2.5,0,6.5+1.5]) cube([8,3,3], center=true); + } +} + +module hooked_rail_clip() { + union() { + translate([-37.5,1,10]) rotate([0,-90,0]) hook(); + translate([0,1,0]) rail_clip(); + } +} + +rotate([90,0,0]) hooked_rail_clip(); \ No newline at end of file diff --git a/bedclip/bedclip_thin_backhook2.scad b/bedclip/bedclip_thin_backhook2.scad new file mode 100644 index 0000000..70b9bfc --- /dev/null +++ b/bedclip/bedclip_thin_backhook2.scad @@ -0,0 +1,55 @@ +raild = 64.9; +railh = 18.5; +clipt = 7; +clipt = 3; + +module rail_latch(x, y, z, m) { + rotate([0,m*5,0]) difference() { + cube([x,y,z], center=true); + translate([0*-m,0,10-z]) rotate([0,25*-m,0]) cube([x+1,y+1,z], center=true); + //translate([5*-m,0,30.8-z]) rotate([0,5*-m,0]) cube([x+1,y+1,10], center=true); + //translate([5*-m,0,30.8-z]) rotate([0,25*-m,0]) cube([x+1,y+1,10], center=true); + + } + +} +module back_latch(x, y, z, m) { + + union() { + translate([1.35,0,-8]) cube([x-0.1,y,z+15], center=true); + translate([-3,0,-29]) cube([x-0.5,y,3], center=true); + translate([-1.15,0,-25.9]) rotate([0,30,0]) cube([x+0.5,y,7], center=true); + //translate([0*-m,0,10-z]) rotate([0,25*-m,0]) cube([x+1,y+1,z], center=true); + //translate([5*-m,0,30.8-z]) rotate([0,5*-m,0]) cube([x+1,y+1,10], center=true); + //translate([5*-m,0,30.8-z]) rotate([0,25*-m,0]) cube([x+1,y+1,10], center=true); + + } + +} +module rail_clip() { + //cube([raild, clipt, railh], center=true); + union() { + translate([raild/2+2,0,-5]) back_latch(5,clipt,30,1); + translate([-raild/2-2,0,-5]) rail_latch(5,clipt,30,-1); + translate([0,0,railh/2+3.5]) cube([76.5,clipt,7], center=true); + + } +}; + +module hook() { + union() { + translate([0,0,3.251]) cube([3,3,6.502], center=true); + //translate([0,0,6.5+1.5]) cube([3,3,3], center=true); + //translate([5,0,6.5+1.5]) rotate([0,90,0]) rotate([0,0,45]) cylinder(h=7,d1=4.2, d2=1, center=true, $fn=4); + translate([2.5,0,6.5+1.5]) cube([8,3,3], center=true); + } +} + +module hooked_rail_clip() { + union() { + translate([-37.5,1,10]) rotate([0,-90,0]) hook(); + translate([0,1,0]) rail_clip(); + } +} + +rotate([90,0,0]) hooked_rail_clip(); \ No newline at end of file diff --git a/bedclip/bedclip_thin_backhook3.scad b/bedclip/bedclip_thin_backhook3.scad new file mode 100644 index 0000000..9e75122 --- /dev/null +++ b/bedclip/bedclip_thin_backhook3.scad @@ -0,0 +1,55 @@ +raild = 64.9; +railh = 18.5; +clipt = 7; +clipt = 3; + +module rail_latch(x, y, z, m) { + rotate([0,m*5,0]) difference() { + cube([x,y,z], center=true); + translate([0*-m,0,10-z]) rotate([0,25*-m,0]) cube([x+1,y+1,z], center=true); + //translate([5*-m,0,30.8-z]) rotate([0,5*-m,0]) cube([x+1,y+1,10], center=true); + //translate([5*-m,0,30.8-z]) rotate([0,25*-m,0]) cube([x+1,y+1,10], center=true); + + } + +} +module back_latch(x, y, z, m) { + + union() { + translate([0,0,2.99]) translate([1.35,0,-8]) cube([x-0.1,y,z+15], center=true); + translate([-3,0,-23]) cube([x-0.5,y,3], center=true); + translate([-1.15,0,-19.9]) rotate([0,30,0]) cube([x+0.5,y,7], center=true); + //translate([0*-m,0,10-z]) rotate([0,25*-m,0]) cube([x+1,y+1,z], center=true); + //translate([5*-m,0,30.8-z]) rotate([0,5*-m,0]) cube([x+1,y+1,10], center=true); + //translate([5*-m,0,30.8-z]) rotate([0,25*-m,0]) cube([x+1,y+1,10], center=true); + + } + +} +module rail_clip() { + //cube([raild, clipt, railh], center=true); + union() { + translate([raild/2+2,0,-5]) back_latch(5,clipt,24,1); + translate([-raild/2-2,0,-5]) rail_latch(5,clipt,30,-1); + translate([0,0,railh/2+3.5]) cube([76.5,clipt,7], center=true); + + } +}; + +module hook() { + union() { + translate([0,0,3.251]) cube([3,3,6.502], center=true); + //translate([0,0,6.5+1.5]) cube([3,3,3], center=true); + //translate([5,0,6.5+1.5]) rotate([0,90,0]) rotate([0,0,45]) cylinder(h=7,d1=4.2, d2=1, center=true, $fn=4); + translate([2.5,0,6.5+1.5]) cube([8,3,3], center=true); + } +} + +module hooked_rail_clip() { + union() { + translate([-37.5,1,10]) rotate([0,-90,0]) hook(); + translate([0,1,0]) rail_clip(); + } +} + +rotate([90,0,0]) hooked_rail_clip(); \ No newline at end of file diff --git a/bedclip/bedclip_thin_backhook4.scad b/bedclip/bedclip_thin_backhook4.scad new file mode 100644 index 0000000..7653309 --- /dev/null +++ b/bedclip/bedclip_thin_backhook4.scad @@ -0,0 +1,56 @@ +raild = 64.9; +railh = 18.5; +clipt = 7; +clipt = 3; + +module rail_latch(x, y, z, m) { + translate([1.1,0,0]) rotate([0,m*7,0]) difference() { + cube([x,y,z], center=true); + translate([0*-m,0,10-z]) rotate([0,25*-m,0]) cube([x+1,y+1,z], center=true); + translate([4.9,0,0]) rotate([0,-5,0]) cube([x,y+1,z], center=true); + //translate([5*-m,0,30.8-z]) rotate([0,5*-m,0]) cube([x+1,y+1,10], center=true); + //translate([5*-m,0,30.8-z]) rotate([0,25*-m,0]) cube([x+1,y+1,10], center=true); + + } + +} +module back_latch(x, y, z, m) { + + union() { + translate([0,0,1.251]) translate([1.35,0,-8]) cube([x-0.1,y,z+15], center=true); + translate([-3,0,-26.25]) cube([x-0.5,y,3], center=true); + translate([-1.15,0,-23.5]) rotate([0,40,0]) cube([x-0.5,y,7], center=true); + //translate([0*-m,0,10-z]) rotate([0,25*-m,0]) cube([x+1,y+1,z], center=true); + //translate([5*-m,0,30.8-z]) rotate([0,5*-m,0]) cube([x+1,y+1,10], center=true); + //translate([5*-m,0,30.8-z]) rotate([0,25*-m,0]) cube([x+1,y+1,10], center=true); + + } + +} +module rail_clip() { + //cube([raild, clipt, railh], center=true); + union() { + translate([raild/2+2,0,-5]) back_latch(5,clipt,27,1); + translate([-raild/2-2,0,-5]) rail_latch(5,clipt,30,-1); + translate([0,0,railh/2+3.5]) cube([76.5,clipt,7], center=true); + + } +}; + +module hook() { + union() { + translate([0,0,3.251]) cube([3,3,6.502], center=true); + //translate([0,0,6.5+1.5]) cube([3,3,3], center=true); + //translate([5,0,6.5+1.5]) rotate([0,90,0]) rotate([0,0,45]) cylinder(h=7,d1=4.2, d2=1, center=true, $fn=4); + translate([2.5,0,6.5+1.5]) cube([8,3,3], center=true); + } +} + +module hooked_rail_clip() { + union() { + translate([-37.5,1,10]) rotate([0,-90,0]) hook(); + translate([0,1,0]) rail_clip(); + } +} + +rotate([90,0,0]) hooked_rail_clip(); \ No newline at end of file diff --git a/bedclip/bedclip_thin_backhook5.scad b/bedclip/bedclip_thin_backhook5.scad new file mode 100644 index 0000000..1b07aa7 --- /dev/null +++ b/bedclip/bedclip_thin_backhook5.scad @@ -0,0 +1,55 @@ +raild = 64.9; +railh = 18.5; +clipt = 5; + +module rail_latch(x, y, z, m) { + translate([1.1,0,0]) rotate([0,m*7,0]) difference() { + cube([x,y,z], center=true); + translate([0*-m,0,10-z]) rotate([0,25*-m,0]) cube([x+1,y+1,z], center=true); + translate([4.9,0,0]) rotate([0,-5,0]) cube([x,y+1,z], center=true); + //translate([5*-m,0,30.8-z]) rotate([0,5*-m,0]) cube([x+1,y+1,10], center=true); + //translate([5*-m,0,30.8-z]) rotate([0,25*-m,0]) cube([x+1,y+1,10], center=true); + + } + +} +module back_latch(x, y, z, m) { + + union() { + translate([0,0,1.251]) translate([1.35,0,-8]) cube([x-0.1,y,z+15], center=true); + translate([-3,0,-26.25]) cube([x-0.5,y,3], center=true); + translate([-1.85,0,-22.2]) rotate([0,30,0]) #cube([x+0.5,y,12], center=true); + //translate([0*-m,0,10-z]) rotate([0,25*-m,0]) cube([x+1,y+1,z], center=true); + //translate([5*-m,0,30.8-z]) rotate([0,5*-m,0]) cube([x+1,y+1,10], center=true); + //translate([5*-m,0,30.8-z]) rotate([0,25*-m,0]) cube([x+1,y+1,10], center=true); + + } + +} +module rail_clip() { + //cube([raild, clipt, railh], center=true); + union() { + translate([raild/2+2,0,-5]) back_latch(5,clipt,27,1); + translate([-raild/2-2,0,-5]) rail_latch(5,clipt,30,-1); + translate([0,0,railh/2+3.5]) cube([76.5,clipt,7], center=true); + + } +}; + +module hook() { + union() { + translate([0,0,3.251]) cube([3,3,6.502], center=true); + //translate([0,0,6.5+1.5]) cube([3,3,3], center=true); + //translate([5,0,6.5+1.5]) rotate([0,90,0]) rotate([0,0,45]) cylinder(h=7,d1=4.2, d2=1, center=true, $fn=4); + translate([2.5,0,6.5+1.5]) cube([8,3,3], center=true); + } +} + +module hooked_rail_clip() { + union() { + translate([-37.5,3/2,10]) rotate([0,-90,0]) hook(); + translate([0,clipt/2,0]) rail_clip(); + } +} + +rotate([90,0,0]) hooked_rail_clip(); \ No newline at end of file diff --git a/bedclip/bedclip_thin_backhook6.scad b/bedclip/bedclip_thin_backhook6.scad new file mode 100644 index 0000000..b3fce48 --- /dev/null +++ b/bedclip/bedclip_thin_backhook6.scad @@ -0,0 +1,56 @@ +raild = 64.9; +railh = 18.5; +clipt = 5; + +module rail_latch(x, y, z, m) { + translate([1.1,0,0]) rotate([0,m*7,0]) difference() { + cube([x,y,z], center=true); + translate([0*-m,0,10-z]) rotate([0,25*-m,0]) cube([x+1,y+1,z], center=true); + translate([4.9,0,0]) rotate([0,-5,0]) cube([x,y+1,z], center=true); + //translate([5*-m,0,30.8-z]) rotate([0,5*-m,0]) cube([x+1,y+1,10], center=true); + //translate([5*-m,0,30.8-z]) rotate([0,25*-m,0]) cube([x+1,y+1,10], center=true); + + } + +} +module back_latch(x, y, z, m) { + + union() { + translate([0,0,1.251]) translate([1.35,0,-8]) cube([x-0.1,y,z+15], center=true); + translate([-3,0,-26.25]) cube([x-0.5,y,3], center=true); + translate([-1.85,0,-22.2]) rotate([0,50,0]) cube([x+0.5,y,9], center=true); + translate([-1.85,0,-19.6]) rotate([0,30,0]) cube([x-1.5,y,11], center=true); + //translate([0*-m,0,10-z]) rotate([0,25*-m,0]) cube([x+1,y+1,z], center=true); + //translate([5*-m,0,30.8-z]) rotate([0,5*-m,0]) cube([x+1,y+1,10], center=true); + //translate([5*-m,0,30.8-z]) rotate([0,25*-m,0]) cube([x+1,y+1,10], center=true); + + } + +} +module rail_clip() { + //cube([raild, clipt, railh], center=true); + union() { + translate([raild/2+2,0,-5]) back_latch(5,clipt,27,1); + translate([-raild/2-2,0,-5]) rail_latch(5,clipt,30,-1); + translate([0,0,railh/2+3.5]) cube([76.5,clipt,7], center=true); + + } +}; + +module hook() { + union() { + translate([0,0,4.251]) cube([3,3,8.502], center=true); + //translate([0,0,6.5+1.5]) cube([3,3,3], center=true); + //translate([5,0,6.5+1.5]) rotate([0,90,0]) rotate([0,0,45]) cylinder(h=7,d1=4.2, d2=1, center=true, $fn=4); + translate([4.5,0,8.5+1.5]) cube([12,3,3], center=true); + } +} + +module hooked_rail_clip() { + union() { + translate([-37.5,3/2,10]) rotate([0,-90,0]) hook(); + translate([0,clipt/2,0]) rail_clip(); + } +} + +rotate([90,0,0]) hooked_rail_clip(); \ No newline at end of file diff --git a/bedclip/bedclip_thin_backhook7.scad b/bedclip/bedclip_thin_backhook7.scad new file mode 100644 index 0000000..bf390bd --- /dev/null +++ b/bedclip/bedclip_thin_backhook7.scad @@ -0,0 +1,73 @@ +raild = 64.9; +railh = 18.5; +clipt = 5; + +module rail_latch(x, y, z, m) { + translate([1.1,0,0]) rotate([0,m*7,0]) difference() { + cube([x,y,z], center=true); + translate([0*-m,0,10-z]) rotate([0,25*-m,0]) cube([x+1,y+1,z], center=true); + translate([4.9,0,0]) rotate([0,-5,0]) cube([x,y+1,z], center=true); + //translate([5*-m,0,30.8-z]) rotate([0,5*-m,0]) cube([x+1,y+1,10], center=true); + //translate([5*-m,0,30.8-z]) rotate([0,25*-m,0]) cube([x+1,y+1,10], center=true); + + } + +} +module back_latch(x, y, z, m) { + + union() { + translate([0,0,1.251]) translate([1.35,0,-8]) cube([x-0.1,y,z+15], center=true); + translate([-3,0,-26.25]) cube([x-0.5,y,3], center=true); + translate([-1.85,0,-22.2]) rotate([0,50,0]) cube([x+0.5,y,9], center=true); + translate([-1.85,0,-19.6]) rotate([0,30,0]) cube([x-1.5,y,11], center=true); + //translate([0*-m,0,10-z]) rotate([0,25*-m,0]) cube([x+1,y+1,z], center=true); + //translate([5*-m,0,30.8-z]) rotate([0,5*-m,0]) cube([x+1,y+1,10], center=true); + //translate([5*-m,0,30.8-z]) rotate([0,25*-m,0]) cube([x+1,y+1,10], center=true); + + } + +} + +module back_latch2(x, y, z, m) { + + union() { + translate([0,0,1.251]) translate([1.35,0,-8]) cube([x-0.1,y,z+19], center=true); + translate([-3,0,-28.25]) cube([x-0.5,y,3], center=true); + translate([-1.85,0,-24.2]) rotate([0,50,0]) cube([x+0.5,y,9], center=true); + //translate([-1.85,0,-21.6]) rotate([0,30,0]) cube([x-1.5,y,11], center=true); + //translate([0*-m,0,10-z]) rotate([0,25*-m,0]) cube([x+1,y+1,z], center=true); + //translate([5*-m,0,30.8-z]) rotate([0,5*-m,0]) cube([x+1,y+1,10], center=true); + //translate([5*-m,0,30.8-z]) rotate([0,25*-m,0]) cube([x+1,y+1,10], center=true); + + } + +} + +module rail_clip() { + //cube([raild, clipt, railh], center=true); + union() { + //color([1,0,1,0.2]) translate([raild/2+2,0.1,-5]) back_latch(5,clipt,27,1); + translate([raild/2+4,0,-5]) rotate([0,10,0]) back_latch2(5,clipt,27,1); + translate([-raild/2-2,0,-5]) rail_latch(5,clipt,30,-1); + translate([2.5,0,railh/2+3.5]) cube([81.5,clipt,7], center=true); + + } +}; + +module hook() { + union() { + translate([0,0,4.251]) cube([3,3,8.502], center=true); + //translate([0,0,6.5+1.5]) cube([3,3,3], center=true); + //translate([5,0,6.5+1.5]) rotate([0,90,0]) rotate([0,0,45]) cylinder(h=7,d1=4.2, d2=1, center=true, $fn=4); + translate([4.5,0,8.5+1.5]) cube([12,3,3], center=true); + } +} + +module hooked_rail_clip() { + union() { + translate([-37.5,3/2,10]) rotate([0,-90,0]) hook(); + translate([0,clipt/2,0]) rail_clip(); + } +} + +rotate([90,0,0]) hooked_rail_clip(); \ No newline at end of file diff --git a/electronics_box/Ebox.scad b/electronics_box/Ebox.scad new file mode 100644 index 0000000..6fb49e0 --- /dev/null +++ b/electronics_box/Ebox.scad @@ -0,0 +1,184 @@ +pcb_w = 80.1; +pcb_h = 105.0; +pcb_t = 1.85; +e = 0.001; +clear = 10; +wall_t = 1.5; +box_t = 26; +hole_diameter = 2.5; +hole_in=72.9; +hole_ctoc = hole_in + hole_diameter; +hole_out = 77.9; +hole_x_edge = 0.7; +hole_y_edge = 1.2; +midpair_y_dist = 73.15; +botpair_y_dist = 21.8; +bat_h = 26.5; +batr_h = 24.5; +bat_w = 51.8; +bat_t = 17.1; +batc_h = 36; +batc_w = 68; +standoff= 12; +pin_t = 4.5; +pin_dia = 2.0; +pin_t2 = 6; +pin_dia2 = 4.5; +screen_t = 5.1; + + +function allclear() = clear + wall_t; +function toppair_y() = (pcb_h/2)-hole_y_edge-(hole_diameter/2); +function toppair_x() = (pcb_w/2)-hole_x_edge-(hole_diameter/2); +function wall_x() = (pcb_w/2)+allclear()/2-wall_t/2; +function wall_y() = (pcb_h/2)+allclear()/2-wall_t/2; +function midpair_x() = toppair_x(); +function midpair_y() = toppair_y() - midpair_y_dist - hole_diameter; +function botpair_x() = toppair_x(); +function botpair_y() = midpair_y() - botpair_y_dist - hole_diameter; +function pin_z() = pin_t2/2 + pin_t/2; +function pin_zs() = pin_t2/2; +function pin_zh(x) = pin_t2 + pin_t + x; +function batc_pyramid() = batc_h/sin(45)/2; +function batc_top() = pcb_h/2-bat_h/2-allclear()/2+batc_h/2; +function batc_bot() = pcb_h/2-bat_h/2-allclear()/2-batc_h/2; +function batc_cent() = pcb_h/2-bat_h/2-allclear()/2; + +module boxbottom() { +difference() { +union() { +translate([0,0,-wall_t+e]) linear_extrude(wall_t) square([pcb_w+allclear(), pcb_h+allclear()], center=true); + + +// hole pins +translate([toppair_x(), toppair_y(), pin_z()+pcb_t]) cylinder(h = pin_zh(pcb_t), r = pin_dia/2, center=true, $fn=40); +translate([-toppair_x(), toppair_y(), pin_z()+pcb_t]) cylinder(h = pin_zh(pcb_t), r = pin_dia/2, center=true, $fn=40); +translate([midpair_x(), midpair_y(), pin_z()]) cylinder(h = pin_zh(0), r = pin_dia/2, center=true, $fn=40); +translate([-midpair_x(), midpair_y(), pin_z()]) cylinder(h = pin_zh(0), r = pin_dia/2, center=true, $fn=40); +translate([botpair_x(), botpair_y(), pin_z()]) cylinder(h = pin_zh(0), r = pin_dia/2, center=true, $fn=40); +translate([-botpair_x(), botpair_y(), pin_z()]) cylinder(h = pin_zh(0), r = pin_dia/2, center=true, $fn=40); + +// standoff pins +translate([toppair_x(), toppair_y(), pin_zs()+pcb_t/2]) cylinder(h = pin_zs()*2+pcb_t, r = pin_dia2/2, center=true, $fn=40); +translate([-toppair_x(), toppair_y(), pin_zs()+pcb_t/2]) cylinder(h = pin_zs()*2+pcb_t, r = pin_dia2/2, center=true, $fn=40); +translate([midpair_x(), midpair_y(), pin_zs()]) cylinder(h = pin_zs()*2, r = pin_dia2/2, center=true, $fn=40); +translate([-midpair_x(), midpair_y(), pin_zs()]) cylinder(h = pin_zs()*2, r = pin_dia2/2, center=true, $fn=40); +translate([botpair_x(), botpair_y(), pin_zs()]) cylinder(h = pin_zs()*2, r = pin_dia2/2, center=true, $fn=40); +translate([-botpair_x(), botpair_y(), pin_zs()]) cylinder(h = pin_zs()*2, r = pin_dia2/2, center=true, $fn=40); + + + +// corners +//translate([wall_x(), wall_y(), box_t/2]) cube([wall_t,wall_t,box_t], center=true); +//translate([-wall_x(), wall_y(), box_t/2]) cube([wall_t,wall_t,box_t], center=true); +//translate([wall_x(), -wall_y(), box_t/2]) cube([wall_t,wall_t,box_t], center=true); +//translate([-wall_x(), -wall_y(), box_t/2]) cube([wall_t,wall_t,box_t], center=true); + + +// walls +translate([wall_x(), 0, box_t/2]) cube([wall_t, pcb_h+allclear(), box_t], center=true); +translate([-wall_x(), 0, box_t/2]) cube([wall_t, pcb_h+allclear(), box_t], center=true); +translate([0, wall_y(), box_t/2]) cube([pcb_w+allclear(), wall_t,box_t], center=true); +translate([0, -wall_y(), box_t/2]) cube([pcb_w+allclear(), wall_t, box_t], center=true); + +// battery compartment +translate([0,pcb_h/2-bat_h/2-allclear()/2,-1]) linear_extrude(3) square([batc_w+clear-e, batc_h+clear*1.2-e], center=true); + +} +union() { + +translate([0,pcb_h/2-bat_h/2-allclear()/2,-wall_t]) linear_extrude(wall_t+e) square([batc_w, batc_h], center=true); +//translate([0,pcb_h/2-bat_h/2-allclear()/2,0]) linear_extrude(wall_t*3+e) square([batc_w/2, batc_h+2], center=true); + +// latch cuts +translate([-15,batc_top()-batc_h/4+4,0]) linear_extrude(wall_t*3+e) square([15, batc_h/2], center=true); +translate([15,batc_top()-batc_h/4+4,0]) linear_extrude(wall_t*3+e) square([15, batc_h/2], center=true); +translate([0,batc_bot()+batc_h/4-4,0]) linear_extrude(wall_t*3+e) square([25, batc_h/2], center=true); + +// pyramid cuts +translate([-batc_w/2+batc_h/2,pcb_h/2-bat_h/2-allclear()/2,0]) rotate([0,0,45]) cylinder(h=wall_t*2,r1=batc_pyramid(),r2=batc_pyramid()-wall_t*4,$fn=4); +translate([0,pcb_h/2-bat_h/2-allclear()/2,0]) rotate([0,0,45]) cylinder(h=wall_t*2,r1=batc_pyramid(),r2=batc_pyramid()-wall_t*4,$fn=4); +translate([-batc_h/2+batc_w/2,pcb_h/2-bat_h/2-allclear()/2,0]) rotate([0,0,45]) cylinder(h=wall_t*2,r1=batc_pyramid(),r2=batc_pyramid()-wall_t*4,$fn=4); + +} +} +} + +*color([1,1,0,0.4]) boxbottom(); + +module backstay() { + difference() { + cube([2, 1.5, bat_t*2/3], center=true); + translate([1.5,0,0]) rotate([0,-8,0]) cube([2.1, 1.6, bat_t*4/3], center=true); + } +} + +module batc_latch() +{ + union() { + translate([0,0,bat_t/2]) cube([4, 1, bat_t], center=true); + translate([0,-0.4,bat_t+0.05]) rotate([45,0,0]) cube([4, 1.2, 1.35], center=true); + translate([0,1-e,bat_t/3]) rotate([0,0,90]) backstay(); + } +} + +module batc_door() { + union() { + difference() { + union() { + translate([0, batc_cent(), (-wall_t+e)/2]) cube([batc_w-0.5, batc_h-0.5, wall_t], center=true); + // rear latches + latch_w = 4.2; + translate([15,batc_top()-batc_h/4+(10.2-latch_w/2),wall_t*0.375-e*10]) + cube([14.6, latch_w, wall_t], center=true); + translate([-15,batc_top()-batc_h/4+(10.2-latch_w/2),wall_t*0.5-e*10]) + cube([14.6, latch_w, wall_t], center=true); + + // battery guides/latches +translate([-15,batc_cent()+(bat_h/2)+2,-e*10]) batc_latch(); +translate([-15,batc_cent()-(batr_h/2)+2,-e*10]) rotate([0,0,180]) batc_latch(); + + translate([26,batc_cent(),0]) rotate([0,0,-90]) batc_latch(); + translate([-26,batc_cent(),0]) rotate([0,0,90]) batc_latch(); + + } + //translate([-15,batc_top()-batc_h/4,wall_t*0.5-e*10]) + //cube([14.6, latch_w, wall_t], center=true); + translate([0,pcb_h/2-bat_h-allclear()/2,(-wall_t+e)/2]) cube([24.5, 12, 10], center=true); + } + + difference() { + union() { + translate([0,pcb_h/2-bat_h-allclear()/2,(-wall_t+e)/2]) cube([22, 15, wall_t], center=true); + translate([0,pcb_h/2-bat_h-allclear()/2,wall_t*-0.1]) rotate([-2.5,0,0]) cube([22, 15, wall_t/2], center=true); + } + // spring + cutw = 1.6; + cutd = 5.0; + translate([-cutd,pcb_h/2-bat_h-allclear()/2+1.5,(-wall_t+e)/2]) cube([21, cutw, 10], center=true); + translate([cutd,pcb_h/2-bat_h-allclear()/2+5,(-wall_t+e)/2]) cube([21, cutw, 10], center=true); + translate([cutd,pcb_h/2-bat_h-allclear()/2-2,(-wall_t+e)/2]) cube([21, cutw, 10], center=true); + //translate([-2,pcb_h/2-bat_h-allclear()/2+3,(-wall_t+e)/2]) cube([21, 1, 10], center=true); + //translate([-2,pcb_h/2-bat_h-allclear()/2-1,(-wall_t+e)/2]) cube([21, 1, 10], center=true); + //translate([-2,pcb_h/2-bat_h-allclear()/2-5,(-wall_t+e)/2]) cube([21, 1, 10], center=true); + + // spring latch + translate([0,pcb_h/2-bat_h-allclear()/2-9.5,(-wall_t+e)/2]) rotate([-45,0,0]) cube([23, 4, 11], center=true); + translate([0,pcb_h/2-bat_h-allclear()/2-10.25,(-wall_t+e)/4-0.35]) rotate([75,0,0]) cube([23, 3, 9.8], center=true); + translate([0,pcb_h/2-bat_h-allclear()/2-10.65,(-wall_t+e)/0.75]) rotate([90,0,0]) cube([23, 3, 11.2], center=true); + } + } + +} + +batc_door(); + +//color([1,0,0,0.2]) translate([0,0,pin_zs()*2]) linear_extrude(pcb_t) square([pcb_w, pcb_h], center=true); +//color([0,0,1,1.0]) translate([0,pcb_h/2-bat_h/2-allclear()/2,bat_t/2]) cube([bat_w, bat_h, bat_t], center=true); +//color([0,1,0.5,0.2]) translate([toppair_x()-2, toppair_y(), pin_t2+pcb_t+standoff/2]) cylinder(h = standoff, r = pin_dia/2, center=true, $fn=40); +//color([1,0.3,1,0.6]) translate([toppair_x()-2, toppair_y(), pin_t2+pcb_t+standoff+pcb_t/2]) cylinder(h = pcb_t, r = pin_dia/2, center=true, $fn=40); +//color([0,0.6,1,0.6]) translate([toppair_x()-2, toppair_y(), pin_t2+pcb_t+standoff+pcb_t+screen_t/2]) cylinder(h = screen_t, r = pin_dia/2, center=true, $fn=40); +//color([0,0.6,1,0.6]) translate([0,pcb_h/2-bat_h/2-allclear()/2,pin_t2+pcb_t+standoff+pcb_t]) linear_extrude(5) square([pcb_w-allclear(), bat_h], center=true); + + + diff --git a/electronics_box/README.md b/electronics_box/README.md new file mode 100644 index 0000000..b0791e4 --- /dev/null +++ b/electronics_box/README.md @@ -0,0 +1,6 @@ +A box for my electronics tester, consisting of a few different parts. + +* The box itself +* Glue-able stoppers that fit onto pins to secure the tester's PCB into the case +* A removable battery door with a flexible latch to clip it in +* A front cover to fit flush with the LCD, buttons, and ZIF socket (not yet implemented, probably also will need to be glued on) diff --git a/fanclip/README.md b/fanclip/README.md new file mode 100644 index 0000000..bc7f6e3 --- /dev/null +++ b/fanclip/README.md @@ -0,0 +1,9 @@ +Very simple clip to disable the oscillating function on my Honeywell desk fan. Clips onto the knob (very firmly!) and prevents the knob from vibrating its way into the oscillate setting. + +Notes: + +* Probably clips *too* firmly, it doesn't flex much at all even with PETG. Barely snapped on, will likely need tool or break something to get it off +* While the tall part of the clip fits the back of the knob just about perfectly, the cutaway from the bottom of the short side is too aggressive +* However extending the front clip prongs to be taller would also make them stiffer +* Possible solutions include thinning the walls, thinning just the prongs, or making the open cut more aggressive so it doesn't need to flex much +* Either way, it suits its purpose at the moment and prevents fan oscillation, ever. \ No newline at end of file diff --git a/fanclip/fanclip1.scad b/fanclip/fanclip1.scad new file mode 100644 index 0000000..0a4404c --- /dev/null +++ b/fanclip/fanclip1.scad @@ -0,0 +1,19 @@ + +module sample() { + cylinder(19, 6, 6); + +} + + +module main_tube(c_cut, c_cut_h, m_cut) { + difference() { + cylinder(18, 12, 12); + translate([0,0,-0.01]) cylinder(19, 6, 6); + translate([-25,c_cut/2,-c_cut+c_cut_h]) rotate([0,90]) cylinder(50, c_cut, c_cut); + translate([2,8,0]) rotate([0,0,-20]) cube([m_cut, m_cut*1.6, 50], center=true); + translate([-2,8,0]) rotate([0,0,20]) cube([m_cut, m_cut*1.6, 50], center=true); + } +} + +//color([1,0,1,0.2]) sample(); +main_tube(20,9, 8); diff --git a/hanging_bracket/README.md b/hanging_bracket/README.md new file mode 100644 index 0000000..10cf8b4 --- /dev/null +++ b/hanging_bracket/README.md @@ -0,0 +1 @@ +A simple (mostly) parametric bracket for hanging stuff, slanted sideways so it can be screwed in with powertools or whatever. \ No newline at end of file diff --git a/hanging_bracket/hanging_bracket.scad b/hanging_bracket/hanging_bracket.scad new file mode 100644 index 0000000..c4bcfca --- /dev/null +++ b/hanging_bracket/hanging_bracket.scad @@ -0,0 +1,74 @@ +height = 95; +width = 16; +pillar_thickness = 5; +prong_thickness = 4; +prong_width = width; +prong_depth = 120; +prong_angle = 25; +screw_hole_diameter = 5.5; +screw_hole_count = 2; +lh_rh = false; + +fuzz = 0.01; + +function triheight() = tan(prong_angle) * width; +function thickness() = prong_thickness / cos(prong_angle); + +module prong() { + translate([-prong_width/2,0,0]) cube([prong_width*2, prong_depth, thickness()]); + + + + +}; + +module screw_hole(pos) { + hole_pos = (prong_depth - pillar_thickness) * pos; + hole_pos_mod = lh_rh ? pillar_thickness : 0; + translate([-fuzz + prong_width/2, -fuzz + hole_pos_mod + hole_pos, -fuzz]) + union() { + cylinder(h = thickness() * 2, d = screw_hole_diameter, $fn=32); + translate([0,0,thickness()*0.255]) cylinder(h = thickness() * 0.75, d1 = 0, d2 = screw_hole_diameter*2, $fn=32); + } +}; + + +module prong_with_holes() { + difference() { + prong(); + for (i = [1: screw_hole_count]) + { + screw_hole(i/(screw_hole_count+1)); + }; + }; +}; + +module pillar() { + translate([0,0,0]) + union() { + rotate([-90,0,0]) linear_extrude(pillar_thickness) polygon([[0, 0], [width, 0], [width, triheight()]]); + cube([width, pillar_thickness, height+(fuzz*2)-triheight()]); + translate([0,0, height]) rotate([-90,0,0]) linear_extrude(pillar_thickness) polygon([[0, 0], [width, triheight()], [0, triheight()]]); + + }; +}; + +module assembly() { + difference() { + union() { + translate([0,0,-prong_thickness]) rotate([0, prong_angle, 0]) prong_with_holes(); + if (lh_rh) { + pillar(); + } else { + translate([0,prong_depth-pillar_thickness,0]) pillar(); + } + translate([0,0,height+(prong_thickness*0.0)+(triheight()*0.0)]) rotate([0, prong_angle, 0]) prong(); + }; + translate([width,-prong_depth,-height]) cube([width*3, prong_depth*3, height*3]); + translate([width*-3,-prong_depth,-height]) cube([width*3, prong_depth*3, height*3]); + }; +}; + + +rotate([0,-90,0]) assembly(); + diff --git a/parametric_funnel/Funnel.scad b/parametric_funnel/Funnel.scad new file mode 100644 index 0000000..4f80708 --- /dev/null +++ b/parametric_funnel/Funnel.scad @@ -0,0 +1,94 @@ +use + +diameter_top = 80; +diameter_throat = 15; +diameter_bottom = 10; +height_top = 100; +height_bottom = 80; +wall_thickness = 2; +vent_pct = 10; +tab = true; +$fn = 50; + +fuzz = 0.1; + +radius_top = diameter_top/2; +radius_throat = diameter_throat/2; +radius_bottom = diameter_bottom/2; +top_vent_pct = vent_pct/10; +throat_vent_pct = vent_pct; +bottom_vent_pct = vent_pct; +tabsize=wall_thickness * 6; +tablength=0.75; // reasonable sizes range from 0.5 - 2.0 +tabpos=90; + +module solidshape(w, h) { + t = radius_top + w; + m = radius_throat + w; + b = radius_bottom + w; + ht = height_top - h + w; + hb = height_bottom - h - h - w; + ft=m-((2*fuzz*(t-m))/ht); + vt=(t - w) * (top_vent_pct/100); + vm=(m - w) * (throat_vent_pct/100); + vb=(b - w) * (bottom_vent_pct/100); + render() { + difference() { + union() { + + translate([0,0,h+fuzz]) + cylinder(ht+fuzz, t, ft); + + + translate([0,0,ht+h+h]) + cylinder(hb, m, b); + } + mw = (t-vt-m+vm+fuzz); + //mw = t-vt-vm; + ab = atan((m-vm-b+vb) / hb); + at = atan(mw / ht); + tcl = sqrt((mw^2)+(ht^2)); + + translate([m-vm, -m, ht+fuzz]) + rotate([0,-ab,0]) + #cube([m*2, m*2, hb*1.2]); + translate([t+t-m-vt-vt+vm+fuzz+fuzz, -t, -ht+fuzz]) + rotate([0,-at,0]) + cube([t*2, t*2, tcl*1.2]); + } + } +} + +module tabshape() { + translate([-tabsize/2,0,fuzz]) + difference() { + intersection() { + cube([tabsize,tabsize*tablength*2,wall_thickness]); + union() { + cube([tabsize,tabsize*tablength,wall_thickness]); + translate([tabsize/2, tabsize*tablength, 0]) + linear_extrude(wall_thickness) + circle(d = tabsize); + }; + } + translate([tabsize/2, tabsize*tablength*0.9, 0]) + linear_extrude(wall_thickness) + circle(d = tabsize/2); + + } +} + +render() { + union() { + difference() { + //solidshape(wall_thickness, 0); + solidshape(0,-fuzz); + } + if (tab) + { + rotate([0,0,tabpos]) + translate([0, radius_top, 0]) + tabshape(); + } + } +} \ No newline at end of file diff --git a/parametric_funnel/Funnel2.scad b/parametric_funnel/Funnel2.scad new file mode 100644 index 0000000..50fda5f --- /dev/null +++ b/parametric_funnel/Funnel2.scad @@ -0,0 +1,124 @@ +diameter_top = 120; +diameter_throat = 15; +diameter_bottom = 10; +height_top = 100; +height_bottom = 80; +wall_thickness = 1.2; +vent_pct = 100; +tab = false; +$fn = 50; + +fuzz = 0.1; + +radius_top = diameter_top/2; +radius_throat = diameter_throat/2; +radius_bottom = diameter_bottom/2; +top_vent_pct = vent_pct/1; +throat_vent_pct = vent_pct; +bottom_vent_pct = vent_pct; +tabsize=wall_thickness * 6; +tablength=0.75; // reasonable sizes range from 0.5 - 2.0 +tabpos=90; + +module ventblock_top(throat_vent, throat, angle, throat_h, hyp_b) +{ + // vent for top + translate([throat_vent, 0, 0]) + rotate([0,0,180]) + translate([0, -throat, throat_h-fuzz]) + rotate([0,180+angle,0]) + cube([throat*2, throat*2, hyp_b*1.2]); + +} + +module ventblock_bottom(throat_vent, throat, angle, throat_h, hyp_b) +{ + // vent for bottom + translate([throat_vent, -throat, throat_h-fuzz]) + rotate([0,-angle,0]) + cube([throat*2, throat*2, hyp_b*1.2]); + +} + +module solidshape(w, h) { + t = radius_top + w; + m = radius_throat + w; + b = radius_bottom + w; + ht = height_top - h + w; + hb = height_bottom - h - h - w; + ft=m-((2*fuzz*(t-m))/ht); + vt=(t - w) * (top_vent_pct/100); + vm=(m - w) * (throat_vent_pct/100); + vb=(b - w) * (bottom_vent_pct/100); + mw = (t-vt-m+vm+fuzz); + //mw = t-vt-vm; + ab = atan((m-vm-b+vb) / hb); + at = atan((mw) / ht); + tcl = sqrt((mw^2)+((ht)^2))-fuzz; + + render() { + difference() { + union() { + + translate([0,0,h+fuzz]) + cylinder(ht+wall_thickness, t, ft); + + + translate([0,0,ht+h+h]) + cylinder(hb, m, b); + } + + + // vent for bottom + ventblock_bottom(m-vm, m, ab, ht+h, hb); + ventblock_top(m-vm, t, at, ht+h, tcl); + + //translate([0,-m,0]) + //translate([0,0,ht]) + //rotate([0,180+at,180]) + //translate([m-vm, -m, 0]) + //rotate([0,180+at,0]) + //#cube([m*2, m*2, hb*2]); + + // vent for top + //translate([t+t-m-vt-vt+vm, -t, -ht]) + //rotate([0,-at,0]) + //#cube([t*2, t*2, tcl*2]); + } + //color("red") x_measurement(0, [m-vm, 0, ht+fuzz-0.2]); + } +} + +module tabshape() { + translate([-tabsize/2,0,fuzz]) + difference() { + intersection() { + cube([tabsize,tabsize*tablength*2,wall_thickness]); + union() { + cube([tabsize,tabsize*tablength,wall_thickness]); + translate([tabsize/2, tabsize*tablength, 0]) + linear_extrude(wall_thickness) + circle(d = tabsize); + }; + } + translate([tabsize/2, tabsize*tablength*0.9, 0]) + linear_extrude(wall_thickness) + circle(d = tabsize/2); + + } +} + +render() { + union() { + difference() { + solidshape(wall_thickness, 0); + solidshape(0,-wall_thickness); + } + if (tab) + { + rotate([0,0,tabpos]) + translate([0, radius_top, 0]) + tabshape(); + } + } +} \ No newline at end of file diff --git a/parametric_funnel/Funnel3.scad b/parametric_funnel/Funnel3.scad new file mode 100644 index 0000000..a394375 --- /dev/null +++ b/parametric_funnel/Funnel3.scad @@ -0,0 +1,110 @@ +module funnel( +diameter_top = 120, +diameter_throat = 15, +diameter_bottom = 10, +height_top = 100, +height_bottom = 80, +wall_thickness = 1.2, +vent_pct = 25, +tab = false) +{ + $fn = 50; + + fuzz = 0.1; + + radius_top = diameter_top/2; + radius_throat = diameter_throat/2; + radius_bottom = diameter_bottom/2; + // y = mx + b + // mx = y - b + // m = (y - b) / x + // m = (y2 - y1) / (x2 - x1) + // (-radius_top,0) - (-radius_throat,height_top) + top_invslope = (radius_throat-radius_top) / -height_top; + bottom_invslope = (radius_bottom-radius_throat) / -height_bottom; + top_thickening = wall_thickness * top_invslope; + bottom_thickening = wall_thickness * bottom_invslope; + top_vent_pct = vent_pct/10; + throat_vent_pct = vent_pct; + bottom_vent_pct = vent_pct; + tabsize=wall_thickness * 6; + tablength=0.75; // reasonable sizes range from 0.5 - 2.0 + tabpos=90; + + module ventblock_topx(throat_vent, throat, angle, throat_h, hyp_b) + { + + translate([throat_vent, 0, 0]) + rotate([0,0,180]) + translate([0, -throat, throat_h-fuzz]) + rotate([0,180+angle,0]) + cube([throat*2, throat*2, hyp_b*1.2]); + + } + + module ventblock_bottomx(throat_vent, throat, angle, throat_h, hyp_b) + { + // vent for bottom + translate([throat_vent, -throat, throat_h-fuzz]) + rotate([0,-angle,0]) + cube([throat*2, throat*2, hyp_b*1.2]); + + } + + module ventblock_top(rt, rm, h1) + { + tsub = rt - ( + angle = atan(() / ()); + translate([rm, 0, 0]) + rotate([0,0,180]) + translate([0, -rm, h1-fuzz]) + rotate([0,180+angle,0]) + #cube([rt*2, rt*2, h1*2]); + } + + module ventblock_bottom(rm, rb, h1, h2) + { + translate([throat_vent, -throat, throat_h-fuzz]) + rotate([0,-angle,0]) + #cube([rm*2, rm*2, h2*2]); + } + + module p_solidfunnelshape(rt, rm, rb, h1, h2) + { + union() { + cylinder(h1+wall_thickness,rt,rm-top_thickening); + translate([0,0,h1]) + cylinder(h2+wall_thickness,rm,rb-bottom_thickening); + } + } + + module p_ventedfunnelshape(rt, rm, rb, h1, h2) + { + difference() { + p_solidfunnelshape(rt, rm, rb, h1, h2); + union() { + //ventblock_top(rm, rm, atan(top_invslope), h1, h1 + h2); + //ventblock_bottom(rm, rm, atan(bottom_invslope), h1, h1 + h2); + ventblock_top(rt, rm, h1); + ventblock_bottom(rm, rb, h1, h2); + } + } + } + + module p_hollowfunnelshape(rt, rm, rb, h1, h2) + { + difference() { + //p_ventedfunnelshape(rt, rm, rb, h1, h2); + translate([0,0,-wall_thickness]) + p_ventedfunnelshape(rt-wall_thickness, rm-wall_thickness, rb-wall_thickness, h1+wall_thickness, h2+wall_thickness); + } + } + + module demofunnel() + { + render() p_hollowfunnelshape(radius_top, radius_throat, radius_bottom, height_top, height_bottom); + } + demofunnel(); + +} +funnel(150,50,40); \ No newline at end of file diff --git a/parametric_funnel/README.md b/parametric_funnel/README.md new file mode 100644 index 0000000..363bd06 --- /dev/null +++ b/parametric_funnel/README.md @@ -0,0 +1,3 @@ +A parametric funnel with options to include a hook/hanger, allow venting by flattening one side, or just flatten one side completely to fit into tighter spaces. + +Kind of a learning experience to be honest, under the premise that it is always handy to have funnels. Haven't used or worked on these in a long time, I forget which file is the right one to use. TBD. I think they all work to make a funnel, but probably some have more features or features that work better. diff --git a/remote_basket/Basket.scad b/remote_basket/Basket.scad new file mode 100644 index 0000000..7df37d2 --- /dev/null +++ b/remote_basket/Basket.scad @@ -0,0 +1,150 @@ +diameter_top = 70; +diameter_throat = 40; +diameter_bottom = 10; +height_top = 60; +height_bottom = 80; +wall_thickness = 1.2; +vent_pct = 100; +tab = false; +$fn = 50; + +fuzz = 0.1; + +radius_top = diameter_top/2; +radius_throat = diameter_throat/2; +radius_bottom = diameter_bottom/2; +top_vent_pct = vent_pct/2; +throat_vent_pct = vent_pct; +bottom_vent_pct = vent_pct; +tabsize=wall_thickness * 6; +tablength=0.75; // reasonable sizes range from 0.5 - 2.0 +tabpos=90; + +module hexgrid_center(hexsize, hexh, hexw, hexd, gridt) { + translate([-hexw/2,-hexd/2,-hexh/2]) hexgrid(hexsize, hexh, hexw, hexd, gridt); +} +module hexgrid(hexsize, hexh, hexw, hexd, gridt) { + intersection() { + hexgrid_only(hexsize, hexh, hexw, hexd, gridt); + cube([hexw, hexd, hexh]); + } +} +module hexgrid_only(hexsize, hexh, hexw, hexd, gridt) { + rotate([0,-90,-90]) + for (Y = [0:(hexh/hexsize)+1]) { + for (X = [0:(hexw/hexsize)+2]) { + hexspaceY = (hexsize+gridt)*sin(60.1); + hexspaceX = (hexsize+gridt)*sin(48.6); + if (X % 2 == 0) { + translate([Y*hexspaceY,X*hexspaceX,0]) rotate([0,0,90])cylinder(h=hexd, d=hexsize, $fn=6); + } else { + translate([(Y+0.5)*hexspaceY,X*hexspaceX,0]) rotate([0,0,90]) cylinder(h=hexd, d=hexsize, $fn=6); + } + } + } +} + +//color([0.5,0.5,1.0]) hexgrid_center(30, 200, 300, 400, 5); + +module ventblock_top(throat_vent, throat, angle, throat_h, hyp_b) +{ + // vent for top + translate([throat_vent, 0, 0]) + rotate([0,0,180]) + translate([0, -throat, throat_h-fuzz]) + rotate([0,180+angle,0]) + cube([throat*2, throat*2, hyp_b*1.2]); + +} + +module ventblock_bottom(throat_vent, throat, angle, throat_h, hyp_b) +{ + // vent for bottom + translate([throat_vent, -throat, throat_h-fuzz]) + rotate([0,-angle,0]) + cube([throat*2, throat*2, hyp_b*1.2]); + +} + +module solidshape(w, h) { + t = radius_top + w; + m = radius_throat + w; + b = radius_bottom + w; + ht = height_top - h + w; + hb = height_bottom - h - h - w; + ft=m-((2*fuzz*(t-m))/ht); + vt=(t - w) * (top_vent_pct/100); + vm=(m - w) * (throat_vent_pct/100); + vb=(b - w) * (bottom_vent_pct/100); + mw = (t-vt-m+vm+fuzz); + //mw = t-vt-vm; + ab = atan((m-vm-b+vb) / hb); + at = atan((mw) / ht); + tcl = sqrt((mw^2)+((ht)^2))-fuzz; + + render() { + difference() { + union() { + + translate([0,0,h+fuzz]) + cylinder(ht+wall_thickness, t, ft); + + + //translate([0,0,ht+h+h]) + //cylinder(hb, m, b); + } + + + // vent for bottom + ventblock_bottom(m-vm, m, ab, ht+h, hb); + ventblock_top(m-vm, t, at, ht+h, tcl); + + //translate([0,-m,0]) + //translate([0,0,ht]) + //rotate([0,180+at,180]) + //translate([m-vm, -m, 0]) + //rotate([0,180+at,0]) + //#cube([m*2, m*2, hb*2]); + + // vent for top + //translate([t+t-m-vt-vt+vm, -t, -ht]) + //rotate([0,-at,0]) + //#cube([t*2, t*2, tcl*2]); + } + //color("red") x_measurement(0, [m-vm, 0, ht+fuzz-0.2]); + } +} + +module tabshape() { + translate([-tabsize/2,0,fuzz]) + difference() { + intersection() { + cube([tabsize,tabsize*tablength*2,wall_thickness]); + union() { + cube([tabsize,tabsize*tablength,wall_thickness]); + translate([tabsize/2, tabsize*tablength, 0]) + linear_extrude(wall_thickness) + circle(d = tabsize); + }; + } + translate([tabsize/2, tabsize*tablength*0.9, 0]) + linear_extrude(wall_thickness) + circle(d = tabsize/2); + + } +} + +render() { + union() { + difference() { + solidshape(wall_thickness, 0); + solidshape(0,-wall_thickness); + } + if (tab) + { + rotate([0,0,tabpos]) + translate([0, radius_top, 0]) + tabshape(); + } + } +} \ No newline at end of file diff --git a/remote_basket/Basket_with_hexgrid.scad b/remote_basket/Basket_with_hexgrid.scad new file mode 100644 index 0000000..b2e71ad --- /dev/null +++ b/remote_basket/Basket_with_hexgrid.scad @@ -0,0 +1,164 @@ +diameter_top = 65; +diameter_throat = 36; +diameter_bottom = 10; +height_top = 95; +height_bottom = 80; +wall_thickness = 1.2; +vent_pct = 100; +tab = false; +$fn = 50; + +fuzz = 0.1; + +radius_top = diameter_top/2; +radius_throat = diameter_throat/2; +radius_bottom = diameter_bottom/2; +top_vent_pct = vent_pct/2; +throat_vent_pct = vent_pct; +bottom_vent_pct = vent_pct; +tabsize=wall_thickness * 6; +tablength=0.75; // reasonable sizes range from 0.5 - 2.0 +tabpos=90; + +module hexgrid_center(hexsize, hexh, hexw, hexd, gridt) { + translate([-hexw/2,-hexd/2,-hexh/2]) hexgrid(hexsize, hexh, hexw, hexd, gridt); +} +module hexgrid(hexsize, hexh, hexw, hexd, gridt) { + intersection() { + hexgrid_only(hexsize, hexh, hexw, hexd, gridt); + cube([hexw, hexd, hexh]); + } +} +module hexgrid_only(hexsize, hexh, hexw, hexd, gridt) { + rotate([0,-90,-90]) + for (Y = [0:(hexh/hexsize)+1]) { + for (X = [0:(hexw/hexsize)+2]) { + hexspaceY = (hexsize+gridt)*sin(60.1); + hexspaceX = (hexsize+gridt)*sin(48.6); + if (X % 2 == 0) { + translate([Y*hexspaceY,X*hexspaceX,0]) rotate([0,0,90])cylinder(h=hexd, d=hexsize, $fn=6); + } else { + translate([(Y+0.5)*hexspaceY,X*hexspaceX,0]) rotate([0,0,90]) cylinder(h=hexd, d=hexsize, $fn=6); + } + } + } +} + +//color([0.5,0.5,1.0]) hexgrid_center(30, 200, 300, 400, 5); + +module ventblock_top(throat_vent, throat, angle, throat_h, hyp_b) +{ + // vent for top + translate([throat_vent, 0, 0]) + rotate([0,0,180]) + translate([0, -throat, throat_h-fuzz+1.2]) + rotate([0,180+angle,0]) + cube([throat*2, throat*2, hyp_b*1.2]); + +} + +module ventblock_bottom(throat_vent, throat, angle, throat_h, hyp_b) +{ + // vent for bottom + translate([throat_vent, -throat, throat_h-fuzz]) + rotate([0,-angle,0]) + + cube([throat*2, throat*2, hyp_b*1.2]); + +} + +module solidshape(w, h) { + t = radius_top + w; + m = radius_throat + w; + b = radius_bottom + w; + ht = height_top - h + w; + hb = height_bottom - h - h - w; + ft=m-((2*fuzz*(t-m))/ht); + vt=(t - w) * (top_vent_pct/100); + vm=(m - w) * (throat_vent_pct/100); + vb=(b - w) * (bottom_vent_pct/100); + mw = (t-vt-m+vm+fuzz); + //mw = t-vt-vm; + ab = atan((m-vm-b+vb) / hb); + at = atan((mw) / ht); + tcl = sqrt((mw^2)+((ht)^2))-fuzz; + + render() { + difference() { + union() { + + translate([0,0,h+fuzz]) + cylinder(ht+wall_thickness, t, ft); + + + //translate([0,0,ht+h+h]) + //cylinder(hb, m, b); + } + + + // vent for bottom + ventblock_bottom(m-vm, m, ab, ht+h, hb); + ventblock_top(m-vm, t, at, ht+h, tcl); + + //translate([0,-m,0]) + //translate([0,0,ht]) + //rotate([0,180+at,180]) + //translate([m-vm, -m, 0]) + //rotate([0,180+at,0]) + //#cube([m*2, m*2, hb*2]); + + // vent for top + //translate([t+t-m-vt-vt+vm, -t, -ht]) + //rotate([0,-at,0]) + //#cube([t*2, t*2, tcl*2]); + } + //color("red") x_measurement(0, [m-vm, 0, ht+fuzz-0.2]); + } +} + +module tabshape() { + translate([-tabsize/2,0,fuzz]) + difference() { + intersection() { + cube([tabsize,tabsize*tablength*2,wall_thickness]); + union() { + cube([tabsize,tabsize*tablength,wall_thickness]); + translate([tabsize/2, tabsize*tablength, 0]) + linear_extrude(wall_thickness) + circle(d = tabsize); + }; + } + translate([tabsize/2, tabsize*tablength*0.9, 0]) + linear_extrude(wall_thickness) + circle(d = tabsize/2); + + } +} + +render() { + difference() { + union() { + difference() { + solidshape(wall_thickness, 0); + solidshape(0,-wall_thickness); + } + if (tab) + { + rotate([0,0,tabpos]) + translate([0, radius_top, 0]) + tabshape(); + } + } + xs = 23; + translate([-xs+10,xs,height_top/2]) + rotate([0,90,45]) + hexgrid_center(5.7, 20, 68, 20, 1.1); + translate([-xs+10,-xs,height_top/2]) + rotate([0,90,-45]) + hexgrid_center(5.7, 20, 68, 20, 1.1); + translate([-xs-5,0,height_top/2]) + rotate([0,90,90]) + hexgrid_center(5.7, 20, 68, 20, 1.1); + } +} + diff --git a/remote_basket/README.md b/remote_basket/README.md new file mode 100644 index 0000000..d2f8c64 --- /dev/null +++ b/remote_basket/README.md @@ -0,0 +1,3 @@ +A simple semi-circular basket that can hold a remote or two and has a flat spot to be command-stripped to a wall or cabinet. + +Also comes in hexgrid edition for material saving, improved visibility, and extra coolness. \ No newline at end of file