Pi3B Enclosure
Raspberry Pi Model 3 Enclosure
OpenSCAD code
Bottom
/**************************************************************************** Raspberry Pi Model 3 Enclosure bottom with camera cutout HiveTool.net *****************************************************************************/ width=64; length=94; height=23; wall_thickness = 2; radius=wall_thickness/2; difference() { union() { rounded_box(width, length, height, wall_thickness); // create the rounded box // add some standoff s for mounting translate([8.5,10.25,wall_thickness]) standoff(7,6,2.3); //translate([29,9.5,wall_thickness]) standoff(4,6,2.2); //Pi Zero translate([57.5,10.25,wall_thickness]) standoff(7,6,2.3); translate([8.5,68.75,wall_thickness]) standoff(7,6,2.3); //translate([29,67.5,wall_thickness]) standoff(4,6,2.2); //Pi Zero translate([57.5,68.75,wall_thickness]) standoff(7,6,2.3); // add some fillets for strength and printability translate([2,9.25,1]) cube([4,2,8]); translate([59.5,9.25,1]) cube([3.5,2,8]); translate([2,67.75,1]) cube([5,2,8]); translate([59.5,67.75,1]) cube([3.5,2,8]); // Standoffs for Camera translate([(width-21-14.3), (length/2 + 14.3),wall_thickness]) standoff(2,6,2.3); translate([(width-21-14.3), (length/2 - 14.3),wall_thickness]) standoff(2,6,2.3); translate([(width-21+14.3), (length/2 - 14.3),wall_thickness]) standoff(2,6,2.3); translate([(width-21+14.3), (length/2 +14.3),wall_thickness]) standoff(2,6,2.3); // add alignment pins translate ([wall_thickness,wall_thickness,height]) alignment_pin(); translate ([wall_thickness,length - wall_thickness,height]) rotate ([0,0,-90]) alignment_pin(); translate ([width - wall_thickness,length - wall_thickness,height]) rotate ([0,0,180]) alignment_pin(); translate ([width - wall_thickness,wall_thickness,height]) rotate ([0,0,90]) alignment_pin(); translate ([wall_thickness+.4,wall_thickness+.4,height]) sphere(1.9, center=true, $fn=36); translate ([wall_thickness+.4,length - wall_thickness-.4,height]) sphere(1.9, center=true, $fn=36); translate ([width - wall_thickness-.4,length - wall_thickness-.4,height]) sphere(1.9, center=true, $fn=36); translate ([width - wall_thickness-.4,wall_thickness+.4,height]) sphere(1.9, center=true, $fn=36); } translate ([wall_thickness,length-wall_thickness-1,8]) cube([width-2*wall_thickness,2,4]); translate([42.5,91,10]) cube([16.8,4,16.5]); // Ethernet translate([6,88,11]) cube(40,4,15.5); // USBs // Camera mount translate([(width-21), (length/2), .5]) difference() { cylinder(h=10, r=15, $fn=50); translate([0, 0, -5]) cylinder(h=10, r=14, $fn=50); } // holes for camera mount translate([(width-21-14.3), (length/2 + 14.3), .5]) cylinder(h=10, r=1.3, $fn=50); translate([(width-21-14.3), (length/2 - 14.3), .5]) cylinder(h=10, r=1.3, $fn=50); translate([(width-21+14.3), (length/2 - 14.3), .5]) cylinder(h=10, r=1.3, $fn=50); translate([(width-21+14.3), (length/2 +14.3), .5]) cylinder(h=10, r=1.3, $fn=50); translate([63,17.5,11.8]) rotate([90,0,90]) round_cutout2 (5,5,0,0,0) ; // micro USB translate ([15,length-3,height-7]) cube([28,4,8]); // shorten the spacers between USB/Ethernet cutouts translate([63,31,17.8]) hdmi_cutout(); // hdmi translate([61,60.5,13.5]) rotate([0,90,0]) cylinder(h=4, r=3.2, $fn=50); // Audio translate([width/2 - 1,3,height-5.5]) latch(); // latch translate([1,length-14,height-5.5]) rotate([0,0,90]) latch(); // latch translate([width-1,length-14,height-5.5]) rotate([0,0,-90]) latch(); // latch } /* ***************************************************** Create a solid cube with 8 rounded edges but not on the top where the cover will go. *******************************************************/ module rounded_cube(width, length, height, wall_thickness){ hull() // wrap a hull around 4 cylinders with rounded bottoms { radius=wall_thickness/2; // place 4 spheres in the corners, with the given radius offset vertically by the radius translate([(wall_thickness/2), (wall_thickness/2), radius]) sphere(r=radius, $fn=50); translate([(wall_thickness/2), length-(wall_thickness/2),radius]) sphere(r=radius, $fn=50); translate([width-(wall_thickness/2), length-(wall_thickness/2), radius]) sphere(r=radius, $fn=50); translate([width-(wall_thickness/2), (wall_thickness/2), radius]) sphere(r=radius, $fn=50); // place 4 cylinders in the corners, with the given radius, // offset vertically by the radius of the spheres translate([(wall_thickness/2), (wall_thickness/2), radius]) cylinder(h=height-radius, r=radius, $fn=50); translate([(wall_thickness/2), (length-wall_thickness/2), radius]) cylinder(h=height-radius, r=radius, $fn=50); translate([(width-wall_thickness/2), (length-wall_thickness/2), radius]) cylinder(h=height-radius, r=radius, $fn=50); translate([(width-wall_thickness/2), (wall_thickness/2), radius]) cylinder(h=height-radius, r=radius, $fn=50); } } /************************************************************** * Create a hollow box with rounded edges inside and out * but not on the top where the cover will go * by subtracting a rounded cubes that is 2x the wall thickness smaller * and shifted by the wall thicknes from the first rounded cube. ***************************************************************/ module rounded_box(width, length, height, wall_thickness){ difference() // subtract two rounded cubes { rounded_cube(width, length, height, wall_thickness); translate([ wall_thickness, wall_thickness, wall_thickness]) rounded_cube(width-(2*wall_thickness), length-(2*wall_thickness), height, wall_thickness); } } module standoff(height,diameter,hole){ difference() { cylinder(h = height, r = diameter/2, $fn=6); cylinder(h = height+1, r = hole/2, $fn=6); } } module hdmi_cutout () { union() { rotate([0,-90,0]) linear_extrude(height = 4, center=true) polygon(points=[[0,0],[0,5],[-7,5],[-7,2],[-5,0]]); rotate([0,-90,0]) linear_extrude(height = 4, center=true) polygon(points=[[0,6],[0,10],[-7,10],[-7,6]]); rotate([0,-90,0]) linear_extrude(height = 4, center=true)polygon(points=[[0,11],[0,16],[-5,16],[-7,14],[-7,11]]); } } module round_cutout2 (height,width,x,y,z) { difference() { linear_extrude(height = 4, center=true) hull() { translate([x-width/2,0,0]) circle(height/2, center=true, $fn=100); translate([x+width/2,0,0]) circle(height/2, center=true, $fn=100); } } } module square_cutout (height,width,x,y,z) { difference() { translate([x,y,z]) rotate([90,0,0]) linear_extrude(height = 4, center=true) hull() { cube(width,wall_thickness,height); } } } module alignment_pin() { rotate([0,180,-90]) { union() { intersection(){cube(4); sphere(3, $fn=36);} } } } module latch(){ translate([-3,-1,0]) rotate([0,90,0]) cylinder(h=6, r=1.2, $fn=36); }
Top
/**************************************************************************** Raspberry Pi Model 3 Enclosure top for hive interface board. HiveTool.net *****************************************************************************/ width=64; length=94; height=18; wall_thickness = 2; radius=wall_thickness/2; difference() { union() { rounded_box(width, length, height, wall_thickness); // create the rounded box // add lip around RJ11 cutout translate([20, 14, 0]) cube([35,51,4]); // add some standoffs to guide the screw and hold the board. translate([6.5,11,0]) standoff(18,5,3.2); translate([55.5,11,0]) standoff(18,5,3.2); translate([6.5,69,0]) standoff(18,5,3.2); translate([55.5,69,0]) standoff(18,5,3.2); // add some fillets for strength and printability translate([0,10,1]) cube([4.5,2,17]); translate([57.5,10,1]) cube([5.5,2,17]); translate([0,68,1]) cube([4.5,2,17]); translate([57.5,68,1]) cube([5.5,2,17]); // add some alignment holes translate ([wall_thickness,wall_thickness,height]) alignment_hole(); // translate ([wall_thickness,length - wall_thickness,height]) rotate ([0,0,-90]) alignment_hole(); translate ([width - wall_thickness,length - wall_thickness,height]) rotate ([0,0,180]) alignment_hole(); translate ([width - wall_thickness,wall_thickness,height]) rotate ([0,0,90]) alignment_hole(); // add some latches translate([width/2 - 4,wall_thickness-.1,1]) latch(); translate([wall_thickness-.2,length -10, 1]) rotate ([0,0,-90]) latch(); translate([width-wall_thickness+.2,length -18, 1]) rotate ([0,0,90]) latch(); // extend spacers between the USB conectors translate([21,length - wall_thickness-4, wall_thickness]) cube ([4,6,height+5]); translate([39,length - wall_thickness-4, wall_thickness]) cube ([4,6,height+5]); } // add some holes for mounting translate([6.5,11,-1]) cylinder(h=4, r=1.6, $fn=50); translate([55.5,11,-1]) cylinder(h=4, r=1.6, $fn=50); translate([6.5,69,-1]) cylinder(h=4, r=1.6, $fn=50); translate([55.5,69,-1]) cylinder(h=4, r=1.6, $fn=50); translate([5,85,17]) cube([16.8,10,12]); // Ethernet translate([24,85,15]) cube([15.5,10,12]); // USB-1 translate([42,85,15]) cube([15.5,10,12]); // USB-2 translate ([25,10,-1]) cylinder(h=4,r=2.51, $fn=50); //LED translate([21.3,15.5,-1]) cube([32.5,48.25,6]); // RJ11 gang jacks translate([15,1,16]) rotate([90,0,0]) round_cutout2 (6,6,0,0,0) ; // 12 volt power cables // holes in corners for alignment pins translate ([wall_thickness+.4,wall_thickness+.4,height]) sphere(2, center=true, $fn=36); translate ([wall_thickness+.4,length - wall_thickness-.4,height]) sphere(2, center=true, $fn=36); translate ([width - wall_thickness-.4,length - wall_thickness-.4,height]) sphere(2, center=true, $fn=36); translate ([width - wall_thickness-.4,wall_thickness+.4,height]) sphere(2, center=true, $fn=36); } /* ***************************************************** Create a solid cube with 8 rounded edges but not on the top where the cover will go. *******************************************************/ module rounded_cube(width, length, height, wall_thickness){ hull() // wrap a hull around 4 cylinders with rounded bottoms { radius=wall_thickness/2; // place 4 spheres in the corners, with the given radius offset vertically by the radius translate([(wall_thickness/2), (wall_thickness/2), radius]) sphere(r=radius, $fn=50); translate([(wall_thickness/2), length-(wall_thickness/2),radius]) sphere(r=radius, $fn=50); translate([width-(wall_thickness/2), length-(wall_thickness/2), radius]) sphere(r=radius, $fn=50); translate([width-(wall_thickness/2), (wall_thickness/2), radius]) sphere(r=radius, $fn=50); // place 4 cylinders in the corners, with the given radius, // offset vertically by the radius of the spheres translate([(wall_thickness/2), (wall_thickness/2), radius]) cylinder(h=height-radius, r=radius, $fn=50); translate([(wall_thickness/2), (length-wall_thickness/2), radius]) cylinder(h=height-radius, r=radius, $fn=50); translate([(width-wall_thickness/2), (length-wall_thickness/2), radius]) cylinder(h=height-radius, r=radius, $fn=50); translate([(width-wall_thickness/2), (wall_thickness/2), radius]) cylinder(h=height-radius, r=radius, $fn=50); } } /************************************************************** * Create a hollow box with rounded edges inside and out * but not on the top where the cover will go * by subtracting a rounded cubes that is 2x the wall thickness smaller * and shifted by the wall thicknes from the first rounded cube. ***************************************************************/ module rounded_box(width, length, height, wall_thickness){ difference() // subtract two rounded cubes { rounded_cube(width, length, height, wall_thickness); translate([ wall_thickness, wall_thickness, wall_thickness]) rounded_cube(width-(2*wall_thickness), length-(2*wall_thickness), height, wall_thickness); } } module standoff(height,diameter,hole){ difference() { cylinder(h = height, r = diameter/2, $fn=50); cylinder(h = height+1, r = hole/2, $fn=50); } } module round_cutout2 (height,width,x,y,z) { difference() { linear_extrude(height = 4, center=true) hull() { translate([x-width/2,0,0]) circle(height/2, center=true, $fn=100); translate([x+width/2,0,0]) circle(height/2, center=true, $fn=100); } } } module square_cutout (height,width,x,y,z) { difference() { translate([x,y,z]) rotate([90,0,0]) linear_extrude(height = 4, center=true) hull() { cube(width,wall_thickness,height); } } } module alignment_hole() { rotate([0,180,-90]) { union() { intersection(){cube(4); sphere(3, $fn=36);}} } } module latch(){ translate([0,0,0]) cube([8,2,height+6]); // latch translate([2,-.25,height+4.5]) rotate([0,90,0]) cylinder(h=4, r=1, $fn=36); }