From: Clinton Ebadi Date: Tue, 4 Apr 2017 05:08:36 +0000 (-0400) Subject: arcade-panel: bevel lid, better positioning, dual hinges X-Git-Url: http://git.hcoop.net/clinton/3d-models.git/commitdiff_plain/ccdc6bcde98db37db1a59f40f4209dbfbd1c5285 arcade-panel: bevel lid, better positioning, dual hinges Cleaned up attachment code and used new code to attach multiple binges. Fixed alignment of lid hinge (rotating the mount made it off by a few mm). Bevel lid for looks and possibly a more secure mounting. --- diff --git a/ble arcade controller/arcade-box.scad b/ble arcade controller/arcade-box.scad index 0fa783e..1aa02fa 100644 --- a/ble arcade controller/arcade-box.scad +++ b/ble arcade controller/arcade-box.scad @@ -20,6 +20,7 @@ // - hinge is not aligned -- either male arm length or connector placement is wrong use +use use use @@ -37,6 +38,7 @@ module preview () { panel_width = 250; panel_height = 130; +panel_bevel = 2; // fixme: calculate based on box_base_thickness? box_depth = 80; box_wall = 2; @@ -47,19 +49,24 @@ $button_d = 30; // I think this should be special joystick_width = 85; joystick_height = 40; -// fixme: these are a bit confused -hinge_joint_width = 8; -hinge_joint_thickness = 5; -hinge_box_base_thicknesseight = 10; -hinge_joint_height = 10; +hinge_arm_width = 6; +hinge_arm_thickness = 6; hinge_arm_length = 50; +// size of block to cut female connector from +hinge_base_size = [hinge_arm_width * 2, hinge_arm_thickness * 2, hinge_arm_thickness * 2]; + +hinge_x_offset = 15; // distance from side of case + // gunk that should be elsewhere... // bcube parameters, clean up cr = box_wall*2; cres = 0; +// switch to hide panel in previews +_hide_panel = false; + // PANEL COMPONENTS module button (bezel = $button_d+4) { @@ -81,8 +88,8 @@ module joystick () { // CASE -module case_base (h=box_base_thickness) { - bcube([panel_width, panel_height, h], cr, cres); +module case_base (width=panel_width, height=panel_height, d=box_base_thickness) { + bcube([width, height, d], cr, cres); } module case_walls () { @@ -90,13 +97,15 @@ module case_walls () { union () { difference() { bcube([panel_width, panel_height, box_depth-box_base_thickness], cr, cres); - bcube([panel_width-box_wall*2, panel_height-box_wall*2, box_depth+1], cr, cres); + bcube([panel_width-box_wall*2, panel_height-box_wall*2, box_depth+1], cr, cres); // FIXME: does this accidentally cut some of the bottom out? } - attach (case_connector_wall (x=10), hinge_connector_back ()) hinge_female_base (); + attach (case_connector_wall ([panel_width/2-hinge_x_offset, -box_wall+0.01, box_depth/2]), hinge_connector_back (h=hinge_base_size[2]+(hinge_arm_thickness+panel_bevel)/2)) hinge_female_base (support=true); + attach (case_connector_wall ([-panel_width/2+hinge_x_offset, -box_wall+0.01, box_depth/2]), hinge_connector_back (h=hinge_base_size[2]+(hinge_arm_thickness+panel_bevel)/2)) hinge_female_base (support=true); } - attach (case_connector_wall (x=10), hinge_connector_back ()) hinge_female_cut (); + attach (case_connector_wall ([panel_width/2-hinge_x_offset, -box_wall+0.01, box_depth/2]), hinge_connector_back (h=hinge_base_size[2]+(hinge_arm_thickness+panel_bevel)/2)) hinge_female_cut (); + attach (case_connector_wall ([-panel_width/2+hinge_x_offset, -box_wall+0.01, box_depth/2]), hinge_connector_back (h=hinge_base_size[2]+(hinge_arm_thickness+panel_bevel)/2)) hinge_female_cut (); } - %connector (case_connector_wall (x=10)); + %connector (case_connector_wall ([panel_width/2-hinge_x_offset, -box_wall+0.01, box_depth/2])); } module case () { @@ -109,78 +118,91 @@ module case () { // specify which wall (rear, front, left, right). vector addition may help... // offset from center of wall, as vector (and use vector subtraction!) // optional: inside/outside -function case_connector_wall (x=0, y=0, z=0) = [ [panel_width/2-x, panel_height/2-y, (box_depth-box_base_thickness)/2-z], [0,-1, 0], 0 ]; +CASE_WALL_BACK = [0, panel_height/2, -box_base_thickness/2]; + +function case_connector_wall (offset=[0,0,0], wall=CASE_WALL_BACK) = [ wall + offset, [0, -1, 0], 0 ]; // HINGE // hinge todo: -// calculate z offset so that hinge will align when closed -// calculate offset into panel surface for length of peg -// attach to case, calculating offset from wall as fixed value + width - -// add connector for pin to socket so that can easily be test fit in -// software instead of guessing +// allow override of global base dimensions -// should panel connector be on its side? Limits motion to 90⁰ Or -// maybe just walls only + fillet with no base... +// maybe: add connector for pin to socket so that can easily be test +// fit in software for a nicer preview -function hinge_connector_back (th=hinge_joint_thickness*2, h=hinge_box_base_thicknesseight) = [ [0, th/2, h/2], [0,1, 0], 0 ]; +function hinge_connector_back (th=hinge_arm_thickness*2, h=hinge_base_size[2]) = [ [0, th/2, h/2], [0,1, 0], 0 ]; +function hinge_connector_bottom (th=hinge_arm_thickness*2, h=hinge_base_size[2]) = [ [0, 0, -h/2], [0, 0, 1], 0 ]; // todo: -// gusset support underneath -// split into base and negative so that a hole can be punched into case wall - -module hinge_female_base () { - w = hinge_joint_width * 2; - th = hinge_joint_thickness * 2; - - %connector (hinge_connector_back ()); - cube ([w, th, hinge_box_base_thicknesseight], center=true); +// gusset support underneath (with argument to toggle) + +module hinge_female_base (support=false) { +// %connector (hinge_connector_back ()); +// %connector (hinge_connector_bottom ()); + color ([0.5,0.3,0.1, 0.3]) cube (hinge_base_size, center=true); + + if (support) { + corner = [ [ 0, hinge_base_size[1]/2, -hinge_base_size[2]/2], [ 0, -1, -1 ], 0]; + base_a = [ [0, hinge_base_size[1]/2, -hinge_base_size[2]/2], [1, 0, 0], 0]; + connector (corner); + connector (base_a); + // fixme: calculate actual radius + color ([0.5,0.7,0.1, 0.3]) bconcave_corner_attach(base_a, corner , l=hinge_base_size[1], cr=hinge_base_size[0],cres=0, ext_corner=false, th=0); + } } module hinge_female_cut () { - w = hinge_joint_width * 2; - th = hinge_joint_thickness * 2; - - // cruft from earlier hacking, remove... - jt = hinge_joint_thickness; - jw = hinge_joint_width; - - joint_male_negative(male_joint_width=jw, male_joint_thickness=jt, forward_rom=90, backward_rom=90, male_joint_height=hinge_joint_height); + joint_male_negative (male_joint_width=hinge_arm_width, + male_joint_thickness=hinge_arm_thickness, + forward_rom=90, + backward_rom=90, + male_joint_height=hinge_arm_length); } -module hinge_female () { +module hinge_female (support=false) { difference () { - hinge_female_base (); + hinge_female_base (support); hinge_female_cut (); } } module hinge_male () { for (i=[0,1]) mirror ([0, i, 0]) translate ([0, -hinge_arm_length/4, 0]) - joint_male(male_joint_width=hinge_joint_width, male_joint_thickness=hinge_joint_thickness, male_joint_height=hinge_arm_length/2, side=true); - + joint_male (male_joint_width=hinge_arm_width, + male_joint_thickness=hinge_arm_thickness, + male_joint_height=hinge_arm_length/2, + side=true); } -// hinge to panel... -// mount hinge on panel arm_length back from edge - -// fixme: wall thickness is not taken into account - // PANEL +// fixme: when attachment axis is [0, 0, -1] something makes the math +// go funky and the connector is facing upward, adding very slight y +// misalignment "fixes" it... +PANEL_BOTTOM = [ [ 0, 0, -box_base_thickness/2+0.01 ], [ 0, 0.000000000001, -1 ] ]; +PANEL_TOP = [ [ 0, 0, box_base_thickness/2-0.01 ], [ 0, 0, 1 ] ]; -// cleanup after general case_connector_wall() is done -panel_c = [ [panel_width/2-10, panel_height/2-hinge_arm_length, -box_base_thickness/2+0.01], [0,0, 1], 180 ]; +function panel_connector (offset=[0,0,0], wall=PANEL_BOTTOM) = [ wall[0]+offset, wall[1], 0 ]; module panel () { difference () { - case_base (); - linear_extrude (box_base_thickness*2,center=true) panel_layout (); + union () { + // bevel + translate ([0, 0, panel_bevel/2]) { + case_base (d=box_base_thickness-panel_bevel); + } + case_base (width=panel_width-box_wall*2-0.1, height=panel_height-box_wall*2-0.1); + } + if (!_hide_panel) { + linear_extrude (box_base_thickness*2,center=true) panel_layout (); + } } - %connector (panel_c); - attach (panel_c, hinge_connector_back ()) hinge_female (); + + attach (panel_connector (offset=[panel_width/2-hinge_x_offset, panel_height/2-hinge_arm_length, 0]), + hinge_connector_bottom ()) hinge_female (); + attach (panel_connector (offset=[-panel_width/2+hinge_x_offset, panel_height/2-hinge_arm_length, 0]), + hinge_connector_bottom ()) hinge_female (); } module panel_attach (position, angle=0) {