X-Git-Url: http://git.scottworley.com/tattlekey/blobdiff_plain/7f78ee2745614bdf5db67f6d9bbccbe460b8186b..79d78cde52a33539a4739df85a234c0aa0c34735:/housing/tattlekey.scad?ds=sidebyside diff --git a/housing/tattlekey.scad b/housing/tattlekey.scad index f117e27..1f5ea4c 100644 --- a/housing/tattlekey.scad +++ b/housing/tattlekey.scad @@ -1,21 +1,29 @@ use -key_interface_size = 19; +key_interface_size = 18; key_interface_corner_r = 5; +key_interface_thickness = 1.484; -housing_inner_h = 10; // Chosen to let board fit inside +// Chosen to let board fit inside +housing_inner_h = 6; housing_inner_w = 21; +housing_flat = 8; +housing_extra_l = 10; thickness = 1.7; +board_gap = 0.125; + wiring_l = 12; +extra_flare = wiring_l; pico_board_l = 51.0; pico_board_w = 21.0; +pico_board_h = 1.0; pico_total_h = 3.7; $fs = .1; -$fa = 6; +$fa = 3; slop = 128; epsilon = 1/64; @@ -25,10 +33,16 @@ module pico_hole(d, x, y) { cylinder(h=slop, d = d); } -module pico_w(hole_d = 2.1) { +module pico_board(length = pico_board_l, gap = 0) { + translate([-gap - length + pico_board_l, 0, -gap]) + cube([length + 2*gap, pico_board_w, pico_board_h + 2*gap]); +} + +module pico_w(hole_d = 2.1) { + // Dimensions from measuring and/or + // https://datasheets.raspberrypi.com/picow/pico-w-datasheet.pdf board_l = pico_board_l; board_w = pico_board_w; - board_h = 1.0; hole_x1 = 2.0; hole_x2 = board_l - 2.0; @@ -37,7 +51,7 @@ module pico_w(hole_d = 2.1) { difference() { color("green") - cube([board_l, board_w, board_h]); + pico_board(); pico_hole(hole_d, hole_x1, hole_y); pico_hole(hole_d, hole_x2, hole_y); @@ -80,12 +94,12 @@ module at_key() { children(); } -module key_interface_shape(thick = thickness) { +module key_interface_shape(thick = key_interface_thickness, outline = thickness) { inner = key_interface_size - 2*key_interface_corner_r; linear_extrude(thick) minkowski() { square([inner, inner], center=true); - circle(r=key_interface_corner_r); + circle(r=key_interface_corner_r + outline); } } @@ -94,37 +108,79 @@ module key_interface() { difference() { key_interface_shape(); - #translate([0, 0, 6 - epsilon]) - cherry_switch_void(); + translate([0, 0, 6 - epsilon]) + cherry_switch_void(tolerance=0.05); + } +} + +module housing_shape(outline = thickness) { + housing_w = housing_inner_w + 2 * outline; + housing_h = housing_inner_h + 2 * outline; + squish = housing_h / (housing_w - housing_flat); + + scale([1, squish]) + minkowski() { + circle(d = housing_w - housing_flat); + square([housing_flat, epsilon], center=true); } } -module housing(length = pico_board_l) { - inner_squish = housing_inner_h / housing_inner_w; - housing_outer_w = housing_inner_w + 2 * thickness; - housing_outer_h = housing_inner_h + 2 * thickness; - outer_squish = housing_outer_h / housing_outer_w; +module housing() { + length = pico_board_l - extra_flare; + translate([-housing_extra_l, 0, 0]) rotate([90, 0, 0]) rotate([0, 90, 0]) - linear_extrude(length) + linear_extrude(length + housing_extra_l) + difference() { + housing_shape(); + housing_shape(0); + } +} + +module flare_shape(outline, extra_len) { + hull() { + at_key() + key_interface_shape(epsilon + extra_len, outline); + translate([pico_board_l-extra_flare, 0, 0]) + + translate([-extra_len, 0, 0]) + rotate([90, 0, 0]) + rotate([0, 90, 0]) + linear_extrude(epsilon+extra_len) + housing_shape(outline); + } +} + +module flare() { + difference() { + flare_shape(thickness, 0); + flare_shape(0, epsilon); + } +} + +module at_board() { + translate([0, -pico_board_w/2, -pico_board_h]) + children(); +} + +module tattlekey_case() { + key_interface(); + difference() { - scale([1, outer_squish]) - circle(d = housing_outer_w); - scale([1, inner_squish]) - circle(d = housing_inner_w); + union() { + housing(); + flare(); + } + at_board() + pico_board(slop, board_gap); } } -/* -!union() {housing(); hull() { - at_key() key_interface_shape(epsilon); - translate([pico_board_l-wiring_l, 0, 0]) - housing(wiring_l); -}} -*/ +module preview() { + at_board() pico_w(); + render() tattlekey_case(); +} -translate([0, -pico_board_w/2, -1]) -pico_w(hole_d = 2); +//preview(); -key_interface(); -housing(); +tattlekey_case();