diff options
Diffstat (limited to 'case/pcb_case')
-rw-r--r-- | case/pcb_case/bolt.scad | 13 | ||||
-rw-r--r-- | case/pcb_case/conversion.scad | 8 | ||||
-rw-r--r-- | case/pcb_case/nut.scad | 7 | ||||
-rw-r--r-- | case/pcb_case/panel.scad | 28 | ||||
-rw-r--r-- | case/pcb_case/pcb.scad | 14 | ||||
-rw-r--r-- | case/pcb_case/rounded_cube.scad | 12 | ||||
-rw-r--r-- | case/pcb_case/shell.scad | 116 | ||||
-rw-r--r-- | case/pcb_case/spacer.scad | 10 | ||||
-rw-r--r-- | case/pcb_case/tolerance_tests.scad | 86 |
9 files changed, 294 insertions, 0 deletions
diff --git a/case/pcb_case/bolt.scad b/case/pcb_case/bolt.scad new file mode 100644 index 0000000..4c26c30 --- /dev/null +++ b/case/pcb_case/bolt.scad @@ -0,0 +1,13 @@ +// bolt based on ISO 4762 (https://www.fasteners.eu/us/standards/ISO/4762) +bolt_k = 3; +bolt_l = 10; +bolt_dk = 5.5; +bolt_ds = 3; +bolt_ds_tol = 0.45; + +module bolt() { + union() { + cylinder(d=bolt_ds, h=bolt_l, $fn=30); + translate([0, 0, -bolt_ds]) cylinder(d=bolt_dk, h=bolt_ds, $fn=30); + } +} diff --git a/case/pcb_case/conversion.scad b/case/pcb_case/conversion.scad new file mode 100644 index 0000000..69c3c3b --- /dev/null +++ b/case/pcb_case/conversion.scad @@ -0,0 +1,8 @@ +include <bolt.scad> +include <nut.scad> + +function dim_pcb_to_case(pcb_dim, margins, t) = [ + pcb_dim[0]+margins[0][0]+margins[0][1]+4*t, + pcb_dim[1]+margins[1][0]+margins[1][1]+2*t+2*(bolt_l-t), + pcb_dim[2]+margins[2][0]+margins[2][1]+4*t +]; diff --git a/case/pcb_case/nut.scad b/case/pcb_case/nut.scad new file mode 100644 index 0000000..0768b6a --- /dev/null +++ b/case/pcb_case/nut.scad @@ -0,0 +1,7 @@ +nut_h = 3; +nut_d = 4.15; +nut_d_tol = 0.2; + +module nut() { + cylinder(d=nut_d,h=nut_h); +} diff --git a/case/pcb_case/panel.scad b/case/pcb_case/panel.scad new file mode 100644 index 0000000..eef0b28 --- /dev/null +++ b/case/pcb_case/panel.scad @@ -0,0 +1,28 @@ +include <nut.scad> + +use <conversion.scad> +use <rounded_cube.scad> + +panel_dim_0_tol = 0.3; +panel_dim_1_2_tol = 0.45; + +module pcb_case_panel(pcb_dim, margins, t) { + dim = dim_pcb_to_case(pcb_dim, margins, t); + + rounded_cube( + dim=[t, dim[1]-2*t, dim[2]-2*t], + radius=t + ); +} + +module pcb_case_panel_back(pcb_dim, margins, t) { + translate([t, t, t]) + pcb_case_panel(pcb_dim, margins, t); +} + +module pcb_case_panel_front(pcb_dim, margins, t) { + dim = dim_pcb_to_case(pcb_dim, margins, t); + + translate([dim[0]-2*t, t, t]) + pcb_case_panel(pcb_dim, margins, t); +} diff --git a/case/pcb_case/pcb.scad b/case/pcb_case/pcb.scad new file mode 100644 index 0000000..7b24131 --- /dev/null +++ b/case/pcb_case/pcb.scad @@ -0,0 +1,14 @@ +include <bolt.scad> +include <nut.scad> + +module pcb(dim, drillings, margins, t) { + translate([2*t+margins[0][0], bolt_l+margins[1][0], t+margins[2][0]]) { + difference() { + cube([dim[0], dim[1], dim[2]]); + for (drilling = drillings) { + translate([drilling[0], drilling[1], 0]) + cylinder(d=3, h=dim[2], $fn=30); + } + } + } +} diff --git a/case/pcb_case/rounded_cube.scad b/case/pcb_case/rounded_cube.scad new file mode 100644 index 0000000..acd50e7 --- /dev/null +++ b/case/pcb_case/rounded_cube.scad @@ -0,0 +1,12 @@ +module rounded_cube(dim, radius) { + range_y = [radius, dim[1]-radius]; + range_z = [radius, dim[2]-radius]; + height = dim[0]; + + hull() { + for (y=range_y, z=range_z) { + translate([0,y,z]) rotate([0,90,0]) + cylinder(r=radius, h=height, $fn=30); + } + } +} diff --git a/case/pcb_case/shell.scad b/case/pcb_case/shell.scad new file mode 100644 index 0000000..18139f6 --- /dev/null +++ b/case/pcb_case/shell.scad @@ -0,0 +1,116 @@ +include <bolt.scad> +include <nut.scad> +include <panel.scad> + +use <conversion.scad> +use <rounded_cube.scad> + +module shell_base(pcb_dim, margins, t) { + dim = dim_pcb_to_case(pcb_dim, margins, t); + + difference() { + // full body + rounded_cube(dim=dim, radius=t); + + // cut away upper half + translate([0,0,dim[2]/2]) + cube([dim[0], dim[1], dim[2]/2]); + + // main PCB space + translate([3*t, t, t]) + rounded_cube([dim[0]-6*t, dim[1]-2*t, dim[2]-2*t], t); + + // remove front and back + translate([0, 2*t, 2*t]) + rounded_cube([dim[0], dim[1]-4*t, dim[2]-4*t], t); + + // panel holder + for (x_off = [t-panel_dim_0_tol/2, dim[0]-2*t-panel_dim_0_tol/2]) { + translate([x_off, t-panel_dim_0_tol/2, t-panel_dim_0_tol/2]) { + rounded_cube( + [ + t+panel_dim_0_tol, + dim[1]-2*t+panel_dim_1_2_tol, + dim[2]-2*t+panel_dim_1_2_tol + ], + t + ); + } + } + + // bolt drillings + for (x = [dim[0]/4, dim[0]-dim[0]/4]) { + translate([x,0,dim[2]/2-1.5*bolt_ds]) + rotate([-90,0,0]) + cylinder(d=bolt_ds+bolt_ds_tol, h=1.1*t, $fn=30); + } + } +} + +module shell_connector(pcb_dim, margins, t) { + dim = dim_pcb_to_case(pcb_dim, margins, t); + + size_x = dim[0]-6*t; + size_y = bolt_l-t; + size_z = dim[2]/2+3*bolt_ds; + + difference () { + // base body + translate([3*t,dim[1]-t-size_y,0]) + cube([size_x,size_y,size_z]); + + // bolt holes + for (x = [dim[0]/4, dim[0]-dim[0]/4]) { + translate([x,dim[1]-t,dim[2]/2+1.5*bolt_ds]) + rotate([90,0,0]) + cylinder(d=bolt_ds+bolt_ds_tol, h=size_y, $fn=30); + } + + // nut holes + for (x = [dim[0]/4, dim[0]-dim[0]/4]) { + translate([x, dim[1]-t-size_y, dim[2]/2+1.5*bolt_ds]) + rotate([-90,0,0]) + cylinder(d=nut_d+nut_d_tol, h=nut_h, $fn=30); + } + } + + echo(min_shell_bolt_length=t+size_y); +} + +module pcb_case_shell(pcb_dim, drillings, margins, t) { + difference () { + union() { + shell_base(pcb_dim, margins, t); + shell_connector(pcb_dim, margins, t); + for (drilling = drillings) { + translate([ + 2*t+margins[0][0]+drilling[0], + bolt_l+margins[1][0]+drilling[1], + 0 + ]) cylinder(d=nut_d+2, h=t+margins[2][0], $fn=30); + } + } + for (drilling = drillings) { + translate([ + 2*t+margins[0][0]+drilling[0], + bolt_l+margins[1][0]+drilling[1], + 0 + ]) { + cylinder(d=bolt_ds+bolt_ds_tol, h=t+margins[2][0], $fn=30); + cylinder(d=nut_d+nut_d_tol, h=nut_h, $fn=30); + } + } + } +} + +module pcb_case_shell_bottom(pcb_dim, drillings, margins, t) { + pcb_case_shell(pcb_dim, drillings, margins, t); +} + +module pcb_case_shell_top(pcb_dim, margins, t) { + dim = dim_pcb_to_case(pcb_dim, margins, t); + + translate([0, dim[1], dim[2]]) + rotate([180,0,0]) + pcb_case_shell(pcb_dim, [], margins, t); +} diff --git a/case/pcb_case/spacer.scad b/case/pcb_case/spacer.scad new file mode 100644 index 0000000..e7eba3a --- /dev/null +++ b/case/pcb_case/spacer.scad @@ -0,0 +1,10 @@ +include <bolt.scad> + +spacer_h = 11; + +module spacer() { + difference() { + cylinder(d=bolt_dk, h=spacer_h, $fn=30); + cylinder(d=bolt_ds+bolt_ds_tol, h=spacer_h, $fn=30); + } +} diff --git a/case/pcb_case/tolerance_tests.scad b/case/pcb_case/tolerance_tests.scad new file mode 100644 index 0000000..94911cd --- /dev/null +++ b/case/pcb_case/tolerance_tests.scad @@ -0,0 +1,86 @@ +include <bolt.scad> +include <nut.scad> +include <panel.scad> + +use <rounded_cube.scad> + +t = 2; +step_width = 0.15; + +module bolt_drilling() { + steps = 2; + + for(i = [-steps : steps]) { + tol = bolt_ds_tol + i * step_width; + echo(bolt_ds_tol=tol); + translate([i*5*bolt_ds,0,0]) + difference() { + cube([5*bolt_ds, 5*bolt_ds, t]); + translate([2.5*bolt_ds,2.5*bolt_ds,0]) { + cylinder(d=bolt_ds+tol,h=t,$fn=50); + } + } + } +} + +module nut_drilling() { + steps = 2; + + for(i = [-steps : steps]) { + tol = nut_d_tol + i * step_width; + echo(nut_d_tol=tol); + translate([i*5*nut_d,0,0]) + difference() { + cube([5*nut_d, 5*nut_d, 2*nut_h]); + translate([2.5*nut_d,2.5*nut_d,0]) { + union() { + cylinder(d=bolt_ds+bolt_ds_tol,h=2*nut_h,$fn=50); + translate([0,0,nut_h]) + cylinder(d=tol+nut_d,h=nut_h,$fn=50); + } + } + } + } +} + +module panel_thickness() { + steps = 2; + + height = 2*t; + + for(i = [-steps : steps]) { + tol = panel_dim_0_tol + i * step_width; + echo(panel_dim_0_tol=tol); + translate([i*5*t,0,0]) + difference() { + cube([5*t, 5*t, height]); + translate([2*t, 0, t]) { + cube([t+tol, 5*t, t]); + } + } + } +} + +module panel_width_height() { + steps = 2; + + height = 3*t; + + for(i = [-steps : steps]) { + tol = panel_dim_1_2_tol + i * step_width; + echo(panel_dim_1_2_tol=tol); + translate([i*3*t,0,0]) + difference() { + cube([3*t, 8*t, height]); + translate([t, t-tol/2, t]) { + rounded_cube([t+panel_dim_0_tol, 6*t+tol, 6*t+tol], t); + } + } + } +} + +bolt_drilling(); +translate([0, 20, 0]) nut_drilling(); +translate([0, 70, 0]) panel_thickness(); +translate([0, 50, 0]) panel_width_height(); +translate([0, 85, 0]) rotate([0, -90, 0]) rounded_cube([t, 6*t, 6*t], t); |