X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=fairphone-case.scad;h=64c0fa20d4ce4b91052c8363a7c95cab9249b59f;hb=24bd1f90746c20560d369a4658da6f20fa0e70fd;hp=5df180bf1efc96ea346c6491ccb69db9b15c6313;hpb=c2f1c867edb4dbeae5775faafde63e3a1c015ffd;p=reprap-play.git diff --git a/fairphone-case.scad b/fairphone-case.scad index 5df180b..64c0fa2 100644 --- a/fairphone-case.scad +++ b/fairphone-case.scad @@ -1,8 +1,10 @@ // -*- C -*- +include + phone = [ 75.0, 145.0 ]; -bumper = [ 0.250, 0.250 ]; +bumper = [ 0.250, -0.025 ]; // ^ One side. Overall size is increased by twice this. // If no bumpers, is the gap around the phone. @@ -24,6 +26,8 @@ jack_dia = 9.1 + .5; // some jack I had lying around noisecancelmic_pos = [ 19.54, 7.37 ]; // from rhs noisecancelmic_dia = 1.75; +fingerpushhole_dias = [ 14, 17 ]; + rearspeaker_pos_bl = [ 14.92, 18.72 ]; rearspeaker_size = [ 3.76, 7.36 ]; @@ -54,6 +58,14 @@ lid_gap_x = 0.25; lid_gap_z = 0.25; lid_lip = 1.75; +foldover_gap = 0.50; +foldover_lever_gap = 0.50; + +hingescrew_shaft_dia = 2.0 + 0.25; // M2 x 12mm machine screw +hingescrew_nut_dia = 4.72 + 0.50; // washer, actually +lever_cover_th = 0.75; +hingemount_th = 2.5; + $fa = 5; $fs = 0.1; @@ -118,17 +130,22 @@ bppL = lpp10 + [5,0]; bppK = [ bppL[0], bppN[1] ]; bppJ = [ bppN[0], bppL[1] ]; -module rectfromto(a,b) { - ab = b - a; - translate([min(a[0], b[0]), min(a[1], b[1])]) - square([abs(ab[0]), abs(ab[1])]); -} -module circleat(c,r) { translate(c) circle(r); } -module linextr(z0,z1) { - translate([0,0,z0]) - linear_extrude(height=z1-z0) - children(); -} +// hinge plan +hp_rn = hingescrew_nut_dia/2; +hp_r2 = hp_rn + lever_cover_th; +hp_rs = hingescrew_shaft_dia/2; +hp_r1 = hp_rs + hingemount_th; + +hppU = lpp13; +hppS = epp2o + [0,-1] * case_th_bottom; +hp_k = 0.5 * (hppU[1] - hppS[1] + foldover_gap); + +hppM = [ epp4[0] - foldover_lever_gap - hp_r2, + 0.5 * (hppU + hppS)[1] ]; +hppT = hppM + 0.5 * [0,+1] * hp_k; +hppB = hppM + 0.5 * [0,-1] * hp_k; + +// ---------- modules ---------- module KeeperProfile(slant=0){ use_e = kppe + [0,-1] * slant * keeper_inner_width / keeper_slant_slope; @@ -332,13 +349,25 @@ module Struts(x_start, z_min, th){ } } -module RearSpeakerAperture(){ - CaseBase_rhsflip([1]) CaseBase_botflip([1]) +module OrdinaryRearAperture(rhs,bot, pos){ + CaseBase_rhsflip(rhs) CaseBase_botflip(bot) linextr(-20, 20) mirror([0,1]) - translate(rearspeaker_pos_bl + bumper) + translate(pos + bumper) + children(); +} + +module OrdinaryRearApertures(){ + // rear speaker + OrdinaryRearAperture(1,1, rearspeaker_pos_bl) rectfromto(-rearspeaker_gap, rearspeaker_size + rearspeaker_gap); + + // finger hole to remove phone + OrdinaryRearAperture(1,0, [ fingerpushhole_dias[0]/2 + epp2i[0], + phone[1]/2 ]) + scale(fingerpushhole_dias) + circle(r= 0.5 ); } module RearCameraAperture(){ @@ -350,6 +379,49 @@ module RearCameraAperture(){ rectfromto(camera_pos_tl, camera_pos_br); } +module HingeLidProfile(){ + hull(){ + circleat(hppT, hp_r1); + circleat(lpp12, lp_r12); + polygon([lpp10, + lpp13 + [2,0], + lpp12, + hppT]); + } +} + +module HingeBaseProfile(){ + difference(){ + hull(){ + circleat(hppB, hp_r1); + circleat(epp2o, case_th_bottom); + circleat(hppB + [10,0], hp_r1); + } + polygon([epp5, epp1, epp2i, epp3, bppL]); + } +} + +module HingeLeverOuterProfile(){ + hull(){ + circleat(hppT, hp_r2); + circleat(hppB, hp_r2); + } +} + +module HingeLeverInnerProfile(){ + for (c = [hppT, hppB]) { + hull() + for (x=[0,20]) + translate([x,0]) + circleat(c, hp_rn); + circleat(hppB, hp_rn); + } +} + +module HingePortion(){ + CaseBase_rhsflip(); +} + module CaseBase(){ AroundEdges(epp3[1], case_th_bottom, 1) EdgeProfile(); @@ -374,6 +446,9 @@ module Case(){ ////toplevel CaseBase_botflip() circleat([+1,-1] * phone_cnr_rad, phone_cnr_rad + case_th_side/2); } + + // hinge + // HingePortion(hex20, hex21) HingerBaseProfile(); } // slot for keeper @@ -416,7 +491,7 @@ module Case(){ ////toplevel CaseBase_rhsflip([1]) CaseAperture(noisecancelmic_pos, noisecancelmic_dia, 20); - RearSpeakerAperture(); + OrdinaryRearApertures(); } } @@ -444,11 +519,23 @@ module Lid(){ ////toplevel } } +module TestSelectLength(){ + translate([-30, -200, -20]) + cube([30 + 15, 250, 40]); +} + module TestLength(){ ////toplevel intersection(){ Case(); - translate([-30, -200, -20]) - cube([30 + 15, 250, 40]); + TestSelectLength(); + } +} + +module TestLengthRight(){ ////toplevel + intersection(){ + Case(); + CaseBase_rhsflip(1) + TestSelectLength(); } } @@ -481,13 +568,16 @@ module TestSelectRearAperture(){ } module TestSelectCamera(){ - TestSelectRearAperture() - RearCameraAperture(); + minkowski(){ + TestSelectRearAperture() + RearCameraAperture(); + cube([0.1, 50, 0.1]); + } } -module TestSelectRearSpeaker(){ +module TestSelectOrdinaryRearApertures(){ TestSelectRearAperture() - RearSpeakerAperture(); + OrdinaryRearApertures(); } module TestCamera(){ ////toplevel @@ -547,7 +637,7 @@ module TestFrameCase(){ ////toplevel union(){ TestSelectFrame(); TestSelectCamera(); - TestSelectRearSpeaker(); + TestSelectOrdinaryRearApertures(); } } } @@ -593,6 +683,15 @@ module DemoProfiles(){ ////toplevel color("red" ) ButtonPlanForDemo(-4, 1,1); color("blue") ButtonPlanForDemo(-6, 1,0); } + + translate([0, -30]) { + %LidEdgeProfile(); + %EdgeProfile(); + color("blue") HingeLidProfile(); + color("red") HingeBaseProfile(); + color("black") translate([0,0,-2]) HingeLeverOuterProfile(); + color("orange") translate([0,0,-1]) HingeLeverInnerProfile(); + } } //EdgeProfile();