2022-09-11 17:20:37 +02:00
// supermicro SC808 (and others) I/O-Shields to be able to utilize mITX-boards with extenation-cords that allow for Surface-Mounting
// by zeus - 2022-09-11 - CC-BY-NC-SA-4.0 - https://git.kostianix.de/zeus/3d-stuff/openscad/
// #####################################
// VARS:
// #####################################
mt = 2 ;
q = 0.01 ; //used as variable to remove manifold-glitches in preview. can be set to "0" in final version
$fn = 100 ;
// shield:
2022-09-11 19:44:18 +02:00
shield_w = 178 ; // let's hope that fits onto my delta...
2022-09-11 17:20:37 +02:00
shield_h = 41 ;
shield_d = 10 ; //around 11.5 in the original, but that is not needed
shield_tab_emboss_d = 1 ; // that lowered lip, that the central and outer tabs mounts onto, 1mm (or one sheet-thickness) lower than the rest
shield_tab_emboss_l = 22 ; // length of the above described cutouts
2022-09-11 19:44:18 +02:00
shield_tab_emboss_l2 = shield_tab_emboss_l / 2 ; // length of the side cutouts
2022-09-13 11:23:01 +02:00
shield_holes = 1 ; // draw holes if >0. the perimeter-holes are manually placed, and should be disabled, if many vars get altered! (and then drilled manually)
2022-09-11 17:20:37 +02:00
shield_hole_d1 = 2.75 ;
2022-09-11 19:44:18 +02:00
shield_hole_d2 = shield_hole_d1 + 0.5 ; // slightly conical holes for better inserting
2022-09-11 17:20:37 +02:00
// for separating the shield into two halves
shield_center_slot = 1 ; // draw slot if >0
shield_center_slot_w = 0.5 ;
shield_hole_center_dia = 4 ;
shield_hole_center_dist = shield_h / 2 ;
// model "gril":
2022-09-11 21:02:15 +02:00
m_grill_w = 3 ;
m_grill_h = shield_h * 0.75 - m_grill_w - 2 * mt ;
m_grill_skew = 25 ;
m_grill_offset = 5 ;
m_grill_spacing = m_grill_w ;
2022-09-13 11:23:01 +02:00
//port ethernet:
p_eth_hole_dist = 27.5 ;
p_eth_hole_dia = 4.5 ;
p_eth_slack = 0.5 ;
p_eth_base_x = 22 + p_eth_slack ;
p_eth_base_y = 21.75 + p_eth_slack ;
p_eth_cut_x = 16 + p_eth_slack ;
p_eth_cut_y = 13.15 + p_eth_slack ;
p_eth_cut_z = mt ;
p_eth_cut_x_offset = 0 ;
p_eth_cut_y_offset = 1.5 ;
//port usb:
p_usb_hole_dist = 30 ;
p_usb_hole_dia = 4.5 ;
p_usb_slack = 0.5 ;
p_usb_base_x = 23 + p_eth_slack ;
p_usb_base_y = 16.5 + p_eth_slack ;
p_usb_cut_x = 16 + p_eth_slack ;
p_usb_cut_y = 15 + p_eth_slack ;
p_usb_cut_z = mt ;
p_usb_cut_x_offset = 0 ;
p_usb_cut_y_offset = 0 ;
//port vga:
p_vga_hole_dist = 25 ;
p_vga_hole_dia = 4.5 ;
p_vga_slack = 0.5 ;
p_vga_base_x = 34 + p_eth_slack ;
p_vga_base_y = 15.25 + p_eth_slack ;
p_vga_cut_x = 15.75 + p_eth_slack ;
p_vga_cut_y = 8 + p_eth_slack ;
p_vga_cut_z = mt ;
p_vga_cut_x_offset = 0 ;
p_vga_cut_y_offset = 0 ;
//port slot:
p_slot_hole_dist = 30 ;
p_slot_hole_dia = mt * 3 ;
2022-09-11 17:20:37 +02:00
// #####################################
// MODEL:
// mounting holes around the shield perimeter
2022-09-13 11:23:01 +02:00
module port_ethernet ( ) {
cube ( [ p_eth_base_x , p_eth_base_y , mt ] , center = true ) ;
translate ( [ p_eth_cut_x_offset , p_eth_cut_y_offset , p_eth_cut_z + mt / 2 ] ) cube ( [ p_eth_cut_x , p_eth_cut_y , p_eth_cut_z + mt ] , center = true ) ;
hull ( ) {
translate ( [ - p_eth_hole_dist / 2 , 0 , 0 ] ) cylinder ( d = p_eth_hole_dia + mt , h = mt , center = true ) ;
translate ( [ p_eth_hole_dist / 2 , 0 , 0 ] ) cylinder ( d = p_eth_hole_dia + mt , h = mt , center = true ) ;
}
translate ( [ - p_eth_hole_dist / 2 , 0 , mt * 1.5 ] ) cylinder ( d = p_eth_hole_dia , h = mt * 2 , center = true ) ;
translate ( [ p_eth_hole_dist / 2 , 0 , mt * 1.5 ] ) cylinder ( d = p_eth_hole_dia , h = mt * 2 , center = true ) ;
}
module port_usb ( ) {
cube ( [ p_usb_base_x , p_usb_base_y , mt ] , center = true ) ;
translate ( [ p_usb_cut_x_offset , p_usb_cut_y_offset , p_usb_cut_z + mt / 2 ] ) cube ( [ p_usb_cut_x , p_usb_cut_y , p_usb_cut_z + mt ] , center = true ) ;
hull ( ) {
translate ( [ - p_usb_hole_dist / 2 , 0 , 0 ] ) cylinder ( d = p_usb_hole_dia + mt , h = mt , center = true ) ;
translate ( [ p_usb_hole_dist / 2 , 0 , 0 ] ) cylinder ( d = p_usb_hole_dia + mt , h = mt , center = true ) ;
}
translate ( [ - p_usb_hole_dist / 2 , 0 , mt * 1.5 ] ) cylinder ( d = p_usb_hole_dia , h = mt * 2 , center = true ) ;
translate ( [ p_usb_hole_dist / 2 , 0 , mt * 1.5 ] ) cylinder ( d = p_usb_hole_dia , h = mt * 2 , center = true ) ;
}
module port_vga ( ) {
cube ( [ p_vga_base_x , p_vga_base_y , mt ] , center = true ) ;
translate ( [ p_vga_cut_x_offset , p_vga_cut_y_offset , p_vga_cut_z + mt / 2 ] ) cube ( [ p_vga_cut_x , p_vga_cut_y , p_vga_cut_z + mt ] , center = true ) ;
hull ( ) {
translate ( [ - p_vga_hole_dist / 2 , 0 , 0 ] ) cylinder ( d = p_vga_hole_dia + mt , h = mt , center = true ) ;
translate ( [ p_vga_hole_dist / 2 , 0 , 0 ] ) cylinder ( d = p_vga_hole_dia + mt , h = mt , center = true ) ;
}
translate ( [ - p_vga_hole_dist / 2 , 0 , mt * 1.5 ] ) cylinder ( d = p_vga_hole_dia , h = mt * 2 , center = true ) ;
translate ( [ p_vga_hole_dist / 2 , 0 , mt * 1.5 ] ) cylinder ( d = p_vga_hole_dia , h = mt * 2 , center = true ) ;
}
module port_slot ( ) {
hull ( ) {
translate ( [ - p_slot_hole_dist / 2 , 0 , mt ] ) cylinder ( d = p_slot_hole_dia , h = mt * 2 , center = true ) ;
translate ( [ p_slot_hole_dist / 2 , 0 , mt ] ) cylinder ( d = p_slot_hole_dia , h = mt * 2 , center = true ) ;
}
}
2022-09-11 17:20:37 +02:00
module shield_hole ( x , y , z , rotx , roty ) {
2022-09-11 18:29:51 +02:00
translate ( [ x , y , shield_d / 2 - z ] ) rotate ( [ rotx , roty , 0 ] ) cylinder ( d1 = shield_hole_d1 , d2 = shield_hole_d2 , h = mt + q , center = true ) ;
2022-09-11 17:20:37 +02:00
}
// basic shield
module shield ( ) {
difference ( ) {
cube ( [ shield_w , shield_h , shield_d ] , center = true ) ; // basebox
translate ( [ 0 , 0 , mt / 2 + q ] ) cube ( [ shield_w - 2 * mt , shield_h - 2 * mt , shield_d - mt ] , center = true ) ; // main hollowing
2022-09-11 19:44:18 +02:00
for ( x = [ - shield_w / 2 + shield_tab_emboss_l / 2 , shield_w / 2 - shield_tab_emboss_l / 2 ] ) {
translate ( [ x , shield_h / 2 - shield_tab_emboss_d / 2 , 0 ] ) cube ( [ shield_tab_emboss_l + q , shield_tab_emboss_d + q , shield_d + q ] , center = true ) ; // top edge-cutout
2022-09-11 17:20:37 +02:00
}
2022-09-11 19:44:18 +02:00
for ( x = [ - shield_w / 2 + shield_tab_emboss_d / 2 , shield_w / 2 - shield_tab_emboss_d / 2 ] ) {
translate ( [ x , shield_h / 2 - shield_tab_emboss_l2 / 2 , 0 ] ) cube ( [ shield_tab_emboss_d + q , shield_tab_emboss_l2 + q , shield_d + q ] , center = true ) ; // side edge-cutout
2022-09-11 17:20:37 +02:00
}
2022-09-11 19:44:18 +02:00
2022-09-11 17:20:37 +02:00
}
2022-09-11 19:44:18 +02:00
for ( x = [ - shield_w / 2 + shield_tab_emboss_l / 2 + mt , shield_w / 2 - shield_tab_emboss_l / 2 - mt ] ) {
translate ( [ x , shield_h / 2 - shield_tab_emboss_d / 2 - mt , 0 ] ) cube ( [ shield_tab_emboss_l + mt + q , shield_tab_emboss_d + q , shield_d + q ] , center = true ) ; // supportblock for top edge-cutout
for ( x = [ - shield_w / 2 + shield_tab_emboss_d / 2 + shield_tab_emboss_d + mt / 2 , shield_w / 2 - shield_tab_emboss_d / 2 - shield_tab_emboss_d - mt / 2 ] ) {
translate ( [ x , shield_h / 2 - shield_tab_emboss_l2 / 2 - mt , 0 ] ) cube ( [ shield_tab_emboss_d + q , shield_tab_emboss_l2 + q , shield_d + q ] , center = true ) ; // supportblock for side edge-cutout
2022-09-11 17:20:37 +02:00
}
2022-09-11 19:44:18 +02:00
}
2022-09-11 17:20:37 +02:00
cube ( [ mt * 4 , shield_h , shield_d ] , center = true ) ; // central support-block
}
// first iteration: optional slotting
module shield_1 ( ) {
if ( shield_center_slot > 0 ) { // generate slot and matching connection-holes in the center
difference ( ) {
shield ( ) ;
2022-09-11 21:02:15 +02:00
cube ( [ shield_center_slot_w , shield_h + q , shield_d + q ] , center = true ) ;
2022-09-11 17:20:37 +02:00
for ( y = [ - shield_hole_center_dist / 2 , shield_hole_center_dist / 2 ] ) {
2022-09-11 21:02:15 +02:00
translate ( [ 0 , y , mt / 2 ] ) rotate ( [ 0 , 90 , 0 ] ) cylinder ( d = shield_hole_center_dia , h = mt * 4 + q , center = true ) ;
2022-09-11 17:20:37 +02:00
}
}
}
else shield ( ) ;
}
2022-09-11 19:44:18 +02:00
// second iteration: add some holes
2022-09-11 17:20:37 +02:00
module shield_2 ( ) {
difference ( ) {
shield_1 ( ) ;
2022-09-11 19:44:18 +02:00
if ( shield_holes > 0 ) {
2022-09-13 11:23:01 +02:00
// some holes all around, (left, than clockwise, viewed from behind). THESE ARE MANUALLY PLACED!
2022-09-11 19:44:18 +02:00
// shield_hole(x,y,z,rotx,roty), "z" is the distance from lip-edge to the center of the hole, x is from center
shield_hole ( - shield_w / 2 + mt / 2 , - 0.5 , 4 , 0 , - 90 ) ; //left side
shield_hole ( - shield_w / 2 + mt / 2 + 4.5 , shield_h / 2 - shield_tab_emboss_d - mt / 2 - q * 0.5 , 6.25 , - 90 , 0 ) ; //top side, 1st from left (recessed)
shield_hole ( - shield_w / 2 + mt / 2 + 29.5 , shield_h / 2 - mt / 2 , 4.4 , - 90 , 0 ) ; //top side, 2nd from left
2022-09-12 22:07:50 +02:00
shield_hole ( - shield_w / 2 + mt / 2 + 147 , shield_h / 2 - mt / 2 , 4.4 , - 90 , 0 ) ; //top side, 3rd from left
2022-09-11 19:44:18 +02:00
shield_hole ( - shield_w / 2 + mt / 2 + 162 , shield_h / 2 - shield_tab_emboss_d - mt / 2 - q * 0.5 , 5.5 , - 90 , 0 ) ; //top side, 4th from left (recessed)
2022-09-11 21:02:15 +02:00
shield_hole ( - shield_w / 2 + mt / 2 + 171.5 , shield_h / 2 - shield_tab_emboss_d - mt / 2 - q * 0.5 , 6.25 , - 90 , 0 ) ; //top side, 5th from left (recessed)
2022-09-11 19:44:18 +02:00
shield_hole ( shield_w / 2 - mt / 2 , - 0.5 , 4 , 0 , 90 ) ; //right side
2022-09-11 21:02:15 +02:00
shield_hole ( - shield_w / 2 + mt / 2 + 172.5 , - shield_h / 2 + mt / 2 , 4.25 , 90 , 0 ) ; // bottom side, 1st one from right
2022-09-11 19:44:18 +02:00
shield_hole ( - shield_w / 2 + mt / 2 + 56.25 , - shield_h / 2 + mt / 2 , 4.25 , 90 , 0 ) ; //bottom side, 2nd one from right
shield_hole ( - shield_w / 2 + mt / 2 + 4.5 , - shield_h / 2 + mt / 2 , 4.25 , 90 , 0 ) ; //bottom side, 3rd one from right
}
2022-09-11 17:20:37 +02:00
}
}
2022-09-11 21:02:15 +02:00
// final interation: with fan-grills
module shield_grill ( ) {
difference ( ) {
shield_2 ( ) ;
for ( a = [ 0 : m_grill_spacing * 2 : shield_w / 2 - mt * 3 - m_grill_offset * 3 ] ) {
translate ( [ - shield_w / 2 + mt * 3 + m_grill_offset + a , 0 , - shield_d / 2 + mt / 2 + q ] ) {
hull ( ) {
for ( y = [ - m_grill_h / 2 , m_grill_h / 2 ] ) {
rotate ( [ 0 , 0 , - m_grill_skew ] ) translate ( [ 0 , y , 0 ] ) cylinder ( d = m_grill_w , h = 2 * mt , center = true ) ;
}
}
translate ( [ shield_w / 2 , 0 , 0 ] ) hull ( ) {
for ( y = [ - m_grill_h / 2 , m_grill_h / 2 ] ) {
rotate ( [ 0 , 0 , - m_grill_skew ] ) translate ( [ 0 , y , 0 ] ) cylinder ( d = m_grill_w , h = 2 * mt , center = true ) ;
}
}
}
}
}
}
2022-09-13 11:23:01 +02:00
// final iteration: with ports (manual placement)
module shield_ports ( ) {
difference ( ) {
shield_2 ( ) ;
translate ( [ - 75 , - 1 , - 3 * mt - q ] ) rotate ( [ 0 , 0 , - 90 ] ) # port_ethernet ( ) ;
translate ( [ - 37.5 , - 1 , - 3 * mt - q ] ) rotate ( [ 0 , 0 , - 90 ] ) # port_ethernet ( ) ;
translate ( [ 22.5 , - 1 , - 3 * mt - q ] ) rotate ( [ 0 , 0 , - 90 ] ) # port_ethernet ( ) ;
translate ( [ 50 , 0 , - 3 * mt - q ] ) rotate ( [ 0 , 0 , - 90 ] ) # port_usb ( ) ;
//flipped and embossed so that only 1mm of the plate thickness is left, due to the way, d-sub is mounted, and no support is needed for printing
translate ( [ 75 , - 1 , - mt - ( mt - 1 ) ] ) rotate ( [ 180 , 0 , - 90 ] ) port_vga ( ) ;
// slots
for ( x = [ - 60 , - 52.5 , - 22.5 , - 15 , - 7.5 , 7.5 , 37.5 , 62.5 ] ) {
translate ( [ x , 0 , - 3 * mt - q ] ) rotate ( [ 0 , 0 , 90 ] ) # port_slot ( ) ;
}
}
}
2022-09-11 17:20:37 +02:00
// #####################################
// DRAWING:
2022-09-13 11:23:01 +02:00
// shield_2();
2022-09-11 17:20:37 +02:00
2022-09-13 11:23:01 +02:00
//port_ethernet();
shield_ports ( ) ;
2022-09-11 17:20:37 +02:00
2022-09-13 11:23:01 +02:00
// todo: add text
2022-09-11 17:20:37 +02:00