diff --git a/enclosure/PSU.scad b/enclosure/PSU.scad new file mode 100644 index 0000000..057b370 --- /dev/null +++ b/enclosure/PSU.scad @@ -0,0 +1,56 @@ +xdim = 23.497 + 1.5; +ydim = 18.155; +zdim = 13.5; +wt = 1; +a = 0.897; +b = 4.364; +c = 10.222; +d = 3.168; +e = 1.495; +f = 3.168; + +//conn_pos = [a, a+b+c, a+b+c+d+e]; +conn_pos = [a+b+c, a+b+c+d+e]; +conn_dim = [ +// [b, 8], + [d, 8], + [f, 8] +]; + +div_width = 0.5; +div_reach = 2.8; +div_pos = a+b+c+d+(e/2)-(div_width/2); + +psu_case(); + +module psu_case() { + translate([wt + div_pos, wt, 0]) { + cube(size=[div_width, div_reach, zdim + wt]); + } + + difference() { + cube(size=[ xdim + (2 * wt), + ydim + (2 * wt), + zdim + wt]); + translate([wt,wt,wt]) { + cube(size=[ xdim, + ydim + wt + 1, + zdim + wt + 1]); + } + conn_cuts(); + } +} + +module conn_cuts() { + translate([wt, -1, 0]) { + for(i = [0:1:len(conn_pos) - 1]) { + translate([ conn_pos[i], 0, -wt]) { + cube([ conn_dim[i][0], + wt + 2, + conn_dim[i][1] + 1]); + } + } + } +} + +//color("red") conn_cuts(); \ No newline at end of file diff --git a/enclosure/enclosure.h b/enclosure/enclosure.h new file mode 100644 index 0000000..36e6fe0 --- /dev/null +++ b/enclosure/enclosure.h @@ -0,0 +1,208 @@ +//*** DIMENSIONS ***// +x = 0; y = 1; z = 2; // simplify array references +printer_layer_height=0.1313; +tol = 0.25; // tolerance +$fn = 80; // facet count for curves + +label_text = "2026-05 v3.5"; +label_size = 5; + +// Include non-printing placeholder compoenents +render_placeholders = false; + +// Only render mesh overlap structures +render_supports = false; + +// Junction Box +jbox_dim = [51,92,82]; +jbox_screw_distance = 83.5; +jbox_screw_dia = 2.1; +jbox_ear_width = 18.155 + 2; +jbox_ear_thickness = 3; +jbox_ear_pleatau = -15; +jbox_hole_inset = 4; +jbox_mount_dim = [15, 10, jbox_dim.z]; + +// Dial +dial_pos = [23.63,19.52]; +dial_r = 18; +dial_bezel_r = 3; +dial_depth = 10.5; +dial_walls = 1.5; +dial_shaft_depth = 5; +dial_shaft_r = 10 / 2; +dial_hole_r = 6.25 / 2; +dial_hole_cut = (dial_hole_r * 2) - 4.75; +dial_faceplate_tol = 1.0; + +// Faceplate +face_pos = [0, -5, 0]; +thickness = 3; +corner_r = 10; +// brim_thickness = 13.5; +brim_thickness = 19.5 + 5; +display_thickness = 8; +display_window_layers = 3; +display_window_thickness = display_window_layers * printer_layer_height; +display_window_depth = 1; +display_pos = [[10.93,39.44],[10.93,59.76]]; +display_dim = [25.4,19,display_thickness]; +display_tolerance = 0.25; +xdim = 75; //placeholder +ydim = 115; +zdim = display_thickness + display_window_depth; +yoff = -10; + +// MAX IC keepout +max_pos = [47.20,55.95]; // centered +max_dim = [10,34,4]; + +// Control PCB +pcb_dim = [54.8,82.29,1.6]; +pcb_pos = [ + (xdim / 2) - dial_pos.x, + (ydim / 2) - (pcb_dim.y / 2) + 5, + zdim +]; +diffuse_inter_digit=12.7; +diffuse_xoff1 = 1; +diffuse_xoff2 = diffuse_xoff1 + diffuse_inter_digit; +diffuse_yoff = 2.5; + +mounting_holes = [ + [3.31,3.08], + [49.78,35.05], + [51.01,5.08], + [3.81,78.81], + [51.01,78.81] +]; + +// ESP Backpack +esp_header_dim = [3,38,3]; +esp_header_offset = 6; +esp_pos = [23.43,19.59,pcb_dim.z+esp_header_dim.z]; +esp_dim = [48,26,4]; + +mounting_stem_r = 8.75/2; +relay_mounting_stem_r = 7.75/2; +mounting_hole_r = 2.75/2; //for M2 screws +mounting_hole_depth = 5; //for 6mm long screws +mounting_stem_support_height = zdim; +mounting_stem_support_base = zdim; +mounting_stem_support_thickness = 2; + +hook_dim = [3,20,30]; +hook_cut_pos = [-1,10,3]; +hook_cut_dim = [3, 10]; +hook_cut_height = 20; +hook_cut_angle = 2; + +// RELAY BOARD + +relay_dim = [41.58,62.22,1.6]; +relay_pos = [(jbox_dim.x / 2) - (relay_dim.x / 2), + jbox_mount_dim.y + 7, + -9.5]; +relay_mounting_holes = [ + [3.81,3.81], + [38.1,3.81], + [3.81,58.65], + [38.1,58.65] +]; +relay_cover_height = 15.0; +relay_cover_thickness = 1.5; +relay_cover_mount_stem_r = 3.75; +relay_cover_mount_hole_r = 1.9; +relay_cover_mount_thickness = 1; +relay_sidewalls = 1.5; //TODO, merge this with thickness +relay_pcb_inset = 5.5; +relay_threaded_insert_depth = 8; //For M2x8x3.5 inserts +// NOTE: the following amount of the threaded brass insert should +// be left protruding: +// relay_pcb_inset - relay_dim.z = 5.5 - 1.6 = 3.9 + +// array of tuples, [pos,length] +// relay_conn_openings = [ +// [8.0,9.0], +// [32.0,4], +// [42.5,4] +// ]; +relay_actap_pos = [ [relay_dim.x-3.81,34.29],[relay_dim.x-3.81,44.45] ]; +relay_passthrough_pos = [6.35 - 2,13.7 - 1]; +relay_passthrough_dim = [4+2,8+2,10]; +relay_conn_height=relay_pcb_inset - relay_dim.z; + +// DHT SENSOR +dht_dim = [20.2,16.4,9.4]; +dht_pos = [xdim - dht_dim.x - thickness - 11, + thickness, + thickness - 1]; +dht_slot_dim = [1.5,dht_dim.y + thickness,dht_dim.z]; +dht_slot_spacing = 1.5; + +// FACEPLATE HOOKS +face_hook_tol = 0.25; +face_hook_thickness = 3; +face_hook_width = 15; +face_hook_jbox_clearance = 2; +face_hook_dim_4 = [ 2,15, 10]; +face_hook_overreach = (xdim / 2) - (jbox_dim.x / 2) - face_hook_dim_4.x - face_hook_tol; +face_hook_dim_1 = [12, + face_hook_width, + thickness]; +face_hook_dim_2 = [ thickness, + face_hook_width, + -relay_pos.z]; +face_hook_dim_3 = [face_hook_overreach + face_hook_jbox_clearance, + 15, + 1.5]; +face_hook_slot_dim = [2 + 2, 15/2 + 1,3]; +face_hook_slot_pos = [-1,15/2,4]; +face_hook_pos = [ + [8, 70], // left side + [8, 70] // right side +]; +face_hook_tab_dim = [3, + 8, + face_hook_slot_dim.z - (face_hook_tol * 2)]; + +// BEZEL + +bezel_r = 5; + +// MODULES + +module mounting_stem(depth, stem_r = mounting_stem_r, hole_r = mounting_hole_r) { + difference() { + linear_extrude(depth) { + circle(stem_r); + } + translate([0,0,2]) { + linear_extrude(depth + 1) { + circle(hole_r); + } + } + } + // stem_support(0); + // stem_support(90); + // stem_support(180); + // stem_support(270); +} + +//support triangle +support_points = [ + [0,0], + [0, mounting_stem_support_height], + [mounting_stem_support_base, 0] +]; +support_paths = [[0, 1, 2]]; + +module stem_support(rotation) { + rotate([90,0,rotation]) { + translate([mounting_stem_r - 1,0,-mounting_stem_support_thickness / 2]) { + linear_extrude(mounting_stem_support_thickness) { + polygon(points=support_points, paths=support_paths); + } + } + } +} diff --git a/enclosure/jbox-bracket.FCStd b/enclosure/jbox-bracket.FCStd new file mode 100644 index 0000000..5b942fc Binary files /dev/null and b/enclosure/jbox-bracket.FCStd differ diff --git a/enclosure/jbox_strap.scad b/enclosure/jbox_strap.scad new file mode 100644 index 0000000..331b1d4 --- /dev/null +++ b/enclosure/jbox_strap.scad @@ -0,0 +1,248 @@ +include +use + +//*** DIMENSIONS ***// + +//*** ASSEMBLY ***// + +if (render_supports) { + supports(); +} else { + difference() { + union() { + if (render_placeholders) { + placeholder_board(); + *color("grey", 0.5) placeholder_jbox(); + } + color("cyan") jbox_mounting_ears(); + *color("white") relay_plate(); + *color("blue") label(); + *color("pink") sidewalls(); + *color("cyan") face_hooks(); + } + *color("red") relay_passthrough(); + translate([0,0,-1]) + *relay_mounting_stems(0); + } + *relay_mounting_stems(mounting_hole_r); +} + +psu_case_attached(); + +*color("grey") placeholder_jbox(); + +//*** MODULES ***// + +module psu_case_attached() { + translate([18.155/2+1,30,-24.0]) + rotate([0,0,90]) + psu_case(); +} + +module sidewalls() { + rotate([0,180,0]) { + translate([ -relay_dim.x/2, + relay_pos.y, + -relay_pos.z]) { + difference() { + cube(size=[ relay_dim.x, + relay_dim.y, + mounting_hole_depth]); + translate([ relay_sidewalls, + relay_sidewalls, + -1]) { + cube(size=[ relay_dim.x - (2 * relay_sidewalls), + relay_dim.y - (2 * relay_sidewalls), + mounting_hole_depth + 2]); + } + for(i = [0:len(relay_mounting_holes)-1]) { + translate(relay_mounting_holes[i]) { + mounting_stem(mounting_hole_depth + thickness, + hole_r = 0); + } + } + } + } + } +} + +module relay_mounting_stems(r) { + stem_depth = relay_threaded_insert_depth - relay_pcb_inset + relay_dim.z + 2; + translate([jbox_dim.x/2,0,stem_depth]) { + rotate([0,0,180]) { + translate([relay_pos.x, -relay_pos.y - relay_dim.y, relay_pos.z]) { + for(i = [0:len(relay_mounting_holes)-1]) { + translate(relay_mounting_holes[i]) { + translate([0,0, 0]) { + rotate([180,0,0]) { + mounting_stem(stem_depth, stem_r = relay_mounting_stem_r, hole_r = r); + } + } + } + } + } + } + } +} + +module supports() { + relay_mounting_stems(0); +} + +module label() { + translate([ relay_pos.x + 0, + relay_pos.y + 10, + relay_pos.z+thickness]) + rotate([0,0,90]) + linear_extrude(0.75) + text(label_text, size=label_size); +} + +module face_hooks() { + for(i = [0:len(face_hook_pos[1])-1]) { + translate([0,face_hook_pos[1][i],relay_pos.z]) { + face_hook_right(); + } + } + for (i = [0:len(face_hook_pos[0])-1]) { + translate([0,face_hook_pos[0][i],relay_pos.z]) { + face_hook_left(); + } + } +} + +module face_hook_left() { + mirror([1,0,0]) + face_hook_right(); +} + +module face_hook_right() { + //difference() { + translate([jbox_dim.x/2 - face_hook_dim_1.x - face_hook_jbox_clearance - thickness,0,0]) { + if (!render_supports) { + cube(size=face_hook_dim_1); + } + translate([face_hook_dim_1.x,0,0]) { + cube(size=face_hook_dim_2); + translate([0,0,face_hook_dim_2.z]) { + cube(size=face_hook_dim_3); + translate([face_hook_dim_3.x,0,0]) { + difference() { + cube(size=face_hook_dim_4); + translate(face_hook_slot_pos) { + cube(size=face_hook_slot_dim); + translate([ 0, + 12, + -5.5]) { + rotate([45,0,0]) { + cube(size=10); + } + } + } + } + } + } + } + } +} + +module placeholder_jbox() { + translate([-jbox_dim.x/2,0,-jbox_dim.z]) { + difference() { + translate([-3,-3,-3]) + cube([jbox_dim.x + 6, + jbox_dim.y + 6, + jbox_dim.z + 3]); + cube([jbox_dim.x, jbox_dim.y, jbox_dim.z + 1]); + } + translate([(jbox_dim.x/2) - (jbox_mount_dim.x/2), 0, 0]) { + cube(jbox_mount_dim); + translate([0,jbox_dim.y - jbox_mount_dim.y ,0]) + cube(jbox_mount_dim); + } + } +} + +module placeholder_board() { + rotate([0,180,0]) + translate([-jbox_dim.x/2,0,2 * -relay_pos.z + relay_pcb_inset - relay_dim.z]) + color("green") { + translate(relay_pos) { + difference() { + cube(size=relay_dim); + for(i = [0:len(relay_mounting_holes)-1]) { + translate([0,0,-1]) + translate(relay_mounting_holes[i]) { + linear_extrude(zdim) { + circle(r=2.1); + } + } + } + } + } + } +} + +module relay_plate() { + rotate([0,180,0]) + translate([0,0,2 * -relay_pos.z - thickness]) + translate([-jbox_dim.x/2,0,0]) + translate([relay_pos.x - relay_cover_thickness,relay_pos.y,relay_pos.z]) { + cube(size=[relay_dim.x + (2 * relay_cover_thickness), relay_dim.y, thickness]); + } +} + +module relay_passthrough() { + rotate([0,180,0]) + translate([0,0,2 * -relay_pos.z - thickness ]) + translate([-jbox_dim.x/2,0,0]) + translate([relay_pos.x - relay_cover_thickness,relay_pos.y,relay_pos.z]) { + translate([ relay_dim.x - relay_passthrough_pos.x, + relay_dim.y - relay_passthrough_pos.y] ) { + cube(size=relay_passthrough_dim, center=true); + } + } +} + +module jbox_mounting_ears() { + translate([0,jbox_hole_inset,0]) { + jbox_mounting_ear(); + translate([0,jbox_screw_distance,0]) { + rotate([0,0,180]) { + jbox_mounting_ear(); + } + } + } + translate([-jbox_ear_width/2, jbox_mount_dim.y, relay_pos.z]) { + difference() { + cube([jbox_ear_width, + jbox_dim.y - (2 * jbox_mount_dim.y) - 2, + thickness]); + translate([15,21.5,-5]) + cube([4, 6,10]); + } + } +} + +module jbox_mounting_ear() { + linear_extrude(jbox_ear_thickness) { + difference() { + intersection() { + square([jbox_ear_width, 12], center=true); + translate([0, jbox_ear_pleatau, 0]) { + rotate([0,0,45]) { + square([50,50]); + } + } + } + circle(r=jbox_screw_dia); + } + } + translate([-jbox_ear_width/2, jbox_mount_dim.y - jbox_hole_inset, relay_pos.z]) { + cube([jbox_ear_width, thickness, -relay_pos.z + jbox_ear_thickness]); + } +} + +module fplate_mount() { + +} \ No newline at end of file