chiark / gitweb /
fairphone-case: demo of shearing the button cover legs to fix case folding bug, does...
[reprap-play.git] / fairphone-case.scad
index f03119be7adec4c87528daa2bb30737cdb8dc65b..75c45ad2ae347610c4dc4d4c9e053e0eb5f2791a 100644 (file)
@@ -1,5 +1,122 @@
 // -*- C -*-
 
+// Hard case for Fairphone 2
+//
+//  Copyright 2018 Ian Jackson.  There is NO WARRANTY.
+//  See below for full licensing and disclaimer.
+//
+// Instructions
+//
+//  1. You will want to git clone this repository.
+//
+//  2. Decide about the notification LED aperture. See the variable
+//     led_window_style, below.  The default here is "ad-hoc
+//     multi-colour", which can produces a translucent (clear-ish)
+//     window set into the lid, even on a single-nozzle printer.
+//     See "Ad-hoc multi-colour", below.
+//
+//  3. use "make" to generate the necessary files:
+//
+//     make -j8 fairphone-case.auto.scads `for f in   \
+//        HingePrint        \
+//        LidWindowPrint    \
+//        LidPrint          \
+//        OneKeeperPrint    \
+//        Case              \
+//     ; do echo fairphone-case,$f.auto.stl; done`
+//
+//  4. Print them.  Case and OneKeeperPrint should probably be
+//     the same colour.
+//
+//     For Lid and LidWindowPrint, if you are doing ad-hoc
+//     multi-colour:
+//        i.   Set up for clear filament
+//        ii.  Print LidWindowPrint.  Wait for it to finish.
+//             It won't take long.  As soon as it finishes, tell
+//             your printer to warm up (so that in fact it does
+//             not cool down).
+//        iii. Leaving the output so far on the printbed, reload
+//             your printer with the main lid colour.
+//        iv.  Print LidPrint.  You can let this go unattended.
+//
+//  5. Assemble the hinge.  You will need 4x M2 12mm machine screws
+//     and 8x M2 full nuts.
+//
+//     Make sure you get the hinge the right way round.  If you're not
+//     sure, run
+//         openscad fairphone-case,DemoHinge.auto.scad
+//     to see an assembly diagram.
+//
+//     The nuts recess into the hinge.  You will want very fine
+//     pliers.  As you screw each screw in, add the second nut when
+//     the screw thread emerges from the first - this will be a
+//     locknut.  Screw each screw to an appropriate tightness for the
+//     hinge stiffness.  You want the lid-side hinge to be stiffer as
+//     that makes closing the case work better.
+//
+//     When you have the stiffness right, tighten the locknuts onto
+//     each first nut.
+//
+//  6. In use:
+// 
+//      - To put the phone in, drop its RH side into the RH side of
+//        the case.  Then feed the keeper through the small hole.
+//        Feed it right through.
+//
+//      - The optional prop can be used to prop the phone up (in
+//        portrait orientation only right now).  See
+//            openscad fairphone-case,DemoPropAngles.auto.scad
+//
+// Ad-hoc multi-colour
+//     
+//  This file is set up to let you make a translucent window using a
+//  single-extruder printer, using a "two print run" technique.  This
+//  works well with our Lulzbot TAZ 5 and Aleph Objects' version of
+//  Cura.  If you are using a different printer, you may need to
+//  adjust the parameters or try a different technique.  In particular,
+//      initial_layer_thick
+//         set so that the window is one layer thick
+//      initial_layer_width
+//         set so that the slicer draws a rectangle around the whole
+//         object, rather than putting a "skirt" or anything inside
+//
+//  If you have a dual-extruder printer, you can set led_window_style
+//  to 2 and do a single print of LidPrint and LidWindowPrint.
+//
+//  Alternatively you can set it to 1 (just a hole) or 0 (no hole).
+//
+//  Thanks to Clare Boothby for the ad-hoc multi-colour technique (and
+//  the parameters for our Lulzbot TAZ 5 and Aleph Objects's Cura).
+//
+// Other phones
+//
+//  It might well be possible to adapt this file for other phones.
+//  If you do, let me know how you get on.
+//
+//
+// AUTHORSHIP, COPYRIGHT, LICENCE, AND LACK OF WARRANTY
+//
+//   Copyright (C)2018 Ian Jackson.
+//
+//    This program for generating a 3D model is free software: you can
+//    redistribute it and/or modify it under the terms of the GNU
+//    General Public License as published by the Free Software
+//    Foundation, either version 3 of the License, or (at your option)
+//    any later version.
+//
+//    This program is distributed in the hope that it will be useful,
+//    but WITHOUT ANY WARRANTY; without even the implied warranty of
+//    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//    GNU General Public License for more details.
+//
+//    You should have received a copy of the GNU General Public
+//    License along with this program.  If not, see
+//    <http://www.gnu.org/licenses/>.
+//
+//  In particular DO NOT BLAME ME IF THIS CASE DOES NOT ADEQUATELY
+//  PROTECT YOUR PHONE !  It is your responsibility to decide whether
+//  this case will meet your needs.
+
 include <utils.scad>
 
 phone = [ 75.0, 145.0 ];
