wood_color = "#FDD835"; pcb_depth = 1.6; main_width = 55.5; main_height = 70; wood_thickness = 12; wood_slices = 5; body_depth = wood_thickness * wood_slices; body_thickness = wood_thickness * 1.5; $fn = 200; module main_board() { translate([main_width / 2, main_height / 2]) rotate([0, 0, -90]) import("main/main.stl"); } digit_width = 35; digit_height = 70; module digit() { translate([digit_width / 2, digit_height / 2]) import("digit/digit.stl"); } dots_width = 25; dots_height = digit_height; module dots() { translate([dots_width / 2, dots_height / 2]) import("dots/dots.stl"); } display_width = digit_width * 4 + dots_width; display_height = digit_height; module display() { digit(); translate([digit_width, 0]) digit(); translate([digit_width * 2, 0]) dots(); translate([digit_width * 2 + dots_width, 0]) digit(); translate([digit_width * 3 + dots_width, 0]) digit(); } battery_width=38; battery_height=67; battery_depth=12; module battery() { cube([battery_width, battery_height, battery_depth]); } speaker_dia1 = 57; speaker_dia2 = 51.5; speaker_dia3 = 29; speaker_dia4 = 18; speaker_depth1 = 2.5; speaker_depth2 = 4; speaker_depth3 = 6; speaker_depth4 = 9; speaker_dia = speaker_dia1; speaker_depth = speaker_depth4; module speaker_base() { cylinder(d = speaker_dia1, h = speaker_depth1); cylinder(d = speaker_dia2, h = speaker_depth2); cylinder(d = speaker_dia3, h = speaker_depth3); cylinder(d = speaker_dia4, h = speaker_depth4); } module speaker() { translate([speaker_dia1 / 2, speaker_dia1 / -2, speaker_depth4]) rotate([0, 180, 0]) difference() { speaker_base(); translate([0, 0, -speaker_depth1]) scale([.9, .9, .9]) speaker_base(); } translate([(speaker_dia1 - 10) / 2, -5, speaker_depth2]) cube([10, 10, speaker_depth4 - speaker_depth3]); } antenna_length = 60; antenna_dia = 10; module antenna() { translate([antenna_dia / 2, antenna_length, antenna_dia / 2]) rotate([90, 0, 0]) cylinder(d = antenna_dia, h = antenna_length, $fn = 6); } main_spacing = 3; main_depth = battery_depth + main_spacing; module translate_speaker() { translate([display_width - speaker_dia, (display_height - speaker_dia) / 2, -main_depth]) rotate([180, 0, 0]) children(); } module snooze() { snooze_width = 30; snooze_height = 5; snooze_thickness = 3; // pcb_depth; snooze_distance = 20; color("#fa0") translate([0, -snooze_height, -main_spacing - snooze_thickness - wood_thickness]) { translate([display_width / 2 - snooze_width - snooze_distance / 2, 0, 0]) cube([snooze_width, snooze_height, snooze_thickness]); translate([display_width / 2 + snooze_distance / 2, 0, 0]) cube([snooze_width, snooze_height, snooze_thickness]); } } module components() { color("#fa0") display(); color("#fa8") translate([main_width, (display_height - main_height) / 2, -main_spacing]) rotate([0, 180, 0]) main_board(); color("#888") translate([main_width + main_spacing, (display_height - antenna_length) / 2, -antenna_dia - main_spacing]) antenna(); color("#ccc") translate([main_width + antenna_dia + 2 * main_spacing, (display_height - battery_height) / 2, -battery_depth - main_spacing]) rotate([0, 0, 0]) battery(); color("#444") translate_speaker() speaker(); snooze(); } hole_dia = 3; hole_xs = [17.5, 17.5 + digit_width, 17.5 + digit_width + digit_width / 2 + dots_width / 2, 17.5 + digit_width + digit_width + dots_width, 17.5 + digit_width + digit_width + dots_width + digit_width]; frame_thickness = 3; frame_border = body_thickness / 3; module frame_body() { d = hole_dia * 4; difference() { translate([0, -frame_border]) cube([display_width, display_height + 2 * frame_border, frame_thickness]); translate([d / 2, d / 2, -1]) cube([display_width - d, display_height - d, frame_thickness + 2]); for (x = hole_xs) { translate([x, hole_dia, -1]) cylinder(d = hole_dia, h = frame_thickness + 2); translate([x, display_height - hole_dia, -1]) cylinder(d = hole_dia, h = frame_thickness + 2); } } } frame_holder_depth = antenna_dia + main_spacing; module frame_antenna() { t = 2; d = antenna_dia + main_spacing * 2; difference() { union() { w = hole_dia * 3; translate([main_width, 0, main_spacing]) cube([d, w, frame_holder_depth]); translate([main_width, display_height - w, main_spacing]) cube([d, w, frame_holder_depth]); } l = antenna_length + t; translate([main_width + main_spacing + antenna_dia / 2, display_height - (display_height - l) / 2, main_spacing + antenna_dia / 2]) rotate([90, 0, 0]) cylinder(d = antenna_dia + t, h = l, $fn = 6); } } module frame_battery() { translate([main_width + antenna_dia + 2 * main_spacing, (main_height - battery_height) / 2, main_spacing]) { difference() { translate([main_spacing / -2, main_spacing / -2, 0]) union() { w = hole_dia * 3; cube([battery_width + main_spacing, w, frame_holder_depth]); translate([0, display_height - w, 0]) cube([battery_width + main_spacing, w, frame_holder_depth]); } cube([battery_width, battery_height, battery_depth]); } } } module translate_frame() { translate([0, display_height, 0]) rotate([180, 0, 0]) { children(); } } module frame() { color("#666") translate_frame() union() { frame_body(); frame_antenna(); frame_battery(); } } //frame(); connector_width = 44; connector_height = 34; connector_depth = 4; connector_magnet_dia = 6; connector_magnet_depth = 3; module connector_clock_pcb() { j4f_width = 11.8; j4f_heigth = 15.7; j4f_depth = 1.3; translate([15, 10]) union() { import("../98-final-project/connector-clock/connector-clock.stl"); translate([0, 0, pcb_depth + j4f_depth / 2]) cube([j4f_width, j4f_heigth, j4f_depth], center = true); translate([0, 0, pcb_depth]) cube([j4f_width, j4f_heigth, j4f_depth], center = true); } } module connector_dock_pcb() { translate([15, 10]) union() { import("../98-final-project/connector-dock/connector-dock.stl"); } } module connector_magnet() { color("#999") cylinder(d = connector_magnet_dia, h = connector_magnet_depth); } module connector_magnets() { translate([connector_magnet_dia / 2 + 1.5, connector_magnet_dia / 2 + 1.5]) connector_magnet(); translate([connector_width, connector_height]) { translate([connector_magnet_dia / -2 - 1.5, connector_magnet_dia / -2 - 1.5]) connector_magnet(); } } module connector_ridge() { translate([5, 7 + (15 - 9.4) / 2, 0]) cube([7, 15, pcb_depth * 2]); translate([30 + 2, 7 + (15 - 9.4) / 2, 0]) cube([7, 15, pcb_depth * 2]); } module connector_clock() { difference() { cube([connector_width, connector_height, connector_depth]); translate([17, 9.4, pcb_depth - 1]) cube([10, 15.2, 10]); translate([7, 7]) connector_clock_pcb(); translate([7, 7, .5]) connector_clock_pcb(); connector_magnets(); connector_ridge(); } } module connector_dock() { difference() { cube([connector_width, connector_height, connector_depth]); translate([17, 9.4, pcb_depth - 1]) cube([10, 15.2, 10]); translate([7, 7]) connector_dock_pcb(); translate([7, 7, .5]) connector_dock_pcb(); translate([connector_width, 0]) mirror([1, 0, 0]) { connector_magnets(); connector_ridge(); } } } module connector_dock_with_pcb() { connector_dock(); color("red") translate([7, 7]) connector_dock_pcb(); } module connector_clock_with_pcb() { connector_clock(); color("red") translate([7, 7]) connector_clock_pcb(); } // connector_dock_with_pcb(); // translate([0, 40, 0]) { // connector_clock_with_pcb(); // } // connector_dock(); // translate([0, 40, 0]) { // connector_clock(); // } module usb_bolt() { translate([0, 0, connector_depth - 2.5]) { translate([0, 0, -1.5]) cylinder(d = 3.5, h = 3.5); cylinder(d = 2, h = 9); } } module usb_opening() { hull() { cylinder(d = 2.5, h = connector_depth); translate([0, 8, 0]) cylinder(d = 2.5, h = connector_depth); } } module clock_base(printing = false) { difference() { translate_frame() union() { d = 6; w = display_width - d; t = frame_thickness / 2; translate([(display_width - w) / 2, 0, -wood_thickness + frame_thickness]) { difference() { color("#666") union() { translate([0, -body_thickness, 0]) cube([w, body_thickness, wood_thickness * 3]); translate([d / -2, -body_thickness * .66, 0]) cube([w + d, body_thickness / 3, wood_thickness * 3]); } if (printing) { hw = w - 15; translate([(w - hw) / 2 + frame_thickness, -body_thickness, t]) cube([hw - frame_thickness * 2, body_thickness, wood_thickness * 3 - t * 2]); } } // connector color("red") translate([18, -body_thickness + connector_depth, (wood_thickness * 3 - connector_height) / 2]) rotate([90, 0, 0]) connector_clock(); difference() { // bottom union() { translate([18 + connector_width, -body_thickness, 0]) cube([w - connector_width - 18, connector_depth, wood_thickness * 3]); translate([0, -body_thickness, 0]) cube([18, connector_depth, wood_thickness * 3]); } translate([10.75, -body_thickness + 1, (wood_thickness * 3 + 20) / 2]) rotate([-90, 0, 0]) { cube([7, 20, connector_depth - 1]); translate([0, (20 - 13 + 7) / 2, -1]) { hull() { translate([3.5, 0, 0]) cylinder(d = 7, h = connector_depth + 1); translate([3.5, 13 - 7, 0]) cylinder(d = 7, h = connector_depth + 1); } } } } } } frame(); } } //clock_base(printing = true); //frame(); frame_speaker_depth = 5; module frame_speaker_holes() { d = speaker_dia1 + 2 * frame_border; translate([speaker_dia1 / 2, speaker_dia1 / -2, speaker_depth - frame_speaker_depth]) { rotate([0, 0, 45]) { for (pos = [[(d - frame_border) / 2, 0, -.5], [0, (d - frame_border) / 2, -.5], [(d - frame_border) / -2, 0, -.5], [0, (d - frame_border) / -2, -.5]]) { translate(pos) cylinder(d = hole_dia, h = frame_border * 2); } } } } module frame_speaker() { d = speaker_dia1 + 2 * frame_border; difference() { translate([speaker_dia1 / 2, speaker_dia1 / -2, speaker_depth - frame_speaker_depth]) difference() { cylinder(d = d, h = frame_speaker_depth); translate([0, 0, -.5]) cylinder(d = speaker_dia2, h = frame_speaker_depth + 1); } frame_speaker_holes(); speaker(); } } interior_width = display_width; interior_height = display_height; interior_depth = main_spacing + battery_depth + main_spacing + frame_speaker_depth; body_height = interior_height + body_thickness * 2; body_width = interior_width + body_thickness * 3; module translate_interior() { translate([body_thickness * 1.5, wood_thickness * 2 - frame_thickness, body_thickness]) rotate([90, 0, 0]) children(); } module interior() { translate_interior() { frame(); clock_base(); translate_speaker() frame_speaker(); components(); } } //interior(); inner_width = body_width - body_thickness * 2; inner_height = interior_height; window_thickness = 3; window_depth = wood_thickness - window_thickness; module window_front() { translate([0, window_depth, 0]) cube([inner_width + 10, window_thickness, inner_height + 10]); } module window_back() { difference() { translate([0, body_depth - window_depth - window_thickness, 0]) cube([inner_width + 10, window_thickness, inner_height + 10]); translate([-body_thickness + 5, 10, -body_thickness + 5]) translate_interior() translate_speaker() frame_speaker_holes(); } } module windows() { difference() { translate([body_thickness - 5, 0, body_thickness - 5]) { window_back(); window_front(); } interior(); } } module exterior_base() { hull() { translate([body_thickness, body_depth, body_height - body_thickness]) rotate([90, 0, 0]) cylinder(d = body_thickness * 2, h = body_depth); translate([body_thickness, body_depth, body_thickness]) rotate([90, 0, 0]) cylinder(d = body_thickness * 2, h = body_depth); translate([body_width - body_thickness, body_depth, body_height - body_thickness]) rotate([90, 0, 0]) cylinder(d = body_thickness * 2, h = body_depth); translate([body_width - body_thickness, body_depth, body_thickness]) rotate([90, 0, 0]) cylinder(d = body_thickness * 2, h = body_depth); } } exterior_hole = 5; module exterior() { color(wood_color) difference() { exterior_base(); // cavity translate([body_thickness, -1, body_thickness]) cube([inner_width, body_depth + 2, inner_height]); // holes translate([body_thickness / 2, body_depth, body_height / 2]) rotate([90, 0, 0]) { cylinder(d = exterior_hole, h = body_depth); translate([body_width - body_thickness, 0, 0]) cylinder(d = exterior_hole, h = body_depth); } interior(); windows(); } } cut_thickness = 3; module exterior_cut(i) { projection(cut = true) translate([0, 0, cut_thickness * -i - .5]) rotate([90, 0, 0]) { exterior(); windows(); } } module cut_exterior() { n = body_depth / cut_thickness; for (i = [0:n]) { x = (i % 5) * (body_width + 10); y = floor(i / 5) * (body_height + 10); translate([x, y, 0]) exterior_cut(i); } } cut_i = -1; if (cut_i != -1) { echo("cutting", cut_i, "of", body_depth / cut_thickness); exterior_cut(cut_i); } module clock() { translate([body_width, 0, body_height]) rotate([0, 180, 0]) { interior(); exterior(); color("white", 0.30) windows(); } } //clock(); dock_base_depth = 57 + 8; encoder_width = 24; module encoder() { q = 12.5; translate([0, 17, 0]) rotate([90, 0, 0]) { cylinder(d = encoder_width, h = 10); translate([q / -2, q / -2, 10]) cube([q, q, 7]); translate([0, 0, 17]) cylinder(d = 7, h = 4.5); } } //encoder(); usb_power_height = 14; usb_power_width = 11.5; usb_power_depth = 28; dock_base_height = encoder_width + 2; module usb_power_component() { t = 2; cube([usb_power_width, usb_power_depth, usb_power_height]); // wire holes translate([t, -t, usb_power_height - 10]) cube([3, 10, 5]); translate([usb_power_width - 3 - t, -t, usb_power_height - 10]) cube([3, 10, 5]); // usb connector translate([(usb_power_width - 9) / 2, usb_power_depth, usb_power_height - 4 - 4]) cube([9, 10, 4]); } module usb_power_outline() { t = 2; translate([-t, -t, 0]) cube([usb_power_width + t * 2, usb_power_depth + t * 2, dock_base_height]); } module usb_power() { difference() { usb_power_outline(); usb_power_component(); } } //usb_power(); dock_base_width = display_width; module translate_docker_connector() { w = dock_base_width; t = frame_thickness / 2; y = dock_base_depth; z = dock_base_height; x = 21; // ?? translate([w - x - connector_width, (y - connector_height) / 2, z - connector_depth]) { children(); } } module dock_base_outline() { cube([dock_base_width, dock_base_depth, dock_base_height]); } module translate_dock_base() { translate([(body_width - dock_base_width) / 2, (body_depth - dock_base_depth) / 2, -dock_base_height]) { children(); } } module dock_holes() { d = hole_dia; translate([body_thickness / -4, dock_base_depth, dock_base_height / 2]) rotate([90, 0, 0]) cylinder(d = d, h = dock_base_depth); translate([dock_base_width + body_thickness / 4, dock_base_depth, dock_base_height / 2]) rotate([90, 0, 0]) cylinder(d = d, h = dock_base_depth); } module dock_base(printing = false) { w = dock_base_width; t = frame_thickness; y = dock_base_depth; z = dock_base_height; translate_dock_base() { color("#666") difference() { dock_base_outline(); translate_docker_connector() { cube([connector_width, connector_height, connector_depth]); } translate([t, t, -connector_depth]) cube([w - t * 2, y - t * 2, z]); translate([w / 2, 1.5, z / 2]) encoder(); translate([t, y - usb_power_depth - 2, 0]) usb_power_outline(); } color("red") translate_docker_connector() connector_dock(); if (!printing) { color("#8f8") translate([w / 2, 1.5, z / 2]) encoder(); } color("#666") translate([t, y - usb_power_depth - 2, 0]) usb_power(); // sides color("#666") difference() { union() { q = 7; n = 3.5; translate([-q, n, 0]) cube([q, dock_base_depth - n * 2, dock_base_height]); translate([dock_base_width, n, 0]) cube([q, dock_base_depth - n * 2, dock_base_height]); } dock_holes(); } } } //translate([body_width, 0, body_height]) rotate([0, 180, 0]) interior(); dock_side_depth = 3; module translate_dock_side() { translate([(body_width - dock_base_width) / 2, -1, 0]) rotate([90, 0, 0]) { children(); } } module dock_side() { difference() { hull() { cylinder(d = body_thickness, h = dock_side_depth); translate([dock_base_width, 0, 0]) cylinder(d = body_thickness, h = dock_side_depth); translate([-body_thickness / 2, -dock_base_height, 0]) cube([body_thickness, body_thickness, dock_side_depth]); translate([dock_base_width -body_thickness / 2, -dock_base_height, 0]) cube([body_thickness, body_thickness, dock_side_depth]); } translate([0, -dock_base_height, 0]) cube([dock_base_width, dock_base_height, dock_side_depth]); rotate([90, 0, 0]) dock_holes(); } } module dock() { color(wood_color) difference() { union() { translate([0, .5, 0]) translate_dock_side() dock_side(); translate([0, dock_base_depth - dock_side_depth - .5, 0]) translate_dock_side() dock_side(); } translate_dock_base() { dock_base_outline(); dock_holes(); } } dock_base(printing = false); } //rotate([90, 0, 180]) components(); //rotate([0, 180, 0]) frame(); //interior(); //exterior(); //frame_speaker(); //rotate([-90, 0, 0]) clock_base(printing = true); //rotate([180, 0, 0]) dock_base(printing = true); //projection() dock_side(); //projection() translate([dock_base_width - 15, -30, 0]) rotate([0, 0, 180]) dock_side(); //cut_exterior(); clock(); dock(); // bar to glue down connector pcb //cube([connector_height - 4, 10, 1.5]); // bar to glue down usb socket // difference() { // cube([10, 7.5, 2.5]); // cube([10 - 3, 7.5, 2.5 - 1.6]); // }