chiark / gitweb /
air-hockey-puck: wip
[reprap-play.git] / fairphone4-case.scad
index 65cd31aa3b9d4d2fd403b378daa66c08a77562ee..0a4b63d6efee47c6ca669319ba61c10e8d96a7dc 100644 (file)
@@ -9,17 +9,12 @@
 //
 //  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.
+//  2. <deleted>
 //
 //  3. use "make" to generate the necessary files:
 //
 //     make -j8 fairphone-case.auto.scads `for f in   \
-//        HingePrint        \
-//        LidWindowPrint    \
+//        HingeLeverPrint   \
 //        LidPrint          \
 //        OneKeeperPrint    \
 //        Case              \
 //  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.  After placing the parts in the appropirate
+//     relative placement:
 //
-//  5. Assemble the hinge.  You will need 4x M2 12mm machine screws
-//     and 8x M2 full nuts.
+//        Use long bit of wire to ensure holes are lined up and proper
+//        Cut four short bits of wire, using above as a guage
 //
-//     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.
+//        Push two short bits into two holes on same side
+//        Use long bit of wire to ensure properly in holes
+//        Keep that side up so they don't fall out!
 //
-//     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.
+//        For each of the two holes
+//          Use 20-30cm hunk of 2.85mm PLA
+//          Use gas flame to melt end until it catches fire (!)
+//          Remove from flame, wave to extinguish, and quickly:
+//          Dab end onto where hole is
+//          As it congeals, use sidecutters to cut off by hole
 //
-//     When you have the stiffness right, tighten the locknuts onto
-//     each first nut.
+//        Repeat for two holes on other side
+//        When cool, file down rough edges
 //
 //  6. In use:
 // 
 //        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.
@@ -96,7 +61,7 @@
 //
 // AUTHORSHIP, COPYRIGHT, LICENCE, AND LACK OF WARRANTY
 //
-//   Copyright (C)2018 Ian Jackson.
+//   Copyright (C) 2018-2022 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
@@ -149,9 +114,9 @@ button_cutout_depth = 9;
 
 phone_edge_thick = 11.25;
 
-camera_pos_tl = [  6.600,  6.750 ]; // from tl corner (as seen from back)
-camera_edge_rad = 9.750;
-camera_sz = 32.920 + .750;
+camera_pos_tl = [  5.600,  5.750 ]; // from tl corner (as seen from back)
+camera_edge_rad = 9.750 + 0.700;
+camera_sz = 32.920 + .750 + 1.000;
 
 // this is disabled, FP4 doesn't have one
 jack_pos = [ 13.83, 8.485 ];
@@ -165,13 +130,13 @@ led_window_ledge = 0.75; // each side
 noisecancelmic_pos = [ 15.08 + .720, 4.35 ];   // from rhs, from top edge
 noisecancelmic_dia = 4.00;
 
-mainmic_pos = [ 21.5, 3.45 ];   // from lhs, from top edge
+mainmic_pos = [ 21.0, 4.65 ];   // from lhs, from top edge
 mainmic_dia = 4.00;
 
-lhshole_pos = [ phone[1]/2 - 0.80, 4.35 ];
+lhshole_pos = [ phone[1]/2 + 0.40, 4.35 ];
 
-// fingerpushhole_dias = [];
-fingerpushhole_dias = [ 15, 18 ]; // this is for testing
+fingerpushhole_dias = [];
+//fingerpushhole_dias = [ 15, 18 ]; // this is for testing
 
 lanyard_half_dia = 1.15;
 lanyard_entry_rel_breadth = 2;
@@ -179,8 +144,8 @@ lanyard_channel_len = 8;
 //rearspeaker_pos_bl = [ 12.64, 18.72 ];
 //rearspeaker_size   = [  3.76,  7.36 ];
 
