From 0c96b1247a605d02e8ca07b90638242f665f1b37 Mon Sep 17 00:00:00 2001 From: Edward Kisiel Date: Thu, 7 Dec 2023 20:46:38 -0500 Subject: [PATCH] adjusted m1s shell, added m1s_shell_ups case, adjusted components and cooling options. --- sbc_case_builder.json | 67 +++++- sbc_case_builder.scad | 40 +++- sbc_case_builder_accessories.cfg | 31 +++ sbc_case_builder_library.scad | 379 ++++++++++++++++++++++++++++++- 4 files changed, 496 insertions(+), 21 deletions(-) diff --git a/sbc_case_builder.json b/sbc_case_builder.json index 56578f1..3c526e4 100644 --- a/sbc_case_builder.json +++ b/sbc_case_builder.json @@ -5076,7 +5076,7 @@ "m1s_shell": { "$fn": "90", "accessory_highlight": "false", - "accessory_name": "none", + "accessory_name": "m1s_shell", "adjust": "0.01", "bottom_ext_standoff": "[6.25, 5, 3.6, 10, 4, 1, 0, 0, 0, 4.5, 5.1]", "bottom_front_left": "0", @@ -5097,8 +5097,8 @@ "cooling": "hex", "exhaust_vents": "vent", "fillet": "0", - "floorthick": "2", - "gap": "1", + "floorthick": "1.5", + "gap": "2.5", "gpio_opening": "none", "indents": "true", "lip": "5", @@ -5118,7 +5118,7 @@ "sbc_off": "false", "sbc_top_standoffs": "true", "sidethick": "2", - "sidewall_support": "true", + "sidewall_support": "false", "tol": "0.25", "top_ext_standoff": "[6.25, 18, 2.5, 10, 4, 4, 0, 1, 0, 4.5, 5.1]", "top_front_left": "0", @@ -5130,6 +5130,63 @@ "vu_rotation": "[15, 0, 0]", "wallthick": "2" }, + "m1s_shell_ups": { + "$fn": "90", + "accessory_highlight": "false", + "accessory_name": "m1s_shell_ups", + "adjust": "0.01", + "bottom_ext_standoff": "[6.25, 11.5, 3.6, 10, 4, 1, 0, 0, 0, 4.5, 5.1]", + "bottom_front_left": "0", + "bottom_front_right": "0", + "bottom_rear_left": "0", + "bottom_rear_right": "0", + "bottom_standoff": "[6.25, 8, 3.6, 10, 4, 1, 0, 0, 0, 4.5, 5.1]", + "c_fillet": "3", + "case_design": "shell", + "case_ext_standoffs": "true", + "case_ffn": "90", + "case_fn": "360", + "case_offset_bz": "3", + "case_offset_tz": "6", + "case_offset_x": "50", + "case_offset_y": "65", + "case_style": "none", + "cooling": "hex", + "exhaust_vents": "vent", + "fillet": "0", + "floorthick": "1.5", + "gap": "2.5", + "gpio_opening": "none", + "indents": "true", + "lip": "5", + "lower_bottom": "0", + "move_front": "0", + "move_leftside": "0", + "move_rear": "0", + "move_rightside": "0", + "pcb_loc_x": "45", + "pcb_loc_y": "0", + "pcb_loc_z": "0", + "raise_top": "0", + "sata_punchout": "false", + "sbc_bottom_standoffs": "true", + "sbc_highlight": "false", + "sbc_model": "m1s", + "sbc_off": "false", + "sbc_top_standoffs": "true", + "sidethick": "2", + "sidewall_support": "false", + "tol": "0.25", + "top_ext_standoff": "[6.25, 17.5, 2.5, 10, 4, 4, 0, 1, 0, 4.5, 5.1]", + "top_front_left": "0", + "top_front_right": "0", + "top_rear_left": "0", + "top_rear_right": "0", + "top_standoff": "[6.25, 18, 2.5, 10, 4, 4, 0, 1, 0, 4.5, 5.1]", + "view": "model", + "vu_rotation": "[15, 0, 0]", + "wallthick": "2" + }, "m1s_panel": { "$fn": "90", "accessory_highlight": "false", @@ -5190,7 +5247,7 @@ "m1s_stacked": { "$fn": "90", "accessory_highlight": "false", - "accessory_name": "none", + "accessory_name": "m1s_shell", "adjust": "0.01", "bottom_ext_standoff": "[6.25, 5, 3.6, 10, 4, 1, 0, 0, 0, 4.5, 5.1]", "bottom_front_left": "0", diff --git a/sbc_case_builder.scad b/sbc_case_builder.scad index 180361e..23d07e7 100644 --- a/sbc_case_builder.scad +++ b/sbc_case_builder.scad @@ -108,7 +108,7 @@ case_offset_bz = 0; //[0:.5:100] // case wall thickness wallthick = 2; //[1:.5:5] // case floor thickness -floorthick = 2; //[1:.5:5] +floorthick = 2; //[1:.25:5] // case side thickness sidethick = 2; //[1:.5:5] // distance between pcb and case @@ -164,14 +164,14 @@ indents = true; // enable sata punchout sata_punchout = false; // gpio openings -gpio_opening = "none"; // [none,vent,open,punchout] +gpio_opening = "none"; // [none,vent,open,block,punchout] // cooling openings cooling = "fan"; // [none,vents,fan,hex,custom] // exhaust vents exhaust_vents = "vent"; // [none,vent] // case accessory group to load -accessory_name = "none"; // ["none", "hk_uart", "c1+_shell_boombox", "c1+_panel_boombox", "c1+_panel_lcd3.5", "c1+_desktop_lcd3.5", "c1+_deskboom_lcd3.5", "c1+_tray_boombox", "c1+_round", "c1+_hex", "c2_shell_boombox", "c2_panel_boombox", "c2_panel_lcd3.5", "c2_desktop_lcd3.5", "c2_deskboom_lcd3.5", "c2_tray_boombox", "c2_round", "c2_hex", "c4_shell_boombox", "c4_panel_lcd3.5", "c4_desktop_lcd3.5", "c4_deskboom_lcd3.5", "c4_panel_boombox", "c4_tray_boombox", "c4_round", "c4_hex", "xu4_keyhole", "hc4_tray_drivebox2.5", "hc4_shell_drivebox2.5", "hc4_shell_drivebox2.5v", "hc4_shell_drivebox3.5", "n1_round", "n1_hex", "n2l_tray", "n2l_gpio", "n2+_tray_vu7_fan", "m1_panel", "m1_tray", "m1_tray_ssd", "m1_tray_sides", "m1_tray_vu5", "m1_tray_vu7", "m1_fitted_drivebox2.5", "m1_fitted_drivebox3.5", "m1_fitted_pizzabox", "m1_fitted_drivebox3.5v", "h2_shell", "h2_shell_router", "h2_shell_router-ssd", "h2_lowboy", "h2_lowboy_router", "h2_tray", "h2_tray_sides", "h2_tray_router", "h2_router_station", "h2_round", "h2_hex", "h3_shell", "h3_lowboy", "h3_lowboy_router", "h3_tallboy", "h3_tallboy-ssd", "h3_ultimate", "h3_ultimate2", "h3_shell_drivebox2.5v", "jetsonnano_shell", "jetsonnano_panel", "jetsonnano_stacked", "jetsonnano_tray", "jetsonnano_tray_sides", "jetsonnano_round", "jetsonnano_hex", "jetsonnano_snap", "jetsonnano_fitted", "rock64_shell", "rock64_panel", "rock64_stacked", "rock64_tray", "rock64_tray_sides", "rock64_round", "rock64_hex", "rock64_snap", "rock64_fitted", "rockpro64_shell", "rockpro64_panel", "rockpro64_stacked", "rockpro64_tray", "rockpro64_tray_sides", "rockpro64_round", "rockpro64_hex", "rockpro64_snap", "rockpro64_fitted", "quartz64b_stacked_poe_hat", "star64_shell", "show2_shell", "rpi1a+_shell", "rpi1a+_panel", "rpi1a+_stacked", "rpi1a+_tray", "rpi1a+_tray_sides", "rpi1a+_round", "rpi1a+_hex", "rpi1a+_snap", "rpi1a+_fitted", "rpi1b+_shell", "rpi1b+_panel", "rpi1b+_stacked", "rpi1b+_tray", "rpi1b+_tray_sides", "rpi1b+_round", "rpi1b+_hex", "rpi1b+_snap", "rpi1b+_fitted", "rpi3a+_shell", "rpi3a+_panel", "rpi3a+_stacked", "rpi3a+_tray", "rpi3a+_tray_sides", "rpi3a+_round", "rpi3a+_hex", "rpi3a+_snap", "rpi3a+_fitted", "rpi3b_shell", "rpi3b_panel", "rpi3b_stacked", "rpi3b_tray", "rpi3b_tray_sides", "rpi3b_round", "rpi3b_hex", "rpi3b_snap", "rpi3b_fitted", "rpi3b+_shell", "rpi3b+_panel", "rpi3b+_stacked", "rpi3b+_tray", "rpi3b+_tray_sides", "rpi3b+_round", "rpi3b+_hex", "rpi3b+_snap", "rpi3b+_fitted", "rpi4b_shell", "rpi4b_shell_geeekpi_poe_hat", "rpi4b_panel", "rpi4b_stacked", "rpi4b_tray", "rpi4b_tray_sides", "rpi4b_round", "rpi4b_hex", "rpi4b_snap", "rpi4b_fitted", "rpi5_noheatsink_shell", "rpi5_noheatsink_panel", "rpi5_noheatsink_stacked", "rpi5_noheatsink_tray", "rpi5_noheatsink_tray_sides", "rpi5_noheatsink_round", "rpi5_noheatsink_hex", "rpi5_noheatsink_snap", "rpi5_noheatsink_fitted", "rock4b+_shell", "rock4b+_panel", "rock4b+_stacked", "rock4b+_tray", "rock4b+_tray_sides", "rock4b+_round", "rock4b+_hex", "rock4b+_snap", "rock4b+_fitted", "rock4c_shell", "rock4c_panel", "rock4c_stacked", "rock4c_tray", "rock4c_tray_sides", "rock4c_round", "rock4c_hex", "rock4c_snap", "rock4c_fitted", "rock4c+_shell", "rock4c+_panel", "rock4c+_stacked", "rock4c+_tray", "rock4c+_tray_sides", "rock4c+_round", "rock4c+_hex", "rock4c+_snap", "rock4c+_fitted", "rock5b", "rock5b_shell", "rock5bq", "rock5bq_shell", "rock5bq_tray", "rock5bq_tray_sides", "rock5bq_snap", "rock5bq_fitted", "rock5b-v1.3", "vim1_shell", "vim1_panel", "vim1_stacked", "vim1_tray", "vim1_tray_sides", "vim1_round", "vim1_hex", "vim1_snap", "vim1_fitted", "vim2_shell", "vim2_panel", "vim2_stacked", "vim2_tray", "vim2_tray_sides", "vim2_round", "vim2_hex", "vim2_snap", "vim2_fitted", "vim3l_shell", "vim3l_panel", "vim3l_stacked", "vim3l_tray", "vim3l_tray_sides", "vim3l_round", "vim3l_hex", "vim3l_snap", "vim3l_fitted", "vim3_shell", "vim3_panel", "vim3_stacked", "vim3_tray", "vim3_tray_sides", "vim3_round", "vim3_hex", "vim3_snap", "vim3_fitted", "vim4_shell", "vim4_panel", "vim4_stacked", "vim4_tray", "vim4_tray_sides", "vim4_round", "vim4_hex", "vim4_snap", "vim4_fitted", "tinkerboard_shell", "tinkerboard_panel", "tinkerboard_stacked", "tinkerboard_tray", "tinkerboard_tray_sides", "tinkerboard_round", "tinkerboard_hex", "tinkerboard_snap", "tinkerboard_fitted", "tinkerboard-s_shell", "tinkerboard-s_panel", "tinkerboard-s_stacked", "tinkerboard-s_tray", "tinkerboard-s_tray_sides", "tinkerboard-s_round", "tinkerboard-s_hex", "tinkerboard-s_snap", "tinkerboard-s_fitted", "tinkerboard-2_shell", "tinkerboard-2_panel", "tinkerboard-2_stacked", "tinkerboard-2_tray", "tinkerboard-2_tray_sides", "tinkerboard-2_round", "tinkerboard-2_hex", "tinkerboard-2_snap", "tinkerboard-2_fitted", "tinkerboard-r2_shell", "tinkerboard-r2_panel", "tinkerboard-r2_stacked", "tinkerboard-r2_tray", "tinkerboard-r2_tray_sides", "tinkerboard-r2_round", "tinkerboard-r2_hex", "tinkerboard-r2_snap", "tinkerboard-r2_fitted", "opi5_shell", "opi5_panel", "opi5_stacked", "opi5_tray", "opi5_tray-sides", "opi5_snap", "opi5_fitted", "visonfive2_shell", "visonfive2_panel", "visonfive2_stacked", "visonfive2_tray", "visonfive2_snap", "visonfive2_fitted", "visonfive2q_shell", "visonfive2q_panel", "visonfive2q_stacked", "visonfive2q_tray", "visonfive2q_snap", "visonfive2q_fitted"] +accessory_name = "none"; // ["none", "hk_uart", "c1+_shell_boombox", "c1+_panel_boombox", "c1+_panel_lcd3.5", "c1+_desktop_lcd3.5", "c1+_deskboom_lcd3.5", "c1+_tray_boombox", "c1+_round", "c1+_hex", "c2_shell_boombox", "c2_panel_boombox", "c2_panel_lcd3.5", "c2_desktop_lcd3.5", "c2_deskboom_lcd3.5", "c2_tray_boombox", "c2_round", "c2_hex", "c4_shell_boombox", "c4_panel_lcd3.5", "c4_desktop_lcd3.5", "c4_deskboom_lcd3.5", "c4_panel_boombox", "c4_tray_boombox", "c4_round", "c4_hex", "xu4_keyhole", "hc4_tray_drivebox2.5", "hc4_shell_drivebox2.5", "hc4_shell_drivebox2.5v", "hc4_shell_drivebox3.5", "n1_round", "n1_hex", "n2l_tray", "n2l_gpio", "n2+_tray_vu7_fan", "m1s_shell", "m1s_shell_ups", "m1_panel", "m1_tray", "m1_tray_ssd", "m1_tray_sides", "m1_tray_vu5", "m1_tray_vu7", "m1_fitted_drivebox2.5", "m1_fitted_drivebox3.5", "m1_fitted_pizzabox", "m1_fitted_drivebox3.5v", "h2_shell", "h2_shell_router", "h2_shell_router-ssd", "h2_lowboy", "h2_lowboy_router", "h2_tray", "h2_tray_sides", "h2_tray_router", "h2_router_station", "h2_round", "h2_hex", "h3_shell", "h3_lowboy", "h3_lowboy_router", "h3_tallboy", "h3_tallboy-ssd", "h3_ultimate", "h3_ultimate2", "h3_shell_drivebox2.5v", "jetsonnano_shell", "jetsonnano_panel", "jetsonnano_stacked", "jetsonnano_tray", "jetsonnano_tray_sides", "jetsonnano_round", "jetsonnano_hex", "jetsonnano_snap", "jetsonnano_fitted", "rock64_shell", "rock64_panel", "rock64_stacked", "rock64_tray", "rock64_tray_sides", "rock64_round", "rock64_hex", "rock64_snap", "rock64_fitted", "rockpro64_shell", "rockpro64_panel", "rockpro64_stacked", "rockpro64_tray", "rockpro64_tray_sides", "rockpro64_round", "rockpro64_hex", "rockpro64_snap", "rockpro64_fitted", "quartz64b_stacked_poe_hat", "star64_shell", "show2_shell", "rpi1a+_shell", "rpi1a+_panel", "rpi1a+_stacked", "rpi1a+_tray", "rpi1a+_tray_sides", "rpi1a+_round", "rpi1a+_hex", "rpi1a+_snap", "rpi1a+_fitted", "rpi1b+_shell", "rpi1b+_panel", "rpi1b+_stacked", "rpi1b+_tray", "rpi1b+_tray_sides", "rpi1b+_round", "rpi1b+_hex", "rpi1b+_snap", "rpi1b+_fitted", "rpi3a+_shell", "rpi3a+_panel", "rpi3a+_stacked", "rpi3a+_tray", "rpi3a+_tray_sides", "rpi3a+_round", "rpi3a+_hex", "rpi3a+_snap", "rpi3a+_fitted", "rpi3b_shell", "rpi3b_panel", "rpi3b_stacked", "rpi3b_tray", "rpi3b_tray_sides", "rpi3b_round", "rpi3b_hex", "rpi3b_snap", "rpi3b_fitted", "rpi3b+_shell", "rpi3b+_panel", "rpi3b+_stacked", "rpi3b+_tray", "rpi3b+_tray_sides", "rpi3b+_round", "rpi3b+_hex", "rpi3b+_snap", "rpi3b+_fitted", "rpi4b_shell", "rpi4b_shell_geeekpi_poe_hat", "rpi4b_panel", "rpi4b_stacked", "rpi4b_tray", "rpi4b_tray_sides", "rpi4b_round", "rpi4b_hex", "rpi4b_snap", "rpi4b_fitted", "rpi5_noheatsink_shell", "rpi5_noheatsink_panel", "rpi5_noheatsink_stacked", "rpi5_noheatsink_tray", "rpi5_noheatsink_tray_sides", "rpi5_noheatsink_round", "rpi5_noheatsink_hex", "rpi5_noheatsink_snap", "rpi5_noheatsink_fitted", "rock4b+_shell", "rock4b+_panel", "rock4b+_stacked", "rock4b+_tray", "rock4b+_tray_sides", "rock4b+_round", "rock4b+_hex", "rock4b+_snap", "rock4b+_fitted", "rock4c_shell", "rock4c_panel", "rock4c_stacked", "rock4c_tray", "rock4c_tray_sides", "rock4c_round", "rock4c_hex", "rock4c_snap", "rock4c_fitted", "rock4c+_shell", "rock4c+_panel", "rock4c+_stacked", "rock4c+_tray", "rock4c+_tray_sides", "rock4c+_round", "rock4c+_hex", "rock4c+_snap", "rock4c+_fitted", "rock5b", "rock5b_shell", "rock5bq", "rock5bq_shell", "rock5bq_tray", "rock5bq_tray_sides", "rock5bq_snap", "rock5bq_fitted", "rock5b-v1.3", "vim1_shell", "vim1_panel", "vim1_stacked", "vim1_tray", "vim1_tray_sides", "vim1_round", "vim1_hex", "vim1_snap", "vim1_fitted", "vim2_shell", "vim2_panel", "vim2_stacked", "vim2_tray", "vim2_tray_sides", "vim2_round", "vim2_hex", "vim2_snap", "vim2_fitted", "vim3l_shell", "vim3l_panel", "vim3l_stacked", "vim3l_tray", "vim3l_tray_sides", "vim3l_round", "vim3l_hex", "vim3l_snap", "vim3l_fitted", "vim3_shell", "vim3_panel", "vim3_stacked", "vim3_tray", "vim3_tray_sides", "vim3_round", "vim3_hex", "vim3_snap", "vim3_fitted", "vim4_shell", "vim4_panel", "vim4_stacked", "vim4_tray", "vim4_tray_sides", "vim4_round", "vim4_hex", "vim4_snap", "vim4_fitted", "tinkerboard_shell", "tinkerboard_panel", "tinkerboard_stacked", "tinkerboard_tray", "tinkerboard_tray_sides", "tinkerboard_round", "tinkerboard_hex", "tinkerboard_snap", "tinkerboard_fitted", "tinkerboard-s_shell", "tinkerboard-s_panel", "tinkerboard-s_stacked", "tinkerboard-s_tray", "tinkerboard-s_tray_sides", "tinkerboard-s_round", "tinkerboard-s_hex", "tinkerboard-s_snap", "tinkerboard-s_fitted", "tinkerboard-2_shell", "tinkerboard-2_panel", "tinkerboard-2_stacked", "tinkerboard-2_tray", "tinkerboard-2_tray_sides", "tinkerboard-2_round", "tinkerboard-2_hex", "tinkerboard-2_snap", "tinkerboard-2_fitted", "tinkerboard-r2_shell", "tinkerboard-r2_panel", "tinkerboard-r2_stacked", "tinkerboard-r2_tray", "tinkerboard-r2_tray_sides", "tinkerboard-r2_round", "tinkerboard-r2_hex", "tinkerboard-r2_snap", "tinkerboard-r2_fitted", "opi5_shell", "opi5_panel", "opi5_stacked", "opi5_tray", "opi5_tray-sides", "opi5_snap", "opi5_fitted", "visonfive2_shell", "visonfive2_panel", "visonfive2_stacked", "visonfive2_tray", "visonfive2_snap", "visonfive2_fitted", "visonfive2q_shell", "visonfive2q_panel", "visonfive2q_stacked", "visonfive2q_tray", "visonfive2q_snap", "visonfive2q_fitted"] a = search([accessory_name],accessory_data); s = search([sbc_model],sbc_data); @@ -2302,11 +2302,11 @@ module open_io() { } if(side == "top" && cooling == "hex" && class == "heatsink" && type != "m1s_oem") { translate([loc_x,loc_y-32,case_z-(floorthick+adjust)-6]) - vent_hex(11, 5, floorthick+(adjust*2)+12, 8, 1.5, "horizontal"); + vent_hex(11, 5, floorthick+(adjust*2)+12, 5, 1.5, "horizontal"); } if(side == "top" && cooling == "hex" && class == "heatsink" && type == "m1s_oem") { translate([loc_x-8,loc_y,case_z-(floorthick+adjust)-6]) - vent_hex(11, 5, floorthick+(adjust*2)+12, 8, 1.5, "horizontal"); + vent_hex(15, 7, floorthick+(adjust*2)+12, 5, 1.5, "horizontal"); } if(side == "top" && cooling == "custom" && class == "heatsink") { translate([loc_x+6,loc_y-14,case_z-(floorthick+adjust)]) @@ -2316,8 +2316,8 @@ module open_io() { || cooling == "custom") && class == "heatsink" && gpio_opening != "vent" && gpio_opening != "open" && gpio_opening != "punchout") { for(r=[loc_x+7:4:50+loc_x]) { - translate([r,depth-(2*wallthick)-adjust-2,bottom_height+2]) - cube([2,wallthick+(2*adjust)+1,top_height-floorthick-6]); + translate([r,depth-(2*wallthick)-adjust-3,bottom_height+2]) + cube([2,wallthick+(2*adjust)+2.5,top_height-floorthick-4]); } } @@ -2326,13 +2326,23 @@ module open_io() { if(gpio_opening == "vent") { for(r=[loc_x-2:4:50+loc_x]) { translate([r,depth-(2*wallthick)-gap-adjust,bottom_height+2]) - cube([2,wallthick+(2*adjust),top_height-floorthick-7]); + cube([2,wallthick+(2*adjust),top_height-floorthick-4]); } } if(gpio_opening == "open") { translate([loc_x-2,depth-(2*wallthick)-adjust-gap,bottom_height+3]) cube([54,wallthick+(2*adjust),top_height-floorthick-5]); } + if(gpio_opening == "block") { + if(sbc_model == "m1s") { + translate([loc_x-27,depth-(2*wallthick)-adjust-gap-10,bottom_height+2]) + cube([79,20,top_height]); + } + else { + translate([loc_x-2,depth-(2*wallthick)-adjust-gap-10,bottom_height+2]) + cube([54,20,top_height]); + } + } if(gpio_opening == "punchout") { translate([loc_x+1,depth-(2*wallthick)-adjust-gap,bottom_height+7.5]) rotate([-90,0,0]) punchout(50,11,2,wallthick+(2*adjust),c_fillet,"slot"); @@ -2342,13 +2352,17 @@ module open_io() { if(gpio_opening == "vent") { for(r=[loc_y-2:4:50+loc_y]) { translate([width-2*(wallthick+gap)-adjust,depth-r,bottom_height+2]) - rotate([0,0,0]) cube([6,wallthick+(2*adjust),top_height-floorthick-7]); + rotate([0,0,0]) cube([6,wallthick+(2*adjust),top_height-floorthick-4]); } } if(gpio_opening == "open") { translate([loc_x+8,depth-13,bottom_height+4]) rotate([0,0,-90]) cube([54,wallthick+(2*adjust),top_height-floorthick-5]); } + if(gpio_opening == "block") { + translate([loc_x+8,depth-13,bottom_height+2]) + rotate([0,0,-90]) cube([54,wallthick+(2*adjust),top_height]); + } if(gpio_opening == "punchout") { translate([loc_x+8,depth-15,bottom_height+7.5]) rotate([-90,0,-90]) punchout(50,11,2,wallthick+(2*adjust),c_fillet,"slot"); @@ -2365,6 +2379,10 @@ module open_io() { translate([loc_x-2,depth-(2*wallthick)-adjust,bottom_height+3]) cube([41,wallthick+(2*adjust),top_height-floorthick-5]); } + if(gpio_opening == "block") { + translate([loc_x-2,depth-(2*wallthick)-adjust-10,bottom_height+2]) + cube([41,20,top_height]); + } if(gpio_opening == "punchout") { translate([loc_x+1,depth-(2*wallthick)-adjust-gap,bottom_height+8]) rotate([-90,0,0]) punchout(34,11,2,wallthick+(2*adjust),3,"slot"); @@ -2381,6 +2399,10 @@ module open_io() { translate([loc_x-2,-wallthick-gap-adjust,bottom_height+3]) cube([41,wallthick+(2*adjust),top_height-floorthick-5]); } + if(gpio_opening == "block") { + translate([loc_x-2,-wallthick-gap-adjust-10,bottom_height+2]) + cube([41,20,top_height]); + } if(gpio_opening == "punchout") { translate([loc_x+1,-wallthick-adjust-gap,bottom_height+8]) rotate([-90,0,0]) punchout(34,11,2,wallthick+(2*adjust),3,"slot"); diff --git a/sbc_case_builder_accessories.cfg b/sbc_case_builder_accessories.cfg index efe6cac..779e1fe 100644 --- a/sbc_case_builder_accessories.cfg +++ b/sbc_case_builder_accessories.cfg @@ -482,6 +482,37 @@ accessory_data = [ "sub","vent",25,25,44,"top",[0,0,0],["case",false,false,false],10,2,4,6,6,"horizontal",1, // sub vent "sub","vent",25,50,44,"top",[0,0,0],["case",false,false,false],10,2,4,6,6,"horizontal",1], // sub vent + // Odroid-M1S + ["m1s_shell", + "sub","vent_hex",10,29,-1,"bottom",[0,0,0],["sbc",true,true,false],21,5,8,5,1.5,"horizontal",1, // vent opening + "sub","rectangle",73.5,5.5,3.5,"top",[0,0,45],["sbc",true,true,true],11,3,15,0,0,"vertical",[1,1,1,1], // standoff trim + "sub","rectangle",5.5,56,3.5,"top",[0,0,0],["sbc",true,true,true],3,11,15,0,0,"vertical",[1,1,1,1], // standoff trim + "sub","rectangle",81.5,56,3.5,"top",[0,0,0],["sbc",true,true,true],3,11,15,0,0,"vertical",[1,1,1,1], // standoff trim + "sub","rectangle",17.5,12,3.5,"top",[0,0,0],["sbc",true,true,true],11,3,15,0,0,"vertical",[1,1,1,1]], // standoff trim + + ["m1s_shell_ups", + "sub","vent_hex",0,5,26,"top",[0,0,0],["case",false,false,false],9,21,8,5,1.5,"horizontal",1, // vent opening + "model","hk_m1s_ups",-1,122.5,5,"bottom",[0,0,270],["sbc",false,false,false],0,0,0,0,0,"",0, // model 2.5 hd + "sub","slot",-55,17.5,7.25,"bottom",[90,0,90],["sbc",true,true,true],3.75,6.125,12,0,0,"",[.25,.25,.25,.25], // usb-c adjustment + "add2","standoff",2.5,11,0,"bottom",[0,0,0],["sbc",false,false,false],0,0,0,0,0,0,[5.75,5,3.6,10,4,1,0,0,0,4.5,5.1], // standoff + "add2","standoff",27.5,11,0,"bottom",[0,0,0],["sbc",false,false,false],0,0,0,0,0,0,[5.75,5,3.6,10,4,1,0,0,0,4.5,5.1], // standoff + "add2","standoff",2.5,119,0,"bottom",[0,0,0],["sbc",false,false,false],0,0,0,0,0,0,[5.75,5,3.6,10,4,1,0,0,0,4.5,5.1], // standoff + "add2","standoff",27.5,119,0,"bottom",[0,0,0],["sbc",false,false,false],0,0,0,0,0,0,[5.75,5,3.6,10,4,1,0,0,0,4.5,5.1], // standoff + "add1","access_port",-12,16.25,-0.01,"bottom",[0,0,180],["sbc",true,true,false],102,40,2,0,0,"landscape",0, // access port + "model","access_cover",-12,16.25,-0.01,"bottom",[0,0,180],["sbc",true,true,false],102,40,2,0,0,"landscape",0, // access port cover + "platter","access_cover",-88,16.25,0,"bottom",[0,0,0],["case",false,false,false],102,40,2,0,0,"landscape",0, // access port cover + "add2","button",-43.25,33.5,20,"top",[0,0,0],["sbc-case_z",true,true,true],10,0,15.5,0,0,"recess",0, // button + "model","button_top",-43.25,33.5,20,"top",[0,0,0],["sbc-case_z",true,true,true],10,0,15.5,0,0,"recess",0, // button top + "platter","button_top",-20,0,0,"top",[0,0,0],["case",false,false,false],10,0,15.5,0,0,"recess",0, // button top + "sub","rectangle",73.5,5.5,3.5,"top",[0,0,45],["sbc",true,true,true],11,3,15,0,0,"vertical",[1,1,1,1], // standoff trim + "sub","rectangle",5.5,56,3.5,"top",[0,0,0],["sbc",true,true,true],3,11,15,0,0,"vertical",[1,1,1,1], // standoff trim + "sub","rectangle",81.5,56,3.5,"top",[0,0,0],["sbc",true,true,true],3,11,15,0,0,"vertical",[1,1,1,1], // standoff trim + "sub","rectangle",17.5,12,3.5,"top",[0,0,0],["sbc",true,true,true],11,3,15,0,0,"vertical",[1,1,1,1]], // standoff trim + +// "add2","uart_holder",100,0,1.9,"bottom",[0,0,0],["case",false,false,false],10,10,0,0,0,"",0, // add uart holder +// "model","uart_strap",100,0,2,"bottom",[0,0,0],["case",false,false,false],0,0,0,0,0,"",0, // hk uart strap +// "model","hk_uart",70,0,5,"bottom",[0,0,270],["case",true,true,false],0,0,0,0,0,"",0, // model 2.5 hd + // Odroid-M1 ["m1_panel", "sub","vent",29,20,-1,"bottom",[0,0,0],["sbc",true,true,false],2,15,8,5,12,"horizontal",1, // vent opening diff --git a/sbc_case_builder_library.scad b/sbc_case_builder_library.scad index d755996..bbe9d9a 100644 --- a/sbc_case_builder_library.scad +++ b/sbc_case_builder_library.scad @@ -55,6 +55,10 @@ added nut_holder(nut, style, dia_x, dia_y, height), fixed access_port and access_cover 180 rotation in portrait and landscape, added h3_port_extender_holder(part,offset), cableholder_spacer() 20231115 Version 2.0.5 added hex vent and new component openings + 2023xxxx Version 2.0.x added vu8s, hk_m1s_case_holes, hk_m1s_ups(), proto_m1s(), proto_ups(), battery_clip(bat_dia = 18.4), + battery(type), pcb_pad(pads = 1, style = "round"), led(ledcolor = "red"), m_insert(type="M3", icolor = "#ebdc8b"), + usbc() + see https://github.com/hominoids/SBC_Case_Builder @@ -128,11 +132,22 @@ h3_port_extender_holder(part,offset) hk_pwr_button(mask = false) keyhole(keysize, mask = false) - vent_hex(cells_x, cells_y, cell_size, cell_spacing, orientation) + vent_hex(cells_x, cells_y, thickness, cell_size, cell_spacing, orientation) vent_panel_hex(x, y, thick, cell_size, cell_spacing, border, borders); dsub(dsubsize, mask = false) nut_holder(nut, style, dia_x, dia_y, height) cableholder_spacer() + hk_m1s_case_holes + hk_m1s_ups() + proto_m1s() + proto_ups() + battery_clip(bat_dia = 18.4) + battery(type) + pcb_pad(pads = 1, style = "round") + led(ledcolor = "red") + m_insert(type="M3", icolor = "#ebdc8b") + usbc() + */ use <./lib/fillets.scad>; @@ -248,6 +263,9 @@ module add(type,loc_x,loc_y,loc_z,face,rotation,size_x,size_y,size_z,data_1,data if(type == "hk_lcd35") { translate([loc_x,loc_y,loc_z]) rotate(rotation) hk35_lcd(); } + if(type == "hk_m1s_ups") { + translate([loc_x,loc_y,loc_z]) rotate(rotation) hk_m1s_ups(); + } if(type == "hk_uart") { translate([loc_x,loc_y,loc_z]) rotate(rotation) hk_uart(); } @@ -316,6 +334,9 @@ module add(type,loc_x,loc_y,loc_z,face,rotation,size_x,size_y,size_z,data_1,data if(type == "nut_holder") { translate([loc_x,loc_y,loc_z]) rotate(rotation) nut_holder(data_1, data_2, size_x, size_y, size_z); } + if(type == "standoff") { + translate([loc_x,loc_y,loc_z]) rotate(rotation) standoff(data_4); + } } @@ -1791,6 +1812,80 @@ module u_bracket() { } } +// hk vu8s lcd display +module hk_vu8s() { + + body_size = [202, 133, 1.70]; + glass_size = [195.5, 131, 1.75]; + lcd_size = [183.5,114, body_size[2] + 1]; + view_size = [172.5, 107.5, .1]; + + rb = 5.25; // body edge radius + + lcd_clearance = [0.15, 0.1, 0]; + pcb_size = [14,24,1.6]; + hole = 4.31; + spacer_size = [5.5, 1.75+body_size[2], 2.5, 5.5, 1, 0, 1, 1, 0, 0, 0]; + + $fn = 90; + adj = .01; + + // "body" + color([0.1,0.1,0.1]) + difference(){ + union() { + slab(body_size, rb); + translate([(8.25/2),-1.74-(8.25/2),0]) rotate([0,0,90]) slot(8.25,10+(8.25/2),body_size[2]); + translate([body_size[0]-(8.25/2),-1.74-(8.25/2),0]) rotate([0,0,90]) slot(8.25,10+(8.25/2),body_size[2]); + translate([(8.25/2),body_size[1]-10,0]) rotate([0,0,90]) slot(8.25,10.75+(8.25/2),body_size[2]); + translate([body_size[0]-(8.25/2),body_size[1]-10,0]) rotate([0,0,90]) slot(8.25,10.75+(8.25/2),body_size[2]); + } + lcd_space = lcd_size + 2*lcd_clearance; + + // corner holes + translate([4, -5, -1]) cylinder(d=hole, h=5); + translate([4, 143-5, -1]) cylinder(d=hole, h=5); + translate([202-4, -5, -1]) cylinder(d=hole, h=5); + translate([202-4, 143-5, -1]) cylinder(d=hole, h=5); + + translate([3.5, 3.5, -1]) cylinder(d=hole, h=5); + translate([3.5, body_size[1]-3.5, -1]) cylinder(d=hole, h=5); + translate([111, 3.5, -1]) cylinder(d=hole, h=5); + translate([111.5, body_size[1]-3.5, -1]) cylinder(d=hole, h=5); + + } + // standoffs + color([0.6,0.6,0.6]) { + translate([4, 3.75, body_size[2]+adj]) standoff(spacer_size); + translate([3.75, 128.25, body_size[2]+adj]) standoff(spacer_size); + translate([111.5, 4, body_size[2]+adj]) standoff(spacer_size); + translate([111.25, 128.75, body_size[2]+adj]) standoff(spacer_size); + } + // LCD panel + color([0.6, 0.6, 0.65]) + translate([10, 9, body_size[2]-lcd_size[2]]+lcd_clearance) + cube(lcd_size); + + // Front glass + // It's actually thinner and glued, but for the sake of simplicity... + color([0.2, 0.2, 0.2], 0.9) + translate([3, 1.25, body_size[2] + 0.01]) + slab(glass_size, rb); + + // view area + color("dimgrey", 0.9) + translate([14, 12.5, body_size[2] + glass_size[2]- 0.01]) + slab(view_size, .1); + + // PCB stub + color([0.1,0.1,0.1]) + translate([body_size[0]-25, body_size[1]-30, -2]) + cube([7,7,.1]); + color([0.1,0.1,0.1]) + translate([body_size[0]-50, body_size[1]-35, -2]) + cube([4,5,.1]); +} + // ODROID M1 2.5" SATA HDD mounting kit module m1_hdmount() { $fn = 30; @@ -2550,11 +2645,11 @@ module hdmi_open(hdmi_style) { if(hdmi_style == "hdmi_a") { union() { difference() { - translate([.25,-5,1]) cube([15,8,5.5]); + translate([0,-5,1.25]) cube([15.5,8,5.75]); translate([0.5,-5.2,.5]) rotate ([-90,0,0]) cylinder(d=3, h=13.5,$fn=30); translate([15,-5.2,.5]) rotate ([-90,0,0]) cylinder(d=3, h=13.5,$fn=30); } - translate([2,-5,.5]) cube([11.5, 8, .5]); + translate([1.75,-5,.5]) cube([12, 8, 1]); } } if(hdmi_style == "hdmi_micro") { @@ -2594,8 +2689,8 @@ module microusb_open() { translate([0,0,.5])rotate([90,0,0]) hull() { - translate([6,1.5,-5]) cylinder(d=3.5,h=9); - translate([1,1.5,-5]) cylinder(d=3.5,h=9); + translate([6,1.5,-5]) cylinder(d=3.5,h=12); + translate([1,1.5,-5]) cylinder(d=3.5,h=12); } } @@ -3249,8 +3344,8 @@ module mask(loc_x,loc_y,loc_z,rotation,side,class,type,wallthick,gap,floorthick, } // single horizontal usb opening if(type == "single_horizontal_a" && rotation == 0) { - place(loc_x-.5,loc_y-6,loc_z,15,7.5,rotation,side) - cube([15,8,7.5]); + place(loc_x-.75,loc_y-6,loc_z,15,7.5,rotation,side) + cube([15.5,8,8]); } if(type == "single_horizontal_a" && rotation == 90) { place(loc_x-6,loc_y-.5,loc_z,15,7.5,rotation,side) @@ -4015,3 +4110,273 @@ module cableholder_spacer() { translate([3,20,-1]) rotate([0,0,45]) cube([2,6,9]); } } + + +module hk_m1s_case_holes(type="landscape") { + + if(type == "portrait") { + cylinder(d=3, h=6); + translate([0,107,0]) cylinder(d=3, h=6); + translate([58,0,0]) cylinder(d=3, h=6); + translate([58,107,0]) cylinder(d=3, h=6); + } + else { + cylinder(d=3, h=6); + translate([0,58,0]) cylinder(d=3, h=6); + translate([107,0,0]) cylinder(d=3, h=6); + translate([107,58,0]) cylinder(d=3, h=6); + } +} + + +// hk m1s ups +module hk_m1s_ups() { + + pcb_size = [115,32,1.62]; + + adj = .01; + $fn = 90; + + difference() { + union() { + color("#008066") slab(pcb_size,4); + color("#fee5a6") translate([3.5,3.5,-.1]) cylinder(d=5.5, h=pcb_size[2]+.2); + color("#fee5a6") translate([3.5,pcb_size[1]-3.5,-.1]) cylinder(d=5.5, h=pcb_size[2]+.2); + color("#fee5a6") translate([pcb_size[0]-3.5,3.5,-.1]) cylinder(d=5.5, h=pcb_size[2]+.2); + color("#fee5a6") translate([pcb_size[0]-3.5,pcb_size[1]-3.5,-.1]) cylinder(d=5.5, h=pcb_size[2]+.2); + } + color("#fee5a6") translate([3.5,3.5,-1]) cylinder(d=4, h=4); + color("#fee5a6") translate([3.5,pcb_size[1]-3.5,-1]) cylinder(d=4, h=4); + color("#fee5a6") translate([pcb_size[0]-3.5,3.5,-1]) cylinder(d=4, h=4); + color("#fee5a6") translate([pcb_size[0]-3.5,pcb_size[1]-3.5,-1]) cylinder(d=4, h=4); + } + // battery and clips + color("silver") translate([15,5,pcb_size[2]]) rotate([0,0,270]) battery_clip(); + color("silver") translate([80,16,pcb_size[2]]) rotate([0,0,90]) battery_clip(); + translate([13.25,10.5,pcb_size[2]+10.4]) rotate([0,90,0]) battery("18650_convex"); + + translate([86.75,.5,pcb_size[2]]) momentary45x15(); + translate([97.5,-1,pcb_size[2]]) usbc(); + + translate([35,28,pcb_size[2]]) led("DodgerBlue"); + translate([40,28,pcb_size[2]]) led("DodgerBlue"); + translate([45,28,pcb_size[2]]) led("DodgerBlue"); + translate([50,28,pcb_size[2]]) led("DodgerBlue"); + + translate([113,8,pcb_size[2]]) rotate([0,0,90]) led("green"); + translate([113,16,pcb_size[2]]) rotate([0,0,90]) led(); + translate([113,21,pcb_size[2]]) rotate([0,0,90]) led(); + + translate([78,29,pcb_size[2]]) rotate([0,0,270])header(7); + translate([78,31.5,pcb_size[2]]) rotate([0,0,270])header(7); +} + + +// prototype board, ups footprint +module proto_ups() { + + pcb_size = [115,32,1.62]; + + adj = .01; + $fn = 90; + + union() { + difference() { + union() { + color("#008066") slab(pcb_size,4); + color("#fee5a6") translate([3.5,3.5,-.1]) cylinder(d=5.5, h=pcb_size[2]+.2); + color("#fee5a6") translate([3.5,pcb_size[1]-3.5,-.1]) cylinder(d=5.5, h=pcb_size[2]+.2); + color("#fee5a6") translate([pcb_size[0]-3.5,3.5,-.1]) cylinder(d=5.5, h=pcb_size[2]+.2); + color("#fee5a6") translate([pcb_size[0]-3.5,pcb_size[1]-3.5,-.1]) cylinder(d=5.5, h=pcb_size[2]+.2); + } + color("#fee5a6") translate([3.5,3.5,-1]) cylinder(d=4, h=4); + color("#fee5a6") translate([3.5,pcb_size[1]-3.5,-1]) cylinder(d=4, h=4); + color("#fee5a6") translate([pcb_size[0]-3.5,3.5,-1]) cylinder(d=4, h=4); + color("#fee5a6") translate([pcb_size[0]-3.5,pcb_size[1]-3.5,-1]) cylinder(d=4, h=4); + } + // pads + for(r=[5:2.54:30]) { + translate([10,r,pcb_size[2]+adj]) pcb_pad(38); + } + } +} + + +// prototype board, m1s footprint +module proto_m1s() { + + pcb_size = [90,65,1.62]; + + adj = .01; + $fn = 90; + + union() { + difference() { + union() { + color("#008066") slab(pcb_size,2); + color("#fee5a6") translate([3.5,3.5,-.1]) cylinder(d=4.5, h=pcb_size[2]+.2); + color("#fee5a6") translate([pcb_size[0]-3.5,3.5,-.1]) cylinder(d=4.5, h=pcb_size[2]+.2); + color("#fee5a6") translate([17.5,52.5,-.1]) cylinder(d=4.5, h=pcb_size[2]+.2); + color("#fee5a6") translate([67.5,55.1,-.1]) cylinder(d=4.5, h=pcb_size[2]+.2); + } + color("#fee5a6") translate([3.5,3.5,-1]) cylinder(d=3, h=4); + color("#fee5a6") translate([pcb_size[0]-3.5,3.5,-1]) cylinder(d=3, h=4); + color("#fee5a6") translate([17.5,52.5,-1]) cylinder(d=3, h=4); + color("#fee5a6") translate([67.5,55.1,-1]) cylinder(d=3, h=4); + } + // pads + for(r=[7:2.54:32]) { + translate([10,r,pcb_size[2]+adj]) pcb_pad(28); + } + } +} + +module battery_clip(bat_dia = 18.4) { + + mat = .38; + width = 9.5; + tab = 8.9; + bat_holder = bat_dia+2*mat; + adj = .1; + + translate([-5.5,0,10.5]) { + difference() { + translate([0,width,0]) rotate([90,0,0]) cylinder(d=bat_holder, h=9.5); + translate([0,width+adj,0]) rotate([90,0,0]) cylinder(d=bat_dia, h=10.5); + translate([mat/2-11.1/2,-adj,mat-1.3-bat_dia/2]) cube([11.1-mat,width+2*adj,3]); + translate([0,width+adj,0]) rotate([90,-45,0]) cube([bat_dia,bat_dia,bat_holder]); + } + difference() { + translate([-11.1/2,0,-1.3-bat_dia/2]) cube([11.1,width,3]); + translate([mat-11.1/2,-adj,mat/2-1.3-bat_dia/2]) cube([11.1-2*mat,width+2*adj,3]); + } + difference() { + translate([-(tab/2),-3.5,-1-bat_dia/2]) rotate([-5,0,0]) cube([tab,3.5,10]); + translate([-(tab/2)-adj,-3.5+mat,mat-1-bat_dia/2]) rotate([-5,0,0]) cube([tab+2*adj,3.5+mat,10]); + } + translate([0,-2.225,0]) rotate([85,0,0]) cylinder(d=tab, h=mat); + difference() { + translate([0,-2.75,0]) sphere(d=3); + translate([-5,-2.75,-5]) rotate([85,0,0]) cube([tab,10,10]); + } + } +} + + +module battery(type) { + + adj = .01; + if(type == "18650") { + difference() { + cylinder(d=18.4, h=65); + translate([0,0,65-4]) difference() { + cylinder(d=18.5, h=2); + cylinder(d=17.5, h=3); + } + } + } + if(type == "18650_convex") { + difference() { + cylinder(d=18.4, h=68); + translate([0,0,65-4]) difference() { + cylinder(d=18.5, h=2); + cylinder(d=17.5, h=3); + } + translate([0,0,65-adj]) difference() { + cylinder(d=18.5, h=3+2*adj); + cylinder(d=14.4, h=3+2*adj); + } + } + } + if(type == "21700") { + difference() { + cylinder(d=21, h=70); + translate([0,0,70-4]) difference() { + cylinder(d=21.1, h=2); + cylinder(d=20.1, h=3); + } + } + } +} + + +// single row pcb pad +module pcb_pad(pads = 1, style = "round") { + + adjust = .01; + $fn = 90; + pad_size = 1.25; + size_y = 2.54; + size_x = 2.54 * (pads-1); + union() { + for (i=[0:2.54:size_x]) { + if(style == "round") { + difference() { + color("#fee5a6") translate ([i,0,0]) cylinder(d=pad_size, h=.125); + color("dimgray") translate([i,0,-adjust]) cylinder(d=.625, h=.125+2*adjust); + } + } + if(style == "square") { + difference() { + color("#fee5a6") translate ([i-pad_size/2,-pad_size/2,0]) cube([pad_size, pad_size, .125]); + color("dimgray") translate([i,0,-adjust]) cylinder(d=.625, h=.125+2*adjust); + } + } + } + } +} + + +module led(ledcolor = "red") { + + color(ledcolor) cube([3,1.5,.4]); + color("silver") cube([.5,1.5,.5]); + color("silver") translate([2.5,0,0]) cube([.5,1.5,.5]); +} + + +module m_insert(type="M3", icolor = "#ebdc8b") { //#f4e6c3, #ebdc8b + + odiam = type == "M3" ? 4.2 : 3.5; + idiam = type == "M3" ? 3 : 2.5; + iheight = 4; + + difference() { + color(icolor,.6) cylinder(d=odiam, h=iheight); + color(icolor,.6) translate([0,0,-1]) cylinder(d=idiam, h=iheight+2); + } + for(bearing = [0:10:360]) { + color(icolor) translate([-.25+(odiam/2)*cos(bearing),-.25+(odiam/2)*sin(bearing),iheight-1.5]) + rotate([0,0,0]) cube([.5,.5,1.5]); + } +} + + +module usbc() { + + $fn=90; + adj = .01; + + // usbc horizontal type + + size_x = 9; + size_y = 7; + dia = 3.5; + diam = 3.75; + + rotate([90, 0, 0]) translate([dia/2, dia/2, -size_y]) union() { + difference () { + color("silver") + hull() { + translate([0,0,0]) cylinder(d=dia,h=size_y); + translate([size_x-dia,0,0]) cylinder(d=dia,h=size_y); + } + color("silver") translate([0,0,1]) + hull() { + translate([0,0,0]) cylinder(d=3,h=size_y+.2); + translate([size_x-dia,0,0]) cylinder(d=3,h=size_y+.2); + } + } + color("black") translate([0,-1.2/2,.1]) cube([5.5,1.2,6]); + } + }