// This is for a Kossel Clear, and it changes the angle of the ball studs // mounted on the carriages to be 45 degrees downward, which improves the // range of motion. // // This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 // International License. // Visit: http://creativecommons.org/licenses/by-sa/4.0/ // // Haydn Huntley // haydn.huntley@gmail.com $fn = 360/4; // All measurements in mm. smidge = 0.1; m3Radius = (3.0+2*smidge)/2; m3LooseRadius = m3Radius + 0.2; m3HeadHeight = 4.0+0.2; m3LooseHeadRadius = (5.4+8*smidge)/2; m3NutRadius = (6.25 + 0.75) / 2; m3LooseNutRadius = m3NutRadius + 0.2; m3NutHeight = 2.4; m3LockNutRadius = (6.25 + 0.75) / 2; m3LockNutHeight = 4.0; ballStudBaseRadius = 10.0/2; ballStudSeparation = 43.35; baseHeight = 2+m3HeadHeight; ballStudBaseHeight = 8; ballStudXOffset = 10; angle = -45; hJoinerOffset = 18.25; vJoinerOffset = 5; difference() { union() { // The lower body, which attaches to the carriage. hull() { for (y = [-1, 1]) translate([0, y*ballStudSeparation/2, 0]) cylinder(r=1+ballStudBaseRadius, h=baseHeight); } // The flat bases for the ball studs. for (y = [-1, 1]) hull() { translate([ballStudXOffset, y*ballStudSeparation/2, 0]) cylinder(r=1+ballStudBaseRadius, h=baseHeight); translate([0, y*ballStudSeparation/2, 0]) cylinder(r=1+ballStudBaseRadius, h=baseHeight); translate([0, y*(ballStudSeparation-2*ballStudBaseRadius)/2, 0]) cylinder(r=1+ballStudBaseRadius, h=baseHeight); } // The angular part of the bases for the ball studs. for (y = [-1, 1]) hull() { translate([ballStudXOffset, y*ballStudSeparation/2, 0]) cylinder(r=1+ballStudBaseRadius, h=baseHeight); translate([ballStudXOffset, y*ballStudSeparation/2, ballStudBaseHeight]) rotate([0, angle, 0]) cylinder(r=ballStudBaseRadius, h=4); } } // Remove holes for two M3 bolts to attach it to the carriage, and // counter sink the heads. for (y = [-1, 1]) { // The holes for the threaded parts of the M3 bolts. translate([0, y*ballStudSeparation/2, -smidge/2]) cylinder(r=m3LooseRadius, h=baseHeight+smidge); // The holes for the heads of the M3 bolts. translate([0, y*ballStudSeparation/2, baseHeight-m3HeadHeight]) cylinder(r=m3LooseHeadRadius, h=m3HeadHeight+smidge); } // Remove holes for the M3 threaded part of the ball studs. for (y = [-1, 1]) { translate([ballStudXOffset, y*ballStudSeparation/2, ballStudBaseHeight]) rotate([0, angle, 0]) translate([0, 0, 0]) cylinder(r=m3LooseRadius, h=20+smidge, center=true); } // Make nut traps to hold the ball studs. for (y = [-1, 1]) { translate([ballStudXOffset, y*ballStudSeparation/2, ballStudBaseHeight]) rotate([0, angle, 0]) translate([0, 0, 1-11]) cylinder(r1=m3LockNutRadius+5*smidge, r2=m3LockNutRadius-3*smidge, h=8, $fn=6); // This makes the opening much cleaner. translate([15, y*ballStudSeparation/2, 0.8+m3LockNutRadius]) rotate([0, 90, 0]) cylinder(r=m3LockNutRadius, h=2, center=true, $fn=6); } // Make space for the head of the M3 bolt which joins the inside // carriage acrylic piece to the one which triggers the endstop switches, // and connects to the outside carriage piece. translate([vJoinerOffset, -hJoinerOffset, -smidge/2]) { cylinder(r=m3LooseHeadRadius, h=m3HeadHeight+smidge); // Domed top. translate([0, 0, m3HeadHeight+smidge]) cylinder(r1=m3LooseHeadRadius, r2=0.5, h=m3LooseHeadRadius-2); } }