-bottomspeaker_size = [ 12.35, 1.40 ] + [1,1] * 0.5;
-bottomspeaker_pos = [ 18.05, 5.52 ]; // from rhs, from top
+bottomspeaker_size = [ 11.35, 1.90 ] + [1,1] * 0.5;
+bottomspeaker_pos = [ 17.55, 5.17 ]; // from rhs, from top
 
 microusb_above = 1.64 - 0.25;
 microusb_below = 2.42;
@@ -188,7 +153,7 @@ microusb_width = 12.16 + 2.0 + 1.25;
 
 case_th_bottom = 2.5;
 case_th_lid = 3.0;
-case_th_side = 2.3;
+case_th_side = 2.6;
 case_th_lip = 1.2;
 
 lid_screen_gap_extra = .66;
@@ -208,6 +173,9 @@ keeper_gap_z_top = 0.25;
 keeper_gap_z_bot = 0.75;
 keeper_gap_x     = 0.25;
 keeper_gap_x_holes = 0.75;
+keeper_fatter = 0.45;
+keeper_fatter_hole = 1.20;
+keeper_stubbier = 0.0;
 
 keeper_side = 0; // 0 = lhs; 1 = rhs
 
@@ -218,14 +186,14 @@ lid_gap_z = 0.25;
 lid_lip = 1.75;
 lid_edgepart_width = 5.0;
 lid_buttoncover_thick = 1.3;
-lid_buttoncover_reinf = 0.65;
+lid_buttoncover_reinf = 0.95;
 
 foldover_gap = 0.50;
 foldover_lever_gap = 0.50;
 
 // properties of the hinge fasteners
-hingescrew_shaft_dia = 2.0 + 0.25; // M2 x 12mm machine screw
-hingescrew_shaft_len = 12;
+hingescrew_shaft_dia = 1.600 + 0.45; // beading wire
+hingescrew_shaft_len = 10;
 hingescrew_fasteners_extra_thick = 0.40;
 // ^ amount of thread protruding if everything was completely nominal
 //   and we are using two nuts
@@ -257,7 +225,7 @@ hinge_x_gap = 0.125;
 hinge_x_postscrew_gap = 0.75;
 hinge_x_arms_gap = 0.35;
 hinge_r_arms_gap = 0.55;
-hinge_over_nut_plate = 1.0;
+hinge_over_nut_plate = -0.50; // bodge apropos slope
 
 // there isn't one of these, speaker is by hinge
 // rearspeaker_gap    = [ 2.0, 2.0 ]; // each side
@@ -283,6 +251,7 @@ lid_fold_clearance_antislop = 0.5;
 
 $button_leg_only = false;
 $suppress_forward_holes = false;
+$suppress_hinge = false;
 
 // ---------- calculated ----------
 
@@ -503,9 +472,15 @@ module AdhocMultiprintFrame(phase, z0, zs) {
     }
 }
 
