include use use use use servo_mount_size = [12, 32, 2.5]; servo_mount_pos = [0, 0, 16]; servo_mount_hole_diam = 2; servo_core_size = [12, 23, 22.3]; servo_gears_size = [servo_core_size.x, servo_core_size.x, 26.5]; servo_gears_pos = [0, -(servo_core_size.y/2 - servo_gears_size.y/2), 0]; servo_centergears_size = [servo_core_size.x/2, servo_core_size.x/2, servo_gears_size.z]; servo_centergears_pos = [0, 0, 0]; servo_shaft_size = [1, 1, 28.5]; servo_shaft_pos = servo_gears_pos; display_pos = [0, 8, servo_core_size.z]; box_wall = 2; servo_box_round = 1; servo_box_size = [40, get_servo_box_size().y, servo_core_size.z + box_wall*2]; servo_box_chamber = [servo_box_size.x - box_wall*2, servo_box_size.y - box_wall*2, servo_box_size.z - box_wall*2]; servo_box_chamber_walled = [servo_box_chamber.x + box_wall, servo_box_chamber.y + box_wall, servo_box_chamber.z + box_wall]; servo_box_pos = [6, 0, servo_box_size.z/2 - box_wall]; servo_box_socket_size = [servo_box_size.x, servo_box_size.y, 4]; servo_box_screw_joiner_size = [5, 5, 20]; servo_box_screw_joiner_pos = [servo_box_size.x/2 + servo_box_screw_joiner_size.x/2, 0, 2]; module servo_mount_holes() { for (i = [0:1]) { down(servo_mount_size.z) fwd((1-2*i)*(servo_mount_size.y/2 - servo_mount_hole_diam) + 0.5*(i+1)) cylinder(h=servo_mount_size.z*4, d=servo_mount_hole_diam, $fn=10); } } module servo() { up(servo_core_size.z/2) cube(servo_core_size, center=true); up(servo_mount_size.z/2) translate(servo_mount_pos) difference() { cube(servo_mount_size, center=true); servo_mount_holes(); } translate(servo_gears_pos) cylinder(d=servo_gears_size.x, h=servo_gears_size.z, $fn=30); translate(servo_centergears_pos) cylinder(d=servo_centergears_size.x, h=servo_centergears_size.z, $fn=20); translate(servo_shaft_pos) cylinder(d=servo_shaft_size.x, h=servo_shaft_size.z, $fn=20); } display_needle_length = 15; module display_mount_holes() { translate(-servo_shaft_pos) { #servo_mount_holes(); } } module display() { angle_max = 180; angle_gap = 8; module display_pie() { up(1) zrot(-90 + angle_gap/2) pie_slice(ang=angle_max-angle_gap, l=2, r=display_needle_length); } difference() { //up(2/2) cube([20, 40, 2], center=true); minkowski() { display_pie(); cylinder(r=7,h=0.1); } up(1.5) display_pie(); translate(-servo_shaft_pos) { down(servo_core_size.z) servo(); } display_mount_holes(); } slices=20; for (i = [0:slices]) { zrot(i * (angle_max - angle_gap)/slices + angle_gap/2) fwd(display_needle_length) up(3) scale(i%5==0 ? 1 : 0.5) cube([1, 4, 2], center=true); } } module servo_box() { up(box_wall) translate(servo_box_pos) { difference() { cuboid(servo_box_size, chamfer=servo_box_round); cuboid(servo_box_chamber, chamfer=servo_box_round); } translate(servo_box_screw_joiner_pos) { fwd(20) screw_joiner(servo_box_screw_joiner_size, edges=EDGES_Z_RT); back(20) screw_joiner(servo_box_screw_joiner_size, edges=EDGES_Z_RT); } } } module servo_box_divider(socket) { up(3) { difference() { up(50 + servo_box_size.z/2 + 5) cube([500, 100, 100], center=true); up(-box_wall) translate(servo_box_pos) scale(socket ? 1 : [0.97, 0.99, 0.98]) cube(servo_box_chamber_walled, center=true); } } } module model_display() { up(box_wall) translate(display_pos) display(); } module model_servo_box() { difference() { servo_box(); translate(display_pos) { down(servo_core_size.z - 2) fwd(servo_gears_pos.y) servo(); display_mount_holes(); } } } module model_servo_box_top() { //up(box_wall + bank_inside_size.z/2) intersection() { model_servo_box(); servo_box_divider(socket=true); } model_display(); } module model_servo_box_bottom() { //up(box_wall + bank_inside_size.z/2) difference() { model_servo_box(); servo_box_divider(socket=false); } } translate(display_pos) down(servo_core_size.z - 4) fwd(servo_gears_pos.y) %servo(); model_servo_box_top(); model_servo_box_bottom();