Circlean/doc/Mechanical_design/myRaspiBp.scad

253 lines
10 KiB
OpenSCAD

// raspberry pi model b+ case
//
// v 1.3 - 29/01/2015 - initial release + corrections (Marc Durvaux)
// v 1.4 - 06/02/2015 - reduced Z clearance, hole opening for audio connector (audio_y),
// added spacers on cover (MD)
// v 1.5 - 08/02/2015 - fine tuning of connector hole Z position
// v 1.7 - 10/02/2015 - fine tuning of holes, cutouts, spacers
// v 1.8 - 21/07/2015 - bug correction : inverted riser parameters
//
// design control
test_fit = 0 ; // set to one for test fit
top_bottom = 0 ; // 0 = bottom only, 1 = top only, 2 = top & bottom
print = 1 ; // set to one for printing configuration
// parameters
$fn = 30 ;
tolerance = 0.50 ; //
wall_thickness = 3.00 ; // box wall thickness
rounding_radius = 5.00 ; // box external wall corner rounding radius
cover_thickness = 3.00 ; // box cover overall thickness at the edge
cover_inside_t = 2.00 ; // box cover material thickess
cover_overlap = 5.00 ; // cover edge overlap height
edge_thickness = 1.00 ; // cover edge thickness (reduction in wall thickness)
clearance_z = 2.00 ; // clearance on Z axis for daughter board
Top_spacer_r = 3.00 ; // radius of spacers on cover
// Raspberry Pi dimensions (from mechanical specs, when available)
// positions on PCB are from lower right corner (near power connector)
device_x = 85.00 ; // pcb size exluding protruding connectors
device_y = 56.00 ;
device_z = 16.80 ; // overall size, excluding bottom solders and USB connector top edge
riser_z = 2.00 ; // riser to cope with PCP bottom solders, located under PCB hole
riser_r = 2.50 ; // riser radius (PCB mask hole radius = 3.1)
hole_x1 = 3.50 ; // hole center x offset from PCB edge (uSD side)
hole_x2 = 58.00 + hole_x1 ; // hole center x offset from PCB edge (uSD side)
hole_y = 3.50 ; // hole center y offset from PCB edge
uSD_x = 2.70 ; // uSD card protrusion
uSD_w = 11.00 ; // uSD card width
uSD_y = device_y/2; // uSD center y offset
PWR_w = 8.00 ; // micro-USB power connector width
PWR_z = 3.00 ; // micro-USB power connector height over PCB
PWR_x = 10.60 ; // micro-USB power connector center X offset from PCB edge
PWRplug_w = 11.00 ; // micro-USB power plug width (used for outside wall stamping)
PWRplug_h = 8.00 ; // micro-USB power plug height (used for outside wall stamping)
PWRplug_d = 2.00 ; // micro-USB power plug outside wall stamping depth
//audio_y = 2.70 ; // audio connector protrusion (masked audio)
audio_y = 2*wall_thickness ; // open audio connector
audio_w = 5.80 ; // audio connector external diameter (width)
audio_z = 6.50 ; // audio connector height over PCB
audio_x = 53.50 ; // audio connector center X offset from PCB edge
hdmi_y = 1.00 ; // hdmi connector protrusion
hdmi_w = 15.00 ; // hdmi connector width
hdmi_z = 7.00 ; // hdmi connector height over PCB
hdmi_x = 32.00 ; // hdmi connector center X offset from PCB edge
Ether_x = 2.60 ; // Ethernet connector protrusion
Ether_w = 15.60 ; // Ethernet connector width
Ether_z = 15.00 ; // Ethernet connector height over PCB lower side
Ether_y = 10.25 ; // Ethernet connector center Y offset from PCB edge
USB_x = 2.60 ; // USB connectors protrusion
USB_w = 15.10 ; // USB connectors width
USB_z = 16.60 ; // USB connecotrs height over PCB
USBl_y = 29.00 ; // left USB connector center Y offset from PCB edge (near Ethernet connector)
USBr_y = 47.00 ; // right USB connector center Y offset from PCB edge
LedBtn_y = device_y - hole_y - 2.5 * 2.54 + tolerance ; // Y axis center position of LEDs and button(s)
R_Led_x = hole_x1 + 29 + 2.54 + tolerance ; // X axis center position of red LED
Y_Led_x = R_Led_x - 3 * 2.54 ; // X axis center position of yellow LED
G_Led_x = R_Led_x - 6 * 2.54 ; // X axis center position of green LED
Btn_x = R_Led_x + 4.5 * 2.54 ; // X axis center position of button
Led_r = 1.50 ; // LED radius + margin
Btn_r = 4.00 ; // push button radius
PCB_z = 12.00 ; // Daughter board top side to main PCB bottom side
// inside box dimension
in_x = device_x + uSD_x + USB_x + 2 * tolerance ;
in_y = device_y + 3 * tolerance ;
in_z = device_z + riser_z + clearance_z ;
in_r = rounding_radius - wall_thickness ;
pcb_top = riser_z + device_z - USB_z ; // the USB connector is the highest component
spacer_z = pcb_top + 2*tolerance ; // spacer on uSD side
// outside box dimension
box_x = in_x + 2 * wall_thickness ;
box_y = in_y + 2 * wall_thickness ;
box_z = in_z + wall_thickness ; // without cover
cover_z = cover_thickness + cover_overlap ; // box cover height
edge_offset = wall_thickness - edge_thickness ; // box cover edge offset
USB_sep = USBr_y - USBl_y - USB_w + tolerance ; // separation between USB connectors
mask_z = clearance_z - 2 * tolerance ; // USB connector mask, cover side
// cover spacer to hold PCB in place
USB_spacer = cover_thickness + clearance_z ;
Eth_spacer = cover_thickness + clearance_z + device_z - Ether_z - tolerance ;
Con_spacer_x = wall_thickness + uSD_x + (device_x + hole_x2) / 2 ; // USB and Ethernet connectors
PCB_spacer = cover_thickness + clearance_z + device_z - PCB_z - tolerance ;
PCB_spacer_x = wall_thickness + uSD_x + (G_Led_x + hole_x1) / 2 ;
// print dimensions for control
echo(box_x = box_x) ;
echo(box_y = box_y) ;
echo(box_z = box_z) ;
echo(cover_z = cover_z) ;
echo(in_x = in_x) ;
echo(in_y = in_y) ;
echo(in_z = in_z) ;
echo(G_Led_x = G_Led_x) ;
echo(USB_sep = USB_sep) ;
echo(cover_z = cover_z) ;
echo(USB_spacer = USB_spacer) ;
echo(Eth_spacer = Eth_spacer) ;
echo(Con_spacer_x = Con_spacer_x) ;
echo(PCB_spacer = PCB_spacer) ;
echo(PCB_spacer_x = PCB_spacer_x) ;
// create device
if (test_fit == 1) {
// test fit
box_bottom() ;
translate([0, 0, box_z - cover_overlap]) box_top() ;
} else {
if (top_bottom < 1) {
box_bottom() ;
} else {
if (print == 1) { translate([0, box_y, cover_z]) rotate([180,0,0]) box_top() ; }
else { box_top() ; }
if (top_bottom > 1) {
translate([0, -100, 0])
box_bottom() ;
}
}
}
// modules
include <shapes.scad>
module right_cutouts() { // position from PCB lower left corner
bezel = 4*PWRplug_d ; // to limit overhang angle for manufacturing
translate([ PWR_x - tolerance - PWR_w/2, 0, tolerance])
cube([ PWR_w + 2*tolerance, wall_thickness + tolerance, PWR_z + 4*tolerance]); // power
translate([PWR_x, 0, PWR_z/2 + 3*tolerance]) rotate ([-90, 0,0]) // stamping for power plug
truncated_square_pyramid(PWRplug_w + bezel,PWRplug_h + bezel,PWRplug_w,PWRplug_h,PWRplug_d) ;
translate([ hdmi_x - tolerance - hdmi_w/2, wall_thickness - hdmi_y -2*tolerance, 3*tolerance])
cube([ hdmi_w + 2*tolerance, hdmi_y + 3*tolerance, hdmi_z + tolerance]) ; // hdmi
translate([audio_x, wall_thickness + tolerance, audio_z - audio_w/2 + 2*tolerance]) {
rotate ([90, 0, 0]) cylinder(h = audio_y, r = audio_w/2 + 3*tolerance) ; } // audio
}
module back_cutouts() { // position on back side from PCB on Y axis
translate([0, USBl_y - USB_w/2, USB_z/2]) // upper-left USB
cube([wall_thickness +tolerance, USB_w +USB_sep, 2*USB_z]) ; // Z size large enough!
translate([0, USBr_y - USB_w/2, 0]) // lower-right USB
cube([wall_thickness +tolerance, USB_w + 3*tolerance, 2*USB_z]) ; // Z size large enough!
}
module box_bottom() {
difference () {
union() { // box + added structures
// basic box
difference(){
round_cube(box_x, box_y, box_z, rounding_radius) ;
translate([wall_thickness, wall_thickness, wall_thickness])
round_cube(in_x, in_y, in_z, in_r) ;
}
// add inside structure
translate([wall_thickness, wall_thickness, wall_thickness]) union() {
// add uSD side wall spacer
difference() {
cube([uSD_x, in_y, spacer_z]) ;
translate([0, uSD_y - uSD_w, 0])
cube([uSD_x, 2*uSD_w, spacer_z]) ;
}
// add PCB spacers
translate([uSD_x, 0, 0])
spacers(hole_x1 + tolerance, hole_x2 + tolerance,
hole_y + tolerance, device_y - hole_y + tolerance,
riser_z, riser_r) ;
}
}
// substract cutouts
union() {
translate([wall_thickness + uSD_x, 0, wall_thickness + pcb_top])
right_cutouts() ;
translate([box_x - wall_thickness, wall_thickness, wall_thickness + pcb_top + 3*tolerance])
back_cutouts() ;
translate([edge_offset, edge_offset, box_z - cover_overlap])
round_cube(box_x - 2*edge_offset, box_y - 2*edge_offset, cover_overlap,
rounding_radius - edge_offset) ;
}
}
}
module box_top() {
difference () {
union() {
// basic cover
difference(){
round_cube(box_x, box_y, cover_z, rounding_radius) ;
union() {
translate([wall_thickness, wall_thickness, 0])
round_cube(in_x, in_y, cover_z - cover_inside_t, in_r) ;
translate([0, 0, 0])
round_belt(box_x, box_y, cover_overlap, rounding_radius, edge_offset) ;
// USB connector cut-out
translate([box_x - wall_thickness, wall_thickness + USBl_y - USB_w/2, 0])
cube([wall_thickness, USBr_y - USBl_y + tolerance, cover_overlap]) ;
}
}
// add connector covers
translate([box_x - wall_thickness, wall_thickness, cover_overlap])
//translate([box_x - wall_thickness, wall_thickness, 0])
union() {
translate([0, USBl_y - USB_w/2 + 0.5*tolerance, -mask_z])
cube([wall_thickness, USBr_y - USBl_y + USB_w + tolerance, mask_z]) ;
translate([0, USBl_y + USB_w/2 + tolerance, -(mask_z + USB_z/2) + 1.5*tolerance])
cube([wall_thickness, USB_sep + USB_w + 0.5*tolerance, mask_z + USB_z/2]) ;
}
// add spacers
translate([Con_spacer_x, wall_thickness + Ether_y, cover_z - Eth_spacer])
cylinder(h = Eth_spacer, r = Top_spacer_r) ;
translate([Con_spacer_x, wall_thickness + USBr_y, cover_z - USB_spacer])
cylinder(h = USB_spacer, r = Top_spacer_r) ;
translate([PCB_spacer_x, wall_thickness + LedBtn_y, cover_z - PCB_spacer])
cylinder(h = PCB_spacer, r = Top_spacer_r) ;
}
// substract cutouts (holes for LEDs and push-button)
translate([wall_thickness + uSD_x, wall_thickness, 0]) union() {
translate([G_Led_x, LedBtn_y, 0])
cylinder(h = cover_z, r = Led_r + tolerance) ;
translate([Y_Led_x, LedBtn_y, 0])
cylinder(h = cover_z, r = Led_r + tolerance) ;
translate([R_Led_x, LedBtn_y, 0])
cylinder(h = cover_z, r = Led_r + tolerance) ;
translate([Btn_x, LedBtn_y, 0])
cylinder(h = cover_z, r = Btn_r + tolerance/2) ;
}
}
}
// --- end of file ---