mirror of https://github.com/CIRCL/Circlean
				
				
				
			
		
			
				
	
	
		
			253 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			OpenSCAD
		
	
	
			
		
		
	
	
			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 ---
 | |
| 
 |