added all the scad files I could find

This commit is contained in:
cecilkorik 2024-01-29 20:54:51 -05:00
parent 652ed93f6b
commit 3a6756e716
24 changed files with 1443 additions and 0 deletions

4
.gitignore vendored
View file

@ -1,3 +1,7 @@
*.3mf
*.stl
*.gcode
# ---> Python
# Byte-compiled / optimized / DLL files
__pycache__/

10
bedclip/README.md Normal file
View file

@ -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.

41
bedclip/bedclip.scad Normal file
View file

@ -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();

42
bedclip/bedclip_thin.scad Normal file
View file

@ -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();

View file

@ -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();

View file

@ -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();

View file

@ -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();

View file

@ -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();

View file

@ -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();

View file

@ -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();

View file

@ -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();

184
electronics_box/Ebox.scad Normal file
View file

@ -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);

View file

@ -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)

9
fanclip/README.md Normal file
View file

@ -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.

19
fanclip/fanclip1.scad Normal file
View file

@ -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);

View file

@ -0,0 +1 @@
A simple (mostly) parametric bracket for hanging stuff, slanted sideways so it can be screwed in with powertools or whatever.

View file

@ -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();

View file

@ -0,0 +1,94 @@
use <measurement.scad>
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();
}
}
}

View file

@ -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();
}
}
}

View file

@ -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);

View file

@ -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.

150
remote_basket/Basket.scad Normal file
View file

@ -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();
}
}
}

View file

@ -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);
}
}

3
remote_basket/README.md Normal file
View file

@ -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.