225 lines
8.2 KiB
OpenSCAD
225 lines
8.2 KiB
OpenSCAD
$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);
|
|
|
|
}
|
|
|