3D Printed Case (Modular!) for your DIY Project

3D Printed Case (Modular!) for your DIY Project

November 28, 2016

Every time I build a DIY project I stumble upon the need to encase it. There is plenty available 3D Printed Case designs online but none truly met my needs for simplicity and modularity. This pushed me to design the case tailored exactly to my needs.

Business requirements

We need the project’s casing to:

  • enclose all the circuit parts
  • be easily extended with additional sensors, motors, and functionalities
  • be easy to modify
  • be easy to disassemble all the parts
  • limit the need for soldering and gluing
  • be 3D printed without support and bridges
  • be KISS (Keep It Simple, Stupid)

3D Printed Case’s body

First, let’s define some variables used to describe the 3D printed case’s size and properties.

$fn = 100; // resolution
clearance=0.25; //clearances for 3D printing to make parts easily fit where needed
width = 68.6+3; //width of the case(X)
depth = 53.3+3; //depth of the case (Y)
depthSpace = 5; //little space on both sides of the case to store loose wires and make it easier to fit components
height = 35; //height of the case (Z)
indentHeight = 2; // tells us how far the cover overlaps the case
wallWidth = 3; // wall width

Next, let’s build the box using variables we just defined.

//build a box
linear_extrude(height, convexity = 10) {
          offset(r = wallWidth)
          square([width, depth + (2 * depthSpace)], true);
        };
}

The Case Bounding Box

Now we can cut the working space, where we can place our Arduino, Raspberry Pi or any other components. Measurements used here should match Arduino Uno.

 difference() {
        //build a box
        [...]
        // cut a working area space
        translate([0, 0, wallWidth]) linear_extrude(height, convexity = 10) square([width, depth], true);
}

We can now cut some space for excess wires. We will keep the pillars which should make our case more sturdy.

difference() {
        //build a box
        [...]
        // cut a working area space
        [...]
        // cut a space on the sides of the working area
        // can be used to hold an excess wires
        for (i = [-1, 1])
          translate([0, i * (depth / 2 + depthSpace / 2), wallWidth]) linear_extrude(height, convexity = 10) square([width - 2 * depthSpace, depthSpace], true);
}

cut some space for excess wires

Cut the screw holes in the pillars. We will use those to screw the body and a cover together.

 difference() {
    //build a box
    [...]
    // cut a working area space
    [...]
    // cut a space on the sides of the working area
    // can be used to hold an excess wires
    [...]
    // add the screw holes
    for (i = [
        [-1, 1],
        [1, -1],
        [-1, -1],
        [1, 1]
      ])
      translate([i[0] * (width / 2 - depthSpace / 2), i[1] * (depth / 2 + depthSpace / 2), height - 4 / 5 * height]) linear_extrude(4 / 5 * height, convexity = 10) circle(d = 2.5);
 }

Cut the screw holes in the pillars

Next step is to cut the indent in which the cover will slide in.

 difference() {
    //build a box
    [...]
    // cut a working area space
    [...]
    // cut a space on the sides of the working area
    // can be used to hold an excess wires
    [...]
    // add a screw hole
    [...]
    // cut an indent at the upper edge of the box
    color("green") translate([0, 0, height - indentHeight])
    linear_extrude(indentHeight, convexity = 10) difference() {
      offset(r = wallWidth) square([width, depth + 2 * depthSpace], center = true);
      square([width + wallWidth, depth + 2 * depthSpace + wallWidth], center = true);
    }
}

Next step is to cut the indent in which the cover will slide in

The Connector

As your project grows and evolves u might need more space in your box. We want the case to be KISS, so let’s just print one more box with different or the same dimensions and join boxes together. How? Here comes an ancient woodworking technique. A dovetail joint or simply dovetail is a joinery technique most commonly used in woodworking joinery (carpentry).

Joinery half blind dovetail Wooden Dovetail

We want to create a dovetail cuts on the opposite walls. We will use those to:

  • pull the wires between the boxes.
  • join boxes together with slide-in connector
  • air cool your project - which might be important for certain electrical circuits.

As we will use it very often we will encapsulate the code in the module for re-use purposes.

/**
* Dovetail shape used to cut a hole in the walls and generate a double sided dovetail connector 
*/
module dovetail(max_width = 5, min_width = 3, depth = 5, height = 20) {
  linear_extrude(height = height , convexity = 2) polygon(paths = [
    [0, 1, 2, 3, 0]
  ], points = [
    [-min_width / 2, 0],
    [-max_width / 2, depth],
    [max_width / 2, depth],
    [min_width / 2, 0]
  ]);
  echo("angle: ", atan((max_width/2-min_width/2)/depth));
}

Dovetail shape used to cut a hole in the walls

Finally, let’s create the connector. We just create two dovetails, mirror one and join them together. You want the connectors to be slightly smaller than the holes so they fit closely and at the same time are easy to slide in and out . Let’s use “clearance” variable to create  little space between walls.

/**
* Generates a double sided dovetail connector 
*/
module dovetailConnector(){
    union() {
        dovetail(max_width = 5 - clearance, min_width = 3 - clearance, depth = wallWidth, height = height/2 - indentHeight);
        mirror([0, 1, 0]) dovetail(max_width = 5 - clearance, min_width = 3 - clearance, depth = wallWidth, height = height/2 - indentHeight);
    }
}

for (i = [1 / 5, 2 / 5, 3 / 5, 4 / 5]) color("red") translate([(width * i), (1.2* depth + depthSpace + wallWidth)]) rotate([0, 0, 180]) { 
      dovetailConnector();
  }

Case connector

3D Printed Case’s Cover

So we’ve got the boxes we can change, duplicate and join together. Now let’s design a cover.

First, create the box with height=wallWidth + indentHeight and two other dimensions same as the box.

 // create cover box
    linear_extrude(wallWidth + indentHeight, convexity = 10) {
      offset(r = wallWidth)
      square([width, depth + (2 * depthSpace)], true);
    };

Box cover

Next cut the indent so u can interlock the case with the cover.

difference() {
    // create cover box
    [...]
    // cut the indent to slide a body in
    linear_extrude(indentHeight, convexity = 10) square([width + wallWidth + clearance, depth + 2 * depthSpace + wallWidth + clearance], center = true);
}

Next cut the indent so u can interlock the case with the cover.

And finally cut the screw holes in corresponding positions to the case’s ones.

difference() {
    // create cover box
    [...]
    // cut the indent to slide a body in
    [...]
    // cut the screw holes
    for (i = [
        [-1, 1],
        [1, -1], 
        [-1, -1],
        [1, 1]
      ])
      translate([i[0] * (width / 2 - depthSpace / 2), i[1] * (depth / 2 + depthSpace / 2), 0]) linear_extrude(wallWidth + indentHeight, convexity = 10) circle(d = 2.5);
  }

finally cut the screw holes in the cover

Final result

Let’s put all parts together of our 3D Printed Case.

The full 3D Case

Here you can see how to use dovetail joints with two Modular 3D printed cases. dovetail joints with two Modular 3D printed cases

This is a base project. Take a look how can you easily extend it for your custom project: 3D Printed Case for Living Green Wall Project

You can find latest source files along with some examples how to modify this basic design at Github: https://github.com/robertmeisner/modular-3d-printed-case

The STL files are available at: http://www.thingiverse.com/thing:1923616


Written by Robert Meisner. You can follow him on0

...