3D printing a case for a phone

This is a work in progress! Neither the case nor this post are complete yet!

Carin would like a phone case that is a little out of the ordinary. 3D printing to the rescue!

What it looks like (interactive - drag it around)

Interactive view via Stl-viewer Copyright © 2018 Viewstl.com and Three JS

Why this is different

A case within a case

Carin likes her rubber-ish case: it provides lots of protection while looking really pretty.

A belt-clip type case is not rubberish (normally a hard shell) and because it is facing jeans/pants, it does not normally have decoration.

The standard belt-clip concept would be to remove the other case and then insert the phone inside the belt-clip case. But why do this, if I am printing a case especially for Carin? Why not just make it bigger, and then the rubber case can fit inside the hard-case?

A non-standard phone (for the USA)

The other problem we have is that Carin purchases a good phone that is unlocked (not tied to a carrier), and that is dual-sim. While we don’t use the second function, the first is extremely valuable to us.

However the side effect is that this limits us to internation models of phones, which are usually slightly different sizes than phones in the USA market.

Designing the Case

I use OpenSCAD to design 3D objects, because it is easy to get alignment just right. And it is a programming language!

First I design a case:

module case(length, width, height, curve) {
    // first half of box
    translate([-length/2, -(width-curve*2)/2]) {
        cube([length, width-curve*2, height]);
    }

    // second half of box
    translate([-(length-curve*2)/2, -width/2]) {
        cube([length - curve*2, width, height]);
    }

    // Position and draw a curve
    translate([(length - curve*2)/2, (width - curve*2)/2]) {
        cylinder(height, curve, curve);   
    }

    // Position and draw a curve
    translate([-(length - curve*2)/2, (width - curve*2)/2]) {
        cylinder(height, curve, curve);   
    }

    // Position and draw a curve
    translate([-(length - curve*2)/2, -(width - curve*2)/2]) {
        cylinder(height, curve, curve);   
    }

    // Position and draw a curve
    translate([(length - curve*2)/2, -(width - curve*2)/2]) {
        cylinder(height, curve, curve);   
    }
}

This is rather boring, but it gives me the basic outline: basic case Now I can make a difference between the outer case and the inner case:

difference() {
    outLength = length + thick * 2;
    outWidth = width + thick * 2;
    outHeight = height + thick;
    outCurve = curve + thick;
    
    // draw the outer case, then subtract the size of the phone.
    case(length = outLength, width = outWidth, 
         height = outHeight, curve = outCurve);
    case(length = length, width = width, 
         height = height, curve = curve);
}

To give me a shell of a case: shell of case