-module KeeperProfile(slant=0){
+module KeeperProfile(fatter=0, slant=0, stubbier=0){
   use_e = kppe + [0,-1] * slant * keeper_inner_width / keeper_slant_slope;
-  polygon([use_e, kppd, kppc, kppb, kppa, kppf]);
+  polygon([use_e + [+1,-1] * fatter,
+          kppd  + [ 0,-1] * fatter - stubbier * [1,0],
+          kppc                     - stubbier * [1,0],
+          kppb,
+          kppa                     + stubbier * [0,1],
+          kppf  + [+1, 0] * fatter + stubbier * [0,1]
+          ]);
 }
 
 module EdgeProfile(){
@@ -829,6 +804,7 @@ module Buttons(){
   Flip_rhs(1) SideButton(64.220, +1, 14.500  ) children(); // power
   Flip_rhs(1) LidButtonishLeg(14, -1) children();
   Flip_rhs(0) LidButtonishLeg(21, -1) children();
+  Flip_rhs(0) LidButtonishLeg(38, +1) children();
   Flip_rhs(0) LidButtonishLeg(14, +1) children();
 }
 
@@ -1122,7 +1098,7 @@ module Case(){ ////toplevel
       Flip_rhs(1-keeper_side) intersection(){
        rotate([90, 0, 0])
          linear_extrude(height = phone_height + phone_cnr_rad * 2)
-         KeeperProfile(1);
+         KeeperProfile(fatter=0, slant=1);
 
        // outline of the whole case, to stop it protruding
        translate([0,0, -25])
@@ -1133,7 +1109,8 @@ module Case(){ ////toplevel
       }
 
       // hinge
-      HingePortion(hex20, hex21) HingeBaseProfile();
+      if (!$suppress_hinge)
+       HingePortion(hex20, hex21) HingeBaseProfile();
 
       // buildout for prop recess
       if (prop_caserecess_buildout_r > 0) Flip_rhs(1)
@@ -1152,7 +1129,7 @@ module Case(){ ////toplevel
       rotate([90, 0, 0])
       linear_extrude(height = phone_height + phone_cnr_rad * 2)
       minkowski(){
-        KeeperProfile();
+        KeeperProfile(fatter=keeper_fatter_hole);
        rectfromto([ -keeper_gap_x,    -keeper_gap_z_bot ],
                   [ keeper_gap_x_holes,    +keeper_gap_z_top ]);
       }
@@ -1194,8 +1171,8 @@ module Case(){ ////toplevel
       // CaseAperture(jack_pos, jack_dia, 8);
       Flip_rhs(1)
        CaseAperture(noisecancelmic_pos, noisecancelmic_dia, 8);
-      CaseAperture(lhshole_pos, noisecancelmic_dia, 8, 1);
     }
+    CaseAperture(lhshole_pos, noisecancelmic_dia, 8, 1);
 
     OrdinaryBottomEdgeApertures();
 
@@ -1205,15 +1182,17 @@ module Case(){ ////toplevel
     MicroUSBEtc();
 
     // gaps for the lid's hinge arms
-    HingePortion(hex20 - hinge_x_arms_gap,
-                hex21 + hinge_x_arms_gap)
-      minkowski(){
+    if (!$suppress_hinge) {
+      HingePortion(hex20 - hinge_x_arms_gap,
+                  hex21 + hinge_x_arms_gap)
+       minkowski(){
         HingeLidProfile();
        circle(r= hinge_r_arms_gap, $fn= 8);
       }
 
-    // screw holes in the hinge arms
-    HingeScrews();
+      // screw holes in the hinge arms
+      HingeScrews();
+    }
 
     // thumb recess
     ThumbRecessApply(epp4[1])
@@ -1332,12 +1311,12 @@ module HingeLever(){ ////toplevel
       HingeLeverOuterProfile();
 
     // space for the screws
-    HingePortion(hex26, hex24)
-      HingeLeverInnerProfile();
+//    HingePortion(hex26, hex24)
+//      HingeLeverInnerProfile();
 
     // recesses for the nuts
-    HingePortion(hex23, hex26+1)
-      HingeLeverNutProfile();
+//    HingePortion(hex23, hex26+1)
+//      HingeLeverNutProfile();
 
     // bores for the screws
     HingeScrews();
@@ -1491,7 +1470,7 @@ module OneKeeper(){ ////toplevel
   translate([0, -phone_cnr_rad, 0])
     rotate([90, 0, 0])
     linear_extrude(height = phone_height - phone_cnr_rad * 2)
-    KeeperProfile();
+    KeeperProfile(fatter=keeper_fatter, stubbier=keeper_stubbier);
 }
 
 module OneKeeperPrint(){ ////toplevel
@@ -1513,6 +1492,11 @@ module TestSelectFrame(){
       linear_extrude(height=200)
       rectfromto(include,  inside_br - include);
   }
+
+  for (i= [1,2]) {
+    translate([ 0, -phone[1] * i/3, 0 ])
+      cube(center=true, [1000, 4, 100]);
+  }
 }
 
 module TestSelectLidFrame(){