@@ -444,6 +561,10 @@ module ButtonPlan(l, deep, cut){
   I0 = [ E0[0], H[1] ];
   I1 = [ E1[0], H[1] ];
 
+  multmatrix([[ 1, $button_plan_shear ? 0.4 : 0, 0 ],
+             [ 0,1,0 ],
+             [ 0,0,1 ],
+             ]){
   hull(){
     for (m=[0,1]) mirror([m,0])
       circleat(H, r0 - epsilon);
@@ -461,6 +582,7 @@ module ButtonPlan(l, deep, cut){
       circleat(D, r0 + epsilon);
     }
   }
+  }
 }
 
 module CatchCatchProfile(){
@@ -571,6 +693,7 @@ module SideButton(y, y_ref_sign, l, suppress_over_keeper=0){
 
 module LidButtonishLeg(y, y_ref_sign, l=buttonishleg_default_l_is_fudge) {
   $button_leg_only = true;
+  $button_plan_shear = true;
   SideButton(y, y_ref_sign, l) children();
 }
 
@@ -1165,7 +1288,7 @@ module TestSelectFrame(){
 module TestSelectLidFrame(){
   TestSelectFrame();
   translate([led_pos[0], -led_pos[1], -50])
-    cylinder(r= nla_r2+2, h=100);
+    cylinder(r= nla_r2+3, h=100);
 }
 
 module TestFrameCase(){ ////toplevel
@@ -1182,6 +1305,8 @@ module TestFrameCase(){ ////toplevel
 module TestSelectTopApertures(){
   translate([-100, -35, -100])
     cube([400, 100, 200]);
+  LidAdhocMultiprintFrame(0);
+  LidAdhocMultiprintFrame(1);
 }
 
 module TestTopApertures(){ ////toplevel
@@ -1195,6 +1320,7 @@ module TestTopApertures(){ ////toplevel
 module TestLidTopAperturesPrint(){ ////toplevel
   rotate([0,180,0]) intersection(){
     Lid();
+    TestSelectLidFrame();
     TestSelectTopApertures();
   }
 }
@@ -1277,6 +1403,43 @@ module DemoPropAngles(){ ////toplevel
     DemoPropAngle(prop_angles[i]);
 }
 
+module DemoHingeAngle(ang1,ang2){
+  hL = [0, -(phone_height - hppT[0]), hppT[1]];
+  hC = [0, -(phone_height - hppB[0]), hppB[1]];
+
+  translate(hL)
+    rotate([ang2,0,0])
+    translate(-hL)
+    translate(hC)
+    rotate([ang1,0,0])
+    translate(-hC) {
+      color("red") Lid();
+    }
+
+  color("blue") intersection(){
+    Case();
+    union(){
+      translate([bppJ[0], -400, -200])
+       mirror([1,0,0])
+       cube([400, 800, 400]);
+      translate([10, -400, -200])
+       cube([10, 800, 400]);
+    }
+  }
+}
+
+module DemoHingeAngles(){ ////toplevel
+  angles = [ 0, 6, 12, 16, 24, 36 ];
+  echo("angles",angles);
+  for (i=[0 : len(angles)-1]) {
+    translate(i * [0, 0, 30]) {
+      DemoHingeAngle(0,angles[i]);
+      translate([0, 200, 0])
+       DemoHingeAngle(angles[i],0);
+    }
+  }
+}
+
 module DemoSelectAdhocLeftRight(right=0) {
   translate([phone_width/2, -400, -100]) // , -15, -100  to cross-section
     mirror([1-right, 0,0])