1098 lines
58 KiB
OpenSCAD
1098 lines
58 KiB
OpenSCAD
|
|
/* Library for Involute Gears, Screws and Racks
|
|
|
|
This library contains the following modules
|
|
- rack(modul, length, height, width, pressure_angle=20, helix_angle=0)
|
|
- mountable_rack(modul, length, height, width, pressure_angle=20, helix_angle=0, fastners, profile, head)
|
|
- herringbone_rack(modul, length, height, width, pressure_angle = 20, helix_angle=45)
|
|
- mountable_herringbone_rack(modul, length, height, width, pressure_angle=20, helix_angle=45, fastners, profile, head)
|
|
- spur_gear(modul, tooth_number, width, bore, pressure_angle=20, helix_angle=0, optimized=true)
|
|
- herringbone_gear(modul, tooth_number, width, bore, pressure_angle=20, helix_angle=0, optimized=true)
|
|
- rack_and_pinion (modul, rack_length, gear_teeth, rack_height, gear_bore, width, pressure_angle=20, helix_angle=0, together_built=true, optimized=true)
|
|
- ring_gear(modul, tooth_number, width, rim_width, pressure_angle=20, helix_angle=0)
|
|
- herringbone_ring_gear(modul, tooth_number, width, rim_width, pressure_angle=20, helix_angle=0)
|
|
- planetary_gear(modul, sun_teeth, planet_teeth, number_planets, width, rim_width, bore, pressure_angle=20, helix_angle=0, together_built=true, optimized=true)
|
|
- bevel_gear(modul, tooth_number, partial_cone_angle, tooth_width, bore, pressure_angle=20, helix_angle=0)
|
|
- bevel_herringbone_gear(modul, tooth_number, partial_cone_angle, tooth_width, bore, pressure_angle=20, helix_angle=0)
|
|
- bevel_gear_pair(modul, gear_teeth, pinion_teeth, axis_angle=90, tooth_width, bore, pressure_angle = 20, helix_angle=0, together_built=true)
|
|
- bevel_herringbone_gear_pair(modul, gear_teeth, pinion_teeth, axis_angle=90, tooth_width, bore, pressure_angle = 20, helix_angle=0, together_built=true)
|
|
- worm(modul, thread_starts, length, bore, pressure_angle=20, lead_angle=10, together_built=true)
|
|
- worm_gear(modul, tooth_number, thread_starts, width, length, worm_bore, gear_bore, pressure_angle=20, lead_angle=0, optimized=true, together_built=true)
|
|
|
|
Examples of each module are commented out at the end of this file
|
|
|
|
Author: Dr Jörg Janssen
|
|
Contributions By: Keith Emery, Chris Spencer
|
|
Last Verified On: 1. June 2018
|
|
Version: 2.2
|
|
License: Creative Commons - Attribution, Non Commercial, Share Alike
|
|
|
|
Permitted modules according to DIN 780:
|
|
0.05 0.06 0.08 0.10 0.12 0.16
|
|
0.20 0.25 0.3 0.4 0.5 0.6
|
|
0.7 0.8 0.9 1 1.25 1.5
|
|
2 2.5 3 4 5 6
|
|
8 10 12 16 20 25
|
|
32 40 50 60
|
|
|
|
*/
|
|
|
|
|
|
// General Variables
|
|
pi = 3.14159;
|
|
rad = 57.29578;
|
|
clearance = 0.05; // clearance between teeth
|
|
|
|
/* Converts Radians to Degrees */
|
|
function grad(pressure_angle) = pressure_angle*rad;
|
|
|
|
/* Converts Degrees to Radians */
|
|
function radian(pressure_angle) = pressure_angle/rad;
|
|
|
|
/* Converts 2D Polar Coordinates to Cartesian
|
|
Format: radius, phi; phi = Angle to x-Axis on xy-Plane */
|
|
function polar_to_cartesian(polvect) = [
|
|
polvect[0]*cos(polvect[1]),
|
|
polvect[0]*sin(polvect[1])
|
|
];
|
|
|
|
/* Circle Involutes-Function:
|
|
Returns the Polar Coordinates of an Involute Circle
|
|
r = Radius of the Base Circle
|
|
rho = Rolling-angle in Degrees */
|
|
function ev(r,rho) = [
|
|
r/cos(rho),
|
|
grad(tan(rho)-radian(rho))
|
|
];
|
|
|
|
/* Sphere-Involutes-Function
|
|
Returns the Azimuth Angle of an Involute Sphere
|
|
theta0 = Polar Angle of the Cone, where the Cutting Edge of the Large Sphere unrolls the Involute
|
|
theta = Polar Angle for which the Azimuth Angle of the Involute is to be calculated */
|
|
function sphere_ev(theta0,theta) = 1/sin(theta0)*acos(cos(theta)/cos(theta0))-acos(tan(theta0)/tan(theta));
|
|
|
|
/* Converts Spherical Coordinates to Cartesian
|
|
Format: radius, theta, phi; theta = Angle to z-Axis, phi = Angle to x-Axis on xy-Plane */
|
|
function sphere_to_cartesian(vect) = [
|
|
vect[0]*sin(vect[1])*cos(vect[2]),
|
|
vect[0]*sin(vect[1])*sin(vect[2]),
|
|
vect[0]*cos(vect[1])
|
|
];
|
|
|
|
/* Check if a Number is even
|
|
= 1, if so
|
|
= 0, if the Number is not even */
|
|
function is_even(number) =
|
|
(number == floor(number/2)*2) ? 1 : 0;
|
|
|
|
/* greatest common Divisor
|
|
according to Euclidean Algorithm.
|
|
Sorting: a must be greater than b */
|
|
function ggt(a,b) =
|
|
a%b == 0 ? b : ggt(b,a%b);
|
|
|
|
/* Polar function with polar angle and two variables */
|
|
function spiral(a, r0, phi) =
|
|
a*phi + r0;
|
|
|
|
/* Copy and rotate a Body */
|
|
module copier(vect, number, distance, winkel){
|
|
for(i = [0:number-1]){
|
|
translate(v=vect*distance*i)
|
|
rotate(a=i*winkel, v = [0,0,1])
|
|
children(0);
|
|
}
|
|
}
|
|
|
|
/* rack
|
|
modul = Height of the Tooth Tip above the Rolling LIne
|
|
length = Length of the Rack
|
|
height = Height of the Rack to the Pitch Line
|
|
width = Width of a Tooth
|
|
pressure_angle = Pressure Angle, Standard = 20° according to DIN 867. Should not exceed 45°.
|
|
helix_angle = Helix Angle of the Rack Transverse Axis; 0° = Spur Teeth */
|
|
module rack(modul, length, height, width, pressure_angle = 20, helix_angle = 0) {
|
|
|
|
// Dimension Calculations
|
|
modul=modul*(1-clearance);
|
|
c = modul / 6; // Tip Clearance
|
|
mx = modul/cos(helix_angle); // Module Shift by Helix Angle in the X-Direction
|
|
a = 2*mx*tan(pressure_angle)+c*tan(pressure_angle); // Flank Width
|
|
b = pi*mx/2-2*mx*tan(pressure_angle); // Tip Width
|
|
x = width*tan(helix_angle); // Topside Shift by Helix Angle in the X-Direction
|
|
nz = ceil((length+abs(2*x))/(pi*mx)); // Number of Teeth
|
|
|
|
translate([-pi*mx*(nz-1)/2-a-b/2,-modul,0]){
|
|
intersection(){ // Creates a Prism that fits into a Geometric Box
|
|
copier([1,0,0], nz, pi*mx, 0){
|
|
polyhedron(
|
|
points=[[0,-c,0], [a,2*modul,0], [a+b,2*modul,0], [2*a+b,-c,0], [pi*mx,-c,0], [pi*mx,modul-height,0], [0,modul-height,0], // Underside
|
|
[0+x,-c,width], [a+x,2*modul,width], [a+b+x,2*modul,width], [2*a+b+x,-c,width], [pi*mx+x,-c,width], [pi*mx+x,modul-height,width], [0+x,modul-height,width]], // Topside
|
|
faces=[[6,5,4,3,2,1,0], // Underside
|
|
[1,8,7,0],
|
|
[9,8,1,2],
|
|
[10,9,2,3],
|
|
[11,10,3,4],
|
|
[12,11,4,5],
|
|
[13,12,5,6],
|
|
[7,13,6,0],
|
|
[7,8,9,10,11,12,13], // Topside
|
|
]
|
|
);
|
|
};
|
|
translate([abs(x),-height+modul-0.5,-0.5]){
|
|
cube([length,height+modul+1,width+1]); // Cuboid which includes the Volume of the Rack
|
|
}
|
|
};
|
|
};
|
|
}
|
|
|
|
/* Mountable-rack; uses module "rack"
|
|
modul = Height of the Tooth Tip above the Rolling LIne
|
|
length = Length of the Rack
|
|
height = Height of the Rack to the Pitch Line
|
|
width = Width of a Tooth
|
|
pressure_angle = Pressure Angle, Standard = 20° according to DIN 867. Should not exceed 45°.
|
|
helix_angle = Helix Angle of the Rack Transverse Axis; 0° = Spur Teeth
|
|
fastners = Total number of fastners.
|
|
profile = Metric standard profile for fastners (ISO machine screws), M4 = 4, M6 = 6 etc.
|
|
|
|
head = Style of fastner to accomodate.
|
|
PH = Pan Head, C = Countersunk, RC = Raised Countersunk, CS = Cap Screw, CSS = Countersunk Socket Screw. */
|
|
module mountable_rack(modul, length, height, width, pressure_angle, helix_angle, fastners, profile, head) {
|
|
difference(){
|
|
rack(modul, length, height, width, pressure_angle, helix_angle);
|
|
offset = (length/fastners);
|
|
translate([-length/2+(offset/2),0,0])
|
|
for(i = [0:fastners-1]){
|
|
if (head=="PH"){
|
|
translate([i*offset,modul,width/2])
|
|
rotate([90,0,0])
|
|
cylinder(h=height+modul, d=profile, center=false);
|
|
translate([i*offset,modul,width/2])
|
|
rotate([90,0,0])
|
|
cylinder(h=profile*0.6+modul*2.25, d=profile*2, center=false);
|
|
}
|
|
if (head=="CS"){
|
|
translate([i*offset,modul,width/2])
|
|
rotate([90,0,0])
|
|
cylinder(h=height+modul, d=profile, center=false);
|
|
translate([i*offset,modul,width/2])
|
|
rotate([90,0,0])
|
|
cylinder(h=profile*1.25+modul*2.25, d=profile*1.5, center=false);
|
|
}
|
|
if (head=="C"){
|
|
translate([i*offset,modul,width/2])
|
|
rotate([90,0,0])
|
|
cylinder(h=height+modul, d=profile, center=false);
|
|
translate([i*offset,modul,width/2])
|
|
rotate([90,0,0])
|
|
cylinder(h=modul*2.25, d=profile*2, center=false);
|
|
translate([i*offset,-modul*1.25,width/2])
|
|
rotate([90,0,0])
|
|
cylinder (h=profile/2, d1=profile*2, d2=profile, center=false);
|
|
}
|
|
if (head=="RC"){
|
|
translate([i*offset,modul,width/2])
|
|
rotate([90,0,0])
|
|
cylinder(h=height+modul, d=profile, center=false);
|
|
translate([i*offset,modul,width/2])
|
|
rotate([90,0,0])
|
|
cylinder(h=modul*2.25+profile/4, d=profile*2, center=false);
|
|
translate([i*offset,-modul*1.25-profile/4,width/2])
|
|
rotate([90,0,0])
|
|
cylinder (h=profile/2, d1=profile*2, d2=profile, center=false);
|
|
}
|
|
if (head=="CSS"){
|
|
translate([i*offset,modul,width/2])
|
|
rotate([90,0,0])
|
|
cylinder(h=height+modul, d=profile, center=false);
|
|
translate([i*offset,modul,width/2])
|
|
rotate([90,0,0])
|
|
cylinder(h=modul*2.25, d=profile*2, center=false);
|
|
translate([i*offset,-modul*1.25,width/2])
|
|
rotate([90,0,0])
|
|
cylinder (h=profile*0.6, d1=profile*2, d2=profile, center=false);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/* Spur gear
|
|
modul = Height of the Tooth Tip beyond the Pitch Circle
|
|
tooth_number = Number of Gear Teeth
|
|
width = tooth_width
|
|
bore = Diameter of the Center Hole
|
|
pressure_angle = Pressure Angle, Standard = 20° according to DIN 867. Should not exceed 45°.
|
|
helix_angle = Helix Angle to the Axis of Rotation; 0° = Spur Teeth
|
|
optimized = Create holes for Material-/Weight-Saving or Surface Enhancements where Geometry allows */
|
|
module spur_gear(modul, tooth_number, width, bore, pressure_angle = 20, helix_angle = 0, optimized = true, no_bore=false) {
|
|
|
|
// Dimension Calculations
|
|
d = modul * tooth_number; // Pitch Circle Diameter
|
|
r = d / 2; // Pitch Circle Radius
|
|
alpha_spur = atan(tan(pressure_angle)/cos(helix_angle));// Helix Angle in Transverse Section
|
|
db = d * cos(alpha_spur); // Base Circle Diameter
|
|
rb = db / 2; // Base Circle Radius
|
|
da = (modul <1)? d + modul * 2.2 : d + modul * 2; // Tip Diameter according to DIN 58400 or DIN 867
|
|
ra = da / 2; // Tip Circle Radius
|
|
c = (tooth_number <3)? 0 : modul/6; // Tip Clearance
|
|
df = d - 2 * (modul + c); // Root Circle Diameter
|
|
rf = df / 2; // Root Radius
|
|
rho_ra = acos(rb/ra); // Maximum Rolling Angle;
|
|
// Involute begins on the Base Circle and ends at the Tip Circle
|
|
rho_r = acos(rb/r); // Rolling Angle at Pitch Circle;
|
|
// Involute begins on the Base Circle and ends at the Tip Circle
|
|
phi_r = grad(tan(rho_r)-radian(rho_r)); // Angle to Point of Involute on Pitch Circle
|
|
gamma = rad*width/(r*tan(90-helix_angle)); // Torsion Angle for Extrusion
|
|
step = rho_ra/16; // Involute is divided into 16 pieces
|
|
tau = 360/tooth_number; // Pitch Angle
|
|
|
|
r_hole = (2*rf - bore)/8; // Radius of Holes for Material-/Weight-Saving
|
|
rm = bore/2+2*r_hole; // Distance of the Axes of the Holes from the Main Axis
|
|
z_hole = floor(2*pi*rm/(3*r_hole)); // Number of Holes for Material-/Weight-Saving
|
|
|
|
optimized = (optimized && r >= width*1.5 && d > 2*bore); // is Optimization useful?
|
|
|
|
// Drawing
|
|
union(){
|
|
rotate([0,0,-phi_r-90*(1-clearance)/tooth_number]){ // Center Tooth on X-Axis;
|
|
// Makes Alignment with other Gears easier
|
|
|
|
linear_extrude(height = width, convexity = 10, twist = gamma){
|
|
difference(){
|
|
union(){
|
|
tooth_width = (180*(1-clearance))/tooth_number+2*phi_r;
|
|
circle(rf); // Root Circle
|
|
for (rot = [0:tau:360]){
|
|
rotate (rot){ // Copy and Rotate "Number of Teeth"
|
|
polygon(concat( // Tooth
|
|
[[0,0]], // Tooth Segment starts and ends at Origin
|
|
[for (rho = [0:step:rho_ra]) // From zero Degrees (Base Circle)
|
|
// To Maximum Involute Angle (Tip Circle)
|
|
polar_to_cartesian(ev(rb,rho))], // First Involute Flank
|
|
|
|
[polar_to_cartesian(ev(rb,rho_ra))], // Point of Involute on Tip Circle
|
|
|
|
[for (rho = [rho_ra:-step:0]) // of Maximum Involute Angle (Tip Circle)
|
|
// to zero Degrees (Base Circle)
|
|
polar_to_cartesian([ev(rb,rho)[0], tooth_width-ev(rb,rho)[1]])]
|
|
// Second Involute Flank
|
|
// (180*(1-clearance)) instead of 180 Degrees,
|
|
// to allow clearance of the Flanks
|
|
)
|
|
);
|
|
}
|
|
}
|
|
}
|
|
circle(r = rm+r_hole*1.49); // "bore"
|
|
}
|
|
}
|
|
}
|
|
// with Material Savings
|
|
if (optimized) {
|
|
linear_extrude(height = width, convexity = 10){
|
|
if(no_bore){
|
|
circle(r = (bore+r_hole)/2);
|
|
}else{
|
|
difference(){
|
|
circle(r = (bore+r_hole)/2);
|
|
circle(r = bore/2); // bore
|
|
}
|
|
}
|
|
}
|
|
linear_extrude(height = (width-r_hole/2 < width*2/3) ? width*2/3 : width-r_hole/2, convexity = 10){
|
|
difference(){
|
|
circle(r=rm+r_hole*1.51);
|
|
union(){
|
|
circle(r=(bore+r_hole)/2);
|
|
for (i = [0:1:z_hole]){
|
|
translate(sphere_to_cartesian([rm,90,i*360/z_hole]))
|
|
circle(r = r_hole);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
// without Material Savings
|
|
else {
|
|
linear_extrude(height = width, convexity = 10){
|
|
difference(){
|
|
circle(r = rm+r_hole*1.51);
|
|
circle(r = bore/2);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/* Herringbone_rack; uses the module "rack"
|
|
modul = Height of the Tooth Tip above the Rolling LIne
|
|
length = Length of the Rack
|
|
height = Height of the Rack to the Pitch Line
|
|
width = Width of a Tooth
|
|
pressure_angle = Pressure Angle, Standard = 20° according to DIN 867. Should not exceed 45°.
|
|
helix_angle = Helix Angle of the Rack Transverse Axis; 0° = Spur Teeth */
|
|
module herringbone_rack(modul, length, height, width, pressure_angle = 20, helix_angle) {
|
|
width = width/2;
|
|
translate([0,0,width]){
|
|
union(){
|
|
rack(modul, length, height, width, pressure_angle, helix_angle); // bottom Half
|
|
mirror([0,0,1]){
|
|
rack(modul, length, height, width, pressure_angle, helix_angle); // top Half
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/* Mountable_herringbone_rack; uses module "herringbone_rack"
|
|
modul = Height of the Tooth Tip above the Rolling LIne
|
|
length = Length of the Rack
|
|
height = Height of the Rack to the Pitch Line
|
|
width = Width of a Tooth
|
|
pressure_angle = Pressure Angle, Standard = 20° according to DIN 867. Should not exceed 45°.
|
|
helix_angle = Helix Angle of the Rack Transverse Axis; 0° = Spur Teeth
|
|
fastners = Total number of fastners.
|
|
profile = Metric standard profile for fastners (ISO machine screws), M4 = 4, M6 = 6 etc.
|
|
|
|
head = Style of fastner to accomodate.
|
|
PH = Pan Head, C = Countersunk, RC = Raised Countersunk, CS = Cap Screw, CSS = Countersunk Socket Screw. */
|
|
module mountable_herringbone_rack(modul, length, height, width, pressure_angle, helix_angle, fastners, profile, head) {
|
|
difference(){
|
|
herringbone_rack(modul, length, height, width, pressure_angle, helix_angle);
|
|
offset = (length/fastners);
|
|
translate([-length/2+(offset/2),0,0])
|
|
for(i = [0:fastners-1]){
|
|
if (head=="PH"){
|
|
translate([i*offset,modul,width/2])
|
|
rotate([90,0,0])
|
|
cylinder(h=height+modul, d=profile, center=false);
|
|
translate([i*offset,modul,width/2])
|
|
rotate([90,0,0])
|
|
cylinder(h=profile*0.6+modul*2.25, d=profile*2, center=false);
|
|
}
|
|
if (head=="CS"){
|
|
translate([i*offset,modul,width/2])
|
|
rotate([90,0,0])
|
|
cylinder(h=height+modul, d=profile, center=false);
|
|
translate([i*offset,modul,width/2])
|
|
rotate([90,0,0])
|
|
cylinder(h=profile*1.25+modul*2.25, d=profile*1.5, center=false);
|
|
}
|
|
if (head=="C"){
|
|
translate([i*offset,modul,width/2])
|
|
rotate([90,0,0])
|
|
cylinder(h=height+modul, d=profile, center=false);
|
|
translate([i*offset,modul,width/2])
|
|
rotate([90,0,0])
|
|
cylinder(h=modul*2.25, d=profile*2, center=false);
|
|
translate([i*offset,-modul*1.25,width/2])
|
|
rotate([90,0,0])
|
|
cylinder (h=profile/2, d1=profile*2, d2=profile, center=false);
|
|
}
|
|
if (head=="RC"){
|
|
translate([i*offset,modul,width/2])
|
|
rotate([90,0,0])
|
|
cylinder(h=height+modul, d=profile, center=false);
|
|
translate([i*offset,modul,width/2])
|
|
rotate([90,0,0])
|
|
cylinder(h=modul*2.25+profile/4, d=profile*2, center=false);
|
|
translate([i*offset,-modul*1.25-profile/4,width/2])
|
|
rotate([90,0,0])
|
|
cylinder (h=profile/2, d1=profile*2, d2=profile, center=false);
|
|
}
|
|
if (head=="CSS"){
|
|
translate([i*offset,modul,width/2])
|
|
rotate([90,0,0])
|
|
cylinder(h=height+modul, d=profile, center=false);
|
|
translate([i*offset,modul,width/2])
|
|
rotate([90,0,0])
|
|
cylinder(h=modul*2.25, d=profile*2, center=false);
|
|
translate([i*offset,-modul*1.25,width/2])
|
|
rotate([90,0,0])
|
|
cylinder (h=profile*0.6, d1=profile*2, d2=profile, center=false);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/* Herringbone_gear; uses the module "spur_gear"
|
|
modul = Height of the Tooth Tip beyond the Pitch Circle
|
|
tooth_number = Number of Gear Teeth
|
|
width = tooth_width
|
|
bore = Diameter of the Center Hole
|
|
pressure_angle = Pressure Angle, Standard = 20° according to DIN 867. Should not exceed 45°.
|
|
helix_angle = Helix Angle to the Axis of Rotation, Standard = 0° (Spur Teeth)
|
|
optimized = Holes for Material-/Weight-Saving */
|
|
module herringbone_gear(modul, tooth_number, width, bore, pressure_angle = 20, helix_angle=0, optimized=true){
|
|
|
|
width = width/2;
|
|
d = modul * tooth_number; // Pitch Circle Diameter
|
|
r = d / 2; // Pitch Circle Radius
|
|
c = (tooth_number <3)? 0 : modul/6; // Tip Clearance
|
|
|
|
df = d - 2 * (modul + c); // Root Circle Diameter
|
|
rf = df / 2; // Root Radius
|
|
|
|
r_hole = (2*rf - bore)/8; // Radius of Holes for Material-/Weight-Saving
|
|
rm = bore/2+2*r_hole; // Distance of the Axes of the Holes from the Main Axis
|
|
z_hole = floor(2*pi*rm/(3*r_hole)); // Number of Holes for Material-/Weight-Saving
|
|
|
|
optimized = (optimized && r >= width*3 && d > 2*bore); // is Optimization useful?
|
|
|
|
translate([0,0,width]){
|
|
union(){
|
|
spur_gear(modul, tooth_number, width, 2*(rm+r_hole*1.49), pressure_angle, helix_angle, false); // bottom Half
|
|
mirror([0,0,1]){
|
|
spur_gear(modul, tooth_number, width, 2*(rm+r_hole*1.49), pressure_angle, helix_angle, false); // top Half
|
|
}
|
|
}
|
|
}
|
|
// with Material Savings
|
|
if (optimized) {
|
|
linear_extrude(height = width*2){
|
|
difference(){
|
|
circle(r = (bore+r_hole)/2);
|
|
circle(r = bore/2); // bore
|
|
}
|
|
}
|
|
linear_extrude(height = (2*width-r_hole/2 < 1.33*width) ? 1.33*width : 2*width-r_hole/2){ //width*4/3
|
|
difference(){
|
|
circle(r=rm+r_hole*1.51);
|
|
union(){
|
|
circle(r=(bore+r_hole)/2);
|
|
for (i = [0:1:z_hole]){
|
|
translate(sphere_to_cartesian([rm,90,i*360/z_hole]))
|
|
circle(r = r_hole);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
// without Material Savings
|
|
else {
|
|
linear_extrude(height = width*2){
|
|
difference(){
|
|
circle(r = rm+r_hole*1.51);
|
|
circle(r = bore/2);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/* Rack and Pinion
|
|
modul = Height of the Tooth Tip beyond the Pitch Circle
|
|
rack_length = Length of the Rack
|
|
gear_teeth = Number of Gear Teeth
|
|
rack_height = Height of the Rack to the Pitch Line
|
|
gear_bore = Diameter of the Center Hole of the Spur Gear
|
|
width = Width of a Tooth
|
|
pressure_angle = Pressure Angle, Standard = 20° according to DIN 867. Should not exceed 45°.
|
|
helix_angle = Helix Angle to the Axis of Rotation, Standard = 0° (Spur Teeth) */
|
|
module rack_and_pinion (modul, rack_length, gear_teeth, rack_height, gear_bore, width, pressure_angle=20, helix_angle=0, together_built=true, optimized=true) {
|
|
|
|
distance = together_built? modul*gear_teeth/2 : modul*gear_teeth;
|
|
|
|
rack(modul, rack_length, rack_height, width, pressure_angle, -helix_angle);
|
|
translate([0,distance,0])
|
|
rotate(a=360/gear_teeth)
|
|
spur_gear (modul, gear_teeth, width, gear_bore, pressure_angle, helix_angle, optimized);
|
|
}
|
|
|
|
/* Ring gear
|
|
modul = Height of the Tooth Tip beyond the Pitch Circle
|
|
tooth_number = Number of Gear Teeth
|
|
width = tooth_width
|
|
rim_width = Width of the Rim from the Root Circle
|
|
bore = Diameter of the Center Hole
|
|
pressure_angle = Pressure Angle, Standard = 20° according to DIN 867. Should not exceed 45°.
|
|
helix_angle = Helix Angle to the Axis of Rotation, Standard = 0° (Spur Teeth) */
|
|
module ring_gear(modul, tooth_number, width, rim_width, pressure_angle = 20, helix_angle = 0) {
|
|
|
|
// Dimension Calculations
|
|
ha = (tooth_number >= 20) ? 0.02 * atan((tooth_number/15)/pi) : 0.6; // Shortening Factor of Tooth Head Height
|
|
d = modul * tooth_number; // Pitch Circle Diameter
|
|
r = d / 2; // Pitch Circle Radius
|
|
alpha_spur = atan(tan(pressure_angle)/cos(helix_angle));// Helix Angle in Transverse Section
|
|
db = d * cos(alpha_spur); // Base Circle Diameter
|
|
rb = db / 2; // Base Circle Radius
|
|
c = modul / 6; // Tip Clearance
|
|
da = (modul <1)? d + (modul+c) * 2.2 : d + (modul+c) * 2; // Tip Diameter
|
|
ra = da / 2; // Tip Circle Radius
|
|
df = d - 2 * modul * ha; // Root Circle Diameter
|
|
rf = df / 2; // Root Radius
|
|
rho_ra = acos(rb/ra); // Maximum Involute Angle;
|
|
// Involute begins on the Base Circle and ends at the Tip Circle
|
|
rho_r = acos(rb/r); // Involute Angle at Pitch Circle;
|
|
// Involute begins on the Base Circle and ends at the Tip Circle
|
|
phi_r = grad(tan(rho_r)-radian(rho_r)); // Angle to Point of Involute on Pitch Circle
|
|
gamma = rad*width/(r*tan(90-helix_angle)); // Torsion Angle for Extrusion
|
|
step = rho_ra/16; // Involute is divided into 16 pieces
|
|
tau = 360/tooth_number; // Pitch Angle
|
|
|
|
// Drawing
|
|
rotate([0,0,-phi_r-90*(1+clearance)/tooth_number]) // Center Tooth on X-Axis;
|
|
// Makes Alignment with other Gears easier
|
|
linear_extrude(height = width, twist = gamma){
|
|
difference(){
|
|
circle(r = ra + rim_width); // Outer Circle
|
|
union(){
|
|
tooth_width = (180*(1+clearance))/tooth_number+2*phi_r;
|
|
circle(rf); // Root Circle
|
|
for (rot = [0:tau:360]){
|
|
rotate (rot) { // Copy and Rotate "Number of Teeth"
|
|
polygon( concat(
|
|
[[0,0]],
|
|
[for (rho = [0:step:rho_ra]) // From zero Degrees (Base Circle)
|
|
// to Maximum Involute Angle (Tip Circle)
|
|
polar_to_cartesian(ev(rb,rho))],
|
|
[polar_to_cartesian(ev(rb,rho_ra))],
|
|
[for (rho = [rho_ra:-step:0]) // von Maximum Involute Angle (Kopfkreis)
|
|
// to zero Degrees (Base Circle)
|
|
polar_to_cartesian([ev(rb,rho)[0], tooth_width-ev(rb,rho)[1]])]
|
|
// (180*(1+clearance)) statt 180,
|
|
// to allow clearance of the Flanks
|
|
)
|
|
);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
echo("Ring Gear Outer Diamater = ", 2*(ra + rim_width));
|
|
|
|
}
|
|
|
|
/* Herringbone Ring Gear; uses the Module "ring_gear"
|
|
modul = Height of the Tooth Tip over the Partial Cone
|
|
tooth_number = Number of Gear Teeth
|
|
width = tooth_width
|
|
bore = Diameter of the Center Hole
|
|
pressure_angle = Pressure Angle, Standard = 20° according to DIN 867. Should not exceed 45°.
|
|
helix_angle = Helix Angle to the Axis of Rotation, Standard = 0° (Spur Teeth) */
|
|
module herringbone_ring_gear(modul, tooth_number, width, rim_width, pressure_angle = 20, helix_angle = 0) {
|
|
|
|
width = width / 2;
|
|
translate([0,0,width])
|
|
union(){
|
|
ring_gear(modul, tooth_number, width, rim_width, pressure_angle, helix_angle); // bottom Half
|
|
mirror([0,0,1])
|
|
ring_gear(modul, tooth_number, width, rim_width, pressure_angle, helix_angle); // top Half
|
|
}
|
|
}
|
|
|
|
/* Planetary Gear; uses the Modules "herringbone_gear" and "herringbone_ring_gear"
|
|
modul = Height of the Tooth Tip over the Partial Cone
|
|
sun_teeth = Number of Teeth of the Sun Gear
|
|
planet_teeth = Number of Teeth of a Planet Gear
|
|
number_planets = Number of Planet Gears. If null, the Function will calculate the Minimum Number
|
|
width = tooth_width
|
|
rim_width = Width of the Rim from the Root Circle
|
|
bore = Diameter of the Center Hole
|
|
pressure_angle = Pressure Angle, Standard = 20° according to DIN 867. Should not exceed 45°.
|
|
helix_angle = Helix Angle to the Axis of Rotation, Standard = 0° (Spur Teeth)
|
|
together_built =
|
|
optimized = Create holes for Material-/Weight-Saving or Surface Enhancements where Geometry allows
|
|
together_built = Components assembled for Construction or separated for 3D-Printing */
|
|
module planetary_gear(modul, sun_teeth, planet_teeth, number_planets, width, rim_width, bore, pressure_angle=20, helix_angle=0, together_built=true, optimized=true){
|
|
|
|
// Dimension Calculations
|
|
d_sun = modul*sun_teeth; // Sun Pitch Circle Diameter
|
|
d_planet = modul*planet_teeth; // Planet Pitch Circle Diameter
|
|
center_distance = modul*(sun_teeth + planet_teeth) / 2; // Distance from Sun- or Ring-Gear Axis to Planet Axis
|
|
ring_teeth = sun_teeth + 2*planet_teeth; // Number of Teeth of the Ring Gear
|
|
d_ring = modul*ring_teeth; // Ring Pitch Circle Diameter
|
|
|
|
rotate = is_even(planet_teeth); // Does the Sun Gear need to be rotated?
|
|
|
|
n_max = floor(180/asin(modul*(planet_teeth)/(modul*(sun_teeth + planet_teeth))));
|
|
// Number of Planet Gears: at most as many as possible without overlap
|
|
|
|
// Drawing
|
|
rotate([0,0,180/sun_teeth*rotate]){
|
|
herringbone_gear (modul, sun_teeth, width, bore, pressure_angle, -helix_angle, optimized); // Sun Gear
|
|
}
|
|
|
|
if (together_built){
|
|
if(number_planets==0){
|
|
list = [ for (n=[2 : 1 : n_max]) if ((((ring_teeth+sun_teeth)/n)==floor((ring_teeth+sun_teeth)/n))) n];
|
|
number_planets = list[0]; // Determine Number of Planet Gears
|
|
center_distance = modul*(sun_teeth + planet_teeth)/2; // Distance from Sun- / Ring-Gear Axis
|
|
for(n=[0:1:number_planets-1]){
|
|
translate(sphere_to_cartesian([center_distance,90,360/number_planets*n]))
|
|
rotate([0,0,n*360*d_sun/d_planet])
|
|
herringbone_gear (modul, planet_teeth, width, bore, pressure_angle, helix_angle); // Planet Gears
|
|
}
|
|
}
|
|
else{
|
|
center_distance = modul*(sun_teeth + planet_teeth)/2; // Distance from Sun- / Ring-Gear Axis
|
|
for(n=[0:1:number_planets-1]){
|
|
translate(sphere_to_cartesian([center_distance,90,360/number_planets*n]))
|
|
rotate([0,0,n*360*d_sun/(d_planet)])
|
|
herringbone_gear (modul, planet_teeth, width, bore, pressure_angle, helix_angle); // Planet Gears
|
|
}
|
|
}
|
|
}
|
|
else{
|
|
planet_distance = ring_teeth*modul/2+rim_width+d_planet; // Distance between Planets
|
|
for(i=[-(number_planets-1):2:(number_planets-1)]){
|
|
translate([planet_distance, d_planet*i,0])
|
|
herringbone_gear (modul, planet_teeth, width, bore, pressure_angle, helix_angle); // Planet Gears
|
|
}
|
|
}
|
|
|
|
herringbone_ring_gear (modul, ring_teeth, width, rim_width, pressure_angle, helix_angle); // Ring Gear
|
|
|
|
}
|
|
|
|
/* Bevel Gear
|
|
modul = Height of the Tooth Tip over the Partial Cone; Specification for the Outside of the Cone
|
|
tooth_number = Number of Gear Teeth
|
|
partial_cone_angle = (Half)angle of the Cone on which the other Ring Gear rolls
|
|
tooth_width = Width of the Teeth from the Outside toward the apex of the Cone
|
|
bore = Diameter of the Center Hole
|
|
pressure_angle = Pressure Angle, Standard = 20° according to DIN 867. Should not exceed 45°.
|
|
helix_angle = Helix Angle, Standard = 0° */
|
|
module bevel_gear(modul, tooth_number, partial_cone_angle, tooth_width, bore, pressure_angle = 20, helix_angle=0) {
|
|
|
|
// Dimension Calculations
|
|
d_outside = modul * tooth_number; // Part Cone Diameter at the Cone Base,
|
|
// corresponds to the Chord in a Spherical Section
|
|
r_outside = d_outside / 2; // Part Cone Radius at the Cone Base
|
|
rg_outside = r_outside/sin(partial_cone_angle); // Large-Cone Radius for Outside-Tooth, corresponds to the Length of the Cone-Flank;
|
|
rg_inside = rg_outside - tooth_width; // Large-Cone Radius for Inside-Tooth
|
|
r_inside = r_outside*rg_inside/rg_outside;
|
|
alpha_spur = atan(tan(pressure_angle)/cos(helix_angle));// Helix Angle in Transverse Section
|
|
delta_b = asin(cos(alpha_spur)*sin(partial_cone_angle)); // Base Cone Angle
|
|
da_outside = (modul <1)? d_outside + (modul * 2.2) * cos(partial_cone_angle): d_outside + modul * 2 * cos(partial_cone_angle);
|
|
ra_outside = da_outside / 2;
|
|
delta_a = asin(ra_outside/rg_outside);
|
|
c = modul / 6; // Tip Clearance
|
|
df_outside = d_outside - (modul +c) * 2 * cos(partial_cone_angle);
|
|
rf_outside = df_outside / 2;
|
|
delta_f = asin(rf_outside/rg_outside);
|
|
rkf = rg_outside*sin(delta_f); // Radius of the Cone Foot
|
|
height_f = rg_outside*cos(delta_f); // Height of the Cone from the Root Cone
|
|
|
|
echo("Part Cone Diameter at the Cone Base = ", d_outside);
|
|
|
|
// Sizes for Complementary Truncated Cone
|
|
height_k = (rg_outside-tooth_width)/cos(partial_cone_angle); // Height of the Complementary Cone for corrected Tooth Length
|
|
rk = (rg_outside-tooth_width)/sin(partial_cone_angle); // Foot Radius of the Complementary Cone
|
|
rfk = rk*height_k*tan(delta_f)/(rk+height_k*tan(delta_f)); // Tip Radius of the Cylinders for
|
|
// Complementary Truncated Cone
|
|
height_fk = rk*height_k/(height_k*tan(delta_f)+rk); // height of the Complementary Truncated Cones
|
|
|
|
echo("Bevel Gear Height = ", height_f-height_fk);
|
|
|
|
phi_r = sphere_ev(delta_b, partial_cone_angle); // Angle to Point of Involute on Partial Cone
|
|
|
|
// Torsion Angle gamma from Helix Angle
|
|
gamma_g = 2*atan(tooth_width*tan(helix_angle)/(2*rg_outside-tooth_width));
|
|
gamma = 2*asin(rg_outside/r_outside*sin(gamma_g/2));
|
|
|
|
step = (delta_a - delta_b)/16;
|
|
tau = 360/tooth_number; // Pitch Angle
|
|
start = (delta_b > delta_f) ? delta_b : delta_f;
|
|
mirrpoint = (180*(1-clearance))/tooth_number+2*phi_r;
|
|
|
|
// Drawing
|
|
rotate([0,0,phi_r+90*(1-clearance)/tooth_number]){ // Center Tooth on X-Axis;
|
|
// Makes Alignment with other Gears easier
|
|
translate([0,0,height_f]) rotate(a=[0,180,0]){
|
|
union(){
|
|
translate([0,0,height_f]) rotate(a=[0,180,0]){ // Truncated Cone
|
|
difference(){
|
|
linear_extrude(height=height_f-height_fk, scale=rfk/rkf) circle(rkf*1.001); // 1 permille Overlap with Tooth Root
|
|
translate([0,0,-1]){
|
|
cylinder(h = height_f-height_fk+2, r = bore/2); // bore
|
|
}
|
|
}
|
|
}
|
|
for (rot = [0:tau:360]){
|
|
rotate (rot) { // Copy and Rotate "Number of Teeth"
|
|
union(){
|
|
if (delta_b > delta_f){
|
|
// Tooth Root
|
|
flankpoint_under = 1*mirrpoint;
|
|
flankpoint_over = sphere_ev(delta_f, start);
|
|
polyhedron(
|
|
points = [
|
|
sphere_to_cartesian([rg_outside, start*1.001, flankpoint_under]), // 1 permille Overlap with Tooth
|
|
sphere_to_cartesian([rg_inside, start*1.001, flankpoint_under+gamma]),
|
|
sphere_to_cartesian([rg_inside, start*1.001, mirrpoint-flankpoint_under+gamma]),
|
|
sphere_to_cartesian([rg_outside, start*1.001, mirrpoint-flankpoint_under]),
|
|
sphere_to_cartesian([rg_outside, delta_f, flankpoint_under]),
|
|
sphere_to_cartesian([rg_inside, delta_f, flankpoint_under+gamma]),
|
|
sphere_to_cartesian([rg_inside, delta_f, mirrpoint-flankpoint_under+gamma]),
|
|
sphere_to_cartesian([rg_outside, delta_f, mirrpoint-flankpoint_under])
|
|
],
|
|
faces = [[0,1,2],[0,2,3],[0,4,1],[1,4,5],[1,5,2],[2,5,6],[2,6,3],[3,6,7],[0,3,7],[0,7,4],[4,6,5],[4,7,6]],
|
|
convexity =1
|
|
);
|
|
}
|
|
// Tooth
|
|
for (delta = [start:step:delta_a-step]){
|
|
flankpoint_under = sphere_ev(delta_b, delta);
|
|
flankpoint_over = sphere_ev(delta_b, delta+step);
|
|
polyhedron(
|
|
points = [
|
|
sphere_to_cartesian([rg_outside, delta, flankpoint_under]),
|
|
sphere_to_cartesian([rg_inside, delta, flankpoint_under+gamma]),
|
|
sphere_to_cartesian([rg_inside, delta, mirrpoint-flankpoint_under+gamma]),
|
|
sphere_to_cartesian([rg_outside, delta, mirrpoint-flankpoint_under]),
|
|
sphere_to_cartesian([rg_outside, delta+step, flankpoint_over]),
|
|
sphere_to_cartesian([rg_inside, delta+step, flankpoint_over+gamma]),
|
|
sphere_to_cartesian([rg_inside, delta+step, mirrpoint-flankpoint_over+gamma]),
|
|
sphere_to_cartesian([rg_outside, delta+step, mirrpoint-flankpoint_over])
|
|
],
|
|
faces = [[0,1,2],[0,2,3],[0,4,1],[1,4,5],[1,5,2],[2,5,6],[2,6,3],[3,6,7],[0,3,7],[0,7,4],[4,6,5],[4,7,6]],
|
|
convexity =1
|
|
);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/* Bevel Herringbone Gear; uses the Module "bevel_gear"
|
|
modul = Height of the Tooth Tip beyond the Pitch Circle
|
|
tooth_number = Number of Gear Teeth
|
|
partial_cone_angle, tooth_width
|
|
bore = Diameter of the Center Hole
|
|
pressure_angle = Pressure Angle, Standard = 20° according to DIN 867. Should not exceed 45°.
|
|
helix_angle = Helix Angle, Standard = 0° */
|
|
module bevel_herringbone_gear(modul, tooth_number, partial_cone_angle, tooth_width, bore, pressure_angle = 20, helix_angle=0){
|
|
|
|
// Dimension Calculations
|
|
|
|
tooth_width = tooth_width / 2;
|
|
|
|
d_outside = modul * tooth_number; // Part Cone Diameter at the Cone Base,
|
|
// corresponds to the Chord in a Spherical Section
|
|
r_outside = d_outside / 2; // Part Cone Radius at the Cone Base
|
|
rg_outside = r_outside/sin(partial_cone_angle); // Large-Cone Radius, corresponds to the Length of the Cone-Flank;
|
|
c = modul / 6; // Tip Clearance
|
|
df_outside = d_outside - (modul +c) * 2 * cos(partial_cone_angle);
|
|
rf_outside = df_outside / 2;
|
|
delta_f = asin(rf_outside/rg_outside);
|
|
height_f = rg_outside*cos(delta_f); // Height of the Cone from the Root Cone
|
|
|
|
// Torsion Angle gamma from Helix Angle
|
|
gamma_g = 2*atan(tooth_width*tan(helix_angle)/(2*rg_outside-tooth_width));
|
|
gamma = 2*asin(rg_outside/r_outside*sin(gamma_g/2));
|
|
|
|
echo("Part Cone Diameter at the Cone Base = ", d_outside);
|
|
|
|
// Sizes for Complementary Truncated Cone
|
|
height_k = (rg_outside-tooth_width)/cos(partial_cone_angle); // Height of the Complementary Cone for corrected Tooth Length
|
|
rk = (rg_outside-tooth_width)/sin(partial_cone_angle); // Foot Radius of the Complementary Cone
|
|
rfk = rk*height_k*tan(delta_f)/(rk+height_k*tan(delta_f)); // Tip Radius of the Cylinders for
|
|
// Complementary Truncated Cone
|
|
height_fk = rk*height_k/(height_k*tan(delta_f)+rk); // height of the Complementary Truncated Cones
|
|
|
|
modul_inside = modul*(1-tooth_width/rg_outside);
|
|
|
|
union(){
|
|
bevel_gear(modul, tooth_number, partial_cone_angle, tooth_width, bore, pressure_angle, helix_angle); // bottom Half
|
|
translate([0,0,height_f-height_fk])
|
|
rotate(a=-gamma,v=[0,0,1])
|
|
bevel_gear(modul_inside, tooth_number, partial_cone_angle, tooth_width, bore, pressure_angle, -helix_angle); // top Half
|
|
}
|
|
}
|
|
|
|
/* Spiral Bevel Gear; uses the Module "bevel_gear"
|
|
modul = Height of the Tooth Tip beyond the Pitch Circle
|
|
tooth_number = Number of Gear Teeth
|
|
height = Height of Gear Teeth
|
|
bore = Diameter of the Center Hole
|
|
pressure_angle = Pressure Angle, Standard = 20° according to DIN 867. Should not exceed 45°.
|
|
helix_angle = Helix Angle, Standard = 0° */
|
|
module spiral_bevel_gear(modul, tooth_number, partial_cone_angle, tooth_width, bore, pressure_angle = 20, helix_angle=30){
|
|
|
|
steps = 16;
|
|
|
|
// Dimension Calculations
|
|
|
|
b = tooth_width / steps;
|
|
d_outside = modul * tooth_number; // Part Cone Diameter at the Cone Base,
|
|
// corresponds to the Chord in a Spherical Section
|
|
r_outside = d_outside / 2; // Part Cone Radius at the Cone Base
|
|
rg_outside = r_outside/sin(partial_cone_angle); // Large-Cone Radius, corresponds to the Length of the Cone-Flank;
|
|
rg_center = rg_outside-tooth_width/2;
|
|
|
|
echo("Part Cone Diameter at the Cone Base = ", d_outside);
|
|
|
|
a=tan(helix_angle)/rg_center;
|
|
|
|
union(){
|
|
for(i=[0:1:steps-1]){
|
|
r = rg_outside-i*b;
|
|
helix_angle = a*r;
|
|
modul_r = modul-b*i/rg_outside;
|
|
translate([0,0,b*cos(partial_cone_angle)*i])
|
|
|
|
rotate(a=-helix_angle*i,v=[0,0,1])
|
|
bevel_gear(modul_r, tooth_number, partial_cone_angle, b, bore, pressure_angle, helix_angle); // top Half
|
|
}
|
|
}
|
|
}
|
|
|
|
/* Bevel Gear Pair with any axis_angle; uses the Module "bevel_gear"
|
|
modul = Height of the Tooth Tip over the Partial Cone; Specification for the Outside of the Cone
|
|
gear_teeth = Number of Gear Teeth on the Gear
|
|
pinion_teeth = Number of Gear Teeth on the Pinion
|
|
axis_angle = Angle between the Axles of the Gear and Pinion
|
|
tooth_width = Width of the Teeth from the Outside toward the apex of the Cone
|
|
gear_bore = Diameter of the Center Hole of the Gear
|
|
pinion_bore = Diameter of the Center Bore of the Gear
|
|
pressure_angle = Pressure Angle, Standard = 20° according to DIN 867. Should not exceed 45°.
|
|
helix_angle = Helix Angle, Standard = 0°
|
|
together_built = Components assembled for Construction or separated for 3D-Printing */
|
|
module bevel_gear_pair(modul, gear_teeth, pinion_teeth, axis_angle=90, tooth_width, gear_bore, pinion_bore, pressure_angle=20, helix_angle=0, together_built=true){
|
|
|
|
// Dimension Calculations
|
|
r_gear = modul*gear_teeth/2; // Cone Radius of the Gear
|
|
delta_gear = atan(sin(axis_angle)/(pinion_teeth/gear_teeth+cos(axis_angle))); // Cone Angle of the Gear
|
|
delta_pinion = atan(sin(axis_angle)/(gear_teeth/pinion_teeth+cos(axis_angle)));// Cone Angle of the Pinion
|
|
rg = r_gear/sin(delta_gear); // Radius of the Large Sphere
|
|
c = modul / 6; // Tip Clearance
|
|
df_pinion = pi*rg*delta_pinion/90 - 2 * (modul + c); // Bevel Diameter on the Large Sphere
|
|
rf_pinion = df_pinion / 2; // Root Cone Radius on the Large Sphere
|
|
delta_f_pinion = rf_pinion/(pi*rg) * 180; // Tip Cone Angle
|
|
rkf_pinion = rg*sin(delta_f_pinion); // Radius of the Cone Foot
|
|
height_f_pinion = rg*cos(delta_f_pinion); // Height of the Cone from the Root Cone
|
|
|
|
echo("Cone Angle Gear = ", delta_gear);
|
|
echo("Cone Angle Pinion = ", delta_pinion);
|
|
|
|
df_gear = pi*rg*delta_gear/90 - 2 * (modul + c); // Bevel Diameter on the Large Sphere
|
|
rf_gear = df_gear / 2; // Root Cone Radius on the Large Sphere
|
|
delta_f_gear = rf_gear/(pi*rg) * 180; // Tip Cone Angle
|
|
rkf_gear = rg*sin(delta_f_gear); // Radius of the Cone Foot
|
|
height_f_gear = rg*cos(delta_f_gear); // Height of the Cone from the Root Cone
|
|
|
|
echo("Gear Height = ", height_f_gear);
|
|
echo("Pinion Height = ", height_f_pinion);
|
|
|
|
rotate = is_even(pinion_teeth);
|
|
|
|
// Drawing
|
|
// Rad
|
|
rotate([0,0,180*(1-clearance)/gear_teeth*rotate])
|
|
bevel_gear(modul, gear_teeth, delta_gear, tooth_width, gear_bore, pressure_angle, helix_angle);
|
|
|
|
// Ritzel
|
|
if (together_built)
|
|
translate([-height_f_pinion*cos(90-axis_angle),0,height_f_gear-height_f_pinion*sin(90-axis_angle)])
|
|
rotate([0,axis_angle,0])
|
|
bevel_gear(modul, pinion_teeth, delta_pinion, tooth_width, pinion_bore, pressure_angle, -helix_angle);
|
|
else
|
|
translate([rkf_pinion*2+modul+rkf_gear,0,0])
|
|
bevel_gear(modul, pinion_teeth, delta_pinion, tooth_width, pinion_bore, pressure_angle, -helix_angle);
|
|
}
|
|
|
|
/* Herringbone Bevel Gear Pair with arbitrary axis_angle; uses the Module "bevel_herringbone_gear"
|
|
modul = Height of the Tooth Tip over the Partial Cone; Specification for the Outside of the Cone
|
|
gear_teeth = Number of Gear Teeth on the Gear
|
|
pinion_teeth = Number of Gear Teeth on the Pinion
|
|
axis_angle = Angle between the Axles of the Gear and Pinion
|
|
tooth_width = Width of the Teeth from the Outside toward the apex of the Cone
|
|
gear_bore = Diameter of the Center Hole of the Gear
|
|
pinion_bore = Diameter of the Center Bore of the Gear
|
|
pressure_angle = Pressure Angle, Standard = 20° according to DIN 867. Should not exceed 45°.
|
|
helix_angle = Helix Angle, Standard = 0°
|
|
together_built = Components assembled for Construction or separated for 3D-Printing */
|
|
module bevel_herringbone_gear_pair(modul, gear_teeth, pinion_teeth, axis_angle=90, tooth_width, gear_bore, pinion_bore, pressure_angle = 20, helix_angle=10, together_built=true){
|
|
|
|
r_gear = modul*gear_teeth/2; // Cone Radius of the Gear
|
|
delta_gear = atan(sin(axis_angle)/(pinion_teeth/gear_teeth+cos(axis_angle))); // Cone Angle of the Gear
|
|
delta_pinion = atan(sin(axis_angle)/(gear_teeth/pinion_teeth+cos(axis_angle)));// Cone Angle of the Pinion
|
|
rg = r_gear/sin(delta_gear); // Radius of the Large Sphere
|
|
c = modul / 6; // Tip Clearance
|
|
df_pinion = pi*rg*delta_pinion/90 - 2 * (modul + c); // Bevel Diameter on the Large Sphere
|
|
rf_pinion = df_pinion / 2; // Root Cone Radius on the Large Sphere
|
|
delta_f_pinion = rf_pinion/(pi*rg) * 180; // Tip Cone Angle
|
|
rkf_pinion = rg*sin(delta_f_pinion); // Radius of the Cone Foot
|
|
height_f_pinion = rg*cos(delta_f_pinion); // Height of the Cone from the Root Cone
|
|
|
|
echo("Cone Angle Gear = ", delta_gear);
|
|
echo("Cone Angle Pinion = ", delta_pinion);
|
|
|
|
df_gear = pi*rg*delta_gear/90 - 2 * (modul + c); // Bevel Diameter on the Large Sphere
|
|
rf_gear = df_gear / 2; // Root Cone Radius on the Large Sphere
|
|
delta_f_gear = rf_gear/(pi*rg) * 180; // Tip Cone Angle
|
|
rkf_gear = rg*sin(delta_f_gear); // Radius of the Cone Foot
|
|
height_f_gear = rg*cos(delta_f_gear); // Height of the Cone from the Root Cone
|
|
|
|
echo("Gear Height = ", height_f_gear);
|
|
echo("Pinion Height = ", height_f_pinion);
|
|
|
|
rotate = is_even(pinion_teeth);
|
|
|
|
// Gear
|
|
rotate([0,0,180*(1-clearance)/gear_teeth*rotate])
|
|
bevel_herringbone_gear(modul, gear_teeth, delta_gear, tooth_width, gear_bore, pressure_angle, helix_angle);
|
|
|
|
// Pinion
|
|
if (together_built)
|
|
translate([-height_f_pinion*cos(90-axis_angle),0,height_f_gear-height_f_pinion*sin(90-axis_angle)])
|
|
rotate([0,axis_angle,0])
|
|
bevel_herringbone_gear(modul, pinion_teeth, delta_pinion, tooth_width, pinion_bore, pressure_angle, -helix_angle);
|
|
else
|
|
translate([rkf_pinion*2+modul+rkf_gear,0,0])
|
|
bevel_herringbone_gear(modul, pinion_teeth, delta_pinion, tooth_width, pinion_bore, pressure_angle, -helix_angle);
|
|
|
|
}
|
|
|
|
/*
|
|
Archimedean screw.
|
|
modul = Height of the Screw Head over the Part Cylinder
|
|
thread_starts = Number of Starts (Threads) of the Worm
|
|
length = Length of the Worm
|
|
bore = Diameter of the Center Hole
|
|
pressure_angle = Pressure Angle, Standard = 20° according to DIN 867. Should not exceed 45°.
|
|
lead_angle = Lead Angle of the Worm, corresponds to 90° minus Helix Angle. Positive Lead Angle = clockwise.
|
|
together_built = Components assembled for Construction or separated for 3D-Printing */
|
|
module worm(modul, thread_starts, length, bore, pressure_angle=20, lead_angle, together_built=true){
|
|
|
|
// Dimension Calculations
|
|
c = modul / 6; // Tip Clearance
|
|
r = modul*thread_starts/(2*sin(lead_angle)); // Part-Cylinder Radius
|
|
rf = r - modul - c; // Root-Cylinder Radius
|
|
a = modul*thread_starts/(90*tan(pressure_angle)); // Spiralparameter
|
|
tau_max = 180/thread_starts*tan(pressure_angle); // Angle from Foot to Tip in the Normal Plane
|
|
gamma = -rad*length/((rf+modul+c)*tan(lead_angle)); // Torsion Angle for Extrusion
|
|
|
|
step = tau_max/16;
|
|
|
|
// Drawing: Extrude with a Twist a Surface enclosed by two Archimedean Spirals
|
|
if (together_built) {
|
|
rotate([0,0,tau_max]){
|
|
linear_extrude(height = length, center = false, convexity = 10, twist = gamma){
|
|
difference(){
|
|
union(){
|
|
for(i=[0:1:thread_starts-1]){
|
|
polygon(
|
|
concat(
|
|
[[0,0]],
|
|
|
|
// rising Tooth Flank
|
|
[for (tau = [0:step:tau_max])
|
|
polar_to_cartesian([spiral(a, rf, tau), tau+i*(360/thread_starts)])],
|
|
|
|
// Tooth Tip
|
|
[for (tau = [tau_max:step:180/thread_starts])
|
|
polar_to_cartesian([spiral(a, rf, tau_max), tau+i*(360/thread_starts)])],
|
|
|
|
// descending Tooth Flank
|
|
[for (tau = [180/thread_starts:step:(180/thread_starts+tau_max)])
|
|
polar_to_cartesian([spiral(a, rf, 180/thread_starts+tau_max-tau), tau+i*(360/thread_starts)])]
|
|
)
|
|
);
|
|
}
|
|
circle(rf);
|
|
}
|
|
circle(bore/2); // Mittelbohrung
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
difference(){
|
|
union(){
|
|
translate([1,r*1.5,0]){
|
|
rotate([90,0,90])
|
|
worm(modul, thread_starts, length, bore, pressure_angle, lead_angle, together_built=true);
|
|
}
|
|
translate([length+1,-r*1.5,0]){
|
|
rotate([90,0,-90])
|
|
worm(modul, thread_starts, length, bore, pressure_angle, lead_angle, together_built=true);
|
|
}
|
|
}
|
|
translate([length/2+1,0,-(r+modul+1)/2]){
|
|
cube([length+2,3*r+2*(r+modul+1),r+modul+1], center = true);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/*
|
|
Calculates a worm wheel set. The worm wheel is an ordinary spur gear without globoidgeometry.
|
|
modul = Height of the screw head above the partial cylinder or the tooth head above the pitch circle
|
|
tooth_number = Number of wheel teeth
|
|
thread_starts = Number of gears (teeth) of the screw
|
|
width = tooth_width
|
|
length = Length of the Worm
|
|
worm_bore = Diameter of the Center Hole of the Worm
|
|
gear_bore = Diameter of the Center Hole of the Spur Gear
|
|
pressure_angle = Pressure Angle, Standard = 20° according to DIN 867. Should not exceed 45°.
|
|
lead_angle = Pitch angle of the worm corresponds to 90 ° bevel angle. Positive slope angle = clockwise.
|
|
optimized = Holes for material / weight savings
|
|
together_built = Components assembled for construction or apart for 3D printing */
|
|
module worm_gear(modul, tooth_number, thread_starts, width, length, worm_bore, gear_bore, pressure_angle=20, lead_angle, optimized=true, together_built=true, show_spur=1, show_worm=1){
|
|
|
|
c = modul / 6; // Tip Clearance
|
|
r_worm = modul*thread_starts/(2*sin(lead_angle)); // Worm Part-Cylinder Radius
|
|
r_gear = modul*tooth_number/2; // Spur Gear Part-Cone Radius
|
|
rf_worm = r_worm - modul - c; // Root-Cylinder Radius
|
|
gamma = -90*width*sin(lead_angle)/(pi*r_gear); // Spur Gear Rotation Angle
|
|
tooth_distance = modul*pi/cos(lead_angle); // Tooth Spacing in Transverse Section
|
|
x = is_even(thread_starts)? 0.5 : 1;
|
|
|
|
if (together_built) {
|
|
if(show_worm)
|
|
translate([r_worm,(ceil(length/(2*tooth_distance))-x)*tooth_distance,0])
|
|
rotate([90,180/thread_starts,0])
|
|
worm(modul, thread_starts, length, worm_bore, pressure_angle, lead_angle, together_built);
|
|
|
|
if(show_spur)
|
|
translate([-r_gear,0,-width/2])
|
|
rotate([0,0,gamma])
|
|
spur_gear (modul, tooth_number, width, gear_bore, pressure_angle, -lead_angle, optimized);
|
|
}
|
|
else {
|
|
if(show_worm)
|
|
worm(modul, thread_starts, length, worm_bore, pressure_angle, lead_angle, together_built);
|
|
|
|
if(show_spur)
|
|
translate([-2*r_gear,0,0])
|
|
spur_gear (modul, tooth_number, width, gear_bore, pressure_angle, -lead_angle, optimized);
|
|
}
|
|
}
|
|
|
|
//rack(modul=1, length=60, height=5, width=20, pressure_angle=20, helix_angle=0);
|
|
|
|
//mountable_rack(modul=1, length=60, height=5, width=20, pressure_angle=20, helix_angle=0, profile=3, head="PH",fastners=3);
|
|
|
|
//herringbone_rack(modul=1, length=60, height=5, width=20, pressure_angle=20, helix_angle=45);
|
|
|
|
//mountable_herringbone_rack(modul=1, length=60, height=5, width=20, pressure_angle=20, helix_angle=45, profile=3, head="PH",fastners=3);
|
|
|
|
//spur_gear (modul=1, tooth_number=30, width=5, bore=4, pressure_angle=20, helix_angle=20, optimized=true);
|
|
|
|
//herringbone_gear (modul=1, tooth_number=30, width=5, bore=4, pressure_angle=20, helix_angle=30, optimized=true);
|
|
|
|
//rack_and_pinion (modul=1, rack_length=50, gear_teeth=30, rack_height=4, gear_bore=4, width=5, pressure_angle=20, helix_angle=0, together_built=true, optimized=true);
|
|
|
|
ring_gear (modul=1, tooth_number=30, width=5, rim_width=3, pressure_angle=20, helix_angle=20);
|
|
|
|
//herringbone_ring_gear (modul=1, tooth_number=30, width=5, rim_width=3, pressure_angle=20, helix_angle=30);
|
|
|
|
//planetary_gear(modul=1, sun_teeth=16, planet_teeth=9, number_planets=5, width=5, rim_width=3, bore=4, pressure_angle=20, helix_angle=30, together_built=true, optimized=true);
|
|
|
|
//bevel_gear(modul=1, tooth_number=30, partial_cone_angle=45, tooth_width=5, bore=4, pressure_angle=20, helix_angle=20);
|
|
|
|
//bevel_herringbone_gear(modul=1, tooth_number=30, partial_cone_angle=45, tooth_width=5, bore=4, pressure_angle=20, helix_angle=30);
|
|
|
|
//bevel_gear_pair(modul=1, gear_teeth=30, pinion_teeth=11, axis_angle=100, tooth_width=5, gear_bore=4, pinion_bore=4, pressure_angle = 20, helix_angle=20, together_built=true);
|
|
|
|
//bevel_herringbone_gear_pair(modul=1, gear_teeth=30, pinion_teeth=11, axis_angle=100, tooth_width=5, gear_bore=4, pinion_bore=4, pressure_angle = 20, helix_angle=30, together_built=true);
|
|
|
|
//worm(modul=1, thread_starts=2, length=15, bore=4, pressure_angle=20, lead_angle=10, together_built=true);
|
|
|
|
//worm_gear(modul=1, tooth_number=30, thread_starts=2, width=8, length=20, worm_bore=4, gear_bore=4, pressure_angle=20, lead_angle=10, optimized=1, together_built=1, show_spur=1, show_worm=1);
|