commit 1908bb66091d4c4d9588b4f39d9eb68013fd3fc3 Author: jayAitch256 Date: Tue Jul 6 12:40:15 2021 +0200 Add gear lib diff --git a/gears/LICENSE.txt b/gears/LICENSE.txt new file mode 100644 index 0000000..d47e863 --- /dev/null +++ b/gears/LICENSE.txt @@ -0,0 +1,3 @@ +Getriebe Bibliothek für OpenSCAD / Gears Library for OpenSCAD (https://www.thingiverse.com/thing:1604369) by janssen86 is licensed under the Creative Commons - Attribution - Non-Commercial - Share Alike license. +http://creativecommons.org/licenses/by-nc-sa/3.0/ + diff --git a/gears/README.md b/gears/README.md new file mode 100644 index 0000000..7f1f81b --- /dev/null +++ b/gears/README.md @@ -0,0 +1,283 @@ +OpenSCAD gear generator +======================= + +This is a fork of [this OpenSCAD gear generator](https://www.thingiverse.com/thing:1604369), translated into English. + +OpenSCAD Library for Gear Racks, Involute and Worm Gears + +A library for the parametric creation of gear racks, spur-, ring-, bevel- and worm gears, as well as of assemblies. + +Parametric Gear Rack +-------------------- + +Creates a gear rack. + +This script adjusts the pressure angle in the transverse section to the helix angle: e.g. with a 20° helix angle, a pressure angle of 20° becomes a pressure angle of 21.17° in the transverse section. + +Format: +zahnstange(modul, laenge, hoehe, breite, eingriffswinkel=20, schraegungswinkel=0) + +Parameters: +modul = height of the tooth above the pitch line +laenge = length of the rack +hoehe = height from bottom to the pitch line +breite = face width +eingriffswinkel = pressure angle, standard value = 20° according to DIN 867. Should not be greater than 45°. +schraegungswinkel = bevel angle perpendicular to the rack's length; 0° = straight teeth + + +

Parametric Involute Spur Gear

+ +Creates an involute spur gear without profile displacement following DIN 867 / DIN 58400. Two gears will mesh if their modules are the same and their helix angles opposite. The centre distance of two meshing gears A and B with module m and tooth numbers za and zb is +m/2·(za + zb) + +Helical gears run more smoothly than gears with straight teeth. However, they also create axial loads which the bearings must be designed to contain. Recommendations for the helix angle depending on the module can be found in DIN 3978. + +This script adjusts the pressure angle in the transverse section to the helix angle: e.g. with a 20° helix angle, a pressure angle of 20° becomes a pressure angle of 21.17° in the transverse section. + +
Format:
+stirnrad (modul, zahnzahl, breite, bohrung, eingriffswinkel=20, schraegungswinkel=0, optimiert=true) + +
Parameters:
+modul = gear module = height of the tooth above the pitch circle = 25.4 / diametrical pitch = circular pitch / π +zahnzahl = number of teeth +breite = face width +bohrung = central bore diameter +eingriffswinkel = pressure angle, standard value = 20° according to DIN 867 +schraegungswinkel = helix angle to the rotation axis; 0° = straight teeth +optimiert = if true, create holes for material/weight reduction resp. surface increase, if geometry allows + + +

Parametric Herringbone Involute Spur Gear

+ +Creates a herringbone spur gear without profile displacement. Two gears will mesh if their modules are the same and their helix angles opposite. The centre distance of two meshing gears with module m and tooth numbers za and zb is +m/2·(za + zb) + +Herringbone gears run more smoothly than gears with straight teeth. They also do not create torque on the axis like helical gears do. + +A helix angle, if used, should be set between between 30° and 45°. Recommendations for the helix angle depending on the module can be found in DIN 3978. + +This script adjusts the pressure angle in the transverse section to the helix angle: e.g. with a 30° helix angle, a pressure angle of 20° becomes a pressure angle of 22.80 in the transverse section. + +
Format:
+pfeilrad (modul, zahnzahl, breite, bohrung, eingriffswinkel=20, schraegungswinkel=0, optimiert=true) + +
Parameters:
+modul = gear module = height of the tooth above the pitch circle = 25.4 / diametrical pitch = circular pitch / π +zahnzahl = number of teeth +breite = face width +bohrung = central bore diameter +eingriffswinkel = pressure angle, standard value = 20° according to DIN 867 +schraegungswinkel = helix angle to the rotation axis; 0° = straight teeth +optimiert = if true, create holes for material/weight reduction resp. surface increase, if geometry allows + + +

Parametric Gear Rack and Pinion

+ +Creates a gear rack and pinion. + +Helical gears / bevelled racks run more smoothly than gears with straight teeth. However, they also create axial loads which the bearings must be designed to contain. Recommendations for the helix angle depending on the module can be found in DIN 3978. + +With a given module m and zp teeth on the pinion, the distance between the pinion's axis and the rack's pitch line is +m/2·zp + +This script adjusts the pressure angle in the transverse section to the helix angle: e.g. with a 20° helix angle, a pressure angle of 20° becomes a pressure angle of 21.17° in the transverse section. + +
Format:
+zahnstange(modul, laenge, hoehe, breite, eingriffswinkel=20, schraegungswinkel=0) + +
Parameters:
+modul = gear module = height of the tooth above the pitch line/pitch circle = 25.4 / diametrical pitch = circular pitch / π +laenge_stange = length of the rack +zahnzahl_ritzel = number of teeth on the pinion +hoehe_stange = height from bottom to the pitch line +bohrung_ritzel = central bore diameter of the pinion +breite = face width +eingriffswinkel = pressure angle, standard value = 20° according to DIN 867 +schraegungswinkel = bevel angle perpendicular to the rack's length resp. helix angle to the rotation axis on the pinion; 0° = straight teeth +zusammen_gebaut = assembled (true) or disassembled for printing (false) + + ++++ + +

Parametric Involute Ring Gear

+ +Creates a herringbone ring gear without profile displacement. Helical gears run more smoothly than gears with straight teeth. However, they also create axial loads which the bearings must be designed to contain. Recommendations for the helix angle depending on the module can be found in DIN 3978. + +This script adjusts the pressure angle in the transverse section to the helix angle: e.g. with a 20° helix angle, a pressure angle of 20° becomes a pressure angle of 21.17° in the transverse section. + +
Format:
+hohlrad(modul, zahnzahl, breite, randbreite, eingriffswinkel=20, schraegungswinkel=0) + +
Parameters:
+modul = gear module = height of the tooth above the pitch circle = 25.4 / diametrical pitch = circular pitch / π +zahnzahl = number of teeth +breite = face width +randbreite = width of the rim around the ring gear, measured from the root circle +bohrung = central bore diameter +eingriffswinkel = pressure angle, standard value = 20° according to DIN 867 +schraegungswinkel = helix angle to the rotation axis; 0° = straight teeth + + +

Parametric Herringbone Involute Ring Gear

+ +Creates a herringbone ring gear without profile displacement. A ring and spur gear mesh if they have the same module and opposite helix angels. Herringbone gears run more smoothly than gear with straight teeth. They also do not create axial load like helical gears do. + +A helix angle, if used, should be set between between 30° and 45°. Recommendations for the helix angle depending on the module can be found in DIN 3978. This script adjusts the pressure angle in the transverse section to the helix angle: e.g. with a 30° helix angle, a pressure angle of 20° becomes a pressure angle of 22.80° in the transverse section. + +
Format:
+pfeilhohlrad(modul, zahnzahl, breite, randbreite, eingriffswinkel=20, schraegungswinkel=0) + +
Parameters:
+modul = gear module = height of the tooth above the pitch circle = 25.4 / diametrical pitch = circular pitch / π +zahnzahl = number of teeth +breite = face width +randbreite = width of the rim around the ring gear, measured from the root circle +bohrung = central bore diameter +eingriffswinkel = pressure angle, standard value = 20° according to DIN 867 +schraegungswinkel = helix angle to the rotation axis; 0° = straight teeth + ++++ + +

Parametric Planetary Gear using Involute Tooth Geometry and Herringbone Shape

+ +This script calculates both the ring gear as well as, if required, the number and geometry of the planetary gears from the number of teeth on the sun and planets. For a module of m, zs teeth for the sun and zp teeth for the planets, the centre distance will be +m/2·(zs + zp) + +If the number of planets is set to zero (anzahl_planeten = 0) then the module will try and calculate them. + +For a module of m, zs teeth for the sun, zp teeth for the planets and a rim width of br, the outer diameter is m·(zs+2zp+2.333)+2br + +The helix angle should be between between 30° and 45°. Recommendations for the helix angle depending on the module can be found in DIN 3978. This script adjusts the pressure angle in the transverse section to the helix angle: e.g. with a 30° helix angle, a pressure angle 20° becomes a pressure angle of 22.80° in the transverse section. + +If no number of gears is given (anzahl_planeten = 0), then the script will attempt to calculate the least number of planet gears. + +To avoid the gears sticking in a 3D print, particularly sticking of the planet gears to the ring gear, the gears can be printed in disassembled layout (zusammen gebaut = false). In that case, please note that herringbone teeth complicate the re-assembly. Experience shows that reassembly is still possible at 30°; however in case of reassembly problems, a lesser helix angle should be selected. Of course, one could always choose straight teeth (Schraegungswinkel = 0). + +The gears can also be kept from sticking by a sufficiently large clearance ("Spiel"); a sufficient clearance also avoids meshing problems. Clearance can be left smaller if the 3D printer offers good resolution, however experience shows that it should not be less than 5%. + +
Format:
+planetengetriebe(modul, zahnzahl_sonne, zahnzahl_planet, breite, randbreite, bohrung, eingriffswinkel=20, schraegungswinkel=0, zusammen_gebaut=true, optimiert=true) + +
Parameters:
+spiel = clearance between teeth as a fraction of their width (0 = no clearance) +modul = gear module = height of the tooth above the pitch circle = 25.4 / diametrical pitch = circular pitch / π +zahnzahl_sonne = number of teeth on the sun gear +zahnzahl_planet = number of teeth per planet gear +anzahl_planeten = number of planet gears; if set to zero, the script will attempt to calculate the least number of planet gears +breite = face width +randbreite = width of the rim around the ring gear, measured from the root circle +bohrung = central bore diameter +eingriffswinkel = pressure angle, standard value = 20° according to DIN 867 +schraegungswinkel = helix angle to the rotation axis; 0° = straight teeth +zusammen_gebaut = components assembled for construction (true) or disassembled (false) for 3D printing +optimiert = if true, create holes for material/weight reduction resp. surface increase, if geometry allows + ++++ + +

Parametric Herringbone Bevel Gear with Spherical Involute Geometry

+ +This script creates a herringbone bevel gear with spherical involute teeth geometry. Two gears will mesh if their modules are the same and their helix angles opposite. Herringbone gears run more smoothly than gear with straight teeth. They also do not create axial load like helical gears do. Recommendations for the helix angle depending on the module can be found in DIN 3978. + +This script adjusts the pressure angle in the transverse section to the helix angle: e.g. with a 30° helix angle, a pressure angle of 20° becomes a pressure angle of 22.80° in the transverse section. + +
Format:
+pfeilkegelrad(modul, zahnzahl, teilkegelwinkel, zahnbreite, bohrung, eingriffswinkel=20, schraegungswinkel=0) + +
Parameters:
+modul = gear module = height of the gear teeth above the pitch cone = 25.4 / diametrical pitch = circular pitch / π +zahnzahl = number of teeth +teilkegelwinkel = reference cone (half-)angle +zahnbreite = width of teeth from the rim in direction of the reference cone tip +bohrung = central bore diameter +eingriffswinkel = pressure angle, standard value = 20° according to DIN 867 +schraegungswinkel = helix angle between the teeth and the reference cone envelope line, 0° = straight teeth + ++++ + +

Parametric Pair of Bevel Gears

+ +This script calculates both the gear and the pinion of a bevel gear pair, using the gears' module and their numbers of teeth. The preset angle of 90° between the axes of both gears can be varied. It is possible to calculate the pair both assembled for design as well as disassembled for printing. + +
Format:
+kegelradpaar(modul, zahnzahl_rad, zahnzahl_ritzel, achsenwinkel=90, zahnbreite, bohrung, eingriffswinkel = 20, schraegungswinkel=0, zusammen_gebaut=true) + +
Parameters:
+modul = gear module = height of the gear teeth above the pitch cone = 25.4 / diametrical pitch = circular pitch / π +zahnzahl_rad = number of teeth on the gear +zahnzahl_ritzel = number of teeth on the pinion +achsenwinkel = angle between the axes of pinion and gear, standard value = 90° +zahnbreite = width of the teeth from the rim in direction of the cone tip +bohrung_rad = central bore diameter of the gear +bohrung_ritzel = central bore diameter of the pinion +eingriffswinkel = pressure angle, standard value = 20° according to DIN 867 +schraegungswinkel = helix angle between the teeth and the reference cone envelope line, 0° = straight teeth +zusammen_gebaut = assembled (true) oder disassembled for printing (false) + + ++++ + +

Parametric Pair of Herringbone Bevel Gears

+ +This script calculates both the gear and the pinion of a herringbone bevel gear pair, using the gears' module and their numbers of teeth. The preset angle of 90° between the axes of both gears can be varied. It is possible to calculate the pair both assembled for design as well as disassembled for printing. + +
Format:
+pfeilkegelradpaar(modul, zahnzahl_rad, zahnzsahl_ritzel, achsenwinkel=90, zahnbreite, bohrung, eingriffswinkel = 20, schraegungswinkel=0, zusammen_gebaut=true) + +
Parameters:
+modul = gear module = height of the gear teeth above the pitch cone = 25.4 / diametrical pitch = circular pitch / π +zahnzahl_rad = number of teeth on the gear +zahnzahl_ritzel = number of teeth on the pinion +achsenwinkel = angle between the axes of pinion and gear, standard value = 90° +zahnbreite = width of the teeth from the rim in direction of the cone tip +bohrung_rad = central bore diameter of the gear +bohrung_ritzel = central bore diameter of the pinion +eingriffswinkel = pressure angle, standard value = 20° according to DIN 867 +schraegungswinkel = helix angle between the teeth and the reference cone envelope line, 0° = straight teeth +zusammen_gebaut = assembled (true) or disassembled for printing (false) + ++++ + +

Parametric Worm

+ +Creates a cylidrical worm (archimedean spiral) following DIN 3975. + +The worm's pitch circle r can be calculated out of its module m, number of threads z and lead angle γ: + +r = m·z·1/2sinγ + +
Format:
+schnecke(modul, gangzahl, laenge, bohrung, eingriffswinkel=20, steigungswinkel=10, zusammen_gebaut=true) + +
Parameters:
+modul = height of the thread above the pitch circle +gangzahl = number of threads +laenge = length of the worm +bohrung = central bore diameter +eingriffswinkel = pressure angle, standard value = 20° according to DIN 867 +steigungswinkel = lead angle of worm. Positive lead angle = clockwise thread rotation +zusammen_gebaut = assembled (true) or disassembled for printing (false) + + ++++ + +

Worm Gear Set (Worm and Pinion)

+ +Creates a set of one worm gear and a pinion. The pinion is a normal spur gear without globoid geometry. + +
Format:
+module schneckenradsatz(modul, zahnzahl, gangzahl, breite, laenge, bohrung_schnecke, bohrung_rad, eingriffswinkel=20, steigungswinkel, optimiert=true, zusammen_gebaut=true) + +
Parameter:
+ +modul = gear module = and height of the gear teeth above th pitch circle / of the thread above the pitch circle +zahnzahl = number of teeth on the pinion +gangzahl = number of threads +breite = face width on the pinion +laenge = length of the worm +bohrung_schnecke = central bore diameter of the worm +bohrung_rad = central bore diameter of the pinion +eingriffswinkel = pressure angle, standard value = 20° according to DIN 867. Shouldn't be greater than 45° +steigungswinkel = lead angle of worm. Positive lead angle = clockwise thread rotation +optimiert = if true, create holes for material/weight reduction resp. surface increase, if geometry allows +zusammen_gebaut = assembled (true) or disassembled for printing (false) diff --git a/gears/gears.scad b/gears/gears.scad new file mode 100644 index 0000000..0850aa6 --- /dev/null +++ b/gears/gears.scad @@ -0,0 +1,1095 @@ +$fn = 50; + +/* 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) { + + // 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, 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){ + 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){ + 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){ + 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);