1 changed files with 178 additions and 0 deletions
@ -0,0 +1,178 @@ |
|||
// Copyright 2010 D1plo1d |
|||
// LGPL 2.1 |
|||
|
|||
|
|||
//test_involute_curve(); |
|||
//test_gears(); |
|||
//demo_3d_gears(); |
|||
|
|||
// Geometry Sources: |
|||
// http://www.cartertools.com/involute.html |
|||
// gears.py (inkscape extension: /usr/share/inkscape/extensions/gears.py) |
|||
// Usage: |
|||
// Diametral pitch: Number of teeth per unit length. |
|||
// Circular pitch: Length of the arc from one tooth to the next |
|||
// Clearance: Radial distance between top of tooth on one gear to bottom of gap on another. |
|||
|
|||
module gear(number_of_teeth, |
|||
circular_pitch=false, diametral_pitch=false, |
|||
pressure_angle=20, clearance = 0) |
|||
{ |
|||
if (circular_pitch==false && diametral_pitch==false) echo("MCAD ERROR: gear module needs either a diametral_pitch or circular_pitch"); |
|||
|
|||
//Convert diametrial pitch to our native circular pitch |
|||
circular_pitch = (circular_pitch!=false?circular_pitch:180/diametral_pitch); |
|||
|
|||
// Pitch diameter: Diameter of pitch circle. |
|||
pitch_diameter = number_of_teeth * circular_pitch / 180; |
|||
pitch_radius = pitch_diameter/2; |
|||
|
|||
// Base Circle |
|||
base_diameter = pitch_diameter*cos(pressure_angle); |
|||
base_radius = base_diameter/2; |
|||
|
|||
// Diametrial pitch: Number of teeth per unit length. |
|||
pitch_diametrial = number_of_teeth / pitch_diameter; |
|||
|
|||
// Addendum: Radial distance from pitch circle to outside circle. |
|||
addendum = 1/pitch_diametrial; |
|||
|
|||
//Outer Circle |
|||
outer_radius = pitch_radius+addendum; |
|||
outer_diameter = outer_radius*2; |
|||
|
|||
// Dedendum: Radial distance from pitch circle to root diameter |
|||
dedendum = addendum + clearance; |
|||
|
|||
// Root diameter: Diameter of bottom of tooth spaces. |
|||
root_radius = pitch_radius-dedendum; |
|||
root_diameter = root_radius * 2; |
|||
|
|||
half_thick_angle = 360 / (4 * number_of_teeth); |
|||
|
|||
union() |
|||
{ |
|||
rotate(half_thick_angle) circle($fn=number_of_teeth*2, r=root_radius*1.001); |
|||
|
|||
for (i= [1:number_of_teeth]) |
|||
//for (i = [0]) |
|||
{ |
|||
rotate([0,0,i*360/number_of_teeth]) |
|||
{ |
|||
involute_gear_tooth( |
|||
pitch_radius = pitch_radius, |
|||
root_radius = root_radius, |
|||
base_radius = base_radius, |
|||
outer_radius = outer_radius, |
|||
half_thick_angle = half_thick_angle); |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
|
|||
module involute_gear_tooth( |
|||
pitch_radius, |
|||
root_radius, |
|||
base_radius, |
|||
outer_radius, |
|||
half_thick_angle |
|||
) |
|||
{ |
|||
pitch_to_base_angle = involute_intersect_angle( base_radius, pitch_radius ); |
|||
|
|||
outer_to_base_angle = involute_intersect_angle( base_radius, outer_radius ); |
|||
|
|||
base1 = 0 - pitch_to_base_angle - half_thick_angle; |
|||
pitch1 = 0 - half_thick_angle; |
|||
outer1 = outer_to_base_angle - pitch_to_base_angle - half_thick_angle; |
|||
|
|||
b1 = polar_to_cartesian([ base1, base_radius ]); |
|||
p1 = polar_to_cartesian([ pitch1, pitch_radius ]); |
|||
o1 = polar_to_cartesian([ outer1, outer_radius ]); |
|||
|
|||
b2 = polar_to_cartesian([ -base1, base_radius ]); |
|||
p2 = polar_to_cartesian([ -pitch1, pitch_radius ]); |
|||
o2 = polar_to_cartesian([ -outer1, outer_radius ]); |
|||
|
|||
// ( root_radius > base_radius variables ) |
|||
pitch_to_root_angle = pitch_to_base_angle - involute_intersect_angle(base_radius, root_radius ); |
|||
root1 = pitch1 - pitch_to_root_angle; |
|||
root2 = -pitch1 + pitch_to_root_angle; |
|||
r1_t = polar_to_cartesian([ root1, root_radius ]); |
|||
r2_t = polar_to_cartesian([ -root1, root_radius ]); |
|||
|
|||
// ( else ) |
|||
r1_f = polar_to_cartesian([ base1, root_radius ]); |
|||
r2_f = polar_to_cartesian([ -base1, root_radius ]); |
|||
|
|||
if (root_radius > base_radius) |
|||
{ |
|||
//echo("true"); |
|||
polygon( points = [ |
|||
r1_t,p1,o1,o2,p2,r2_t |
|||
], convexity = 3); |
|||
} |
|||
else |
|||
{ |
|||
polygon( points = [ |
|||
r1_f, b1,p1,o1,o2,p2,b2,r2_f |
|||
], convexity = 3); |
|||
} |
|||
|
|||
} |
|||
|
|||
// Mathematical Functions |
|||
//=============== |
|||
|
|||
// Finds the angle of the involute about the base radius at the given distance (radius) from it's center. |
|||
//source: http://www.mathhelpforum.com/math-help/geometry/136011-circle-involute-solving-y-any-given-x.html |
|||
|
|||
function involute_intersect_angle(base_radius, radius) = sqrt( pow(radius/base_radius,2) - 1); |
|||
|
|||
|
|||
|
|||
// Polar coord [angle, radius] to cartesian coord [x,y] |
|||
|
|||
function polar_to_cartesian(polar) = [ |
|||
polar[1]*cos(polar[0]), |
|||
polar[1]*sin(polar[0]) |
|||
]; |
|||
|
|||
|
|||
// Test Cases |
|||
//=============== |
|||
|
|||
module test_gears() |
|||
{ |
|||
gear(number_of_teeth=51,circular_pitch=200); |
|||
translate([0, 50])gear(number_of_teeth=17,circular_pitch=200); |
|||
translate([-50,0]) gear(number_of_teeth=17,diametral_pitch=1); |
|||
} |
|||
|
|||
module demo_3d_gears() |
|||
{ |
|||
//double helical gear |
|||
translate([50,0]) |
|||
{ |
|||
linear_extrude(height = 10, center = true, convexity = 10, twist = -45) |
|||
gear(number_of_teeth=17,diametral_pitch=1); |
|||
translate([0,0,10]) |
|||
rotate([0,180,180/17]) |
|||
linear_extrude(height = 10, center = true, convexity = 10, twist = 45) |
|||
gear(number_of_teeth=17,diametral_pitch=1); |
|||
} |
|||
|
|||
//spur gear |
|||
translate([0,-50]) linear_extrude(height = 10, center = true, convexity = 10, twist = 0) |
|||
gear(number_of_teeth=17,diametral_pitch=1); |
|||
|
|||
} |
|||
|
|||
module test_involute_curve() |
|||
{ |
|||
for (i=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]) |
|||
{ |
|||
translate(polar_to_cartesian([involute_intersect_angle( 0.1,i) , i ])) circle($fn=15, r=0.5); |
|||
} |
|||
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue