// 10:1 Cycloid helicopter Gearbox, Tyler Montbriand, 2016-2017 // // It's always cycloids with me lately, isn't it? // // This is my second attempt at making a gearbox which fits // motors from a crashed RC heli, the first which works // acceptably: Note I do not say fly as much as "whirl its // blades around alarmingly". Unlike my previous attempts it // has no preferred rotation of direction. It cannot be // backdriven -- if you try and let the motor freewheel, // it will just seize! // // Required vitamins: // 1 x 625 ball bearing // Probably epoxy, to hold the cam in place // 30mm M3 and 14mm M3 bolts, 4 x M3 nut // Main motor and mounting bolts from "Sanhuan 8827 RC Helicopter", aka Pioneer X8 // Mounting bolts and pair of "A" or "B" blades from above helicopter // A mess of 4.5 mm ammunition // Four 4.5mm balls are used to join the wobbling gear to the // output plate. A bunch more are used in a thrust bearing // as shown in the cutaway view. b608=[8,22,7]; b626=[6,19,6]; b625=[5,16,5]; b624=[4,13,5]; b623=[3,10,4]; b603=[3,9,5]; $fs=1; $fa=1; b=b625; t=11; // Number of teeth r=1+0.2; // Pitch of teeth roff=2; ol=0; h=10; bbr=18; holes=[0,3,5,8]; holer=7.5; blader=16; //anim(); //translate(15*[1,-1]) rotate([0,0,-45]) bladeholder(); //thrust(); plate(); module plate() { base_a(); translate([12,32]) base_b(); translate([35,10]) translate([0,0,7]) rotate([180,0]) pinion(); translate([-21,22]) thrust(); translate([15,-22]) rotate([0,0,-45]) bladeholder(); } //plate(); module bladeholder() difference() { union() { // Flanges to hold blades for(Z=[0,6]) translate([0,0,Z]) linear_extrude(2) hull() { for(Y=blader*[-1,1]) translate([0,Y]) circle(d=(9/16)*25.4); circle(d=(9/16)*25.4); } // Support for flanges for(Y=blader*[-1,1], d=-0.5+(9/16)*25.4) translate([0,Y,2-0.5]) linear_extrude(5,convexity=2) difference() { circle(d=d); circle(d=d - 0.5); } translate([0,0,1.5]) linear_extrude(5) intersection() { circle(d=17.125); square((9/16)*25.4*[2,10]/2, center=true); } } for(A=[0,180]) rotate([0,0,A+90]) { translate([5,0,-1]) cylinder(d=3.5, h=20); translate([blader,0,-1]) cylinder(d=2, h=20); translate([5,0,6]) rotate([0,0,180/6]) cylinder(d=6 / cos(30), $fn=6, h=10); } // for(A=[0,180]) rotate([0,0,A+90]) translate([blader,0,-1]) cylinder(d=2, h=20); } module base_b() intersection() { translate([0,0,3]) base(); translate([0,0,-1]) linear_extrude(13.5) square(45*[1,1],center=true); } module base_a() translate([0,0,6.5]) rotate([180,0]) intersection() { translate([0,0,3 - 12.5]) base(); linear_extrude(100) square(45*[1,1],center=true); } module anim() { color("blue") rotate(-[0,0,$t] * 360 ) for(A=(360/(t-1))*holes) rotate([0,0,A]) translate([holer,0,7]) sphere(d=4.5); difference() { union() { color(0.85*[1,0.75,.25]) rotate(-[0,0,$t] * 360 ) translate([0,0,8.2]) thrust(); color("blue") rotate(-[0,0,$t] * 180 )for(A=[0:360/14:360-1]) rotate([0,0,A]) translate([11,0,12]) sphere(d=4.5); } // rotate([0,0,-45-1]) cube([40,40,40]); } color("lightblue") translate(r*[cos($t*360*(t-1)),sin($t*360*(t-1)),0]) rotate(-[0,0,$t] * 360) pinion(); intersection() { base(); union() { translate(-[50,0,12]/2) cube([50,50,50]); mirror([1,1,0]) translate(-[0,50,13]/2) cube([50,50,12]); } } cylinder(d=2, h=14); } module thrust() difference() { union() { cylinder(d=25, h=10); // Flanges to hold blades } for(A=(360/(t-1))*[1.5,6.5]) rotate([0,0,A]) translate([5,0,-1]) { cylinder(d=6, h=4); cylinder(d=3.5, h=20); } for(A=(360/(t-1))*holes) rotate([0,0,A]) translate([holer,0]) sphere(d=4.5 + 0.5); translate([0,0,-1]) cylinder(d=4, h=20); rotate_extrude() translate([11,4]) offset(0.25) hull() { circle(d=4.5); translate([5,0]) circle(d=4.5); translate([0,10]) circle(d=4.5); } } module base() { difference() { translate([0,0,-3]) linear_extrude(19, convexity=2) union() { circle(d=33); difference() { hull() for(X=37*[-1,1]/2) translate([X,0]) circle(d=8); for(X=37*[-1,1]/2) translate([X,0]) circle(d=3.75); } } // yaw, 0.75 is awful tolerances, but good tolerances aren't // needed here, and any warping of the base will make it seize. linear_extrude(10, convexity=3) offset(0.75) hypo(t); translate([0,0,5]) cylinder(d=19, h=30); translate([0,3,-5]) cylinder(d=b[1]+1, h=5); hull() rotate_extrude() translate([11,12]) offset(0.25) hull() { circle(d=4.5); translate(-[0,4.5]/2+[0,1]/2) square([4.5,1],center=true); } hull() for(X=17*[-1,1]/2) translate([X,0]) cylinder(d=3.75, h=10, center=true); hull() for(X=17*[-1,1]/2) translate([X,0,-2]) cylinder(d=6, h=5); for(X=37*[-1,1]/2) { translate([X,0,-4]) linear_extrude(3, convexity=3) difference() { circle(d=6 / cos(30), $fn=6); circle(d=3.5 + 0.5); } translate([X,0,18-5]) cylinder(d=6, h=5); } } } module pinion() difference() { linear_extrude(5+2, convexity=3) hypo(t-1); cylinder(d=b[1]+0.5, h=10.5, center=true); cylinder(d=6, h=30, center=true); translate([0,0,0]) cylinder(d=10, h=6); //for(A=[0:360/5:360-1]) for(A=(360/(t-1))*holes) rotate([0,0,A]) translate([holer,0]) translate([0,0,4.95]) cylinder(d=4.5 + r + r + 0.5, h=20); } if(0) color("lightblue") linear_extrude(5, convexity=3) difference() { circle(d=30); offset(0.25) hypo(t); } if(0) rotate(-[0,0,$t] * 360 ) translate([0,0,10]) difference() { circle(d=21); for(A=[0:360/3:360-1]) rotate([0,0,A]) translate([6,0]) circle(d=5); } // This function is modified from http://www.thingiverse.com/thing:8348 //=========================================== // Hypotrochoid Band Fast // // This generates the normal vector to a hypocycloid, pointing outward, // and extrudes a profile approximating the envelope of normals. // // n is the number of lobes // r is the radius of the little rolling circle that generates the hypocycloid // thickness is the height of extrusion // r_off is the distance that the envelope is offset from the base hypocycloid // // When r_off = zero the output is the same as a hypocycloid. // // As far as I know, OpenSCAD does not do arrays, hence the funny big blocks of // hardcoded numbers you will see below. // module hypo(n, r=r, r_off=roff) { R = r*n; d = r; // set to 1 for normal size cylinders. this will leave a tiny cusp in some cases that does // not blend in to cylinders. see below for details. make hideCuspFactor larger to scale up // the cylinders slightly. 1.01 seems to work OK. hideCuspFactor = 1.01; // dth stands for dtheta - i.e. a small change of the angle "theta" // there are 14 intermediate points on the curve, so a wedge is // divided into 14 + 1 = 15. You may be tempted to change this, but it really is 15. dth = 360/n/15; // X points on base hypotrochoid xbStart = (R-r) + d; xbEnd = (R-r)*cos(360/n) + d*cos((R-r)/r*360/n); // Instead of an array and a for-loop we just hard-code these // intermediate points, this if for X coords on the base hypocycloid. // xb1 = (R-r)*cos(dth*1) + d*cos((R-r)/r*dth*1); xb2 = (R-r)*cos(dth*2) + d*cos((R-r)/r*dth*2); xb3 = (R-r)*cos(dth*3) + d*cos((R-r)/r*dth*3); xb4 = (R-r)*cos(dth*4) + d*cos((R-r)/r*dth*4); xb5 = (R-r)*cos(dth*5) + d*cos((R-r)/r*dth*5); xb6 = (R-r)*cos(dth*6) + d*cos((R-r)/r*dth*6); xb7 = (R-r)*cos(dth*7) + d*cos((R-r)/r*dth*7); xb8 = (R-r)*cos(dth*8) + d*cos((R-r)/r*dth*8); xb9 = (R-r)*cos(dth*9) + d*cos((R-r)/r*dth*9); xb10 = (R-r)*cos(dth*10) + d*cos((R-r)/r*dth*10); xb11 = (R-r)*cos(dth*11) + d*cos((R-r)/r*dth*11); xb12 = (R-r)*cos(dth*12) + d*cos((R-r)/r*dth*12); xb13 = (R-r)*cos(dth*13) + d*cos((R-r)/r*dth*13); xb14 = (R-r)*cos(dth*14) + d*cos((R-r)/r*dth*14); // Y points on base hypotrochoid ybStart = 0; ybEnd = (R-r)*sin(360/n) - d*sin((R-r)/r*360/n); // Instead of an array and a for-loop we just hard-code these // intermediate points, this if for Y coords on the base hypocycloid. // yb1 = (R-r)*sin(dth*1) - d*sin((R-r)/r*dth*1); yb2 = (R-r)*sin(dth*2) - d*sin((R-r)/r*dth*2); yb3 = (R-r)*sin(dth*3) - d*sin((R-r)/r*dth*3); yb4 = (R-r)*sin(dth*4) - d*sin((R-r)/r*dth*4); yb5 = (R-r)*sin(dth*5) - d*sin((R-r)/r*dth*5); yb6 = (R-r)*sin(dth*6) - d*sin((R-r)/r*dth*6); yb7 = (R-r)*sin(dth*7) - d*sin((R-r)/r*dth*7); yb8 = (R-r)*sin(dth*8) - d*sin((R-r)/r*dth*8); yb9 = (R-r)*sin(dth*9) - d*sin((R-r)/r*dth*9); yb10 = (R-r)*sin(dth*10) - d*sin((R-r)/r*dth*10); yb11 = (R-r)*sin(dth*11) - d*sin((R-r)/r*dth*11); yb12 = (R-r)*sin(dth*12) - d*sin((R-r)/r*dth*12); yb13 = (R-r)*sin(dth*13) - d*sin((R-r)/r*dth*13); yb14 = (R-r)*sin(dth*14) - d*sin((R-r)/r*dth*14); // Now we do the offset points. The tangent to the // hypotrochoid is [dx/dtheta, dy/dtheta]. // We take the tangent, normalize it, rotate it, and scale it // to get the offsets in X and Y coords. // X offset points xfStart = 0; xfEnd = r_off*cos(360/n - 90); // hard-coded offset points for X // xf1 = (R-r)*cos(dth*1) - r*cos( (R-r)/r*dth*1) * (R-r)/r ; xf2 = (R-r)*cos(dth*2) - r*cos( (R-r)/r*dth*2) * (R-r)/r ; xf3 = (R-r)*cos(dth*3) - r*cos( (R-r)/r*dth*3) * (R-r)/r ; xf4 = (R-r)*cos(dth*4) - r*cos( (R-r)/r*dth*4) * (R-r)/r ; xf5 = (R-r)*cos(dth*5) - r*cos( (R-r)/r*dth*5) * (R-r)/r ; xf6 = (R-r)*cos(dth*6) - r*cos( (R-r)/r*dth*6) * (R-r)/r ; xf7 = (R-r)*cos(dth*7) - r*cos( (R-r)/r*dth*7) * (R-r)/r ; xf8 = (R-r)*cos(dth*8) - r*cos( (R-r)/r*dth*8) * (R-r)/r ; xf9 = (R-r)*cos(dth*9) - r*cos( (R-r)/r*dth*9) * (R-r)/r ; xf10 = (R-r)*cos(dth*10) - r*cos( (R-r)/r*dth*10) * (R-r)/r ; xf11 = (R-r)*cos(dth*11) - r*cos( (R-r)/r*dth*11) * (R-r)/r ; xf12 = (R-r)*cos(dth*12) - r*cos( (R-r)/r*dth*12) * (R-r)/r ; xf13 = (R-r)*cos(dth*13) - r*cos( (R-r)/r*dth*13) * (R-r)/r ; xf14 = (R-r)*cos(dth*14) - r*cos( (R-r)/r*dth*14) * (R-r)/r ; // Y offset points yfStart = r_off; yfEnd = r_off*sin(360/n - 90); yf1 = (R-r)*sin(dth*1) + r*sin( (R-r)/r*dth*1) * (R-r)/r ; yf2 = (R-r)*sin(dth*2) + r*sin( (R-r)/r*dth*2) * (R-r)/r ; yf3 = (R-r)*sin(dth*3) + r*sin( (R-r)/r*dth*3) * (R-r)/r ; yf4 = (R-r)*sin(dth*4) + r*sin( (R-r)/r*dth*4) * (R-r)/r ; yf5 = (R-r)*sin(dth*5) + r*sin( (R-r)/r*dth*5) * (R-r)/r ; yf6 = (R-r)*sin(dth*6) + r*sin( (R-r)/r*dth*6) * (R-r)/r ; yf7 = (R-r)*sin(dth*7) + r*sin( (R-r)/r*dth*7) * (R-r)/r ; yf8 = (R-r)*sin(dth*8) + r*sin( (R-r)/r*dth*8) * (R-r)/r ; yf9 = (R-r)*sin(dth*9) + r*sin( (R-r)/r*dth*9) * (R-r)/r ; yf10 = (R-r)*sin(dth*10) + r*sin( (R-r)/r*dth*10) * (R-r)/r ; yf11 = (R-r)*sin(dth*11) + r*sin( (R-r)/r*dth*11) * (R-r)/r ; yf12 = (R-r)*sin(dth*12) + r*sin( (R-r)/r*dth*12) * (R-r)/r ; yf13 = (R-r)*sin(dth*13) + r*sin( (R-r)/r*dth*13) * (R-r)/r ; yf14 = (R-r)*sin(dth*14) + r*sin( (R-r)/r*dth*14) * (R-r)/r ; m1 = sqrt(xf1*xf1 + yf1*yf1)/r_off; m2 = sqrt(xf2*xf2 + yf2*yf2)/r_off; m3 = sqrt(xf3*xf3 + yf3*yf3)/r_off; m4 = sqrt(xf4*xf4 + yf4*yf4)/r_off; m5 = sqrt(xf5*xf5 + yf5*yf5)/r_off; m6 = sqrt(xf6*xf6 + yf6*yf6)/r_off; m7 = sqrt(xf7*xf7 + yf7*yf7)/r_off; m8 = sqrt(xf8*xf8 + yf8*yf8)/r_off; m9 = sqrt(xf9*xf9 + yf9*yf9)/r_off; m10 = sqrt(xf10*xf10 + yf10*yf10)/r_off; m11 = sqrt(xf11*xf11 + yf11*yf11)/r_off; m12 = sqrt(xf12*xf12 + yf12*yf12)/r_off; m13 = sqrt(xf13*xf13 + yf13*yf13)/r_off; m14 = sqrt(xf14*xf14 + yf14*yf14)/r_off; // Now that we have the points, we make a polygon and extrude it. union() { for ( i = [0:n-1] ) { rotate([0,0, 360/n*i]) { // the first point in the polygon is moved slightly off the origin polygon(points= [ [-R/20 * cos(360/n/2) , -R/20 * sin(360/n/2)], [xbStart, ybStart], [xbStart + xfStart, ybStart + yfStart], [xb1 + xf1/m1, yb1 + yf1/m1], [xb2 + xf2/m2, yb2 + yf2/m2], [xb3 + xf3/m3, yb3 + yf3/m3], [xb4 + xf4/m4, yb4 + yf4/m4], [xb5 + xf5/m5, yb5 + yf5/m5], [xb6 + xf6/m6, yb6 + yf6/m6], [xb7 + xf7/m7, yb7 + yf7/m7], [xb8 + xf8/m8, yb8 + yf8/m8], [xb9 + xf9/m9, yb9 + yf9/m9], [xb10 + xf10/m10, yb10 + yf10/m10], [xb11 + xf11/m11, yb11 + yf11/m11], [xb12 + xf12/m12, yb12 + yf12/m12], [xb13 + xf13/m13, yb13 + yf13/m13], [xb14 + xf14/m14, yb14 + yf14/m14], [xbEnd + xfEnd, ybEnd + yfEnd], [xbEnd, ybEnd]], paths = [[0,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1]]); // If you look at just the wedge extruded above, without the cylinders below, // you can see a small cusp as the band radius gets larger. The radius of // the cylinder is manually increased a slight bit so that the cusp is contained // within the cylinder. With unlimited resolution, the cusp and cylinder would // blend together perfectly (I think), but this workaround is needed because // we are only using piecewise linear approximations to these curves. translate([xbStart, ybStart]) circle(r = hideCuspFactor*r_off); } //end rotate } //end for } // end union() } // end module hypotrochoidBandFast //===========================================