Pi3B Enclosure
These enclosures were designed with OpenSCAD, sliced with Repetier and printed on a Tronxy X5S.
The bottom has a cutout and mounting for Arducam Raspberry Pi Camera board with interchangeable CS lens mount. This camera accepts a variety of lenses and is available without the infrared filter (NOIR model).
Contents
Raspberry Pi Model 3 Enclosure
3-D printed box for Raspberry Pi and Hive Interface Board.
Assembly
Mount the camera
- If using the camera, cut out the large round hole for the camera lens with a utility or X-Acto knife. I used nylon screws to mount the camera in case one came lose, there wouldn't be a metal screw rolling around inside. I used 4-40 threads on the camera as I had nylon 4-40 screws.
- Cut and remove the supports on the HDMI opening, deburr and clean up the print.
- Tap the four taller Pi standoffs M2.5. If you don't have taps, a metal screw or standoff can be used to form the threads.
- Tap the four shorter camera standoffs with M2.5 or 4-40.
- Remove the lens from the camera (one screw) and mount the camera.
- Fold the flat cable as shown.
Install Pi
- Correctly orient the Pi,
- Lower the side of the Pi with the HDMI, and audio connectors and insert that side into the enclosure first taking care that the Ethernet and Type A USB connectors are aligned with the edge of the enclosure. When the board is correctly installed, the mounting holes should line up with the standoffs.
- Install the four 11mm x M2.5 hex standoffs. When tight they should be about 1 mm below the edge of the enclosure.
Install Hive Interface Board
- Align the 40 pin headers and install the Hive Interface board. It should be flush with the top of the box.
Install Top
Install the top cover. Three latches hold the cover on. Four M2.5 x 30mm machine screws are used to secure the cover.
Bottom
- Includes cutout and mounting for Arducam Raspberry Pi Camera board with interchangeable CS lens mount. This camera accepts a variety of lenses and is available without the Infra Red filter (NOIR model).
- Estimated printing time: 2:42
- Layer Count 124
- Filament Needed 10567 mm.
OpenSCAD code
/**************************************************************************** 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
- The top will snap on using the three latches.
- M2.5x30mm screws can be used to further secure the lid and board.
- Clean up the print.
- Make sure the LED will fit otherwise enlarge the LED hole with a drill bit.
OpenSCAD code
/**************************************************************************** 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); }