From 36a44beb7f6c1ad164e652da132a65c41d94e022 Mon Sep 17 00:00:00 2001 From: William Toohey Date: Wed, 9 Mar 2016 15:41:28 +1000 Subject: [PATCH] Nunchuck now hangs more to accommodate case --- .gitignore | 2 + Hardware/Case/TataconCase.scad | 70 +++++++++++++++++++++++++-------- Hardware/TataconUSB.PcbDoc | Bin 1081344 -> 1059840 bytes 3 files changed, 55 insertions(+), 17 deletions(-) diff --git a/.gitignore b/.gitignore index a6209ba..4fba0e5 100644 --- a/.gitignore +++ b/.gitignore @@ -11,3 +11,5 @@ Hardware/TataconUSB.PcbDoc.htm *.eep *.bin *.elf +Firmware/Bootloader/ +*.hex diff --git a/Hardware/Case/TataconCase.scad b/Hardware/Case/TataconCase.scad index 11b84e6..9e3f08e 100644 --- a/Hardware/Case/TataconCase.scad +++ b/Hardware/Case/TataconCase.scad @@ -1,8 +1,8 @@ use -fudge = 0.5; +fudge = 0.4; -board_length = 37.3 + fudge; +board_length = 35.73 + fudge; board_width = 16.3 + fudge; board_thickness = 1.6; board_clearance_top = 3.3 + fudge; // height of crystal @@ -25,17 +25,23 @@ switch_offsetx = 4.85; switch_offsety = 21.1; crystal_bottom = 18.3 + fudge; +crystal_length = 11.4; -wall_strength = 2; +wall_strength = 1.6; lip_strength = 0.8; clip_height = 1.6; +clip_strength = 1.6; +cliplock_strength = 0.4; + +vertiLid = true; shapeways = false; shapeways_clearance = 1 + clip_height; $fn = 8; +bezRes = 2; module board_shape(width = board_width, extend = 0) { translate([width,0,0]) @@ -54,7 +60,32 @@ module board_shape(width = board_width, extend = 0) { translate([board_height + board_clearance_top - bezHeight/2, crystal_bottom, 0]) BezLine([ [0,-crystal_bottom/2], [0, bezWidth/2], [bezHeight, bezWidth/2], [bezHeight,bezWidth] - ], width = [bezHeight], resolution = 2, centered = true); + ], width = [bezHeight], resolution = bezRes, centered = true); + } +} + +module clip(strength = clip_strength, height = clip_height, gap = fudge) { + // clip hang down + difference() { + // main body + // we want a tight fit so we only do half fudge + translate([gap/2, 0, 0]) + board_shape(board_width - gap); + // form the lips + // Don't offset for the fudge above or we'll hit the Nunchuck + translate([strength,0,0]) + board_shape(board_width - strength*2); + // cut them short + translate([0,0,-height]) + board_shape(board_width, height); + // Shorten the front for clearance + cube([board_width, fudge, board_clearance_top*2]); + // Shorten the back for clearance + translate([0,board_length - fudge,0]) + cube([board_width, fudge, board_clearance_top + nunchuck_height]); + // Cut out a hole for the crystal to go + translate([board_width-clip_strength, crystal_bottom - crystal_length, board_height]) + cube([clip_strength, crystal_length, nunchuck_height + wall_strength]); } } @@ -65,6 +96,7 @@ module lid() { translate([-wall_strength,0,0]) board_shape(board_width + wall_strength*2, wall_strength); }; + // USB connector overhang usb_overhang = board_clearance_bottom+usb_relative_z+usb_height; translate([board_width/2 - usb_width/2, @@ -73,16 +105,11 @@ module lid() { cube([usb_width, wall_strength, board_height+board_clearance_top - usb_overhang]); - // clip hang down difference() { - // main body - board_shape(); - // form the lips - translate([wall_strength,0,0]) - board_shape(board_width - wall_strength*2); - // cut them short - translate([0,0,-clip_height]) - board_shape(board_width, clip_height); + clip(); + // cutout for a locked fit + translate([0,0,-(clip_height/2 - cliplock_strength/2)]) + clip(cliplock_strength, cliplock_strength); } } } @@ -144,15 +171,24 @@ module button_hole() { module board() { // board shape minus the lid translate([wall_strength, wall_strength, wall_strength]) - difference() { - hollowed(); - port_holes(); - lid(); + union() { + difference() { + hollowed(); + port_holes(); + lid(); + }; + // clip points + translate([0,0,-(clip_height/2 - cliplock_strength/2)]) + clip(cliplock_strength, cliplock_strength, 0); } // lid with reset button hole if(shapeways) { translate([wall_strength,wall_strength,wall_strength+shapeways_clearance]) lid_complete(); + } else if(vertiLid) { + rotate([90,0,90]) + translate([wall_strength, wall_strength, -(board_height + nunchuck_height)]) + lid_complete(); } else { rotate([0,180,0]) translate([wall_strength*3, wall_strength, -(board_height + nunchuck_height + wall_strength)]) diff --git a/Hardware/TataconUSB.PcbDoc b/Hardware/TataconUSB.PcbDoc index c3491683fd1948140e9374a36c750b11f1cd57f2..434b7e4d67f3b9911bd5d4eb38393804b4b39bdd 100644 GIT binary patch delta 17339 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