commit e98fef0cdb829b541b85cf2abf19c6b393243b74 Author: Lyderic Maillet Date: Mon Oct 14 18:21:15 2024 +0200 Initial commit : Tevo Tarantula X carriage, L-Core & L-Minion, Creature Comfort parts diff --git a/Creature Comfort/ComfortCards.scad b/Creature Comfort/ComfortCards.scad new file mode 100644 index 0000000..5ac1357 --- /dev/null +++ b/Creature Comfort/ComfortCards.scad @@ -0,0 +1,53 @@ +$fn = 60; + +module base() +{ + difference() + { + square([146, 101.5]); + +// translate([0, 101.5/2]) circle(48.5/2); +// translate([146, 101.5/2]) circle(48.5/2); + + translate([3.3+68/2, 7.75 - 27.5/2]) circle(27.5/2); + translate([3.3+68+3.4+68/2, 7.75 - 27.5/2]) circle(27.5/2); + + translate([3.3+68/2, 101.5 - 7.75 + 27.5/2]) circle(27.5/2); + translate([3.3+68+3.4+68/2, 101.5 - 7.75 + 27.5/2]) circle(27.5/2); + } +} + +minkowski() +{ + difference() + { + linear_extrude(29) + minkowski(convexity = 2) + { + offset(-4) base(); + circle(4); + } + + translate([3.3, 2.75, 1]) + linear_extrude(35) + //minkowski(convexity = 2) + { + //offset(-4) + square([68, 96]); + //circle(4); + } + + translate([3.3+68+3.4, 2.75, 1]) + linear_extrude(35) + //minkowski(convexity = 2) + { + //offset(-4) + square([68, 96]); + //circle(4); + } + +// translate([146/2, 101.5/2, -1]) cylinder(35,r=48.5/2); + } + + translate([1,1,0]) cylinder(1, 1, 0); +} \ No newline at end of file diff --git a/Creature Comfort/TravelerCards.scad b/Creature Comfort/TravelerCards.scad new file mode 100644 index 0000000..4a1aee6 --- /dev/null +++ b/Creature Comfort/TravelerCards.scad @@ -0,0 +1,38 @@ +$fn = 60; + +module base() +{ + difference() + { + square([138, 101.5]); + translate([0, 101.5/2]) circle(48.5/2); + translate([138, 101.5/2]) circle(48.5/2); + translate([138/2, 7.75 - 27.5/2]) circle(27.5/2); + translate([138/2, 101.5 - 7.75 + 27.5/2]) circle(27.5/2); + } +} + +minkowski() +{ + difference() + { + linear_extrude(13.3) + minkowski(convexity = 2) + { + offset(-4) base(); + circle(4); + } + + translate([8, 9.75, 1]) + linear_extrude(30) + minkowski(convexity = 2) + { + offset(-4) square([122, 82]); + circle(4); + } + + translate([138/2, 101.5/2, -1]) cylinder(30,r=48.5/2); + } + + translate([1,1,0]) cylinder(1, 1, 0); +} \ No newline at end of file diff --git a/L-Core/lead-screw-constraint-front-left-3.1.scad b/L-Core/lead-screw-constraint-front-left-3.1.scad new file mode 100644 index 0000000..12f2ea9 --- /dev/null +++ b/L-Core/lead-screw-constraint-front-left-3.1.scad @@ -0,0 +1,56 @@ + $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 + +MGN_RAIL_WR = 12; +MGN_RAIL_HR = 8; + +F688ZZ_D = 16; + +// Parameters +CORNER_SIZE = 5.0; // Part corner size +MOTOR_TO_BORDER_CLEARANCE = 5.0; +CHAMFER_SIZE = 1; +EXTRUSION_BORDER_CLEARANCE = 4; // 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; + +//minkowski() +{ + linear_extrude(8 - CHAMFER_SIZE) + difference() + { + + hull() + { + square([EXTRUSION_WIDTH + 3, EXTRUSION_HEIGHT + 3]); + translate([EXTRUSION_WIDTH + MOTOR_WIDTH / 2, EXTRUSION_HEIGHT + MOTOR_HEIGHT / 2]) circle(F688ZZ_D/2 + MOTOR_TO_BORDER_CLEARANCE); + } + + translate([-1, -1]) square([EXTRUSION_WIDTH + 1, EXTRUSION_HEIGHT +1]); + translate([EXTRUSION_WIDTH + MOTOR_WIDTH / 2, EXTRUSION_HEIGHT + MOTOR_HEIGHT / 2]) circle(F688ZZ_D/2); + + translate([EXTRUSION_WIDTH / 2 - MGN_RAIL_WR / 2, EXTRUSION_HEIGHT - 1]) square([MGN_RAIL_WR, MGN_RAIL_HR + 1]); + + square([EXTRUSION_WIDTH / 2 - MGN_RAIL_WR / 2, EXTRUSION_HEIGHT + MGN_RAIL_HR + 10]); + square([EXTRUSION_WIDTH + 10, EXTRUSION_BORDER_CLEARANCE]); + } + + translate([CHAMFER_SIZE, CHAMFER_SIZE]) cylinder(CHAMFER_SIZE,CHAMFER_SIZE,0); +} \ No newline at end of file diff --git a/L-Core/lead-screw-motor-cage-front-3.1.scad b/L-Core/lead-screw-motor-cage-front-3.1.scad new file mode 100644 index 0000000..705003e --- /dev/null +++ b/L-Core/lead-screw-motor-cage-front-3.1.scad @@ -0,0 +1,224 @@ + $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); + +} + diff --git a/L-Minion/y_motor_cage.scad b/L-Minion/y_motor_cage.scad new file mode 100644 index 0000000..af22c52 --- /dev/null +++ b/L-Minion/y_motor_cage.scad @@ -0,0 +1,132 @@ +$fn=100; + +EXTRUSION_W = 40; +EXTRUSION_H = 40; +EXTRUSION_D = 40; + +MOTOR_W = 43; +MOTOR_H = 43; + + +p = [ + [0, 0], + [0, EXTRUSION_H - MOTOR_H / 2 + MOTOR_H - 1.5], + [MOTOR_W + 5, EXTRUSION_H - MOTOR_H / 2 + MOTOR_H - 1.5], + [MOTOR_W + 5, EXTRUSION_H], + [MOTOR_W + 5 + 60, EXTRUSION_H], + [MOTOR_W + 5 + 60, 0], + ]; + +p2 = [ + [0, 0], + [0, EXTRUSION_H - MOTOR_H / 2 - 1.5], + [EXTRUSION_D, EXTRUSION_H - MOTOR_H / 2 + MOTOR_H - 1.5], + [EXTRUSION_D + 5, EXTRUSION_H - MOTOR_H / 2 + MOTOR_H - 1.5], + [EXTRUSION_D + 5, 0], + ]; + + +module plate() +{ + + difference() + { + union() + { + + translate([0,5,0]) + rotate([90,0,0]) + linear_extrude(5) + polygon(p); + + + + hull() + { + translate([0,5,0]) + rotate([90,0,0]) + linear_extrude(5) + square([MOTOR_W + 60 + 5, EXTRUSION_H - 1.5 - 8]); + + translate([MOTOR_W - 6, 5+12-1, 0]) + rotate([90,0,0]) + linear_extrude(1) + square([60 + 5 + 6, EXTRUSION_H - 1.5 - 8 - 2]); + + translate([MOTOR_W, 5+20-1, 0]) + rotate([90,0,0]) + linear_extrude(1) + square([60 + 5 - 8, EXTRUSION_H - 1.5 - 8 - 2 - 4]); + } + + translate([0, -EXTRUSION_D, 0]) + cube([MOTOR_W, EXTRUSION_D, EXTRUSION_H - MOTOR_H / 2 - 1.5]); + + translate([-5, -EXTRUSION_D, 0]) + rotate([90,0,90]) + linear_extrude(5) + polygon(p2); + + translate([MOTOR_W, -EXTRUSION_D, 0]) + rotate([90,0,90]) + linear_extrude(5) + polygon(p2); + + } + + // Motor shaft hole + translate([MOTOR_W / 2, 25, EXTRUSION_H - 1.5]) + rotate([90,0,0]) + cylinder(26, r= 24/2); + + + // Motor screws holes + translate([6, 25, EXTRUSION_H - MOTOR_H / 2 + 6 - 1.5]) + rotate([90,0,0]) + cylinder(26, r= 3.3/2); + + translate([6, 25, EXTRUSION_H - MOTOR_H / 2 + 6 - 1.5]) + rotate([90,0,0]) + cylinder(21, r= 6/2); + + translate([MOTOR_W - 6, 25, EXTRUSION_H - MOTOR_H / 2 + 6 - 1.5]) + rotate([90,0,0]) + cylinder(26, r= 3.3/2); + + translate([MOTOR_W - 6, 25, EXTRUSION_H - MOTOR_H / 2 + 6 - 1.5]) + rotate([90,0,0]) + cylinder(21, r= 6/2); + + + translate([6, 25, EXTRUSION_H - MOTOR_H / 2 + MOTOR_H - 6 - 1.5]) + rotate([90,0,0]) + cylinder(26, r= 3.3/2); + + translate([MOTOR_W - 6, 25, EXTRUSION_H - MOTOR_H / 2 + MOTOR_H - 6 - 1.5]) + rotate([90,0,0]) + cylinder(26, r= 3.3/2); + + + // part screw hold hole 1 + translate([MOTOR_W + 15, 25, EXTRUSION_H / 2]) + rotate([90,0,0]) + cylinder(26, r= 6.3/2); + + translate([MOTOR_W + 15, 25, EXTRUSION_H / 2]) + rotate([90,0,0]) + cylinder(21, r= 12/2); + + // part screw hold hole 2 + translate([MOTOR_W + 15 + 30, 25, EXTRUSION_H / 2]) + rotate([90,0,0]) + cylinder(26, r= 6.3/2); + + translate([MOTOR_W + 15 + 30, 25, EXTRUSION_H / 2]) + rotate([90,0,0]) + cylinder(20, r= 12/2); + + } +} + +plate(); + diff --git a/README.md b/README.md new file mode 100644 index 0000000..e69de29 diff --git a/Tevo Tarantula/x-carriage-plate.scad b/Tevo Tarantula/x-carriage-plate.scad new file mode 100644 index 0000000..577ad9b --- /dev/null +++ b/Tevo Tarantula/x-carriage-plate.scad @@ -0,0 +1,79 @@ +$fn=100; + +WIDTH = 76; +DEPTH = 64; +THICKNESS = 5; + +BASE_PLATE_CORNER_RADIUS = 10; + +VSLOT_WHEEL_HOLE_DIA_SMALL = 5; +VSLOT_WHEEL_HOLE_DIA_BIG = 7; + +WHEEL_DIA = 24; +WHEEL_FLANGE = 2.25; + +EXTRUSION_WIDTH = 20; +WHEEL_FLANGE_IN_EXTRUSION_SIZE = 2; // /!\ Max = WHEEL_FLANGE + +module base_plate () +{ + difference() + { + linear_extrude(THICKNESS) + minkowski() + { + offset(-BASE_PLATE_CORNER_RADIUS) + square([WIDTH, DEPTH]); + circle(BASE_PLATE_CORNER_RADIUS); + } + + // Wheel holes + cy = DEPTH / 2; + wheel_radius = WHEEL_DIA / 2; + + translate([10, cy - EXTRUSION_WIDTH / 2 - (wheel_radius - WHEEL_FLANGE_IN_EXTRUSION_SIZE), -1]) + cylinder(h=THICKNESS + 2, r=VSLOT_WHEEL_HOLE_DIA_SMALL / 2); + + translate([WIDTH - 10, cy - EXTRUSION_WIDTH / 2 - (wheel_radius - WHEEL_FLANGE_IN_EXTRUSION_SIZE), -1]) + cylinder(h=THICKNESS + 2, r=VSLOT_WHEEL_HOLE_DIA_SMALL / 2); + + translate([10, cy + EXTRUSION_WIDTH / 2 + (wheel_radius - WHEEL_FLANGE_IN_EXTRUSION_SIZE), -1]) + cylinder(h=THICKNESS + 2, r=VSLOT_WHEEL_HOLE_DIA_BIG / 2); + + translate([WIDTH - 10, cy + EXTRUSION_WIDTH / 2 + (wheel_radius - WHEEL_FLANGE_IN_EXTRUSION_SIZE), -1]) + cylinder(h=THICKNESS + 2, r=VSLOT_WHEEL_HOLE_DIA_BIG / 2); + } +} + +module belt_attach() +{ + linear_extrude(8) + union() + { + translate([0, THICKNESS - 4]) + union() + { + hull() + { + translate([2, 1.5]) square([3.5, 2.5]); + translate([2, 2]) circle(2); + } + translate([5.5, 1.5]) square([4.7, 2.5]); + } + + translate([5.5 + 4.7, -1]) square([7+1, THICKNESS + 2]); + } +} + +difference() +{ + base_plate(); + + translate([17, DEPTH / 2 - 4, 0.01]) + rotate([90,0,180]) + belt_attach(); + + translate([WIDTH - 17, DEPTH / 2 + 4, 0.01]) + rotate([90,0,0]) + belt_attach(); +}