diff --git a/sbc_case_builder.cfg b/sbc_case_builder.cfg index 63a4e19..ab2df66 100644 --- a/sbc_case_builder.cfg +++ b/sbc_case_builder.cfg @@ -29,7 +29,8 @@ 20220515 Version 1.2.3 added m1_panel,m1_tray,m1_tray_drive,m1_tray_sides,m1_tray_vu5,m1_tray_vu7,show2_shell jetsonnano_shell,jetsonnano_panel,jetsonnano_stacked,jetsonnano_tray rockpro64_shell,rockpro64_panel,rockpro64_stacked,rockpro64_tray - + 2022xxxx Version 1.x.x added round case for odroid c-series + see https://github.com/hominoids/SBC_Case_Builder */ @@ -293,6 +294,18 @@ case_data = [ [6.75,18,2.5,10,4,4,0,1,0,4.5,5.1], // top_ext_standoff [6.75,5,3.6,10,4,1,0,0,0,4.5,5.1]], // bottom_ext_standoff + ["c1+_round","c1+","round","none", // case_name,sbc_model,case_design,case_style + 0,0,0,0,0,4,2, // pcb_loc_x,pcb_loc_y,pcb_loc_z,case_offset_x,case_offset_y,case_offset_tz,case_offset_bz, + 3,2,3,1.5,[2,2], // wallthick,floorthick,sidethick,gap,fillet + false,false,false,true,false, // indents,sidewall_support,sbc_top_standoffs,sbc_bottom_standoffs,case_ext_standoffs + false,"none","fan","none","true", // sata_punchout,gpio_opening,cooling,exhaust_vents,mode + [6.75,18,2.5,10,4,4,0,1,0,4.5,5.1], // top_pcb_standoff + [6.75,5,3.6,10,4,1,0,0,0,4.5,5.1], // bottom_pcb_standoff + [6.75,18,2.5,10,4,4,0,1,0,4.5,5.1], // top_ext_standoff + [6.75,5,3.6,10,4,1,0,0,0,4.5,5.1], // bottom_ext_standoff + "sub","round",49.5,-15,12.5,"top",[90,0,0],11,0,15,0,0,"",0, // sub power plug hole + "suball","rectangle",20.5,-26,6.5,"top",[0,0,0],21,8,13.5,0,0,"vertical",[1,1,1,1]], // sub hdmi opening + // Odroid-C2 ["c2_shell","c2","shell","none", // case_name,sbc_model,case_design,case_style @@ -519,6 +532,18 @@ case_data = [ [6.75,18,2.5,10,4,4,0,1,0,4.5,5.1], // top_ext_standoff [6.75,5,3.6,10,4,1,0,0,0,4.5,5.1]], // bottom_ext_standoff + ["c2_round","c2","round","none", // case_name,sbc_model,case_design,case_style + 0,0,0,0,0,4,2, // pcb_loc_x,pcb_loc_y,pcb_loc_z,case_offset_x,case_offset_y,case_offset_tz,case_offset_bz, + 3,2,3,1.5,[2,2], // wallthick,floorthick,sidethick,gap,fillet + false,false,false,true,false, // indents,sidewall_support,sbc_top_standoffs,sbc_bottom_standoffs,case_ext_standoffs + false,"none","fan","none","true", // sata_punchout,gpio_opening,cooling,exhaust_vents,mode + [6.75,18,2.5,10,4,4,0,1,0,4.5,5.1], // top_pcb_standoff + [6.75,5,3.6,10,4,1,0,0,0,4.5,5.1], // bottom_pcb_standoff + [6.75,18,2.5,10,4,4,0,1,0,4.5,5.1], // top_ext_standoff + [6.75,5,3.6,10,4,1,0,0,0,4.5,5.1], // bottom_ext_standoff + "sub","round",49.5,-15,12.5,"top",[90,0,0],11,0,15,0,0,"",0, // sub power plug hole + "suball","rectangle",20.5,-26,6.5,"top",[0,0,0],21,8,13.5,0,0,"vertical",[1,1,1,1]], // sub hdmi opening + // Odroid-C4 ["c4_shell","c4","shell","none", // case_name,sbc_model,case_design,case_style @@ -617,8 +642,8 @@ case_data = [ "sub","rectangle",5.5,2.75,28,"top",[0,0,0],74.5,51,5,0,0,"vertical",[.25,.25,.25,.25], // sub rectangle "model","hk_lcd35",95,56,20,"bottom",[0,0,180],0,0,0,0,0,"",0], // model hk 3.5 lcd - ["c4_deskboom_lcd3.5","c4","panel","none", // case_name,sbc_model,case_design,case_style - 40,0,4,40,15,3,11, // pcb_loc_x,pcb_loc_y,pcb_loc_z,case_offset_x,case_offset_y,case_offset_tz,case_offset_bz, + ["c4_deskboom_lcd3.5","c4","panel","none", // case_name,sbc_model,case_design,case_style + 40,0,4,40,15,3,11, // pcb_loc_x,pcb_loc_y,pcb_loc_z,case_offset_x,case_offset_y,case_offset_tz,case_offset_bz, 2,2,3,1.5,[3.5,0], // wallthick,floorthick,sidethick,gap,fillet true,false,false,true,false, // indents,sidewall_support,sbc_top_standoffs,sbc_bottom_standoffs,case_ext_standoffs false,"none","none","none","true", // sata_punchout,gpio_opening,cooling,exhaust_vents,mode @@ -755,6 +780,18 @@ case_data = [ [6.75,18,2.5,10,4,4,0,1,0,4.5,5.1], // top_ext_standoff [6.75,5,3.6,10,4,1,0,0,0,4.5,5.1]], // bottom_ext_standoff + ["c4_round","c4","round","none", // case_name,sbc_model,case_design,case_style + 0,0,0,0,0,4,2, // pcb_loc_x,pcb_loc_y,pcb_loc_z,case_offset_x,case_offset_y,case_offset_tz,case_offset_bz, + 3,2,3,1.5,[2,2], // wallthick,floorthick,sidethick,gap,fillet + false,false,false,true,false, // indents,sidewall_support,sbc_top_standoffs,sbc_bottom_standoffs,case_ext_standoffs + false,"none","vents","none","true", // sata_punchout,gpio_opening,cooling,exhaust_vents,mode + [6.75,18,2.5,10,4,4,0,1,0,4.5,5.1], // top_pcb_standoff + [6.75,5,3.6,10,4,1,0,0,0,4.5,5.1], // bottom_pcb_standoff + [6.75,18,2.5,10,4,4,0,1,0,4.5,5.1], // top_ext_standoff + [6.75,5,3.6,10,4,1,0,0,0,4.5,5.1], // bottom_ext_standoff + "suball","round",10.5,-2,14.5,"top",[90,0,0],11,0,18,0,0,"",0, // sub power plug hole + "suball","rectangle",34.5,-26,4.99,"top",[0,0,0],21,10,14.5,0,0,"vertical",[1,1,1,1]], // sub hdmi opening + // Odroid-XU4 ["xu4_shell","xu4","shell","none", // case_name,sbc_model,case_design,case_style diff --git a/sbc_case_builder.scad b/sbc_case_builder.scad index 6a3bf34..a7b11b9 100644 --- a/sbc_case_builder.scad +++ b/sbc_case_builder.scad @@ -33,7 +33,8 @@ 20220406 Version 1.2.2 added vu7c, vu8m and weatherboard2 models, other additions, fixes and maintenance 20220515 Version 1.2.3 added odroid-m1, jetson nano, rockpro64, completed mask(), improved docs changed tray top design - + 2022xxxx Version 1.x.x added round case for odroid c-series and other rpi format + see https://github.com/hominoids/SBC_Case_Builder */ @@ -43,7 +44,7 @@ use <./lib/fillets.scad>; include <./lib/sbc_models.cfg>; include <./sbc_case_builder.cfg>; -case_name = "m1_tray"; // case_name to load from sbc_case_builder.cfg +case_name = "c4_round"; // case_name to load from sbc_case_builder.cfg view = "model"; // viewing mode "platter", "model", "debug" highlight = false; // enable highlight for subtarctive geometry (true or false) @@ -54,10 +55,12 @@ move_leftside = 0; // move left side mm in mode move_rightside = 0; // move right side mm in model view or < 0 = off move_front = 0; // move front mm in model view or < 0 = off move_rear = 0; // move rear mm in model view or < 0 = off +case_fn = 90; // circle segments for round cases +case_ffn = 90; // circle segments for fillet of round cases c = search([case_name],case_data); -case_design = case_data[c[0]][2]; // "shell", "panel", "stacked", "tray" +case_design = case_data[c[0]][2]; // "shell", "panel", "stacked", "tray", "round" case_style = case_data[c[0]][3]; // style of case_design sbc_model = case_data[c[0]][1]; // any sbc from sbc model framework: "c1+","c2","c4","hc4" @@ -103,6 +106,10 @@ top_height = pcb_tmaxz+floorthick+case_offset_tz; bottom_height = pcb_bmaxz+floorthick+case_offset_bz; case_z = bottom_height+top_height; +case_diameter = width*1.14; +lip = 5; +tol = .25; + top_standoff = [case_data[c[0]][26][0], // diameter top_height-pcb_loc_z, // height top_height case_data[c[0]][26][2], // holesize @@ -184,6 +191,10 @@ if (view == "platter") { case_side(case_design,case_style,"left"); } } + if(case_design == "round") { + case_bottom(case_design); + translate([width+30,depth,case_z-floorthick-gap]) rotate([180,0,0]) case_top(case_design); + } // platter accessories for (i=[30:14:len(case_data[c[0]])-1]) { class = case_data[c[0]][i]; @@ -315,6 +326,17 @@ if (view == "model") { case_z+27]) rotate([-vu_rotation[0],0,180]) hk_speaker(); } } + if(case_design == "round") { + if(lower_bottom >= 0) { + color("grey",1) translate([0,0,-lower_bottom]) case_bottom(case_design); + } + if(sbc_off == false) { + translate([pcb_loc_x ,pcb_loc_y,bottom_standoff[1]]) sbc(sbc_model); + } + if(raise_top >= 0) { + color("grey",1) translate([0,0,raise_top]) case_top(case_design); + } + } // model accessories for (i=[30:14:len(case_data[c[0]])-1]) { class = case_data[c[0]][i]; @@ -456,6 +478,35 @@ module case_bottom(case_design) { cube([width,wallthick,top_height-floorthick]); } + + if(case_design == "round") { + difference() { + translate([pcb_width/2,pcb_depth/2,bottom_height/2]) rotate([0,0,30]) + cylinder_fillet_inside(h=bottom_height, r=case_diameter/2, + top=0, bottom=c_fillet, $fn=case_fn, fillet_fn=case_ffn, center=true); + translate([pcb_width/2,pcb_depth/2,(bottom_height/2)+1+floorthick]) rotate([0,0,30]) + cylinder_fillet_inside(h=bottom_height+adjust+floorthick, + r=(case_diameter/2)-lip/2,top=0, bottom=c_fillet-1, $fn=case_fn, + fillet_fn=case_ffn, center=true); + difference() { + translate([pcb_width/2,pcb_depth/2,(bottom_height-lip)]) rotate([0,0,30]) + cylinder(h=lip+adjust, r=(case_diameter/2)+1, $fn=case_fn); + translate([pcb_width/2,pcb_depth/2,(bottom_height-lip)-adjust]) rotate([0,0,30]) + cylinder(h=lip+2*adjust, r=(case_diameter/2)-lip/4, $fn=case_fn); + } + } + difference() { + translate([pcb_width/2,pcb_depth/2,(bottom_height/2)+1+floorthick]) rotate([0,0,30]) + cylinder_fillet_inside(h=bottom_height+adjust+floorthick, + r=(case_diameter/2)-lip/2,top=0, bottom=c_fillet-1, $fn=case_fn, + fillet_fn=case_ffn, center=true); + translate([-16,(depth/2)-60,-adjust]) + cube([width+10,110,top_height-2*floorthick-2]); + translate([width-9,(depth/2)-62.5,bottom_height]) + cube([20,110,top_height-2*floorthick-2]); + } + + } // additive accessories for (i=[30:14:len(case_data[c[0]])-1]) { class = case_data[c[0]][i]; @@ -899,6 +950,26 @@ module case_top(case_design) { } } } + if(case_design == "round") { + difference() { + translate([pcb_width/2,pcb_depth/2,case_z/2]) rotate([0,0,30]) + cylinder_fillet_inside(h=top_height, r=case_diameter/2, + top=fillet, bottom=0, $fn=case_fn, fillet_fn=case_ffn, center=true); + translate([pcb_width/2,pcb_depth/2,(case_z/2)-floorthick]) rotate([0,0,30]) + cylinder_fillet_inside(h=top_height, r=(case_diameter/2)-lip/2, + top=fillet-1, bottom=0, $fn=case_fn, fillet_fn=case_ffn, center=true); + translate([pcb_width/2,pcb_depth/2,lip-adjust]) rotate([0,0,30]) + cylinder(h=lip+2*adjust, r=(case_diameter/2)-(lip/4)+tol/2, $fn=case_fn); + // io cutout + translate([width,(depth/2)-wallthick-gap,floorthick+gap+top_height/2]) + cube_fillet_inside([18,depth-2*(wallthick+gap)-1,top_height-1], + vertical=[0,0,0,0], + top=[0,0,0,0], + bottom=[0,0,0,0], $fn=90); + } + translate([width-8.49,(depth/2)-32,bottom_height]) + cube([wallthick-.75,55,top_height-2*floorthick-3]); + } for (i=[30:14:len(case_data[c[0]])-1]) { class = case_data[c[0]][i]; type = case_data[c[0]][i+1]; @@ -1479,8 +1550,8 @@ module open_io() { // top cooling openings if(side == "top" && cooling == "fan" && class == "heatsink" && type != "h2_oem" && type != "n2_oem" && type != "n2+_oem") { - translate([loc_x+6,loc_y-28,case_z-(floorthick+adjust)]) - fan_mask(40,floorthick+(2*adjust)+4,2); + translate([loc_x+6,loc_y-28,case_z-(floorthick+adjust)-5]) + fan_mask(40,floorthick+(2*adjust)+8,2); } if(side == "top" && cooling == "fan" && class == "heatsink" && (type == "n2_oem" || type == "n2+_oem")) { translate([loc_x+4,loc_y+5.5,-adjust]) @@ -1498,8 +1569,8 @@ module open_io() { } if(side == "top" && cooling == "vents" && class == "heatsink") { for(r=[loc_x+7:4:48]) { - translate([r,loc_y-20,case_z-(floorthick+adjust)]) - cube([2,25,floorthick+(adjust*2)]); + translate([r,loc_y-20,case_z-(floorthick+adjust)-6]) + cube([2,25,floorthick+(adjust*2)+8]); } } if(side == "top" && cooling == "custom" && class == "heatsink") { @@ -1567,8 +1638,8 @@ module open_io() { // uart knockout opening if(side == "top" && type == "uart_micro" && rotation == 90) { - translate([loc_x-wallthick-gap-4,loc_y-1,bottom_height+5]) rotate([90,0,90]) - punchout(15,8,1,sidethick+(2*adjust)+5,2,"rectangle"); + translate([loc_x-wallthick-gap-8,loc_y-1,bottom_height+5]) rotate([90,0,90]) + punchout(15,8,1,sidethick+(2*adjust)+8,2,"rectangle"); } if(side == "top" && type == "uart_micro" && rotation == -90) { translate([loc_x+2*(wallthick+gap)+1,loc_y-1,bottom_height+5]) rotate([90,0,90]) @@ -1818,4 +1889,4 @@ vu7_height = vu7_pcb_height + 9.75; } } } -} \ No newline at end of file +} diff --git a/sbc_case_builder_library.scad b/sbc_case_builder_library.scad index 9f4b397..bb8cc0b 100644 --- a/sbc_case_builder_library.scad +++ b/sbc_case_builder_library.scad @@ -42,7 +42,8 @@ adjusted access_port(), access_cover(), added @mctom's hk_vu8m(bracket), u_bracket(), spacer() 20220515 version 1.2.3 removed spacer(); added screw(); modified hk_vu8m(); added m1_hdmount(); added hdd35_25holder(length) printer friendly punchout(),added remaining mask() entries, standardized mask() - + 2022xxxx version 1.x.x increased mask projection for ir_1 + see https://github.com/hominoids/SBC_Case_Builder place(x,y,z,size_x,size_y,rotation,side) @@ -2663,19 +2664,19 @@ module mask(loc_x,loc_y,loc_z,rotation,side,class,type,wallthick,gap,floorthick, // ir opening if(type == "ir_1" && rotation == 0) { place(loc_x,loc_y,loc_z,6,6,rotation,side) - translate([3.5,2,7.5]) rotate([90,0,0]) cylinder(d=6, h=12); + translate([3.5,2,7.5]) rotate([90,0,0]) cylinder(d=6, h=15); } if(type == "ir_1" && rotation == 90) { place(loc_x,loc_y,loc_z,6,6,rotation,side) - translate([2.5,2,7.5]) rotate([90,0,0]) cylinder(d=6, h=12); + translate([2.5,2,7.5]) rotate([90,0,0]) cylinder(d=6, h=15); } if(type == "ir_1" && rotation == 180) { place(loc_x,loc_y,loc_z,6,6,rotation,side) - translate([2.5,5,6.5]) rotate([90,0,0]) cylinder(d=6, h=12); + translate([2.5,5,6.5]) rotate([90,0,0]) cylinder(d=6, h=15); } if(type == "ir_1" && rotation == 270) { place(loc_x,loc_y,loc_z,6,6,rotation,side) - translate([3.375,5,7.5]) rotate([90,0,0]) cylinder(d=6, h=12); + translate([3.375,5,7.5]) rotate([90,0,0]) cylinder(d=6, h=15); } // switch opening if(type == "slide_4x9" && rotation == 0) {