v = 0.3; e = 0.01; l = 39+v; m = 3; d1 = 24.8 + v; l1 = 21; d2 = 24.4; d2 = d1; l2 = l - l1; d3 = 7+v; l3 = 2.5; d4 = 6.5+v; l4 = 1; module motor() { color("grey") rotate([-90, 0, 0]) translate([0, 0, l3]) union() { cylinder(l1, d=d1, d=d1); translate([0, 0, l1]) cylinder(l2, d=d2, d=d2); translate([0, 0, -l3]) cylinder(l3, d=d3, d=d3); translate([0, 0, l]) cylinder(l4, d=d4, d=d4); translate([0, 12-d4/2+3/2, l+1]) cube([7, 3, 2], center=true); } } module motormount() { d = 2.5; dd = d1+d*2; w = d1; hc = d1/2+d; module plate() { translate([-w/2, 0, 0]) cube([w, d, hc]); translate([0, 0, dd/2]) rotate([-90, 0, 0]) cylinder(d, d=w, d=w); } module body() { union() { plate(); translate([0, l+d, 0]) plate(); translate([-w/2, 0, 0]) cube([w, l+d*2, dd/3]); } } module axelcap() { translate([0, 0, dd/2]) { // Axel cap hole. translate([0, 0, 0]) rotate([-90, 0, 0]) cylinder(d+e, d=d3, d=d3); translate([-d3/2, 0, 0]) cube([d3, d+e, dd]); for (r = [0:45:360]) { rotate([-90, r, 0]) translate([(19.5-m)/2, 0, 0]) cylinder(d, d=m, d=m); } } } module endcap() { translate([0, l+d, 0]) union() { // End axel cap hole. translate([0, 0, dd/2]) rotate([-90, 0, 0]) cylinder(d+e, d=d4, d=d4); translate([-d4/2, 0, dd/2]) cube([d4, d+e, dd]); translate([-15/2, 0, dd-11]) cube([15, d+e, 20]); } } module motorhole() { union() { translate([0, d, hc]) rotate([-90, 0, 0]) cylinder(l1, d=d1, d=d1); translate([0, d+l1, hc]) rotate([-90, 0, 0]) cylinder(l2, d=d2, d=d2); } } module foo() { difference() { body(); motorhole(); axelcap(); endcap(); } } module fins() { t = 2; difference() { translate([0, d+d/2, dd/2]) rotate([-90, 0, 0]) difference() { cylinder(l-d, d=d1+t*2, d=d1+t*2); cylinder(l-d, d=d1, d=d1); } // Cut the top off. translate([-(d1+t*2)/2, d, dd/2+5]) cube([d1+t*2, l, 40]); for (y = [0, l-t, (l-t)/2]) { translate([-(d1+t*2)/2, d+y, dd/3]) cube([d1+t*2, t, 40]); } } } difference() { union() { foo(); fins(); } // Cut the top off. translate([-d1, -e, hc+hc/2+1]) cube([d1*2, l*2, 30]); // Cut holes through the bottom. for (y = [d+l/4, d+l*3/4]) { translate([0, y, -e]) cylinder(40, d=dd/2, d=dd/2); } } }