pcb_depth = 1.6; main_width = 55.5; main_height = 70; $fn = 200; module main_board() { translate([main_width / 2, main_height / 2]) rotate([0, 0, -90]) import("../98-final-project/main/main.stl"); } digit_width = 35; digit_height = 70; module digit() { translate([digit_width / 2, digit_height / 2]) import("../98-final-project/digit/digit.stl"); } dots_width = 25; dots_height = digit_height; module dots() { translate([dots_width / 2, dots_height / 2]) import("../98-final-project/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 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(); } 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_border = 5; module frame_body() { d = hole_dia * 4; difference() { translate([0, -frame_border]) cube([display_width, display_height + 2 * frame_border, main_spacing]); translate([d / 2, d / 2, -1]) cube([display_width - d, display_height - d, main_spacing + 2]); for (x = hole_xs) { translate([x, hole_dia, -1]) cylinder(d = hole_dia, h = main_spacing + 2); translate([x, display_height - hole_dia, -1]) cylinder(d = hole_dia, h = main_spacing + 2); } } } module frame_antenna() { d = antenna_dia + main_spacing * 2; difference() { union() { w = hole_dia * 3; translate([main_width, 0, main_spacing]) cube([d, w, antenna_dia + main_spacing]); translate([main_width, display_height - w, main_spacing]) cube([d, w, antenna_dia + main_spacing]); } translate([main_width + main_spacing + antenna_dia / 2, display_height - main_spacing / 2, main_spacing + antenna_dia / 2]) rotate([90, 0, 0]) cylinder(d = antenna_dia + 2, h = display_height - main_spacing, $fn = 6); } } module frame() { translate([0, display_height, 0]) rotate([180, 0, 0]) union() { frame_body(); frame_antenna(); } } frame_speaker_depth = frame_border; 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 + 1); } } } } 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_depth = 50; body_thickness = 15; body_height = interior_height + body_thickness * 2; body_width = interior_width + body_thickness * 3; module translate_interior() { translate([body_thickness * 1.5, (body_depth - interior_depth) / 2, body_thickness]) rotate([90, 0, 0]) children(); } module interior() { translate_interior() { color("#666") frame(); translate_speaker() frame_speaker(); components(); } } inner_width = body_width - body_thickness * 2; inner_height = interior_height; window_depth = 5; window_thickness = 2; 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() { translate([body_thickness - 5, 0, body_thickness - 5]) { window_back(); window_front(); } } 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); } } module exterior() { difference() { exterior_base(); translate([body_thickness, -1, body_thickness]) cube([inner_width, body_depth + 2, inner_height]); interior(); windows(); } } module clock() { interior(); color("#FDD835") exterior(); color("white", 0.51) windows(); } module dock() { difference() { translate([body_thickness / 2, 0, -body_thickness]) hull() { d = body_thickness * 2; cylinder(d = d, h = body_thickness); translate([display_width + d, 0]) cylinder(d = body_thickness * 2, h = body_thickness); translate([display_width + d, body_depth]) cylinder(d = body_thickness * 2, h = body_thickness); translate([0, body_depth]) cylinder(d = body_thickness * 2, h = body_thickness); } translate([0, 0, body_thickness / -3]) minkowski() { exterior_base(); sphere(d = 2); } } } clock(); color("#FDD835") dock(); // TODO snooze // TODO power + encoder connector // TODO battery frame