diff --git a/enclosure/character_retainer_ring.scad b/enclosure/character_retainer_ring.scad index 514fa77..2777c5a 100644 --- a/enclosure/character_retainer_ring.scad +++ b/enclosure/character_retainer_ring.scad @@ -4,7 +4,7 @@ // Indents at height 4 module retainer_spring() { - rotate_extrude(convexity = 10, angle = 120, $fn = 128) + rotate_extrude(convexity = 10, angle = 90, $fn = 128) translate([22, 0, 0]) square([2, 10]); } @@ -16,22 +16,61 @@ module character_retainer_ring() { // Body cylinder(d = 59.5, h = 6); cylinder(d = 40.5, h = 20, center = true); - // 5mm LED hole - //translate([0, 25, 0]) sphere(d = 5); // Screw holes - translate([25, 0, 0]) cylinder(d = screw_hole_diameter, h = 6, center = true); - translate([-25, 0, 0]) cylinder(d = screw_hole_diameter, h = 6, center = true); + translate([0, -25, 0]) cylinder(d = screw_hole_diameter, h = 6, center = true); + rotate([0, 0, 120]) translate([0, -25, 0]) cylinder(d = screw_hole_diameter, h = 6, center = true); + rotate([0, 0, 240]) translate([0, -25, 0]) cylinder(d = screw_hole_diameter, h = 6, center = true); // Retainer springs - rotate([0, 0, 30]) retainer_spring(); - rotate([0, 0, 210]) retainer_spring(); + rotate([0, 0, 45]) retainer_spring(); + rotate([0, 0, 165]) retainer_spring(); + rotate([0, 0, 285]) retainer_spring(); } // Retainer bumps + rotate([0, 0, -30]) translate ([20.25, 0, 4]) sphere(d = 2); rotate([0, 0, 90]) translate ([20.25, 0, 4]) sphere(d = 2); - rotate([0, 0, 270]) translate ([20.25, 0, 4]) sphere(d = 2); + rotate([0, 0, 210]) translate ([20.25, 0, 4]) sphere(d = 2); } +module status_led_diffuser() { + $fn = 32; + // Diffuser + hull() { + translate([0, -13, 0]) cylinder(d = 10, h = 13); + translate([15, 13, 0]) cylinder(d = 10, h = 13); + translate([-15, 13, 0]) cylinder(d = 10, h = 13); + } + difference() { + // Flange + cube([50, 40, 2], true); + // Mounting holes + translate([-18, -5, 0]) cylinder(d = 3, h = 3, center = true); + translate([18, -5, 0]) cylinder(d = 3, h = 3, center = true); + } +} + +module sdcard_access_port() { + $fn = 32; + difference() { + union() { + translate([-12, -7.5, 0]) cube([24, 15, 8]); + // Flange + hull() { + translate([15, 0, 0]) cylinder(d = 20, h = 2); + translate([-15, 0, 0]) cylinder(d = 20, h = 2); + } + // Text + translate([6, -3, -0.9]) linear_extrude(height = 1) rotate([0, 180, 0]) text("SD", size = 6); + } + // Mounting holes + translate([16, 0, -1]) cylinder(d = 3, h = 10); + translate([-16, 0, -1]) cylinder(d = 3, h = 10); + } +} + //retainer_spring(); -character_retainer_ring(); +//character_retainer_ring(); +//status_led_diffuser(); +sdcard_access_port(); diff --git a/enclosure/cutouts.scad b/enclosure/cutouts.scad index 5cd9d75..f925a12 100644 --- a/enclosure/cutouts.scad +++ b/enclosure/cutouts.scad @@ -26,15 +26,42 @@ module keycap() { module character_retainer_cutout() { $fn = 128; + screw_hole_diameter = 3; // Ring cutout cylinder(d = 60, h = 5); - // 5mm LED hole - translate([0, 25, 10]) cylinder(d = 5, h = 15, center = true); // Screw holes - translate([25, 0, 10]) cylinder(d = screw_hole_diameter, h = 15, center = true); - translate([-25, 0, 10]) cylinder(d = screw_hole_diameter, h = 15, center = true); + translate([0, -25, 10]) cylinder(d = screw_hole_diameter, h = 15, center = true); + rotate([0, 0, 120]) translate([0, -25, 10]) cylinder(d = screw_hole_diameter, h = 15, center = true); + rotate([0, 0, 240]) translate([0, -25, 10]) cylinder(d = screw_hole_diameter, h = 15, center = true); +} + +module status_led_diffuser_cutout() { + $fn = 32; + // Diffuser + hull() { + translate([0, -13.2, 0]) cylinder(d = 10.2, h = 13); + translate([15.2, 13.2, 0]) cylinder(d = 10.2, h = 13); + translate([-15.2, 13.2, 0]) cylinder(d = 10.2, h = 13); + } +} + +module sdcard_access_port_cutout() { + $fn = 32; + union() { + translate([-13, -8.5, 0]) cube([26, 17, 8]); + // Flange + hull() { + translate([15, 0, 0]) cylinder(d = 21, h = 2); + translate([-15, 0, 0]) cylinder(d = 21, h = 2); + } + // Screw holes + translate([16, 0, -1]) cylinder(d = 2, h = 10); + translate([-16, 0, -1]) cylinder(d = 2, h = 10); + } } //usb_cutout(); //speaker_grille(); -character_retainer_cutout(); \ No newline at end of file +//character_retainer_cutout(); +//status_led_diffuser_cutout(); +sdcard_access_port_cutout(); \ No newline at end of file diff --git a/enclosure/fabula_enclosure.scad b/enclosure/fabula_enclosure.scad index 7045df2..3c6baf8 100644 --- a/enclosure/fabula_enclosure.scad +++ b/enclosure/fabula_enclosure.scad @@ -24,7 +24,10 @@ module fabula_enclosure_bottom() { translate([98.4, 29, 17]) rotate([0, -90, 0]) usb_cutout(); translate([90, 5, 10]) rotate([90, 0, 0]) rotate([0, 90, 0]) switch_cutout(); translate([-65, -40, 25]) speaker_grille(); - // TODO: lace hanger + translate([75, 55, 16]) rotate([90, 0, 0]) cylinder(d = 3, h = 20, $fn = 4); + + // Logos + translate([60, -10, 28.1]) linear_extrude(height = 1, center = true) rotate([0, 0, 90]) scale([0.10, 0.10, 0.10]) import("oshw-logo-filled-black.svg"); } // Speaker grille reinforcements @@ -45,6 +48,9 @@ module fabula_enclosure_top() { translate([-66.1, -27.8, -16.2]) pcb_support(pcb_screw_size); translate([64.1, 24.2, -16.2]) pcb_support(pcb_screw_size); translate([64.1, -26.8, -16.2]) pcb_support(pcb_screw_size); + + // Url + translate([-80, -42, -22.5]) linear_extrude(height = 1.5, center = true) text("git.ichibi.eu/penguin86/Fabula", size = 6); } // Cutouts @@ -54,6 +60,7 @@ module fabula_enclosure_top() { translate([44.5, 23.5, -30]) keycap(); translate([61, -2, -30]) keycap(); translate([-50, 0, -30.5]) rotate([0, 0, 90]) character_retainer_cutout(); + translate([-10, -51, -10]) rotate([-90, 0, 0]) sdcard_access_port_cutout(); } } diff --git a/enclosure/oshw-logo-filled-black.svg b/enclosure/oshw-logo-filled-black.svg new file mode 100644 index 0000000..f81cd1d --- /dev/null +++ b/enclosure/oshw-logo-filled-black.svg @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/enclosure/supports.scad b/enclosure/supports.scad index 5ee34ac..f364b89 100644 --- a/enclosure/supports.scad +++ b/enclosure/supports.scad @@ -27,3 +27,5 @@ module pcb_support(screw_diameter) { cylinder(d = screw_diameter, h = 18, center = true); } } + +supports_charging_module(); diff --git a/enclosure/test_fit.scad b/enclosure/test_fit.scad index 2c227bb..7890633 100644 --- a/enclosure/test_fit.scad +++ b/enclosure/test_fit.scad @@ -24,12 +24,10 @@ module test_fit_components() { // Components mounted on the external shell translate([0, 50, 45]) character_retainer_ring(); + //translate([24, 0, 38]) rotate([0, 0, -90]) status_led_diffuser(); + translate([51, 10, 30]) rotate([90, 0, 0]) rotate([0, 270, 0]) sdcard_access_port(); } -//test_fit_components(); -//translate([0, 0, explode_view ? -20 : 20]) rotate([0, 0, -90]) rotate([180, 0, 0]) fabula_enclosure_bottom(); +test_fit_components(); +translate([0, 0, explode_view ? -20 : 20]) rotate([0, 0, -90]) rotate([180, 0, 0]) fabula_enclosure_bottom(); translate([0, 0, explode_view ? 100 : 20]) rotate([0, 0, -90]) rotate([180, 0, 0]) fabula_enclosure_top(); - -//DEBUG -//translate([0, 50, 45]) character_retainer_ring(); -//DEBUG \ No newline at end of file