$fn=60; // Physical dimensions EXTRUSION_WIDTH = 40; EXTRUSION_HEIGHT = 40; EXTRUSION_GROOVE_WIDTH = 8.2; MOTOR_WIDTH = 43.0; MOTOR_HEIGHT = 43.0; MOTOR_DEPTH = 40.0; MOTOR_CORNER = 4.5; MOTOR_SHAFT_HOLE_DIAMETER = 24; BOLT_HOLE_DIAMETER = 6.4; // M6 BOLT_HOLE_HEAD_DIAMETER = 11; // M6 // Parameters CORNER_SIZE = 5.0; // Part corner size MOTOR_TO_BORDER_CLEARANCE = 8.0; CHAMFER_SIZE = 0.4; EXTRUSION_BORDER_CLEARANCE = 1; // Distance between extrusion and part borders EXTRUSION_GROOVE_SLIDE_CLEARANCE = 0.2; // Slide to groove clearance EXTRUSION_GROOVE_SLIDE_DEPTH = 2; // Slide depth // Variables total_width = EXTRUSION_WIDTH - EXTRUSION_BORDER_CLEARANCE + MOTOR_WIDTH + MOTOR_TO_BORDER_CLEARANCE; total_height = EXTRUSION_HEIGHT - EXTRUSION_BORDER_CLEARANCE + MOTOR_HEIGHT + MOTOR_TO_BORDER_CLEARANCE; base_p = [ [0, CORNER_SIZE], [0, total_height - CORNER_SIZE], [CORNER_SIZE, total_height], [total_width - CORNER_SIZE, total_height], [total_width, total_height - CORNER_SIZE], [total_width, CORNER_SIZE], [total_width - CORNER_SIZE, 0], [CORNER_SIZE, 0] ]; motor_p = [ [0, MOTOR_CORNER], [0, MOTOR_HEIGHT - MOTOR_CORNER], [MOTOR_CORNER, MOTOR_HEIGHT], [MOTOR_WIDTH - MOTOR_CORNER, MOTOR_HEIGHT], [MOTOR_WIDTH, MOTOR_HEIGHT - MOTOR_CORNER], [MOTOR_WIDTH, MOTOR_CORNER], [MOTOR_WIDTH - MOTOR_CORNER, 0], [MOTOR_CORNER, 0] ]; module hexagon(ri = 1.0) // inner radius of hexagon { ra = ri*2/sqrt(3); circle(r = ra, $fn=6); } module m3nut(height) { linear_extrude(height) hexagon(5.6 / 2); } module groove(s) { groove_p = [ [0, 0], [0, EXTRUSION_GROOVE_SLIDE_DEPTH - 0.6], [0.6, EXTRUSION_GROOVE_SLIDE_DEPTH], [EXTRUSION_GROOVE_WIDTH - 0.6, EXTRUSION_GROOVE_SLIDE_DEPTH], [EXTRUSION_GROOVE_WIDTH, EXTRUSION_GROOVE_SLIDE_DEPTH - 0.6], [EXTRUSION_GROOVE_WIDTH, 0], ]; translate([0,s,0]) rotate([90,0,0]) linear_extrude(s) polygon(groove_p); } module base() { union() { hull() { linear_extrude(2) offset(-4) polygon(base_p); translate([0, 0, 2]) linear_extrude(14) offset(-1.75) polygon(base_p); translate([0, 0, 16]) linear_extrude(8) polygon(base_p); } // Grooves translate([EXTRUSION_WIDTH / 2 - EXTRUSION_GROOVE_WIDTH / 2 - EXTRUSION_BORDER_CLEARANCE, 0, 2+14+8]) groove(10.5 + EXTRUSION_HEIGHT - EXTRUSION_BORDER_CLEARANCE); translate([EXTRUSION_WIDTH / 2 - EXTRUSION_GROOVE_WIDTH / 2 - EXTRUSION_BORDER_CLEARANCE, 10.5 + EXTRUSION_HEIGHT - EXTRUSION_BORDER_CLEARANCE + 9, 2+14+8]) groove(11); translate([EXTRUSION_WIDTH / 2 - EXTRUSION_GROOVE_WIDTH / 2 - EXTRUSION_BORDER_CLEARANCE, 10.5 + EXTRUSION_HEIGHT - EXTRUSION_BORDER_CLEARANCE + 9 + 11 + 9, 2+14+8]) groove(11.5); translate([0, EXTRUSION_HEIGHT / 2 - EXTRUSION_GROOVE_WIDTH / 2 - EXTRUSION_BORDER_CLEARANCE + EXTRUSION_GROOVE_WIDTH, 2+14+8]) rotate([0,0,-90]) groove(10.5 + EXTRUSION_HEIGHT - EXTRUSION_BORDER_CLEARANCE); translate([10.5 + EXTRUSION_WIDTH - EXTRUSION_BORDER_CLEARANCE + 9, EXTRUSION_HEIGHT / 2 - EXTRUSION_GROOVE_WIDTH / 2 - EXTRUSION_BORDER_CLEARANCE + EXTRUSION_GROOVE_WIDTH, 2+14+8]) rotate([0,0,-90]) groove(11); translate([10.5 + EXTRUSION_WIDTH - EXTRUSION_BORDER_CLEARANCE + 9 + 11 + 9, EXTRUSION_HEIGHT / 2 - EXTRUSION_GROOVE_WIDTH / 2 - EXTRUSION_BORDER_CLEARANCE + EXTRUSION_GROOVE_WIDTH, 2+14+8]) rotate([0,0,-90]) groove(11.5); } } motor_shaft_hole_radius = MOTOR_SHAFT_HOLE_DIAMETER / 2; motor_center_x = EXTRUSION_WIDTH - EXTRUSION_BORDER_CLEARANCE + MOTOR_WIDTH / 2; motor_center_y = EXTRUSION_HEIGHT - EXTRUSION_BORDER_CLEARANCE + MOTOR_HEIGHT / 2; difference() { base(); translate([-EXTRUSION_BORDER_CLEARANCE, -EXTRUSION_BORDER_CLEARANCE, -1]) cube([EXTRUSION_WIDTH, EXTRUSION_HEIGHT, 29]); translate([EXTRUSION_WIDTH - EXTRUSION_BORDER_CLEARANCE, EXTRUSION_HEIGHT - EXTRUSION_BORDER_CLEARANCE, 5]) linear_extrude(20) polygon(motor_p); // Motor holes translate([motor_center_x, motor_center_y, -1]) cylinder(20, r=motor_shaft_hole_radius); translate([motor_center_x - 31/2, motor_center_y - 31/2, -1]) cylinder(20, r=3.4/2); translate([motor_center_x + 31/2, motor_center_y - 31/2, -1]) cylinder(20, r=3.4/2); translate([motor_center_x - 31/2, motor_center_y + 31/2, -1]) cylinder(20, r=3.4/2); translate([motor_center_x + 31/2, motor_center_y + 31/2, -1]) cylinder(20, r=3.4/2); // Chamfers translate([motor_center_x, motor_center_y, -0.01]) cylinder(1, motor_shaft_hole_radius+0.5, motor_shaft_hole_radius); translate([motor_center_x - 31/2, motor_center_y - 31/2, -0.01]) cylinder(1, (3.4+0.5)/2); translate([motor_center_x + 31/2, motor_center_y - 31/2, -0.01]) cylinder(1, (3.4+0.5)/2); translate([motor_center_x - 31/2, motor_center_y + 31/2, -0.01]) cylinder(1, (3.4+0.5)/2); translate([motor_center_x + 31/2, motor_center_y + 31/2, -0.01]) cylinder(1, (3.4+0.5)/2); // Groove holes translate([EXTRUSION_WIDTH / 2 - EXTRUSION_BORDER_CLEARANCE, 10.5 + EXTRUSION_HEIGHT - EXTRUSION_BORDER_CLEARANCE + 4.5, 11.2]) cylinder(35, r = BOLT_HOLE_DIAMETER / 2); translate([EXTRUSION_WIDTH / 2 - EXTRUSION_BORDER_CLEARANCE, 10.5 + EXTRUSION_HEIGHT - EXTRUSION_BORDER_CLEARANCE + 9 + 11 + 4.5, 11.2]) cylinder(35, r = BOLT_HOLE_DIAMETER / 2); translate([10.5 + EXTRUSION_WIDTH - EXTRUSION_BORDER_CLEARANCE + 4.5, EXTRUSION_HEIGHT / 2 - EXTRUSION_BORDER_CLEARANCE, 11.2]) cylinder(35, r = BOLT_HOLE_DIAMETER / 2); translate([10.5 + EXTRUSION_WIDTH - EXTRUSION_BORDER_CLEARANCE + 9 + 11 + 4.5, EXTRUSION_HEIGHT / 2 - EXTRUSION_BORDER_CLEARANCE, 11.2]) cylinder(35, r = BOLT_HOLE_DIAMETER / 2); // Bolt head holes translate([EXTRUSION_WIDTH / 2 - EXTRUSION_BORDER_CLEARANCE, 10.5 + EXTRUSION_HEIGHT - EXTRUSION_BORDER_CLEARANCE + 4.5, -1]) cylinder(12, r = BOLT_HOLE_HEAD_DIAMETER / 2); translate([EXTRUSION_WIDTH / 2 - EXTRUSION_BORDER_CLEARANCE, 10.5 + EXTRUSION_HEIGHT - EXTRUSION_BORDER_CLEARANCE + 9 + 11 + 4.5, -1]) cylinder(12, r = BOLT_HOLE_HEAD_DIAMETER / 2); translate([10.5 + EXTRUSION_WIDTH - EXTRUSION_BORDER_CLEARANCE + 4.5, EXTRUSION_HEIGHT / 2 - EXTRUSION_BORDER_CLEARANCE, -1]) cylinder(12, r = BOLT_HOLE_HEAD_DIAMETER / 2); translate([10.5 + EXTRUSION_WIDTH - EXTRUSION_BORDER_CLEARANCE + 9 + 11 + 4.5, EXTRUSION_HEIGHT / 2 - EXTRUSION_BORDER_CLEARANCE, -1]) cylinder(12, r = BOLT_HOLE_HEAD_DIAMETER / 2); // Bold head chamfers translate([EXTRUSION_WIDTH / 2 - EXTRUSION_BORDER_CLEARANCE, 10.5 + EXTRUSION_HEIGHT - EXTRUSION_BORDER_CLEARANCE + 4.5, -0.01]) cylinder(1, (BOLT_HOLE_HEAD_DIAMETER+1) / 2, BOLT_HOLE_HEAD_DIAMETER / 2); translate([EXTRUSION_WIDTH / 2 - EXTRUSION_BORDER_CLEARANCE, 10.5 + EXTRUSION_HEIGHT - EXTRUSION_BORDER_CLEARANCE + 9 + 11 + 4.5, -0.01]) cylinder(1, (BOLT_HOLE_HEAD_DIAMETER+1) / 2, BOLT_HOLE_HEAD_DIAMETER / 2); translate([10.5 + EXTRUSION_WIDTH - EXTRUSION_BORDER_CLEARANCE + 4.5, EXTRUSION_HEIGHT / 2 - EXTRUSION_BORDER_CLEARANCE, -0.01]) cylinder(1, (BOLT_HOLE_HEAD_DIAMETER+1) / 2, BOLT_HOLE_HEAD_DIAMETER / 2); translate([10.5 + EXTRUSION_WIDTH - EXTRUSION_BORDER_CLEARANCE + 9 + 11 + 4.5, EXTRUSION_HEIGHT / 2 - EXTRUSION_BORDER_CLEARANCE, -0.01]) cylinder(1, (BOLT_HOLE_HEAD_DIAMETER+1) / 2, BOLT_HOLE_HEAD_DIAMETER / 2); }