2017-08-30 00:00:16 +00:00
//////////////////////////////////////////////////////////////////////////////////////////////
2021-03-01 09:29:41 +00:00
// LibFile: gears.scad
// Spur Gears, Bevel Gears, Racks, Worms and Worm Gears.
2022-04-21 04:26:20 +00:00
// Inspired by code by Leemon Baird, 2011, Leemon@Leemon.com
2021-01-05 09:20:01 +00:00
// Includes:
2019-04-19 07:25:10 +00:00
// include <BOSL2/std.scad>
2021-03-01 09:29:41 +00:00
// include <BOSL2/gears.scad>
2021-12-13 23:48:30 +00:00
// FileGroup: Parts
// FileSummary: Gears, racks, worms, and worm gears.
2017-08-30 00:00:16 +00:00
//////////////////////////////////////////////////////////////////////////////////////////////
2023-07-15 23:06:30 +00:00
_GEAR_PITCH = 5 ;
_GEAR_HELICAL = 0 ;
_GEAR_THICKNESS = 10 ;
_GEAR_PA = 20 ;
$ parent_gear_type = undef ;
$ parent_gear_pitch = undef ;
$ parent_gear_teeth = undef ;
$ parent_gear_pa = undef ;
$ parent_gear_helical = undef ;
$ parent_gear_thickness = undef ;
$ parent_gear_dir = undef ;
$ parent_gear_travel = 0 ;
2023-07-17 06:10:27 +00:00
function _inherit_gear_param ( name , val , pval , dflt , invert = false ) =
2023-07-15 23:06:30 +00:00
is_undef ( val )
? is_undef ( pval )
? dflt
: ( invert ? - 1 : 1 ) * pval
: is_undef ( pval )
? assert ( is_finite ( val ) , str ( "Invalid " , name , " value: " , val ) )
val
: ( invert ? - 1 : 1 ) * val ;
2023-07-17 06:10:27 +00:00
function _inherit_gear_pitch ( pitch , circ_pitch , diam_pitch , mod ) =
pitch ! = undef ?
echo ( "WARNING: The use of the argument pitch= in gear code is deprecated. Please use circ_pitch= instead." )
assert ( is_finite ( pitch ) && pitch > 0 )
pitch :
circ_pitch ! = undef ?
assert ( is_finite ( circ_pitch ) && circ_pitch > 0 )
circ_pitch :
diam_pitch ! = undef ?
assert ( is_finite ( diam_pitch ) && diam_pitch > 0 )
pitch_value ( diam_pitch = diam_pitch ) :
mod ! = undef ?
assert ( is_finite ( mod ) && mod > 0 )
pitch_value ( mod ) :
$ parent_gear_pitch ! = undef ? $ parent_gear_pitch :
5 ;
function _inherit_gear_pa ( pressure_angle ) =
_inherit_gear_param ( "pressure_angle" , pressure_angle , $ parent_gear_pa , dflt = 20 ) ;
function _inherit_gear_helical ( helical , invert = false ) =
_inherit_gear_param ( "helical" , helical , $ parent_gear_helical , dflt = 0 , invert = invert ) ;
function _inherit_gear_thickness ( thickness ) =
_inherit_gear_param ( "thickness" , thickness , $ parent_gear_thickness , dflt = 10 ) ;
2019-03-23 04:13:18 +00:00
// Section: Terminology
// The outline of a gear is a smooth circle (the "pitch circle") which has
// mountains and valleys added so it is toothed. There is an inner
// circle (the "root circle") that touches the base of all the teeth, an
// outer circle that touches the tips of all the teeth, and the invisible
// pitch circle in between them. There is also a "base circle", which can
// be smaller than all three of the others, which controls the shape of
// the teeth. The side of each tooth lies on the path that the end of a
// string would follow if it were wrapped tightly around the base circle,
// then slowly unwound. That shape is an "involute", which gives this
// type of gear its name.
2022-03-28 03:06:42 +00:00
// Section: Gears
2019-03-23 04:13:18 +00:00
2022-03-28 03:06:42 +00:00
// Function&Module: spur_gear()
2023-06-18 13:22:41 +00:00
// Synopsis: Creates a spur gear, helical gear, or internal ring gear.
2023-05-27 08:42:09 +00:00
// SynTags: Geom, VNF
2023-04-05 00:25:13 +00:00
// Topics: Gears, Parts
// See Also: rack(), spur_gear(), spur_gear2d(), bevel_gear()
2022-03-28 03:06:42 +00:00
// Usage: As a Module
2023-07-17 06:10:27 +00:00
// spur_gear(circ_pitch, teeth, thickness, [shaft_diam], [hide=], [pressure_angle=], [clearance=], [backlash=], [helical=], [slices=], [internal=], [herringbone=]) [ATTACHMENTS];
2022-04-09 01:06:14 +00:00
// spur_gear(mod=, teeth=, thickness=, [shaft_diam=], ...) [ATTACHMENTS];
2022-03-28 03:06:42 +00:00
// Usage: As a Function
2023-07-17 06:10:27 +00:00
// vnf = spur_gear(circ_pitch, teeth, thickness, [shaft_diam=], ...);
2023-04-05 03:29:21 +00:00
// vnf = spur_gear(mod=, teeth=, thickness=, [shaft_diam=], ...);
2020-10-22 08:20:07 +00:00
// Description:
2023-07-15 23:06:30 +00:00
// Creates a involute spur gear, helical gear, or a mask for an internal ring gear. The module `spur_gear()` gives an involute
2022-03-28 03:06:42 +00:00
// spur gear, with reasonable defaults for all the parameters. Normally, you should just choose the
2023-06-18 13:22:41 +00:00
// first 4 parameters, and let the rest be default values. Spur gears have straight teeth and
// mesh together on parallel shafts without creating any axial thrust. The teeth engage suddenly across their
// entire width, creating stress and noise. Helical gears have angled teeth and engage more gradually, so they
// run more smoothly and quietly, however they do produce thrust along the gear axis. This can be
// circumvented using herringbone or double helical gears, which have no axial thrust and also self-align.
// Helical gears can mesh along shafts that are not parallel, where the angle between the shafts is
2023-07-15 23:06:30 +00:00
// the sum of the helical angles of the two gears.
// .
2023-06-18 13:22:41 +00:00
// The module `spur_gear()` gives a gear in
2022-03-28 03:06:42 +00:00
// the XY plane, centered on the origin, with one tooth centered on the positive Y axis. The most
2023-07-15 23:06:30 +00:00
// important function is `mesh_radius()`, which tells how far apart to space gears that are meshing, and
2022-03-28 03:06:42 +00:00
// `outer_radius()`, which gives the size of the region filled by the gear. A gear has a "pitch
// circle", which is an invisible circle that cuts through the middle of each tooth (though not the
// exact center). In order for two gears to mesh, their pitch circles should just touch. So the
2023-07-15 23:06:30 +00:00
// distance between their centers should be `mesh_radius()` for one, plus `mesh_radius()` for the
// other, which gives the overall meshing distance. In order for two gears to mesh, they must
2022-03-28 03:06:42 +00:00
// have the same `pitch` and `pressure_angle` parameters. `pitch` gives the number of millimeters
// of arc around the pitch circle covered by one tooth and one space between teeth. The
// `pressure_angle` controls how flat or bulged the sides of the teeth are. Common values include
2023-07-15 23:06:30 +00:00
// 14.5 degrees and 20 degrees, and occasionally 25. The default here is 20 degrees.
2022-03-28 03:06:42 +00:00
// The ratio of `teeth` for two meshing gears gives how many times one will make a full revolution
// when the the other makes one full revolution. If the two numbers are coprime (i.e. are not both
// divisible by the same number greater than 1), then every tooth on one gear will meet every tooth
// on the other, for more even wear. So coprime numbers of teeth are good.
2023-07-15 23:06:30 +00:00
// Normally, If the number of teeth is too few, gear tooth shapes may be undercut to allow meshing
// with other gears. If this is the case, profile shifting will automatically be applies to enlarge
// the teeth, removing the undercut. This may add to the distance needed between gears.
// If you with to override this correction, you can use `profile_shift=0`, or set it to a specific
// value like 0.5.
2019-03-23 04:13:18 +00:00
// Arguments:
2023-07-17 06:10:27 +00:00
// circ_pitch = The circular pitch, or distance in mm between teeth around the pitch circle.
2022-03-28 03:06:42 +00:00
// teeth = Total number of teeth around the entire perimeter
// thickness = Thickness of gear in mm
// shaft_diam = Diameter of the hole in the center, in mm. Default: 0 (no shaft hole)
// ---
// hide = Number of teeth to delete to make this only a fraction of a circle
// pressure_angle = Controls how straight or bulged the tooth sides are. In degrees.
// clearance = Clearance gap at the bottom of the inter-tooth valleys.
// backlash = Gap between two meshing teeth, in the direction along the circumference of the pitch circle
// helical = Teeth are slanted around the spur gear at this angle away from the gear axis of rotation.
// slices = Number of vertical layers to divide gear into. Useful for refining gears with `helical`.
2023-07-17 06:10:27 +00:00
// diam_pitch = The diametral pitch, or number of teeth per inch of pitch diameter. Note that the diametral pitch is a completely different thing than the pitch diameter.
// mod = The metric module/modulus of the gear, or mm of pitch diameter per tooth.
2023-06-20 03:41:39 +00:00
// internal = If true, create a mask for difference()ing from something else.
2023-07-15 23:06:30 +00:00
// profile_shift = Profile shift factor x.
// herringbone = If true, and helical is set, creates a herringbone gear.
2022-03-28 03:06:42 +00:00
// anchor = Translate so anchor point is at origin (0,0,0). See [anchor](attachments.scad#subsection-anchor). Default: `CENTER`
// spin = Rotate this many degrees around the Z axis after anchor. See [spin](attachments.scad#subsection-spin). Default: `0`
// orient = Vector to rotate top towards, after spin. See [orient](attachments.scad#subsection-orient). Default: `UP`
2023-06-20 03:41:39 +00:00
// Side Effects:
// If internal is true then the default tag is "remove"
2022-03-28 03:06:42 +00:00
// Example: Spur Gear
2023-07-17 06:10:27 +00:00
// spur_gear(circ_pitch=5, teeth=20, thickness=8, shaft_diam=5);
2022-03-28 03:06:42 +00:00
// Example: Metric Gear
// spur_gear(mod=2, teeth=20, thickness=8, shaft_diam=5);
// Example: Helical Gear
// spur_gear(
2023-07-17 06:10:27 +00:00
// circ_pitch=5, teeth=20, thickness=10,
2022-03-28 03:06:42 +00:00
// shaft_diam=5, helical=-30, slices=12,
// $fa=1, $fs=1
// );
2023-06-19 08:53:21 +00:00
// Example: Herringbone Gear
// spur_gear(
2023-07-17 06:10:27 +00:00
// circ_pitch=5, teeth=20, thickness=10, shaft_diam=5,
2023-07-15 23:06:30 +00:00
// helical=30, herringbone=true, slices=5
// );
// Example(Big): Effects of Profile Shifting.
2023-07-17 06:10:27 +00:00
// circ_pitch=5; teeth=7; thick=10; shaft=5; strokewidth=0.2;
// pr = pitch_radius(circ_pitch, teeth);
2023-07-15 23:06:30 +00:00
// left(10) {
2023-07-17 06:10:27 +00:00
// profile_shift = 0;
// mr = mesh_radius(circ_pitch,teeth,profile_shift=profile_shift);
// back(mr) spur_gear(circ_pitch, teeth, thick, shaft, profile_shift=profile_shift);
// rack(circ_pitch, teeth=3, thickness=thick, height=5, orient=BACK);
2023-07-15 23:06:30 +00:00
// color("black") up(thick/2) linear_extrude(height=0.1) {
2023-07-17 06:10:27 +00:00
// back(mr) dashed_stroke(circle(r=pr), width=strokewidth, closed=true);
// dashed_stroke([[-7.5,0],[7.5,0]], width=strokewidth);
2023-07-15 23:06:30 +00:00
// }
// }
// right(10) {
2023-07-17 23:24:03 +00:00
// profile_shift = 0.59;
// mr = mesh_radius(circ_pitch,teeth,profile_shift=profile_shift);
// back(mr) spur_gear(circ_pitch, teeth, thick, shaft, profile_shift=profile_shift);
// rack(circ_pitch, teeth=3, thickness=thick, height=5, orient=BACK);
2023-07-15 23:06:30 +00:00
// color("black") up(thick/2) linear_extrude(height=0.1) {
2023-07-17 23:24:03 +00:00
// back(mr)
// dashed_stroke(circle(r=pr), width=strokewidth, closed=true);
// dashed_stroke([[-7.5,0],[7.5,0]], width=strokewidth);
2023-07-15 23:06:30 +00:00
// }
// }
2022-03-28 03:06:42 +00:00
// Example(Anim,Frames=8,VPT=[0,30,0],VPR=[0,0,0],VPD=300): Assembly of Gears
// n1 = 11; //red gear number of teeth
// n2 = 20; //green gear
2023-07-17 23:24:03 +00:00
// n3 = 6; //blue gear
2022-03-28 03:06:42 +00:00
// n4 = 16; //orange gear
// n5 = 9; //gray rack
2023-07-17 06:10:27 +00:00
// circ_pitch = 9; //all meshing gears need the same `circ_pitch` (and the same `pressure_angle`)
2022-03-28 03:06:42 +00:00
// thickness = 6;
// hole = 3;
// rack_base = 12;
2023-07-17 06:10:27 +00:00
// r1 = mesh_radius(circ_pitch,n1);
// r2 = mesh_radius(circ_pitch,n2);
// r3 = mesh_radius(circ_pitch,n3);
// r4 = mesh_radius(circ_pitch,n4);
// r5 = mesh_radius(circ_pitch,n5);
2022-03-28 03:06:42 +00:00
// a1 = $t * 360 / n1;
// a2 = -$t * 360 / n2 + 180/n2;
2023-07-17 23:24:03 +00:00
// a3 = -$t * 360 / n3 - 3*90/n3;
// a4 = -$t * 360 / n4 - 3.5*180/n4;
2023-07-17 06:10:27 +00:00
// color("#f77") zrot(a1) spur_gear(circ_pitch,n1,thickness,hole);
// color("#7f7") back(r1+r2) zrot(a2) spur_gear(circ_pitch,n2,thickness,hole);
// color("#77f") right(r1+r3) zrot(a3) spur_gear(circ_pitch,n3,thickness,hole);
// color("#fc7") left(r1+r4) zrot(a4) spur_gear(circ_pitch,n4,thickness,hole,hide=n4-3);
// color("#ccc") fwd(r1) right(circ_pitch*$t)
// rack(pitch=circ_pitch,teeth=n5,thickness=thickness,height=rack_base,anchor=CENTER,orient=BACK);
2023-06-18 13:22:41 +00:00
// Example: Helical gears meshing with non-parallel shafts
// ang1 = 30;
// ang2 = 10;
2023-07-17 06:10:27 +00:00
// circ_pitch = 5;
2023-06-18 13:22:41 +00:00
// n = 20;
2023-07-17 23:24:03 +00:00
// r1 = mesh_radius(circ_pitch,n,helical=ang1);
// r2 = mesh_radius(circ_pitch,n,helical=ang2);
// left(r1) spur_gear(
// circ_pitch, teeth=n, thickness=10,
2023-06-18 13:22:41 +00:00
// shaft_diam=5, helical=ang1, slices=12,
2023-07-17 23:24:03 +00:00
// gear_spin=-90
2023-06-18 13:22:41 +00:00
// );
2023-07-17 23:24:03 +00:00
// right(r2)
2023-06-18 13:22:41 +00:00
// xrot(ang1+ang2)
2023-07-17 23:24:03 +00:00
// spur_gear(
2023-07-17 06:10:27 +00:00
// circ_pitch=circ_pitch, teeth=n, thickness=10,
2023-06-18 13:22:41 +00:00
// shaft_diam=5, helical=ang2, slices=12,
2023-07-17 23:24:03 +00:00
// gear_spin=90-180/n
2023-06-18 13:22:41 +00:00
// );
2023-06-18 05:39:06 +00:00
// Example(Anim,Frames=36,VPT=[0,0,0],VPR=[55,0,25],VPD=375): Planetary Gear Assembly
// rteeth=56; pteeth=16; cteeth=24;
2023-07-17 06:10:27 +00:00
// circ_pitch=5; thick=10; pa=20;
// cr = mesh_radius(circ_pitch,cteeth);
// pr = mesh_radius(circ_pitch,pteeth);
// ring_gear(
// circ_pitch=circ_pitch,
// teeth=rteeth,
// thickness=thick,
// pressure_angle=pa);
2023-06-18 05:39:06 +00:00
// for (a=[0:3]) {
2023-07-17 06:10:27 +00:00
// zrot($t*90+a*90) back(cr+pr) {
2023-06-18 05:39:06 +00:00
// color("green")
// spur_gear(
2023-07-17 06:10:27 +00:00
// circ_pitch=circ_pitch,
// teeth=pteeth,
2023-06-18 05:39:06 +00:00
// thickness=thick,
// shaft_diam=5,
// pressure_angle=pa,
// spin=-$t*90*rteeth/pteeth);
// }
// }
// color("orange")
// zrot($t*90*rteeth/cteeth+$t*90+180/cteeth)
// spur_gear(
2023-07-17 06:10:27 +00:00
// circ_pitch=circ_pitch,
// teeth=cteeth,
2023-06-18 05:39:06 +00:00
// thickness=thick,
// shaft_diam=5,
// pressure_angle=pa);
2023-07-15 23:06:30 +00:00
2022-03-28 03:06:42 +00:00
function spur_gear (
2023-07-17 06:10:27 +00:00
circ_pitch ,
2023-07-15 23:06:30 +00:00
teeth = 11 ,
thickness ,
2022-03-28 03:06:42 +00:00
shaft_diam = 0 ,
hide = 0 ,
2023-07-15 23:06:30 +00:00
pressure_angle ,
clearance ,
2022-03-28 03:06:42 +00:00
backlash = 0.0 ,
2023-07-15 23:06:30 +00:00
helical ,
2023-06-20 03:41:39 +00:00
interior ,
internal ,
2023-07-15 23:06:30 +00:00
profile_shift ,
slices ,
herringbone = false ,
2023-07-17 06:10:27 +00:00
diam_pitch ,
2022-03-28 03:06:42 +00:00
mod ,
2023-07-17 06:10:27 +00:00
pitch ,
2023-07-15 23:06:30 +00:00
gear_spin = 0 ,
2022-03-28 03:06:42 +00:00
anchor = CENTER ,
spin = 0 ,
orient = UP
) =
let (
2023-07-15 23:06:30 +00:00
dummy = ! is_undef ( interior ) ? echo ( "In spur_gear(), the argument 'interior=' has been deprecated, and may be removed in the future. Please use 'internal=' instead." ) : 0 ,
2023-06-20 03:41:39 +00:00
internal = first_defined ( [ internal , interior , false ] ) ,
2023-07-17 06:10:27 +00:00
circ_pitch = _inherit_gear_pitch ( pitch , circ_pitch , diam_pitch , mod ) ,
PA = _inherit_gear_pa ( pressure_angle ) ,
helical = _inherit_gear_helical ( helical , invert = ! internal ) ,
thickness = _inherit_gear_thickness ( thickness ) ,
2023-07-15 23:06:30 +00:00
profile_shift = default ( profile_shift , auto_profile_shift ( teeth , PA ) ) ,
2023-07-17 06:10:27 +00:00
pr = pitch_radius ( circ_pitch , teeth , helical ) ,
2023-07-15 23:06:30 +00:00
circum = 2 * PI * pr ,
twist = 360 * thickness * tan ( helical ) / circum ,
slices = default ( slices , ceil ( twist / 360 * segs ( pr ) + 1 ) ) ,
rgn = spur_gear2d (
2023-07-17 06:10:27 +00:00
circ_pitch = circ_pitch ,
2022-03-28 03:06:42 +00:00
teeth = teeth ,
2023-07-15 23:06:30 +00:00
pressure_angle = PA ,
2022-03-28 03:06:42 +00:00
hide = hide ,
2023-07-15 23:06:30 +00:00
helical = helical ,
2022-03-28 03:06:42 +00:00
clearance = clearance ,
backlash = backlash ,
2023-07-15 23:06:30 +00:00
internal = internal ,
profile_shift = profile_shift ,
hub_diam = shaft_diam
2022-03-28 03:06:42 +00:00
) ,
2023-07-15 23:06:30 +00:00
rvnf = herringbone
? zrot ( twist / 2 , p = linear_sweep ( rgn , height = thickness , twist = twist , slices = slices , center = true ) )
: let (
wall_vnf = linear_sweep ( rgn , height = thickness / 2 , twist = twist / 2 , slices = ceil ( slices / 2 ) , center = false , caps = false ) ,
cap_vnf = vnf_from_region ( rgn , transform = up ( thickness / 2 ) * zrot ( twist / 2 ) )
)
vnf_join ( [
wall_vnf , zflip ( p = wall_vnf ) ,
cap_vnf , zflip ( p = cap_vnf ) ,
] ) ,
vnf = zrot ( gear_spin , p = rvnf )
) reorient ( anchor , spin , orient , h = thickness , r = pr , p = vnf ) ;
2019-03-23 04:13:18 +00:00
2022-03-28 03:06:42 +00:00
module spur_gear (
2023-07-17 06:10:27 +00:00
circ_pitch ,
2023-07-15 23:06:30 +00:00
teeth = 11 ,
thickness ,
2022-03-28 03:06:42 +00:00
shaft_diam = 0 ,
hide = 0 ,
2023-07-15 23:06:30 +00:00
pressure_angle ,
clearance ,
2022-03-28 03:06:42 +00:00
backlash = 0.0 ,
2023-07-15 23:06:30 +00:00
helical ,
2023-06-20 03:41:39 +00:00
internal ,
interior ,
2023-07-15 23:06:30 +00:00
profile_shift ,
slices ,
herringbone = false ,
2023-07-17 06:10:27 +00:00
pitch ,
diam_pitch ,
2022-03-28 03:06:42 +00:00
mod ,
2023-07-15 23:06:30 +00:00
gear_spin = 0 ,
2022-03-28 03:06:42 +00:00
anchor = CENTER ,
spin = 0 ,
orient = UP
) {
2023-07-15 23:06:30 +00:00
dummy = ! is_undef ( interior ) ? echo ( "In spur_gear(), the argument 'interior=' has been deprecated, and may be removed in the future. Please use 'internal=' instead." ) : 0 ;
2023-06-20 03:41:39 +00:00
internal = first_defined ( [ internal , interior , false ] ) ;
2023-07-17 06:10:27 +00:00
circ_pitch = _inherit_gear_pitch ( pitch , circ_pitch , diam_pitch , mod ) ;
PA = _inherit_gear_pa ( pressure_angle ) ;
helical = _inherit_gear_helical ( helical , invert = ! internal ) ;
thickness = _inherit_gear_thickness ( thickness ) ;
2023-07-15 23:06:30 +00:00
profile_shift = default ( profile_shift , auto_profile_shift ( teeth , PA ) ) ;
2023-07-17 06:10:27 +00:00
pr = pitch_radius ( circ_pitch , teeth , helical ) ;
2023-07-15 23:06:30 +00:00
circum = 2 * PI * pr ;
twist = 360 * thickness * tan ( helical ) / circum ;
slices = default ( slices , ceil ( twist / 360 * segs ( pr ) + 1 ) ) ;
default_tag ( "remove" , internal ) {
attachable ( anchor , spin , orient , r = pr , l = thickness ) {
zrot ( gear_spin )
if ( herringbone ) {
zflip_copy ( ) down ( 0.01 )
linear_extrude (
height = thickness / 2 + 0.01 , center = false ,
twist = twist / 2 , slices = ceil ( slices / 2 ) ,
convexity = teeth / 2
) {
spur_gear2d (
2023-07-17 06:10:27 +00:00
circ_pitch = circ_pitch ,
2023-07-15 23:06:30 +00:00
teeth = teeth ,
pressure_angle = PA ,
hide = hide ,
helical = helical ,
clearance = clearance ,
backlash = backlash ,
internal = internal ,
profile_shift = profile_shift ,
hub_diam = shaft_diam
) ;
}
} else {
zrot ( twist / 2 )
linear_extrude (
height = thickness , center = true ,
twist = twist , slices = slices ,
convexity = teeth / 2
) {
2023-06-20 03:41:39 +00:00
spur_gear2d (
2023-07-17 06:10:27 +00:00
circ_pitch = circ_pitch ,
2023-06-20 03:41:39 +00:00
teeth = teeth ,
2023-07-15 23:06:30 +00:00
pressure_angle = PA ,
2023-06-20 03:41:39 +00:00
hide = hide ,
2023-07-15 23:06:30 +00:00
helical = helical ,
2023-06-20 03:41:39 +00:00
clearance = clearance ,
backlash = backlash ,
2023-07-15 23:06:30 +00:00
internal = internal ,
profile_shift = profile_shift ,
hub_diam = shaft_diam
2023-06-20 03:41:39 +00:00
) ;
2023-06-19 08:53:21 +00:00
}
2022-03-28 03:06:42 +00:00
}
2023-07-15 23:06:30 +00:00
union ( ) {
$ parent_gear_type = "spur" ;
2023-07-17 06:10:27 +00:00
$ parent_gear_pitch = circ_pitch ;
2023-07-15 23:06:30 +00:00
$ parent_gear_teeth = teeth ;
$ parent_gear_pa = PA ;
$ parent_gear_helical = helical ;
$ parent_gear_thickness = thickness ;
union ( ) children ( ) ;
}
2022-03-28 03:06:42 +00:00
}
2023-07-15 23:06:30 +00:00
}
2022-03-28 03:06:42 +00:00
}
2019-03-23 04:13:18 +00:00
2022-03-28 03:06:42 +00:00
// Function&Module: spur_gear2d()
2023-06-18 13:22:41 +00:00
// Synopsis: Creates a 2D spur gear or internal ring gear.
2023-07-15 23:06:30 +00:00
// SynTags: Geom, Region
2023-04-05 00:25:13 +00:00
// Topics: Gears, Parts
// See Also: rack(), spur_gear(), spur_gear2d(), bevel_gear()
2022-03-28 03:06:42 +00:00
// Usage: As Module
2023-07-17 06:10:27 +00:00
// spur_gear2d(circ_pitch, teeth, [hide=], [pressure_angle=], [clearance=], [backlash=], [internal=]) [ATTACHMENTS];
2023-06-20 03:41:39 +00:00
// spur_gear2d(mod=, teeth=, [hide=], [pressure_angle=], [clearance=], [backlash=], [internal=]) [ATTACHMENTS];
2022-03-28 03:06:42 +00:00
// Usage: As Function
2023-07-17 06:10:27 +00:00
// rgn = spur_gear2d(circ_pitch, teeth, [hide=], [pressure_angle=], [clearance=], [backlash=], [internal=]);
2023-07-15 23:06:30 +00:00
// rgn = spur_gear2d(mod=, teeth=, [hide=], [pressure_angle=], [clearance=], [backlash=], [internal=]);
2020-10-22 08:20:07 +00:00
// Description:
2023-07-15 23:06:30 +00:00
// When called as a module, creates a 2D involute spur gear. When called as a function,
// returns a 2D region for the 2D involute spur gear. Normally, you should just specify the
2023-07-17 06:10:27 +00:00
// first 2 parameters `circ_pitch` and `teeth`, and let the rest be default values.
// Meshing gears must match in `circ_pitch`, `pressure_angle`, and `helical`, and be separated by
2023-07-15 23:06:30 +00:00
// the sum of their meshing radii, which can be found with `mesh_radius()`.
2019-03-23 04:13:18 +00:00
// Arguments:
2023-07-17 06:10:27 +00:00
// circ_pitch = The circular pitch, or distance between teeth around the pitch circle, in mm.
2022-03-28 03:06:42 +00:00
// teeth = Total number of teeth around the spur gear.
// hide = Number of teeth to delete to make this only a fraction of a circle
// pressure_angle = Controls how straight or bulged the tooth sides are. In degrees.
2023-07-17 06:10:27 +00:00
// ---
// hide = Number of teeth to delete to make this only a fraction of a circle
2022-03-28 03:06:42 +00:00
// clearance = Gap between top of a tooth on one gear and bottom of valley on a meshing gear (in millimeters)
// backlash = Gap between two meshing teeth, in the direction along the circumference of the pitch circle
2023-07-15 23:06:30 +00:00
// helical = The angle of the rack teeth away from perpendicular to the gear axis of rotation. Stretches out the tooth shapes. Used to match helical spur gear pinions. Default: 0
2023-06-20 03:41:39 +00:00
// internal = If true, create a mask for difference()ing from something else.
2023-07-15 23:06:30 +00:00
// profile_shift = Profile shift factor x.
// hub_diam = If given, the diameter of the central hub hole.
2023-07-17 06:10:27 +00:00
// diam_pitch = The diametral pitch, or number of teeth per inch of pitch diameter. Note that the diametral pitch is a completely different thing than the pitch diameter.
// mod = The metric module/modulus of the gear, or mm of pitch diameter per tooth.
2021-11-20 03:33:16 +00:00
// anchor = Translate so anchor point is at origin (0,0,0). See [anchor](attachments.scad#subsection-anchor). Default: `CENTER`
// spin = Rotate this many degrees around the Z axis after anchor. See [spin](attachments.scad#subsection-spin). Default: `0`
2019-03-23 04:13:18 +00:00
// Example(2D): Typical Gear Shape
2023-07-17 23:24:03 +00:00
// spur_gear2d(circ_pitch=5, teeth=20, hub_diam=5);
// Example(2D): By Metric Module
// spur_gear2d(mod=2, teeth=20, hub_diam=5);
// Example(2D): By Imperial Gear Pitch
// spur_gear2d(diam_pitch=10, teeth=20, hub_diam=5);
2019-03-23 04:13:18 +00:00
// Example(2D): Lower Pressure Angle
2023-07-17 23:24:03 +00:00
// spur_gear2d(circ_pitch=5, teeth=20, pressure_angle=14);
2019-03-23 04:13:18 +00:00
// Example(2D): Partial Gear
2023-07-17 06:10:27 +00:00
// spur_gear2d(circ_pitch=5, teeth=20, hide=15, pressure_angle=20);
2023-07-15 23:06:30 +00:00
// Example(2D): Effects of Profile Shifting.
2023-07-17 06:10:27 +00:00
// circ_pitch=5; teeth=7; shaft=5; strokewidth=0.2;
// module the_gear(profile_shift=0) {
2023-07-17 23:24:03 +00:00
// $fn=72;
2023-07-17 06:10:27 +00:00
// pr = pitch_radius(circ_pitch,teeth);
// mr = mesh_radius(circ_pitch,teeth,profile_shift=profile_shift);
// back(mr) {
// spur_gear2d(circ_pitch, teeth, hub_diam=shaft, profile_shift=profile_shift);
// up(0.1) color("black")
// dashed_stroke(circle(r=pr), width=strokewidth, closed=true);
2023-07-15 23:06:30 +00:00
// }
// }
2023-07-17 06:10:27 +00:00
// module the_rack() {
2023-07-17 23:24:03 +00:00
// $fn=72;
2023-07-17 06:10:27 +00:00
// rack2d(circ_pitch, teeth=3, height=5);
// up(0.1) color("black")
// dashed_stroke([[-7.5,0],[7.5,0]], width=strokewidth);
2023-07-15 23:06:30 +00:00
// }
2023-07-17 06:10:27 +00:00
// left(10) { the_gear(0); the_rack(); }
// right(10) { the_gear(0.59); the_rack(); }
2023-06-18 05:39:06 +00:00
// Example(2D): Planetary Gear Assembly
// rteeth=56; pteeth=16; cteeth=24;
2023-07-17 06:10:27 +00:00
// circ_pitch=5; pa=20;
// cr = mesh_radius(circ_pitch, cteeth);
// pr = mesh_radius(circ_pitch, pteeth);
// ring_gear2d(
// circ_pitch=circ_pitch,
// teeth=rteeth,
// pressure_angle=pa);
2023-06-18 05:39:06 +00:00
// for (a=[0:3]) {
2023-07-17 06:10:27 +00:00
// zrot(a*90) back(cr+pr) {
2023-06-18 05:39:06 +00:00
// color("green")
// spur_gear2d(
2023-07-17 06:10:27 +00:00
// circ_pitch=circ_pitch,
// teeth=pteeth,
2023-06-18 05:39:06 +00:00
// pressure_angle=pa);
// }
// }
// color("orange")
// zrot(180/cteeth)
2023-07-17 06:10:27 +00:00
// spur_gear2d(
// circ_pitch=circ_pitch,
// teeth=cteeth,
// pressure_angle=pa);
2020-10-20 05:53:56 +00:00
// Example(2D): Called as a Function
2023-07-17 06:10:27 +00:00
// rgn = spur_gear2d(circ_pitch=8, teeth=16, hub_diam=5);
2023-07-15 23:06:30 +00:00
// region(rgn);
2021-03-01 09:29:41 +00:00
function spur_gear2d (
2023-07-17 06:10:27 +00:00
circ_pitch ,
2020-10-20 06:52:46 +00:00
teeth = 11 ,
hide = 0 ,
2023-07-15 23:06:30 +00:00
pressure_angle ,
clearance ,
2020-10-20 06:52:46 +00:00
backlash = 0.0 ,
2023-06-20 03:41:39 +00:00
internal ,
interior ,
2023-07-15 23:06:30 +00:00
profile_shift ,
helical ,
hub_diam ,
2023-07-17 06:10:27 +00:00
pitch ,
diam_pitch ,
2020-10-22 08:20:07 +00:00
mod ,
2023-07-15 23:06:30 +00:00
gear_spin = 0 ,
2020-10-20 06:52:46 +00:00
anchor = CENTER ,
spin = 0
2023-07-15 23:06:30 +00:00
) = let (
dummy = ! is_undef ( interior ) ? echo ( "In spur_gear2d(), the argument 'interior=' has been deprecated, and may be removed in the future. Please use 'internal=' instead." ) : 0 ,
internal = first_defined ( [ internal , interior , false ] ) ,
2023-07-17 06:10:27 +00:00
circ_pitch = _inherit_gear_pitch ( pitch , circ_pitch , diam_pitch , mod ) ,
PA = _inherit_gear_pa ( pressure_angle ) ,
helical = _inherit_gear_helical ( helical , invert = ! internal ) ,
2023-07-15 23:06:30 +00:00
profile_shift = default ( profile_shift , auto_profile_shift ( teeth , PA ) ) ,
2023-07-17 06:10:27 +00:00
pr = pitch_radius ( circ_pitch , teeth , helical = helical ) ,
2023-07-15 23:06:30 +00:00
tooth = _gear_tooth_profile (
2023-07-17 06:10:27 +00:00
circ_pitch = circ_pitch ,
teeth = teeth ,
2023-07-15 23:06:30 +00:00
pressure_angle = PA ,
clearance = clearance ,
backlash = backlash ,
profile_shift = profile_shift ,
helical = helical ,
internal = internal
) ,
perim = [
for ( i = [ 0 : 1 : teeth - 1 - hide ] )
2023-07-17 06:10:27 +00:00
each zrot ( - i * 360 / teeth + gear_spin , p = tooth ) ,
if ( hide > 0 ) [ 0 , 0 ] ,
2023-07-15 23:06:30 +00:00
] ,
rgn = [
list_unwrap ( deduplicate ( perim ) ) ,
2023-07-17 06:10:27 +00:00
if ( is_finite ( hub_diam ) && hub_diam > 0 && ! hide )
2023-07-15 23:06:30 +00:00
reverse ( circle ( d = hub_diam ) ) ,
]
) reorient ( anchor , spin , two_d = true , r = pr , p = rgn ) ;
2019-06-12 02:29:39 +00:00
2021-03-01 09:29:41 +00:00
module spur_gear2d (
2023-07-17 06:10:27 +00:00
circ_pitch ,
2020-10-20 06:52:46 +00:00
teeth = 11 ,
hide = 0 ,
2023-07-15 23:06:30 +00:00
pressure_angle ,
clearance ,
2020-10-20 06:52:46 +00:00
backlash = 0.0 ,
2023-06-20 03:41:39 +00:00
internal ,
interior ,
2023-07-15 23:06:30 +00:00
profile_shift ,
helical ,
hub_diam = 0 ,
2023-07-17 06:10:27 +00:00
pitch ,
diam_pitch ,
2020-10-22 08:33:45 +00:00
mod ,
2023-07-15 23:06:30 +00:00
gear_spin = 0 ,
2020-10-20 06:52:46 +00:00
anchor = CENTER ,
spin = 0
2017-08-30 00:00:16 +00:00
) {
2023-07-15 23:06:30 +00:00
dummy = ! is_undef ( interior ) ? echo ( "In spur_gear2d(), the argument 'interior=' has been deprecated, and may be removed in the future. Please use 'internal=' instead." ) : 0 ;
2023-06-20 03:41:39 +00:00
internal = first_defined ( [ internal , interior , false ] ) ;
2023-07-17 06:10:27 +00:00
circ_pitch = _inherit_gear_pitch ( pitch , circ_pitch , diam_pitch , mod ) ;
PA = _inherit_gear_pa ( pressure_angle ) ;
helical = _inherit_gear_helical ( helical , invert = ! internal ) ;
2023-07-15 23:06:30 +00:00
profile_shift = default ( profile_shift , auto_profile_shift ( teeth , PA ) ) ;
rgn = spur_gear2d (
2023-07-17 06:10:27 +00:00
circ_pitch = circ_pitch ,
2020-10-20 06:52:46 +00:00
teeth = teeth ,
hide = hide ,
2023-07-15 23:06:30 +00:00
pressure_angle = PA ,
2020-05-30 02:04:34 +00:00
clearance = clearance ,
2023-07-15 23:06:30 +00:00
helical = helical ,
2020-10-20 06:52:46 +00:00
backlash = backlash ,
2023-07-15 23:06:30 +00:00
profile_shift = profile_shift ,
internal = internal ,
hub_diam = hub_diam
2020-05-30 02:04:34 +00:00
) ;
2023-07-17 06:10:27 +00:00
pr = pitch_radius ( circ_pitch , teeth , helical = helical ) ;
2020-05-30 02:04:34 +00:00
attachable ( anchor , spin , two_d = true , r = pr ) {
2023-07-15 23:06:30 +00:00
zrot ( gear_spin ) region ( rgn ) ;
union ( ) {
$ parent_gear_type = "spur2D" ;
2023-07-17 06:10:27 +00:00
$ parent_gear_pitch = circ_pitch ;
2023-07-15 23:06:30 +00:00
$ parent_gear_teeth = teeth ;
$ parent_gear_pa = PA ;
$ parent_gear_helical = helical ;
$ parent_gear_thickness = 0 ;
union ( ) children ( ) ;
}
}
}
// Module: ring_gear()
// Synopsis: Creates a 3D ring gear.
// SynTags: Geom
// Topics: Gears, Parts
// See Also: rack(), ring_gear2d(), spur_gear(), spur_gear2d(), bevel_gear()
// Usage:
2023-07-17 20:41:56 +00:00
// ring_gear(circ_pitch, teeth, thickness, [backing], [pressure_angle=], [helical=], [herringbone=], [profile_shift=], [clearance=], [backlash=]) [ATTACHMENTS];
// ring_gear(mod=, teeth=, thickness=, backing=, [pressure_angle=], [helical=], [herringbone=], [profile_shift=], [clearance=], [backlash=]) [ATTACHMENTS];
// ring_gear(diam_pitch=, teeth=, thickness=, backing=, [pressure_angle=], [helical=], [herringbone=], [profile_shift=], [clearance=], [backlash=]) [ATTACHMENTS];
2023-07-15 23:06:30 +00:00
// Description:
// Creates a 3D involute ring gear. Normally, you should just specify the
2023-07-17 06:10:27 +00:00
// first 3 parameters `circ_pitch`, `teeth`, and `thickness`, and let the rest be default values.
// Meshing gears must match in `circ_pitch`, `pressure_angle`, and `helical`, and be separated by
2023-07-15 23:06:30 +00:00
// the sum of their profile shifts and pitch radii, which can be found with `mesh_radius()`.
// Arguments:
2023-07-17 06:10:27 +00:00
// circ_pitch = The circular pitch, or distance between teeth around the pitch circle, in mm.
2023-07-15 23:06:30 +00:00
// teeth = Total number of teeth around the spur gear.
// thickness = Thickness of ring gear in mm
2023-07-17 20:41:56 +00:00
// backing = The width of the ring gear backing, in mm.
// pressure_angle = Controls how straight or bulged the tooth sides are. In degrees.
2023-07-17 06:10:27 +00:00
// ---
2023-07-15 23:06:30 +00:00
// helical = The angle of the rack teeth away from perpendicular to the gear axis of rotation. Stretches out the tooth shapes. Used to match helical spur gear pinions. Default: 0
// herringbone = If true, and helical is set, creates a herringbone gear.
2023-07-17 20:41:56 +00:00
// profile_shift = Profile shift factor x for tooth profile.
// clearance = Gap between top of a tooth on one gear and bottom of valley on a meshing gear (in millimeters)
// backlash = Gap between two meshing teeth, in the direction along the circumference of the pitch circle
2023-07-17 06:10:27 +00:00
// diam_pitch = The diametral pitch, or number of teeth per inch of pitch diameter. Note that the diametral pitch is a completely different thing than the pitch diameter.
// mod = The metric module/modulus of the gear, or mm of pitch diameter per tooth.
2023-07-15 23:06:30 +00:00
// anchor = Translate so anchor point is at origin (0,0,0). See [anchor](attachments.scad#subsection-anchor). Default: `CENTER`
// spin = Rotate this many degrees around the Z axis after anchor. See [spin](attachments.scad#subsection-spin). Default: `0`
2023-07-17 20:41:56 +00:00
// orient = Vector to rotate top towards, after spin. See [orient](attachments.scad#subsection-orient). Default: `UP`
2023-07-15 23:06:30 +00:00
// Example:
2023-07-17 06:10:27 +00:00
// ring_gear(circ_pitch=5, teeth=48, thickness=10);
2023-07-15 23:06:30 +00:00
// Example: Adjusting Backing
2023-07-17 23:24:03 +00:00
// ring_gear(circ_pitch=5, teeth=48, thickness=10, backing=30);
// Example(Med): Adjusting Pressure Angle
2023-07-17 06:10:27 +00:00
// ring_gear(circ_pitch=5, teeth=48, thickness=10, pressure_angle=28);
2023-07-17 23:24:03 +00:00
// Example(Med): Tooth Profile Shifting
2023-07-17 06:10:27 +00:00
// ring_gear(circ_pitch=5, teeth=48, thickness=10, profile_shift=0.5);
2023-07-17 23:24:03 +00:00
// Example(Med): Helical Ring Gear
2023-07-17 06:10:27 +00:00
// ring_gear(circ_pitch=5, teeth=48, thickness=10, helical=30);
2023-07-17 23:24:03 +00:00
// Example(Med): Herringbone Ring Gear
2023-07-17 06:10:27 +00:00
// ring_gear(circ_pitch=5, teeth=48, thickness=10, helical=30, herringbone=true);
2023-07-17 23:24:03 +00:00
2023-07-15 23:06:30 +00:00
module ring_gear (
2023-07-17 06:10:27 +00:00
circ_pitch ,
2023-07-15 23:06:30 +00:00
teeth = 50 ,
2023-07-17 20:41:56 +00:00
thickness = 10 ,
backing = 10 ,
2023-07-15 23:06:30 +00:00
pressure_angle ,
helical ,
herringbone = false ,
2023-07-17 20:41:56 +00:00
profile_shift ,
clearance ,
backlash = 0.0 ,
2023-07-17 06:10:27 +00:00
pitch ,
diam_pitch ,
2023-07-15 23:06:30 +00:00
mod ,
slices ,
gear_spin = 0 ,
anchor = CENTER ,
2023-07-17 20:41:56 +00:00
spin = 0 ,
orient = UP
2023-07-15 23:06:30 +00:00
) {
2023-07-17 06:10:27 +00:00
circ_pitch = _inherit_gear_pitch ( pitch , circ_pitch , diam_pitch , mod ) ;
PA = _inherit_gear_pa ( pressure_angle ) ;
helical = _inherit_gear_helical ( helical ) ;
thickness = _inherit_gear_thickness ( thickness ) ;
2023-07-15 23:06:30 +00:00
profile_shift = default ( profile_shift , auto_profile_shift ( teeth , PA ) ) ;
2023-07-17 06:10:27 +00:00
pr = pitch_radius ( circ_pitch , teeth , helical = helical ) ;
ar = outer_radius ( circ_pitch , teeth , helical = helical , profile_shift = profile_shift , internal = true ) ;
2023-07-15 23:06:30 +00:00
circum = 2 * PI * pr ;
twist = 360 * thickness * tan ( helical ) / circum ;
slices = default ( slices , ceil ( twist / 360 * segs ( pr ) + 1 ) ) ;
2023-07-17 20:41:56 +00:00
attachable ( anchor , spin , orient , h = thickness , r = pr ) {
2023-07-15 23:06:30 +00:00
zrot ( gear_spin )
if ( herringbone ) {
zflip_copy ( ) down ( 0.01 )
linear_extrude ( height = thickness / 2 , center = false , twist = twist / 2 , slices = ceil ( slices / 2 ) , convexity = teeth / 4 ) {
difference ( ) {
circle ( r = ar + backing ) ;
spur_gear2d (
2023-07-17 06:10:27 +00:00
circ_pitch = circ_pitch ,
2023-07-15 23:06:30 +00:00
teeth = teeth ,
pressure_angle = PA ,
helical = helical ,
clearance = clearance ,
backlash = backlash ,
profile_shift = profile_shift ,
internal = true
) ;
}
}
} else {
zrot ( twist / 2 )
linear_extrude ( height = thickness , center = true , twist = twist , convexity = teeth / 4 ) {
difference ( ) {
circle ( r = ar + backing ) ;
spur_gear2d (
2023-07-17 06:10:27 +00:00
circ_pitch = circ_pitch ,
2023-07-15 23:06:30 +00:00
teeth = teeth ,
pressure_angle = PA ,
helical = helical ,
clearance = clearance ,
backlash = backlash ,
profile_shift = profile_shift ,
internal = true
) ;
}
}
}
2020-05-30 02:04:34 +00:00
children ( ) ;
}
2019-02-07 05:04:45 +00:00
}
2023-07-15 23:06:30 +00:00
// Module: ring_gear2d()
// Synopsis: Creates a 2D ring gear.
// SynTags: Geom
// Topics: Gears, Parts
// See Also: rack(), spur_gear(), spur_gear2d(), bevel_gear()
// Usage:
2023-07-17 20:41:56 +00:00
// ring_gear2d(circ_pitch, teeth, [backing], [pressure_angle=], [helical=], [profile_shift=], [clearance=], [backlash=]) [ATTACHMENTS];
// ring_gear2d(mod=, teeth=, [backing=], [pressure_angle=], [helical=], [profile_shift=], [clearance=], [backlash=]) [ATTACHMENTS];
// ring_gear2d(diam_pitch=, teeth=, [backing=], [pressure_angle=], [helical=], [profile_shift=], [clearance=], [backlash=]) [ATTACHMENTS];
2023-07-15 23:06:30 +00:00
// Description:
// Creates a 2D involute ring gear. Normally, you should just specify the
2023-07-17 06:10:27 +00:00
// first 2 parameters `circ_pitch` and `teeth`, and let the rest be default values.
// Meshing gears must match in `circ_pitch`, `pressure_angle`, and `helical`, and be separated by
2023-07-15 23:06:30 +00:00
// the sum of their profile shifts and pitch radii, which can be found with `mesh_radius()`.
// Arguments:
2023-07-17 06:10:27 +00:00
// circ_pitch = The circular pitch, or distance between teeth around the pitch circle, in mm.
2023-07-15 23:06:30 +00:00
// teeth = Total number of teeth around the spur gear.
2023-07-17 20:41:56 +00:00
// backing = The width of the ring gear backing, in mm.
2023-07-15 23:06:30 +00:00
// pressure_angle = Controls how straight or bulged the tooth sides are. In degrees.
2023-07-17 20:41:56 +00:00
// ---
// helical = The angle of the rack teeth away from perpendicular to the gear axis of rotation. Stretches out the tooth shapes. Used to match helical spur gear pinions. Default: 0
// profile_shift = Profile shift factor x for tooth profile.
2023-07-15 23:06:30 +00:00
// clearance = Gap between top of a tooth on one gear and bottom of valley on a meshing gear (in millimeters)
// backlash = Gap between two meshing teeth, in the direction along the circumference of the pitch circle
2023-07-17 06:10:27 +00:00
// diam_pitch = The diametral pitch, or number of teeth per inch of pitch diameter. Note that the diametral pitch is a completely different thing than the pitch diameter.
// mod = The metric module/modulus of the gear, or mm of pitch diameter per tooth.
2023-07-15 23:06:30 +00:00
// anchor = Translate so anchor point is at origin (0,0,0). See [anchor](attachments.scad#subsection-anchor). Default: `CENTER`
// spin = Rotate this many degrees around the Z axis after anchor. See [spin](attachments.scad#subsection-spin). Default: `0`
// Example(2D;Big):
2023-07-17 06:10:27 +00:00
// circ_pitch=5; teeth1=50; teeth2=16;
// pr1 = pitch_radius(circ_pitch, teeth1);
// pr2 = pitch_radius(circ_pitch, teeth2);
// ring_gear2d(circ_pitch=circ_pitch, teeth=teeth1);
// back(pr1-pr2) spur_gear2d(circ_pitch=circ_pitch, teeth=teeth2);
2023-07-15 23:06:30 +00:00
module ring_gear2d (
2023-07-17 06:10:27 +00:00
circ_pitch ,
2023-07-15 23:06:30 +00:00
teeth = 50 ,
2023-07-17 20:41:56 +00:00
backing = 10 ,
2023-07-15 23:06:30 +00:00
pressure_angle ,
2023-07-17 20:41:56 +00:00
helical ,
profile_shift ,
2023-07-15 23:06:30 +00:00
clearance ,
backlash = 0.0 ,
2023-07-17 06:10:27 +00:00
pitch ,
diam_pitch ,
2023-07-15 23:06:30 +00:00
mod ,
gear_spin = 0 ,
anchor = CENTER ,
spin = 0
) {
2023-07-17 06:10:27 +00:00
circ_pitch = _inherit_gear_pitch ( pitch , circ_pitch , diam_pitch , mod ) ;
PA = _inherit_gear_pa ( pressure_angle ) ;
helical = _inherit_gear_helical ( helical ) ;
2023-07-15 23:06:30 +00:00
profile_shift = default ( profile_shift , auto_profile_shift ( teeth , PA ) ) ;
2023-07-17 06:10:27 +00:00
pr = pitch_radius ( circ_pitch , teeth , helical = helical ) ;
ar = outer_radius ( circ_pitch , teeth , helical = helical , profile_shift = profile_shift , internal = true ) ;
2023-07-15 23:06:30 +00:00
attachable ( anchor , spin , two_d = true , r = pr ) {
zrot ( gear_spin )
difference ( ) {
circle ( r = ar + backing ) ;
spur_gear2d (
2023-07-17 06:10:27 +00:00
circ_pitch = circ_pitch ,
2023-07-15 23:06:30 +00:00
teeth = teeth ,
pressure_angle = PA ,
helical = helical ,
clearance = clearance ,
backlash = backlash ,
profile_shift = profile_shift ,
internal = true
) ;
}
children ( ) ;
}
}
2022-03-28 03:06:42 +00:00
// Function&Module: rack()
2023-06-18 13:22:41 +00:00
// Synopsis: Creates a straight or helical gear rack.
2023-05-27 08:42:09 +00:00
// SynTags: Geom, VNF
2023-04-05 00:25:13 +00:00
// Topics: Gears, Parts
// See Also: rack2d(), spur_gear(), spur_gear2d(), bevel_gear()
2022-03-28 03:06:42 +00:00
// Usage: As a Module
2023-04-05 03:29:21 +00:00
// rack(pitch, teeth, thickness, height, [pressure_angle=], [backlash=], [clearance=], [helical=]) [ATTACHMENTS];
// rack(mod=, teeth=, thickness=, height=, [pressure_angle=], [backlash]=, [clearance=], [helical=]) [ATTACHMENTS];
2022-03-28 03:06:42 +00:00
// Usage: As a Function
2023-04-05 03:29:21 +00:00
// vnf = rack(pitch, teeth, thickness, height, [pressure_angle=], [backlash=], [clearance=], [helical=]);
// vnf = rack(mod=, teeth=, thickness=, height=, [pressure_angle=], [backlash=], [clearance=], [helical=]);
2022-03-28 03:06:42 +00:00
// Description:
// This is used to create a 3D rack, which is a linear bar with teeth that a gear can roll along.
// A rack can mesh with any gear that has the same `pitch` and `pressure_angle`.
// When called as a function, returns a 3D [VNF](vnf.scad) for the rack.
// When called as a module, creates a 3D rack shape.
// Arguments:
2023-07-17 06:10:27 +00:00
// pitch = The pitch, or distance in mm between teeth along the rack. Matches up with circular pitch on a spur gear. Default: 5
2022-03-28 03:06:42 +00:00
// teeth = Total number of teeth along the rack. Default: 20
// thickness = Thickness of rack in mm (affects each tooth). Default: 5
// height = Height of rack in mm, from tooth top to back of rack. Default: 10
// ---
2023-07-15 23:06:30 +00:00
// pressure_angle = Controls how straight or bulged the tooth sides are. In degrees. Default: 20
2022-03-28 03:06:42 +00:00
// backlash = Gap between two meshing teeth, in the direction along the circumference of the pitch circle. Default: 0
// clearance = Clearance gap at the bottom of the inter-tooth valleys.
// helical = The angle of the rack teeth away from perpendicular to the rack length. Used to match helical spur gear pinions. Default: 0
2023-07-15 23:06:30 +00:00
// profile_shift = Profile shift factor x.
2023-07-17 06:10:27 +00:00
// diam_pitch = The diametral pitch, or number of teeth per inch of pitch diameter. Note that the diametral pitch is a completely different thing than the pitch diameter.
// mod = The metric module/modulus of the gear, or mm of pitch diameter per tooth.
2022-03-28 03:06:42 +00:00
// anchor = Translate so anchor point is at origin (0,0,0). See [anchor](attachments.scad#subsection-anchor). Default: `CENTER`
// spin = Rotate this many degrees around the Z axis after anchor. See [spin](attachments.scad#subsection-spin). Default: `0`
// orient = Vector to rotate top towards, after spin. See [orient](attachments.scad#subsection-orient). Default: `UP`
// Extra Anchors:
// "adendum" = At the tips of the teeth, at the center of rack.
// "adendum-left" = At the tips of the teeth, at the left end of the rack.
// "adendum-right" = At the tips of the teeth, at the right end of the rack.
// "adendum-back" = At the tips of the teeth, at the back of the rack.
// "adendum-front" = At the tips of the teeth, at the front of the rack.
// "dedendum" = At the base of the teeth, at the center of rack.
// "dedendum-left" = At the base of the teeth, at the left end of the rack.
// "dedendum-right" = At the base of the teeth, at the right end of the rack.
// "dedendum-back" = At the base of the teeth, at the back of the rack.
// "dedendum-front" = At the base of the teeth, at the front of the rack.
// Example(VPR=[60,0,325],VPD=130):
// rack(pitch=5, teeth=10, thickness=5, height=5, pressure_angle=20);
// Example: Rack for Helical Gear
// rack(pitch=5, teeth=10, thickness=5, height=5, pressure_angle=20, helical=30);
// Example: Alternate Helical Gear
// rack(pitch=5, teeth=10, thickness=5, height=5, pressure_angle=20, helical=-30);
// Example: Metric Rack
// rack(mod=2, teeth=10, thickness=5, height=5, pressure_angle=20);
// Example(Anim,VPT=[0,0,12],VPD=100,Frames=6): Rack and Pinion
// teeth1 = 16; teeth2 = 16;
// pitch = 5; thick = 5; helical = 30;
2023-07-17 06:10:27 +00:00
// pr = pitch_radius(pitch, teeth2, helical=helical);
// right(pr*2*PI/teeth2*$t)
// rack(pitch, teeth1, thickness=thick, height=5, helical=helical);
2023-07-17 23:24:03 +00:00
// up(pr)
// spur_gear(
// pitch, teeth2,
// thickness=thick,
// helical=helical,
// shaft_diam=5,
// orient=BACK,
// gear_spin=180-$t*360/teeth2);
2023-07-15 23:06:30 +00:00
2022-03-28 03:06:42 +00:00
module rack (
2023-07-15 23:06:30 +00:00
pitch ,
2022-03-28 03:06:42 +00:00
teeth = 20 ,
2023-07-15 23:06:30 +00:00
thickness ,
2022-03-28 03:06:42 +00:00
height = 10 ,
2023-07-15 23:06:30 +00:00
pressure_angle ,
2022-03-28 03:06:42 +00:00
backlash = 0.0 ,
clearance ,
2023-07-15 23:06:30 +00:00
helical ,
profile_shift = 0 ,
gear_travel = 0 ,
2023-07-17 06:10:27 +00:00
circ_pitch ,
diam_pitch ,
2022-03-28 03:06:42 +00:00
mod ,
anchor = CENTER ,
spin = 0 ,
orient = UP
) {
2023-07-17 06:10:27 +00:00
pitch = _inherit_gear_pitch ( pitch , circ_pitch , diam_pitch , mod ) ;
PA = _inherit_gear_pa ( pressure_angle ) ;
helical = _inherit_gear_helical ( helical ) ;
thickness = _inherit_gear_thickness ( thickness ) ;
2023-07-15 23:06:30 +00:00
trans_pitch = pitch / cos ( helical ) ;
a = _adendum ( pitch , profile_shift ) ;
d = _dedendum ( pitch , clearance , profile_shift ) ;
l = teeth * trans_pitch ;
2022-03-28 03:06:42 +00:00
anchors = [
named_anchor ( "adendum" , [ 0 , 0 , a ] , BACK ) ,
named_anchor ( "adendum-left" , [ - l / 2 , 0 , a ] , LEFT ) ,
named_anchor ( "adendum-right" , [ l / 2 , 0 , a ] , RIGHT ) ,
named_anchor ( "adendum-front" , [ 0 , - thickness / 2 , a ] , DOWN ) ,
named_anchor ( "adendum-back" , [ 0 , thickness / 2 , a ] , UP ) ,
named_anchor ( "dedendum" , [ 0 , 0 , - d ] , BACK ) ,
named_anchor ( "dedendum-left" , [ - l / 2 , 0 , - d ] , LEFT ) ,
named_anchor ( "dedendum-right" , [ l / 2 , 0 , - d ] , RIGHT ) ,
named_anchor ( "dedendum-front" , [ 0 , - thickness / 2 , - d ] , DOWN ) ,
named_anchor ( "dedendum-back" , [ 0 , thickness / 2 , - d ] , UP ) ,
] ;
2023-07-15 23:06:30 +00:00
size = [ l , thickness , 2 * height ] ;
attachable ( anchor , spin , orient , size = size , anchors = anchors ) {
right ( gear_travel )
2022-03-28 03:06:42 +00:00
skew ( sxy = tan ( helical ) ) xrot ( 90 ) {
linear_extrude ( height = thickness , center = true , convexity = teeth * 2 ) {
rack2d (
pitch = pitch ,
teeth = teeth ,
height = height ,
2023-07-15 23:06:30 +00:00
pressure_angle = PA ,
2022-03-28 03:06:42 +00:00
backlash = backlash ,
2023-07-15 23:06:30 +00:00
clearance = clearance ,
helical = helical ,
profile_shift = profile_shift
2022-03-28 03:06:42 +00:00
) ;
}
}
children ( ) ;
}
}
function rack (
2023-07-15 23:06:30 +00:00
pitch ,
2022-03-28 03:06:42 +00:00
teeth = 20 ,
2023-07-15 23:06:30 +00:00
thickness ,
2022-03-28 03:06:42 +00:00
height = 10 ,
2023-07-15 23:06:30 +00:00
pressure_angle ,
2022-03-28 03:06:42 +00:00
backlash = 0.0 ,
clearance ,
2023-07-15 23:06:30 +00:00
helical ,
profile_shift = 0 ,
2023-07-17 06:10:27 +00:00
circ_pitch ,
diam_pitch ,
2022-03-28 03:06:42 +00:00
mod ,
2023-07-15 23:06:30 +00:00
gear_travel = 0 ,
2022-03-28 03:06:42 +00:00
anchor = CENTER ,
spin = 0 ,
orient = UP
) =
let (
2023-07-17 06:10:27 +00:00
pitch = _inherit_gear_pitch ( pitch , circ_pitch , diam_pitch , mod ) ,
PA = _inherit_gear_pa ( pressure_angle ) ,
helical = _inherit_gear_helical ( helical ) ,
thickness = _inherit_gear_thickness ( thickness ) ,
2023-07-15 23:06:30 +00:00
trans_pitch = pitch / cos ( helical ) ,
a = _adendum ( pitch , profile_shift ) ,
d = _dedendum ( pitch , clearance , profile_shift ) ,
l = teeth * trans_pitch ,
path = rack2d (
pitch = pitch ,
teeth = teeth ,
height = height ,
2023-07-17 06:10:27 +00:00
pressure_angle = PA ,
2023-07-15 23:06:30 +00:00
backlash = backlash ,
clearance = clearance ,
helical = helical ,
profile_shift = profile_shift
) ,
vnf = linear_sweep ( path , height = thickness , anchor = "origin" , orient = FWD ) ,
m = product ( [
right ( gear_travel ) ,
if ( helical ) skew ( sxy = tan ( helical ) ) ,
] ) ,
out = apply ( m , vnf ) ,
size = [ l , thickness , 2 * height ] ,
2022-03-28 03:06:42 +00:00
anchors = [
named_anchor ( "adendum" , [ 0 , 0 , a ] , BACK ) ,
named_anchor ( "adendum-left" , [ - l / 2 , 0 , a ] , LEFT ) ,
named_anchor ( "adendum-right" , [ l / 2 , 0 , a ] , RIGHT ) ,
named_anchor ( "adendum-front" , [ 0 , - thickness / 2 , a ] , DOWN ) ,
named_anchor ( "adendum-back" , [ 0 , thickness / 2 , a ] , UP ) ,
named_anchor ( "dedendum" , [ 0 , 0 , - d ] , BACK ) ,
named_anchor ( "dedendum-left" , [ - l / 2 , 0 , - d ] , LEFT ) ,
named_anchor ( "dedendum-right" , [ l / 2 , 0 , - d ] , RIGHT ) ,
named_anchor ( "dedendum-front" , [ 0 , - thickness / 2 , - d ] , DOWN ) ,
named_anchor ( "dedendum-back" , [ 0 , thickness / 2 , - d ] , UP ) ,
2023-07-15 23:06:30 +00:00
]
) reorient ( anchor , spin , orient , size = size , anchors = anchors , p = out ) ;
2022-03-28 03:06:42 +00:00
2020-10-20 05:53:56 +00:00
// Function&Module: rack2d()
2023-06-18 13:22:41 +00:00
// Synopsis: Creates a 2D gear rack.
2023-05-27 08:42:09 +00:00
// SynTags: Geom, Path
2023-04-05 00:25:13 +00:00
// Topics: Gears, Parts
// See Also: rack(), spur_gear(), spur_gear2d(), bevel_gear()
2020-10-20 05:53:56 +00:00
// Usage: As a Module
2023-04-05 03:29:21 +00:00
// rack2d(pitch, teeth, height, [pressure_angle=], [backlash=], [clearance=]) [ATTACHMENTS];
// rack2d(mod=, teeth=, height=, [pressure_angle=], [backlash=], [clearance=]) [ATTACHMENTS];
2022-04-09 01:06:14 +00:00
// Usage: As a Function
2023-04-05 03:29:21 +00:00
// path = rack2d(pitch, teeth, height, [pressure_angle=], [backlash=], [clearance=]);
// path = rack2d(mod=, teeth=, height=, [pressure_angle=], [backlash=], [clearance=]);
2020-10-20 05:53:56 +00:00
// Description:
// This is used to create a 2D rack, which is a linear bar with teeth that a gear can roll along.
// A rack can mesh with any gear that has the same `pitch` and `pressure_angle`.
// When called as a function, returns a 2D path for the outline of the rack.
// When called as a module, creates a 2D rack shape.
// Arguments:
2023-07-17 06:10:27 +00:00
// pitch = The pitch, or distance in mm between teeth along the rack. Matches up with circular pitch on a spur gear. Default: 5
2020-10-20 05:53:56 +00:00
// teeth = Total number of teeth along the rack
2023-07-15 23:06:30 +00:00
// height = Height of rack in mm, from pitch line to back of rack.
2022-04-09 01:06:14 +00:00
// ---
2020-10-20 05:53:56 +00:00
// pressure_angle = Controls how straight or bulged the tooth sides are. In degrees.
// backlash = Gap between two meshing teeth, in the direction along the circumference of the pitch circle
2023-07-15 23:06:30 +00:00
// clearance = Clearance gap at the bottom of the inter-tooth valleys.
// helical = The angle of the rack teeth away from perpendicular to the rack length. Stretches out the tooth shapes. Used to match helical spur gear pinions. Default: 0
2023-07-19 09:52:10 +00:00
// profile_shift = Profile shift factor x for tooth shape.
// gear_travel = The distance the rack should be moved by linearly. Default: 0
// rounding = If true, rack tips and valleys are slightly rounded. Default: true
2023-07-17 06:10:27 +00:00
// diam_pitch = The diametral pitch, or number of teeth per inch of pitch diameter. Note that the diametral pitch is a completely different thing than the pitch diameter.
// mod = The metric module/modulus of the gear, or mm of pitch diameter per tooth.
2021-11-20 03:33:16 +00:00
// anchor = Translate so anchor point is at origin (0,0,0). See [anchor](attachments.scad#subsection-anchor). Default: `CENTER`
// spin = Rotate this many degrees around the Z axis after anchor. See [spin](attachments.scad#subsection-spin). Default: `0`
2021-02-20 03:56:43 +00:00
// Extra Anchors:
2020-10-20 05:53:56 +00:00
// "adendum" = At the tips of the teeth, at the center of rack.
// "adendum-left" = At the tips of the teeth, at the left end of the rack.
// "adendum-right" = At the tips of the teeth, at the right end of the rack.
2020-10-20 06:52:46 +00:00
// "dedendum" = At the height of the teeth, at the center of rack.
// "dedendum-left" = At the height of the teeth, at the left end of the rack.
// "dedendum-right" = At the height of the teeth, at the right end of the rack.
2020-10-20 05:53:56 +00:00
// Example(2D):
2020-10-20 06:52:46 +00:00
// rack2d(pitch=5, teeth=10, height=10, pressure_angle=20);
2020-10-20 05:53:56 +00:00
// Example(2D): Called as a Function
2023-07-15 23:06:30 +00:00
// path = rack2d(pitch=8, teeth=8, height=10, pressure_angle=20);
2020-10-20 05:53:56 +00:00
// polygon(path);
2023-07-15 23:06:30 +00:00
2020-10-20 05:53:56 +00:00
function rack2d (
2023-07-15 23:06:30 +00:00
pitch ,
2020-10-20 06:52:46 +00:00
teeth = 20 ,
height = 10 ,
2023-07-15 23:06:30 +00:00
pressure_angle ,
backlash = 0 ,
clearance ,
helical ,
profile_shift = 0 ,
2023-07-17 06:10:27 +00:00
circ_pitch ,
diam_pitch ,
2020-10-22 08:20:07 +00:00
mod ,
2023-07-15 23:06:30 +00:00
gear_travel = 0 ,
2023-07-19 09:52:10 +00:00
rounding = true ,
2020-10-20 06:52:46 +00:00
anchor = CENTER ,
spin = 0
2023-07-15 23:06:30 +00:00
) = let (
2023-07-17 06:10:27 +00:00
pitch = _inherit_gear_pitch ( pitch , circ_pitch , diam_pitch , mod ) ,
PA = _inherit_gear_pa ( pressure_angle ) ,
helical = _inherit_gear_helical ( helical ) ,
2023-07-15 23:06:30 +00:00
adendum = _adendum ( pitch , profile_shift ) ,
2023-07-15 23:35:18 +00:00
dedendum = _dedendum ( pitch , clearance , profile_shift )
2020-10-20 06:52:46 +00:00
)
2023-07-15 23:06:30 +00:00
assert ( dedendum < height )
2020-10-20 06:52:46 +00:00
let (
2023-07-15 23:06:30 +00:00
trans_pitch = pitch / cos ( helical ) ,
trans_pa = atan ( tan ( PA ) / cos ( helical ) ) ,
tthick = trans_pitch / PI * ( PI / 2 + 2 * profile_shift * tan ( PA ) ) - backlash ,
l = teeth * trans_pitch ,
ax = ang_adj_to_opp ( trans_pa , adendum ) ,
dx = ang_adj_to_opp ( trans_pa , dedendum ) ,
2023-07-19 09:52:10 +00:00
clear = dedendum - adendum ,
2023-07-15 23:06:30 +00:00
poff = tthick / 2 - backlash ,
tooth = [
[ - trans_pitch / 2 , - dedendum ] ,
2023-07-19 09:52:10 +00:00
if ( rounding ) each arc ( n = 4 , r = clear , corner = [
2023-07-15 23:06:30 +00:00
[ - trans_pitch / 2 , - dedendum ] ,
2023-07-19 09:52:10 +00:00
[ - poff - dx , - dedendum ] ,
[ - poff + ax , + adendum ] ,
] ) else [ - poff - dx , - dedendum ] ,
if ( rounding ) each arc ( n = 4 , r = trans_pitch / 16 , corner = [
[ - poff - dx , - dedendum ] ,
[ - poff + ax , + adendum ] ,
[ + poff - ax , + adendum ] ,
] ) else [ - poff + ax , + adendum ] ,
if ( rounding ) each arc ( n = 4 , r = trans_pitch / 16 , corner = [
[ - poff + ax , + adendum ] ,
[ + poff - ax , + adendum ] ,
[ + poff + dx , - dedendum ] ,
] ) else [ + poff - ax , + adendum ] ,
if ( rounding ) each arc ( n = 4 , r = clear , corner = [
[ + poff - ax , + adendum ] ,
[ + poff + dx , - dedendum ] ,
2023-07-15 23:06:30 +00:00
[ + trans_pitch / 2 , - dedendum ] ,
2023-07-19 09:52:10 +00:00
] ) else [ + poff + dx , - dedendum ] ,
2023-07-15 23:06:30 +00:00
[ + trans_pitch / 2 , - dedendum ] ,
2020-10-20 05:53:56 +00:00
] ,
2023-07-15 23:06:30 +00:00
path2 = [
for ( m = xcopies ( trans_pitch , n = teeth ) )
each apply ( m , tooth )
] ,
path = right ( gear_travel , p = [
[ path2 [ 0 ] . x , - height ] ,
each path2 ,
[ last ( path2 ) . x , - height ] ,
] ) ,
size = [ l , 2 * height ] ,
anchors = [
named_anchor ( "adendum" , [ 0 , adendum , 0 ] , BACK ) ,
named_anchor ( "adendum-left" , [ - l / 2 , adendum , 0 ] , LEFT ) ,
named_anchor ( "adendum-right" , [ l / 2 , adendum , 0 ] , RIGHT ) ,
named_anchor ( "dedendum" , [ 0 , - dedendum , 0 ] , BACK ) ,
named_anchor ( "dedendum-left" , [ - l / 2 , - dedendum , 0 ] , LEFT ) ,
named_anchor ( "dedendum-right" , [ l / 2 , - dedendum , 0 ] , RIGHT ) ,
2020-10-20 05:53:56 +00:00
]
2023-07-15 23:06:30 +00:00
) reorient ( anchor , spin , two_d = true , size = size , anchors = anchors , p = path ) ;
2020-10-20 05:53:56 +00:00
module rack2d (
2023-07-15 23:06:30 +00:00
pitch ,
2020-10-20 06:52:46 +00:00
teeth = 20 ,
height = 10 ,
2023-07-15 23:06:30 +00:00
pressure_angle ,
2020-10-20 06:52:46 +00:00
backlash = 0.0 ,
2023-07-15 23:06:30 +00:00
clearance ,
helical ,
profile_shift = 0 ,
gear_travel = 0 ,
2023-07-17 06:10:27 +00:00
circ_pitch ,
diam_pitch ,
2020-10-22 08:20:07 +00:00
mod ,
2020-10-20 06:52:46 +00:00
anchor = CENTER ,
spin = 0
2020-10-20 05:53:56 +00:00
) {
2023-07-17 06:10:27 +00:00
pitch = _inherit_gear_pitch ( pitch , circ_pitch , diam_pitch , mod ) ;
PA = _inherit_gear_pa ( pressure_angle ) ;
helical = _inherit_gear_helical ( helical ) ;
2023-07-15 23:06:30 +00:00
trans_pitch = pitch / cos ( helical ) ;
a = _adendum ( pitch , profile_shift ) ;
d = _dedendum ( pitch , clearance , profile_shift ) ;
l = teeth * trans_pitch ;
path = rack2d (
pitch = pitch ,
teeth = teeth ,
height = height ,
2023-07-17 06:10:27 +00:00
pressure_angle = PA ,
2023-07-15 23:06:30 +00:00
backlash = backlash ,
clearance = clearance ,
helical = helical ,
profile_shift = profile_shift
) ;
size = [ l , 2 * height ] ;
2020-10-20 05:53:56 +00:00
anchors = [
2021-09-16 22:32:12 +00:00
named_anchor ( "adendum" , [ 0 , a , 0 ] , BACK ) ,
named_anchor ( "adendum-left" , [ - l / 2 , a , 0 ] , LEFT ) ,
named_anchor ( "adendum-right" , [ l / 2 , a , 0 ] , RIGHT ) ,
named_anchor ( "dedendum" , [ 0 , - d , 0 ] , BACK ) ,
named_anchor ( "dedendum-left" , [ - l / 2 , - d , 0 ] , LEFT ) ,
named_anchor ( "dedendum-right" , [ l / 2 , - d , 0 ] , RIGHT ) ,
2020-10-20 05:53:56 +00:00
] ;
2023-07-15 23:06:30 +00:00
attachable ( anchor , spin , two_d = true , size = size , anchors = anchors ) {
right ( gear_travel ) polygon ( path ) ;
2020-10-20 05:53:56 +00:00
children ( ) ;
}
}
2022-03-28 03:06:42 +00:00
// Function&Module: bevel_gear()
2023-06-18 13:22:41 +00:00
// Synopsis: Creates a straight or spiral bevel gear.
2023-05-27 08:42:09 +00:00
// SynTags: Geom, VNF
2023-04-05 00:25:13 +00:00
// Topics: Gears, Parts
// See Also: rack(), rack2d(), spur_gear(), spur_gear2d(), bevel_pitch_angle(), bevel_gear()
2020-10-20 05:53:56 +00:00
// Usage: As a Module
2023-07-17 06:10:27 +00:00
// bevel_gear(circ_pitch, teeth, face_width, [pitch_angle=]|[mate_teeth=], [shaft_diam=], [hide=], [pressure_angle=], [clearance=], [backlash=], [cutter_radius=], [spiral_angle=], [left_handed=], [slices=], [internal=]);
2023-06-20 03:41:39 +00:00
// bevel_gear(mod=, teeth=, face_width=, [pitch_angle=]|[mate_teeth=], [shaft_diam=], [hide=], [pressure_angle=], [clearance=], [backlash=], [cutter_radius=], [spiral_angle=], [left_handed=], [slices=], [internal=]);
2022-03-28 03:06:42 +00:00
// Usage: As a Function
2023-07-17 06:10:27 +00:00
// vnf = bevel_gear(circ_pitch, teeth, face_width, [pitch_angle=]|[mate_teeth=], [hide=], [pressure_angle=], [clearance=], [backlash=], [cutter_radius=], [spiral_angle=], [left_handed=], [slices=], [internal=]);
2023-06-20 03:41:39 +00:00
// vnf = bevel_gear(mod=, teeth=, face_width=, [pitch_angle=]|[mate_teeth=], [hide=], [pressure_angle=], [clearance=], [backlash=], [cutter_radius=], [spiral_angle=], [left_handed=], [slices=], [internal=]);
2019-03-23 04:13:18 +00:00
// Description:
2022-03-28 03:06:42 +00:00
// Creates a (potentially spiral) bevel gear. The module `bevel_gear()` gives a bevel gear, with
// reasonable defaults for all the parameters. Normally, you should just choose the first 4
2023-06-18 13:22:41 +00:00
// parameters, and let the rest be default values. In straight bevel gear sets, when each tooth
// engages it inpacts the corresponding tooth. The abrupt tooth engagement causes impact stress
// which makes them more prone to breakage. Spiral bevel gears have teeth formed along spirals so
// they engage more gradually, resulting in a less abrupt transfer of force, so they are quieter
// in operation and less likely to break.
// .
2023-07-15 23:06:30 +00:00
// The module `bevel_gear()` gives a gear in the XY plane, centered on the origin, with one tooth
// centered on the positive Y axis. The various functions below it take the same parameters, and
// return various measurements for the gear. The most important function is `mesh_radius()`, which tells
// how far apart to space gears that are meshing, and `outer_radius()`, which gives the size of the
// region filled by the gear. A gear has a "pitch circle", which is an invisible circle that cuts
// through the middle of each tooth (though not the exact center). In order for two gears to mesh,
// their pitch circles should just touch, if no profile shifting is done). So the distance between
// their centers should be `mesh_radius()` for one, plus `mesh_radius()` for the other, which gives
// the radii of their pitch circles and profile shifts. In order for two gears to mesh, they must
2023-07-17 06:10:27 +00:00
// have the same `circ_pitch` and `pressure_angle` parameters. `circ_pitch` gives the number of millimeters
2023-07-15 23:06:30 +00:00
// of arc around the pitch circle covered by one tooth and one space between teeth. The `pressure_angle`
// controls how flat or bulged the sides of the teeth are. Common values include 14.5 degrees and 20
// degrees, and occasionally 25. The default here is 20 degrees. Larger numbers bulge out more,
// giving stronger teeth. The ratio of `teeth` for two meshing gears gives how many times one will make a full
// revolution when the the other makes one full revolution. If the two numbers are coprime (i.e.
// are not both divisible by the same number greater than 1), then every tooth on one gear will meet
// every tooth on the other, for more even wear. So coprime numbers of teeth are good.
2019-03-23 04:13:18 +00:00
// Arguments:
2023-07-17 06:10:27 +00:00
// circ_pitch = The circular pitch, or distance between teeth around the pitch circle, in mm. Default: 5
2022-03-28 03:06:42 +00:00
// teeth = Total number of teeth around the entire perimeter. Default: 20
// face_width = Width of the toothed surface in mm, from inside to outside. Default: 10
2023-06-20 03:41:39 +00:00
// ---
2022-03-28 03:06:42 +00:00
// pitch_angle = Angle of beveled gear face. Default: 45
// mate_teeth = The number of teeth in the gear that this gear will mate with. Overrides `pitch_angle` if given.
// shaft_diam = Diameter of the hole in the center, in mm. Module use only. Default: 0 (no shaft hole)
// hide = Number of teeth to delete to make this only a fraction of a circle. Default: 0
2023-07-15 23:06:30 +00:00
// pressure_angle = Controls how straight or bulged the tooth sides are. In degrees. Default: 20
2019-03-23 04:13:18 +00:00
// clearance = Clearance gap at the bottom of the inter-tooth valleys.
2022-03-28 03:06:42 +00:00
// backlash = Gap between two meshing teeth, in the direction along the circumference of the pitch circle. Default: 0
// cutter_radius = Radius of spiral arc for teeth. If 0, then gear will not be spiral. Default: 0
// spiral_angle = The base angle for spiral teeth. Default: 0
// left_handed = If true, the gear returned will have a left-handed spiral. Default: false
// slices = Number of vertical layers to divide gear into. Useful for refining gears with `spiral`. Default: 1
2023-06-20 03:41:39 +00:00
// internal = If true, create a mask for difference()ing from something else.
2023-07-17 06:10:27 +00:00
// diam_pitch = The diametral pitch, or number of teeth per inch of pitch diameter. Note that the diametral pitch is a completely different thing than the pitch diameter.
// mod = The metric module/modulus of the gear, or mm of pitch diameter per tooth.
2021-11-20 03:33:16 +00:00
// anchor = Translate so anchor point is at origin (0,0,0). See [anchor](attachments.scad#subsection-anchor). Default: `CENTER`
// spin = Rotate this many degrees around the Z axis after anchor. See [spin](attachments.scad#subsection-spin). Default: `0`
// orient = Vector to rotate top towards, after spin. See [orient](attachments.scad#subsection-orient). Default: `UP`
2022-03-28 03:06:42 +00:00
// Extra Anchors:
// "apex" = At the pitch cone apex for the bevel gear.
// "pitchbase" = At the natural height of the pitch radius of the beveled gear.
// "flattop" = At the top of the flat top of the bevel gear.
2023-06-20 03:41:39 +00:00
// Side Effects:
// If internal is true then the default tag is "remove"
2022-03-28 03:06:42 +00:00
// Example: Beveled Gear
// bevel_gear(
2023-07-17 06:10:27 +00:00
// circ_pitch=5, teeth=36, face_width=10, shaft_diam=5,
2022-03-28 03:06:42 +00:00
// pitch_angle=45, spiral_angle=0
2021-02-28 23:44:09 +00:00
// );
2022-03-28 03:06:42 +00:00
// Example: Spiral Beveled Gear and Pinion
// t1 = 16; t2 = 28;
// bevel_gear(
2023-07-17 06:10:27 +00:00
// circ_pitch=5, teeth=t1, mate_teeth=t2,
2022-03-28 03:06:42 +00:00
// slices=12, anchor="apex", orient=FWD
// );
// bevel_gear(
2023-07-17 06:10:27 +00:00
// circ_pitch=5, teeth=t2, mate_teeth=t1, left_handed=true,
2022-03-28 03:06:42 +00:00
// slices=12, anchor="apex", spin=180/t2
// );
// Example(Anim,Frames=4,VPD=175): Manual Spacing of Pinion and Gear
2023-07-17 06:10:27 +00:00
// t1 = 14; t2 = 28; circ_pitch=5;
// back(pitch_radius(circ_pitch, t2)) {
2022-03-28 03:06:42 +00:00
// yrot($t*360/t1)
// bevel_gear(
2023-07-17 06:10:27 +00:00
// circ_pitch=circ_pitch, teeth=t1, mate_teeth=t2, shaft_diam=5,
2022-03-28 03:06:42 +00:00
// slices=12, orient=FWD
// );
// }
2023-07-17 06:10:27 +00:00
// down(pitch_radius(circ_pitch, t1)) {
2022-03-28 03:06:42 +00:00
// zrot($t*360/t2)
// bevel_gear(
2023-07-17 06:10:27 +00:00
// circ_pitch=circ_pitch, teeth=t2, mate_teeth=t1, left_handed=true,
2022-03-28 03:06:42 +00:00
// shaft_diam=5, slices=12, spin=180/t2
// );
// }
2023-07-15 23:06:30 +00:00
2022-03-28 03:06:42 +00:00
function bevel_gear (
2023-07-17 06:10:27 +00:00
circ_pitch = 5 ,
2022-03-28 03:06:42 +00:00
teeth = 20 ,
face_width = 10 ,
pitch_angle = 45 ,
mate_teeth ,
2020-10-20 06:52:46 +00:00
hide = 0 ,
2022-03-28 03:06:42 +00:00
pressure_angle = 20 ,
2023-07-17 06:10:27 +00:00
clearance ,
2020-10-20 06:52:46 +00:00
backlash = 0.0 ,
2022-03-28 03:06:42 +00:00
cutter_radius = 30 ,
spiral_angle = 35 ,
left_handed = false ,
slices = 5 ,
2023-06-20 03:41:39 +00:00
internal ,
interior ,
2023-07-17 06:10:27 +00:00
pitch ,
diam_pitch ,
2020-10-22 08:20:07 +00:00
mod ,
2022-03-28 03:06:42 +00:00
anchor = "pitchbase" ,
2020-10-20 06:52:46 +00:00
spin = 0 ,
orient = UP
2023-07-15 23:06:30 +00:00
) = let (
dummy = ! is_undef ( interior ) ? echo ( "In bevel_gear(), the argument 'interior=' has been deprecated, and may be removed in the future. Please use 'internal=' instead." ) : 0 ,
2023-06-20 03:41:39 +00:00
internal = first_defined ( [ internal , interior , false ] ) ,
2023-07-17 06:10:27 +00:00
circ_pitch = _inherit_gear_pitch ( pitch , circ_pitch , diam_pitch , mod ) ,
PA = _inherit_gear_pa ( pressure_angle ) ,
spiral_angle = _inherit_gear_helical ( spiral_angle , invert = ! internal ) ,
face_width = _inherit_gear_thickness ( face_width ) ,
2022-03-28 03:06:42 +00:00
slices = cutter_radius = = 0 ? 1 : slices ,
pitch_angle = is_undef ( mate_teeth ) ? pitch_angle : atan ( teeth / mate_teeth ) ,
2023-07-17 06:10:27 +00:00
pr = pitch_radius ( circ_pitch , teeth ) ,
rr = _root_radius ( circ_pitch , teeth , clearance , internal ) ,
2022-03-28 03:06:42 +00:00
pitchoff = ( pr - rr ) * sin ( pitch_angle ) ,
ocone_rad = opp_ang_to_hyp ( pr , pitch_angle ) ,
icone_rad = ocone_rad - face_width ,
cutter_radius = cutter_radius = = 0 ? 1000 : cutter_radius ,
midpr = ( icone_rad + ocone_rad ) / 2 ,
radcp = [ 0 , midpr ] + polar_to_xy ( cutter_radius , 180 + spiral_angle ) ,
angC1 = law_of_cosines ( a = cutter_radius , b = norm ( radcp ) , c = ocone_rad ) ,
angC2 = law_of_cosines ( a = cutter_radius , b = norm ( radcp ) , c = icone_rad ) ,
radcpang = v_theta ( radcp ) ,
sang = radcpang - ( 180 - angC1 ) ,
eang = radcpang - ( 180 - angC2 ) ,
2023-07-17 23:24:03 +00:00
profile = reverse ( _gear_tooth_profile (
2023-07-17 06:10:27 +00:00
circ_pitch = circ_pitch ,
2022-03-28 03:06:42 +00:00
teeth = teeth ,
2023-07-17 06:10:27 +00:00
pressure_angle = PA ,
2022-03-28 03:06:42 +00:00
clearance = clearance ,
backlash = backlash ,
2023-06-20 03:41:39 +00:00
internal = internal ,
2022-03-28 03:06:42 +00:00
center = true
2023-07-17 23:24:03 +00:00
) ) ,
2022-03-28 03:06:42 +00:00
verts1 = [
for ( v = lerpn ( 0 , 1 , slices + 1 ) ) let (
p = radcp + polar_to_xy ( cutter_radius , lerp ( sang , eang , v ) ) ,
ang = v_theta ( p ) - 90 ,
dist = norm ( p )
) [
let (
u = dist / ocone_rad ,
m = up ( ( 1 - u ) * pr / tan ( pitch_angle ) ) *
up ( pitchoff ) *
zrot ( ang / sin ( pitch_angle ) ) *
back ( u * pr ) *
xrot ( pitch_angle ) *
scale ( u )
)
for ( tooth = [ 0 : 1 : teeth - 1 ] )
each apply ( xflip ( ) * zrot ( 360 * tooth / teeth ) * m , path3d ( profile ) )
]
2020-10-20 05:53:56 +00:00
] ,
2022-03-28 03:06:42 +00:00
botz = verts1 [ 0 ] [ 0 ] . z ,
topz = last ( verts1 ) [ 0 ] . z ,
thickness = abs ( topz - botz ) ,
cpz = ( topz + botz ) / 2 ,
vertices = [ for ( x = verts1 ) reverse ( x ) ] ,
sides_vnf = vnf_vertex_array ( vertices , caps = false , col_wrap = true , reverse = true ) ,
top_verts = last ( vertices ) ,
bot_verts = vertices [ 0 ] ,
gear_pts = len ( top_verts ) ,
face_pts = gear_pts / teeth ,
top_faces = [
for ( i = [ 0 : 1 : teeth - 1 ] , j = [ 0 : 1 : ( face_pts / 2 ) - 1 ] ) each [
[ i * face_pts + j , ( i + 1 ) * face_pts - j - 1 , ( i + 1 ) * face_pts - j - 2 ] ,
[ i * face_pts + j , ( i + 1 ) * face_pts - j - 2 , i * face_pts + j + 1 ]
] ,
for ( i = [ 0 : 1 : teeth - 1 ] ) each [
[ gear_pts , ( i + 1 ) * face_pts - 1 , i * face_pts ] ,
[ gear_pts , ( ( i + 1 ) % teeth ) * face_pts , ( i + 1 ) * face_pts - 1 ]
]
] ,
vnf1 = vnf_join ( [
[
[ each top_verts , [ 0 , 0 , top_verts [ 0 ] . z ] ] ,
top_faces
] ,
[
[ each bot_verts , [ 0 , 0 , bot_verts [ 0 ] . z ] ] ,
[ for ( x = top_faces ) reverse ( x ) ]
] ,
sides_vnf
] ) ,
lvnf = left_handed ? vnf1 : xflip ( p = vnf1 ) ,
vnf = down ( cpz , p = lvnf ) ,
anchors = [
named_anchor ( "pitchbase" , [ 0 , 0 , pitchoff - thickness / 2 ] ) ,
named_anchor ( "flattop" , [ 0 , 0 , thickness / 2 ] ) ,
named_anchor ( "apex" , [ 0 , 0 , hyp_ang_to_opp ( ocone_rad , 90 - pitch_angle ) + pitchoff - thickness / 2 ] )
]
) reorient ( anchor , spin , orient , vnf = vnf , extent = true , anchors = anchors , p = vnf ) ;
2020-10-20 05:53:56 +00:00
2022-03-28 03:06:42 +00:00
module bevel_gear (
2023-07-17 06:10:27 +00:00
circ_pitch = 5 ,
2022-03-28 03:06:42 +00:00
teeth = 20 ,
face_width = 10 ,
pitch_angle = 45 ,
mate_teeth ,
2020-10-21 05:24:12 +00:00
shaft_diam = 0 ,
2022-03-28 03:06:42 +00:00
pressure_angle = 20 ,
2020-05-30 02:04:34 +00:00
clearance = undef ,
2020-10-20 06:52:46 +00:00
backlash = 0.0 ,
2022-03-28 03:06:42 +00:00
cutter_radius = 30 ,
spiral_angle = 35 ,
left_handed = false ,
slices = 5 ,
2023-06-20 03:41:39 +00:00
internal ,
interior ,
2023-07-17 06:10:27 +00:00
pitch ,
diam_pitch ,
2020-10-22 08:20:07 +00:00
mod ,
2022-03-28 03:06:42 +00:00
anchor = "pitchbase" ,
2020-10-20 06:52:46 +00:00
spin = 0 ,
orient = UP
2019-02-07 05:04:45 +00:00
) {
2023-07-15 23:06:30 +00:00
dummy = ! is_undef ( interior ) ? echo ( "In bevel_gear(), the argument 'interior=' has been deprecated, and may be removed in the future. Please use 'internal=' instead." ) : 0 ;
2023-06-20 03:41:39 +00:00
internal = first_defined ( [ internal , interior , false ] ) ;
2023-07-17 06:10:27 +00:00
circ_pitch = _inherit_gear_pitch ( pitch , circ_pitch , diam_pitch , mod ) ;
PA = _inherit_gear_pa ( pressure_angle ) ;
spiral_angle = _inherit_gear_helical ( spiral_angle , invert = ! internal ) ;
face_width = _inherit_gear_thickness ( face_width ) ;
2022-03-28 03:06:42 +00:00
slices = cutter_radius = = 0 ? 1 : slices ;
pitch_angle = is_undef ( mate_teeth ) ? pitch_angle : atan ( teeth / mate_teeth ) ;
2023-07-17 06:10:27 +00:00
pr = pitch_radius ( circ_pitch , teeth ) ;
2022-03-28 03:06:42 +00:00
ipr = pr - face_width * sin ( pitch_angle ) ;
2023-07-17 06:10:27 +00:00
rr = _root_radius ( circ_pitch , teeth , clearance , internal ) ;
2022-03-28 03:06:42 +00:00
pitchoff = ( pr - rr ) * sin ( pitch_angle ) ;
vnf = bevel_gear (
2023-07-17 06:10:27 +00:00
circ_pitch = circ_pitch ,
2022-03-28 03:06:42 +00:00
teeth = teeth ,
face_width = face_width ,
pitch_angle = pitch_angle ,
2023-07-17 06:10:27 +00:00
pressure_angle = PA ,
2022-03-28 03:06:42 +00:00
clearance = clearance ,
backlash = backlash ,
cutter_radius = cutter_radius ,
spiral_angle = spiral_angle ,
left_handed = left_handed ,
slices = slices ,
2023-06-20 03:41:39 +00:00
internal = internal ,
2022-03-28 03:06:42 +00:00
anchor = CENTER
) ;
axis_zs = [ for ( p = vnf [ 0 ] ) if ( norm ( point2d ( p ) ) < EPSILON ) p . z ] ;
thickness = max ( axis_zs ) - min ( axis_zs ) ;
anchors = [
named_anchor ( "pitchbase" , [ 0 , 0 , pitchoff - thickness / 2 ] ) ,
named_anchor ( "flattop" , [ 0 , 0 , thickness / 2 ] ) ,
named_anchor ( "apex" , [ 0 , 0 , adj_ang_to_opp ( pr , 90 - pitch_angle ) + pitchoff - thickness / 2 ] )
] ;
2023-07-17 06:10:27 +00:00
default_tag ( "remove" , internal ) {
2023-06-20 03:41:39 +00:00
attachable ( anchor , spin , orient , r1 = pr , r2 = ipr , h = thickness , anchors = anchors ) {
difference ( ) {
vnf_polyhedron ( vnf , convexity = teeth / 2 ) ;
if ( shaft_diam > 0 ) {
cylinder ( h = 2 * thickness + 1 , r = shaft_diam / 2 , center = true , $fn = max ( 12 , segs ( shaft_diam / 2 ) ) ) ;
}
2020-05-30 02:04:34 +00:00
}
2023-06-20 03:41:39 +00:00
children ( ) ;
2020-05-30 02:04:34 +00:00
}
2023-07-17 06:10:27 +00:00
}
2019-06-12 02:29:39 +00:00
}
2022-03-28 03:06:42 +00:00
// Function&Module: worm()
2023-06-18 13:22:41 +00:00
// Synopsis: Creates a worm that will mate with a worm gear.
2023-05-27 08:42:09 +00:00
// SynTags: Geom, VNF
2023-04-05 00:25:13 +00:00
// Topics: Gears, Parts
// See Also: worm(), worm_gear(), rack(), rack2d(), spur_gear(), spur_gear2d(), bevel_pitch_angle(), bevel_gear()
2020-10-20 05:53:56 +00:00
// Usage: As a Module
2023-07-17 06:10:27 +00:00
// worm(circ_pitch, d, l, [starts=], [left_handed=], [pressure_angle=], [backlash=], [clearance=]);
2023-04-05 03:29:21 +00:00
// worm(mod=, d=, l=, [starts=], [left_handed=], [pressure_angle=], [backlash=], [clearance=]);
2020-10-20 05:53:56 +00:00
// Usage: As a Function
2023-07-17 06:10:27 +00:00
// vnf = worm(circ_pitch, d, l, [starts=], [left_handed=], [pressure_angle=], [backlash=], [clearance=]);
2023-04-05 03:29:21 +00:00
// vnf = worm(mod=, d=, l=, [starts=], [left_handed=], [pressure_angle=], [backlash=], [clearance=]);
2019-06-12 02:29:39 +00:00
// Description:
2022-03-28 03:06:42 +00:00
// Creates a worm shape that can be matched to a worm gear.
2019-06-12 02:29:39 +00:00
// Arguments:
2023-07-17 06:10:27 +00:00
// circ_pitch = The circular pitch, or distance between teeth around the pitch circle, in mm. Default: 5
2022-03-28 03:06:42 +00:00
// d = The diameter of the worm. Default: 30
// l = The length of the worm. Default: 100
// starts = The number of lead starts. Default: 1
2020-10-21 05:24:12 +00:00
// left_handed = If true, the gear returned will have a left-handed spiral. Default: false
2022-03-28 03:06:42 +00:00
// pressure_angle = Controls how straight or bulged the tooth sides are. In degrees. Default: 20
// backlash = Gap between two meshing teeth, in the direction along the circumference of the pitch circle. Default: 0
// clearance = Clearance gap at the bottom of the inter-tooth valleys.
2023-07-15 23:06:30 +00:00
// profile_shift = Profile shift factor x.
2023-07-17 06:10:27 +00:00
// diam_pitch = The diametral pitch, or number of teeth per inch of pitch diameter. Note that the diametral pitch is a completely different thing than the pitch diameter.
// mod = The metric module/modulus of the gear, or mm of pitch diameter per tooth.
2021-11-20 03:33:16 +00:00
// anchor = Translate so anchor point is at origin (0,0,0). See [anchor](attachments.scad#subsection-anchor). Default: `CENTER`
// spin = Rotate this many degrees around the Z axis after anchor. See [spin](attachments.scad#subsection-spin). Default: `0`
// orient = Vector to rotate top towards, after spin. See [orient](attachments.scad#subsection-orient). Default: `UP`
2022-03-28 03:06:42 +00:00
// Example:
2023-07-17 06:10:27 +00:00
// worm(circ_pitch=8, d=30, l=50, $fn=72);
2022-03-28 03:06:42 +00:00
// Example: Multiple Starts.
2023-07-17 06:10:27 +00:00
// worm(circ_pitch=8, d=30, l=50, starts=3, $fn=72);
2022-03-28 03:06:42 +00:00
// Example: Left Handed
2023-07-17 06:10:27 +00:00
// worm(circ_pitch=8, d=30, l=50, starts=3, left_handed=true, $fn=72);
2022-03-28 03:06:42 +00:00
// Example: Called as Function
2023-07-17 06:10:27 +00:00
// vnf = worm(circ_pitch=8, d=35, l=50, starts=2, left_handed=true, pressure_angle=20, $fn=72);
2022-03-28 03:06:42 +00:00
// vnf_polyhedron(vnf);
2023-07-15 23:06:30 +00:00
2022-03-28 03:06:42 +00:00
function worm (
2023-07-17 06:10:27 +00:00
circ_pitch ,
2022-03-28 03:06:42 +00:00
d = 30 , l = 100 ,
starts = 1 ,
left_handed = false ,
2023-07-15 23:06:30 +00:00
pressure_angle ,
2022-03-28 03:06:42 +00:00
backlash = 0 ,
clearance ,
2023-07-15 23:06:30 +00:00
profile_shift ,
2023-07-17 06:10:27 +00:00
diam_pitch ,
2022-03-28 03:06:42 +00:00
mod ,
2023-07-17 06:10:27 +00:00
pitch ,
2022-03-28 03:06:42 +00:00
anchor = CENTER ,
spin = 0 ,
orient = UP
) =
let (
2023-07-17 06:10:27 +00:00
circ_pitch = _inherit_gear_pitch ( pitch , circ_pitch , diam_pitch , mod ) ,
PA = _inherit_gear_pa ( pressure_angle ) ,
2023-07-15 23:06:30 +00:00
profile_shift = default ( profile_shift , 0 ) ,
2023-07-17 06:10:27 +00:00
helical = asin ( starts * circ_pitch / PI / d ) ,
trans_pitch = circ_pitch / cos ( helical ) ,
2023-07-15 23:06:30 +00:00
tooth = xflip (
p = select ( rack2d (
2023-07-17 06:10:27 +00:00
pitch = circ_pitch ,
2023-07-15 23:06:30 +00:00
teeth = 1 ,
pressure_angle = PA ,
clearance = clearance ,
backlash = backlash ,
helical = helical ,
profile_shift = profile_shift
) , 1 , - 2 )
) ,
rack_profile = [
for ( t = xcopies ( trans_pitch , n = 2 * ceil ( l / trans_pitch ) + 1 ) )
each apply ( t , tooth )
2022-03-28 03:06:42 +00:00
] ,
2023-07-15 23:06:30 +00:00
steps = max ( 36 , segs ( d / 2 ) ) ,
step = 360 / steps ,
2023-07-17 06:10:27 +00:00
zsteps = ceil ( l / circ_pitch * cos ( helical ) / starts * steps ) ,
2023-07-15 23:06:30 +00:00
zstep = l / zsteps ,
2022-03-28 03:06:42 +00:00
profiles = [
2023-07-15 23:06:30 +00:00
for ( j = [ 0 : 1 : zsteps ] ) [
for ( i = [ 0 : 1 : steps - 1 ] ) let (
u = i / steps - 0.5 ,
ang = 360 * ( 1 - u ) + 90 ,
z = j * zstep - l / 2 ,
2023-07-17 06:10:27 +00:00
zoff = circ_pitch * starts * u / cos ( helical ) ,
2023-07-15 23:06:30 +00:00
h = lookup ( z + zoff , rack_profile )
)
cylindrical_to_xyz ( d / 2 + h , ang , z )
]
2022-03-28 03:06:42 +00:00
] ,
2023-07-15 23:06:30 +00:00
vnf1 = vnf_vertex_array ( profiles , caps = true , col_wrap = true , style = "alt" ) ,
2023-07-17 06:10:27 +00:00
vnf = left_handed ? xflip ( p = vnf1 ) : vnf1
2022-03-28 03:06:42 +00:00
) reorient ( anchor , spin , orient , d = d , l = l , p = vnf ) ;
module worm (
2023-07-17 06:10:27 +00:00
circ_pitch ,
2022-03-28 03:06:42 +00:00
d = 15 , l = 100 ,
starts = 1 ,
left_handed = false ,
2023-07-15 23:06:30 +00:00
pressure_angle ,
2022-03-28 03:06:42 +00:00
backlash = 0 ,
clearance ,
2023-07-15 23:06:30 +00:00
profile_shift = 0 ,
2023-07-17 06:10:27 +00:00
pitch ,
diam_pitch ,
2022-03-28 03:06:42 +00:00
mod ,
2023-07-15 23:06:30 +00:00
gear_spin = 0 ,
2022-03-28 03:06:42 +00:00
anchor = CENTER ,
spin = 0 ,
orient = UP
) {
2023-07-17 06:10:27 +00:00
circ_pitch = _inherit_gear_pitch ( pitch , circ_pitch , diam_pitch , mod ) ;
PA = _inherit_gear_pa ( pressure_angle ) ;
2023-07-15 23:06:30 +00:00
profile_shift = default ( profile_shift , auto_profile_shift ( starts , PA ) ) ;
2022-03-28 03:06:42 +00:00
vnf = worm (
2023-07-17 06:10:27 +00:00
circ_pitch = circ_pitch ,
2022-03-28 03:06:42 +00:00
starts = starts ,
d = d , l = l ,
left_handed = left_handed ,
2023-07-15 23:06:30 +00:00
pressure_angle = PA ,
2022-03-28 03:06:42 +00:00
backlash = backlash ,
clearance = clearance ,
2023-07-15 23:06:30 +00:00
profile_shift = profile_shift ,
2022-03-28 03:06:42 +00:00
mod = mod
) ;
attachable ( anchor , spin , orient , d = d , l = l ) {
2023-07-17 06:10:27 +00:00
zrot ( gear_spin ) vnf_polyhedron ( vnf , convexity = ceil ( l / circ_pitch ) * 2 ) ;
2022-03-28 03:06:42 +00:00
children ( ) ;
}
}
// Function&Module: worm_gear()
2023-06-18 13:22:41 +00:00
// Synopsis: Creates a worm gear that will mate with a worm.
2023-05-27 08:42:09 +00:00
// SynTags: Geom, VNF
2023-04-05 00:25:13 +00:00
// Topics: Gears, Parts
// See Also: worm(), worm_gear(), rack(), rack2d(), spur_gear(), spur_gear2d(), bevel_pitch_angle(), bevel_gear()
2022-03-28 03:06:42 +00:00
// Usage: As a Module
2023-07-17 06:10:27 +00:00
// worm_gear(circ_pitch, teeth, worm_diam, [worm_starts=], [worm_arc=], [crowning=], [left_handed=], [pressure_angle=], [backlash=], [clearance=], [slices=], [shaft_diam=]) [ATTACHMENTS];
2023-04-05 03:29:21 +00:00
// worm_gear(mod=, teeth=, worm_diam=, [worm_starts=], [worm_arc=], [crowning=], [left_handed=], [pressure_angle=], [backlash=], [clearance=], [slices=], [shaft_diam=]) [ATTACHMENTS];
2022-03-28 03:06:42 +00:00
// Usage: As a Function
2023-07-17 06:10:27 +00:00
// vnf = worm_gear(circ_pitch, teeth, worm_diam, [worm_starts=], [worm_arc=], [crowning=], [left_handed=], [pressure_angle=], [backlash=], [clearance=], [slices=]);
2023-04-05 03:29:21 +00:00
// vnf = worm_gear(mod=, teeth=, worm_diam=, [worm_starts=], [worm_arc=], [crowning=], [left_handed=], [pressure_angle=], [backlash=], [clearance=], [slices=]);
2022-03-28 03:06:42 +00:00
// Description:
// Creates a worm gear to match with a worm.
// Arguments:
2023-07-17 06:10:27 +00:00
// circ_pitch = The circular pitch, or distance between teeth around the pitch circle, in mm. Default: 5
2022-03-28 03:06:42 +00:00
// teeth = Total number of teeth along the rack. Default: 30
// worm_diam = The pitch diameter of the worm gear to match to. Default: 30
// worm_starts = The number of lead starts on the worm gear to match to. Default: 1
// worm_arc = The arc of the worm to mate with, in degrees. Default: 60 degrees
2023-06-18 13:22:41 +00:00
// crowning = The amount to oversize the virtual hobbing cutter used to make the teeth, to add a slight crowning to the teeth to make them fit the work easier. Default: 1
2022-03-28 03:06:42 +00:00
// left_handed = If true, the gear returned will have a left-handed spiral. Default: false
// pressure_angle = Controls how straight or bulged the tooth sides are. In degrees. Default: 20
// backlash = Gap between two meshing teeth, in the direction along the circumference of the pitch circle. Default: 0
// clearance = Clearance gap at the bottom of the inter-tooth valleys.
2023-07-15 23:06:30 +00:00
// profile_shift = Profile shift factor x.
2022-03-28 03:06:42 +00:00
// slices = The number of vertical slices to refine the curve of the worm throat. Default: 10
2023-07-17 06:10:27 +00:00
// diam_pitch = The diametral pitch, or number of teeth per inch of pitch diameter. Note that the diametral pitch is a completely different thing than the pitch diameter.
// mod = The metric module/modulus of the gear, or mm of pitch diameter per tooth.
2022-03-28 03:06:42 +00:00
// anchor = Translate so anchor point is at origin (0,0,0). See [anchor](attachments.scad#subsection-anchor). Default: `CENTER`
// spin = Rotate this many degrees around the Z axis after anchor. See [spin](attachments.scad#subsection-spin). Default: `0`
// orient = Vector to rotate top towards, after spin. See [orient](attachments.scad#subsection-orient). Default: `UP`
// Example: Right-Handed
2023-07-17 06:10:27 +00:00
// worm_gear(circ_pitch=5, teeth=36, worm_diam=30, worm_starts=1);
2022-03-28 03:06:42 +00:00
// Example: Left-Handed
2023-07-17 06:10:27 +00:00
// worm_gear(circ_pitch=5, teeth=36, worm_diam=30, worm_starts=1, left_handed=true);
2022-03-28 03:06:42 +00:00
// Example: Multiple Starts
2023-07-17 06:10:27 +00:00
// worm_gear(circ_pitch=5, teeth=36, worm_diam=30, worm_starts=4);
2022-03-28 03:06:42 +00:00
// Example: Metric Worm Gear
// worm_gear(mod=2, teeth=32, worm_diam=30, worm_starts=1);
// Example(Anim,Frames=4,FrameMS=125,VPD=220,VPT=[-15,0,0]): Meshing Worm and Gear
// $fn=36;
2023-07-17 06:10:27 +00:00
// circ_pitch = 5; starts = 4;
2022-03-28 03:06:42 +00:00
// worm_diam = 30; worm_length = 50;
// gear_teeth=36;
// right(worm_diam/2)
// yrot($t*360/starts)
2023-07-17 06:10:27 +00:00
// worm(
// d=worm_diam,
// l=worm_length,
// circ_pitch=circ_pitch,
// starts=starts,
// orient=BACK);
// left(pitch_radius(circ_pitch, gear_teeth))
2022-03-28 03:06:42 +00:00
// zrot(-$t*360/gear_teeth)
2023-07-17 06:10:27 +00:00
// worm_gear(
// circ_pitch=circ_pitch,
// teeth=gear_teeth,
// worm_diam=worm_diam,
// worm_starts=starts);
2022-03-28 03:06:42 +00:00
// Example: Meshing Worm and Gear Metricly
// $fn = 72;
// modulus = 2; starts = 3;
// worm_diam = 30; worm_length = 50;
// gear_teeth=36;
// right(worm_diam/2)
// worm(d=worm_diam, l=worm_length, mod=modulus, starts=starts, orient=BACK);
// left(pitch_radius(mod=modulus, teeth=gear_teeth))
// worm_gear(mod=modulus, teeth=gear_teeth, worm_diam=worm_diam, worm_starts=starts);
// Example: Called as Function
2023-07-17 06:10:27 +00:00
// vnf = worm_gear(circ_pitch=8, teeth=30, worm_diam=30, worm_starts=1);
2022-03-28 03:06:42 +00:00
// vnf_polyhedron(vnf);
2023-07-15 23:06:30 +00:00
2022-03-28 03:06:42 +00:00
function worm_gear (
2023-07-17 06:10:27 +00:00
circ_pitch ,
2022-03-28 03:06:42 +00:00
teeth = 36 ,
worm_diam = 30 ,
worm_starts = 1 ,
worm_arc = 60 ,
2023-07-15 23:06:30 +00:00
crowning = 0.1 ,
2020-10-20 05:53:56 +00:00
left_handed = false ,
2023-07-15 23:06:30 +00:00
pressure_angle ,
2022-03-28 03:06:42 +00:00
backlash = 0 ,
clearance ,
2023-07-15 23:06:30 +00:00
profile_shift ,
2022-03-28 03:06:42 +00:00
slices = 10 ,
2023-07-15 23:06:30 +00:00
gear_spin = 0 ,
2023-07-17 06:10:27 +00:00
pitch ,
diam_pitch ,
2023-04-05 03:29:21 +00:00
mod ,
2022-03-28 03:06:42 +00:00
anchor = CENTER ,
2020-10-20 06:52:46 +00:00
spin = 0 ,
orient = UP
2020-10-20 05:53:56 +00:00
) =
2022-03-28 03:06:42 +00:00
assert ( worm_arc >= 10 && worm_arc < = 60 )
2020-10-20 05:53:56 +00:00
let (
2023-07-17 06:10:27 +00:00
circ_pitch = _inherit_gear_pitch ( pitch , circ_pitch , diam_pitch , mod ) ,
PA = _inherit_gear_pa ( pressure_angle ) ,
2023-07-15 23:06:30 +00:00
profile_shift = default ( profile_shift , auto_profile_shift ( teeth , PA ) ) ,
2023-07-17 06:10:27 +00:00
helical = asin ( worm_starts * circ_pitch / PI / worm_diam ) ,
pr = pitch_radius ( circ_pitch , teeth , helical ) ,
2023-07-15 23:06:30 +00:00
hob_rad = worm_diam / 2 + crowning ,
2023-07-17 06:10:27 +00:00
thickness = worm_gear_thickness ( circ_pitch = circ_pitch , teeth = teeth , worm_diam = worm_diam , worm_arc = worm_arc , crowning = crowning , clearance = clearance ) ,
2023-07-15 23:06:30 +00:00
tooth_profile = _gear_tooth_profile (
2023-07-17 06:10:27 +00:00
circ_pitch = circ_pitch ,
2023-07-15 23:06:30 +00:00
teeth = teeth ,
pressure_angle = PA ,
clearance = clearance ,
backlash = backlash ,
helical = helical ,
profile_shift = profile_shift ,
center = true
) ,
tbot = min ( column ( tooth_profile , 1 ) ) ,
arcthick = hob_rad * sin ( worm_arc / 2 ) * 2 ,
twist = sin ( helical ) * arcthick / ( 2 * PI * pr ) * 360 ,
2022-03-28 03:06:42 +00:00
profiles = [
for ( slice = [ 0 : 1 : slices ] ) let (
2023-07-15 23:06:30 +00:00
u = slice / slices - 0.5
2021-04-19 21:55:50 +00:00
) [
2022-03-28 03:06:42 +00:00
for ( i = [ 0 : 1 : teeth - 1 ] ) each
apply (
2023-07-15 23:06:30 +00:00
zrot ( - i * 360 / teeth + twist * u - 0.5 ) *
right ( pr + hob_rad ) *
yrot ( u * worm_arc ) *
left ( hob_rad ) *
zrot ( - 90 ) *
back ( tbot ) *
scale ( cos ( u * worm_arc ) ) *
fwd ( tbot ) ,
2022-03-28 03:06:42 +00:00
path3d ( tooth_profile )
2020-10-20 05:53:56 +00:00
)
]
] ,
2022-03-28 03:06:42 +00:00
top_verts = last ( profiles ) ,
bot_verts = profiles [ 0 ] ,
face_pts = len ( tooth_profile ) ,
gear_pts = face_pts * teeth ,
2020-10-20 05:53:56 +00:00
top_faces = [
2022-03-28 03:06:42 +00:00
for ( i = [ 0 : 1 : teeth - 1 ] , j = [ 0 : 1 : ( face_pts / 2 ) - 2 ] ) each [
2020-10-20 05:53:56 +00:00
[ i * face_pts + j , ( i + 1 ) * face_pts - j - 1 , ( i + 1 ) * face_pts - j - 2 ] ,
[ i * face_pts + j , ( i + 1 ) * face_pts - j - 2 , i * face_pts + j + 1 ]
] ,
for ( i = [ 0 : 1 : teeth - 1 ] ) each [
[ gear_pts , ( i + 1 ) * face_pts - 1 , i * face_pts ] ,
[ gear_pts , ( ( i + 1 ) % teeth ) * face_pts , ( i + 1 ) * face_pts - 1 ]
]
] ,
2022-03-28 03:06:42 +00:00
sides_vnf = vnf_vertex_array ( profiles , caps = false , col_wrap = true , style = "min_edge" ) ,
2021-11-11 13:45:30 +00:00
vnf1 = vnf_join ( [
2020-10-20 05:53:56 +00:00
[
[ each top_verts , [ 0 , 0 , top_verts [ 0 ] . z ] ] ,
2022-03-28 03:06:42 +00:00
[ for ( x = top_faces ) reverse ( x ) ]
2020-10-20 05:53:56 +00:00
] ,
[
[ each bot_verts , [ 0 , 0 , bot_verts [ 0 ] . z ] ] ,
2022-03-28 03:06:42 +00:00
top_faces
2020-10-20 05:53:56 +00:00
] ,
sides_vnf
] ) ,
2023-07-15 23:06:30 +00:00
m = product ( [
zrot ( gear_spin ) ,
if ( left_handed ) xflip ( ) ,
] ) ,
vnf = apply ( m , vnf1 )
) reorient ( anchor , spin , orient , r = pr , l = thickness , p = vnf ) ;
2022-03-28 03:06:42 +00:00
module worm_gear (
2023-07-17 06:10:27 +00:00
circ_pitch ,
2022-03-28 03:06:42 +00:00
teeth = 36 ,
worm_diam = 30 ,
worm_starts = 1 ,
worm_arc = 60 ,
2023-07-15 23:06:30 +00:00
crowning = 0.1 ,
2022-03-28 03:06:42 +00:00
left_handed = false ,
2023-07-15 23:06:30 +00:00
pressure_angle ,
2022-03-28 03:06:42 +00:00
backlash = 0 ,
slices = 10 ,
clearance ,
2023-07-15 23:06:30 +00:00
profile_shift ,
gear_spin = 0 ,
2023-07-17 06:10:27 +00:00
pitch ,
diam_pitch ,
2022-03-28 03:06:42 +00:00
mod ,
shaft_diam = 0 ,
anchor = CENTER ,
spin = 0 ,
orient = UP
) {
2023-07-17 06:10:27 +00:00
circ_pitch = _inherit_gear_pitch ( pitch , circ_pitch , diam_pitch , mod ) ;
PA = _inherit_gear_pa ( pressure_angle ) ;
2023-07-15 23:06:30 +00:00
profile_shift = default ( profile_shift , auto_profile_shift ( teeth , PA ) ) ;
2023-07-17 06:10:27 +00:00
helical = asin ( worm_starts * circ_pitch / PI / worm_diam ) ;
pr = pitch_radius ( circ_pitch , teeth , helical ) ;
2022-03-28 03:06:42 +00:00
vnf = worm_gear (
2023-07-17 06:10:27 +00:00
circ_pitch = circ_pitch ,
2022-03-28 03:06:42 +00:00
teeth = teeth ,
worm_diam = worm_diam ,
worm_starts = worm_starts ,
worm_arc = worm_arc ,
crowning = crowning ,
left_handed = left_handed ,
2023-07-15 23:06:30 +00:00
pressure_angle = PA ,
2022-03-28 03:06:42 +00:00
backlash = backlash ,
2023-07-15 23:06:30 +00:00
clearance = clearance ,
profile_shift = profile_shift ,
slices = slices
2022-03-28 03:06:42 +00:00
) ;
thickness = pointlist_bounds ( vnf [ 0 ] ) [ 1 ] . z ;
2023-07-15 23:06:30 +00:00
attachable ( anchor , spin , orient , r = pr , l = thickness ) {
zrot ( gear_spin )
2022-03-28 03:06:42 +00:00
difference ( ) {
vnf_polyhedron ( vnf , convexity = teeth / 2 ) ;
if ( shaft_diam > 0 ) {
2023-07-18 00:21:36 +00:00
cylinder ( h = 2 * thickness + 1 , r = shaft_diam / 2 , center = true , $fn = max ( 12 , segs ( shaft_diam / 2 ) ) ) ;
2022-03-28 03:06:42 +00:00
}
}
children ( ) ;
}
}
2023-07-17 06:10:27 +00:00
/// Function: _gear_tooth_profile()
2022-03-30 03:21:32 +00:00
/// Usage: As Function
2023-07-17 06:10:27 +00:00
/// path = _gear_tooth_profile(pitch, teeth, [pressure_angle], [clearance], [backlash], [internal]);
2022-03-30 03:21:32 +00:00
/// Topics: Gears
/// See Also: spur_gear2d()
/// Description:
/// When called as a function, returns the 2D profile path for an individual gear tooth.
/// When called as a module, creates the 2D profile shape for an individual gear tooth.
/// Arguments:
2023-07-17 06:10:27 +00:00
/// circ_pitch = The circular pitch, or distance between teeth around the pitch circle, in mm.
2022-03-30 03:21:32 +00:00
/// teeth = Total number of teeth on the spur gear that this is a tooth for.
/// pressure_angle = Pressure Angle. Controls how straight or bulged the tooth sides are. In degrees.
/// clearance = Gap between top of a tooth on one gear and bottom of valley on a meshing gear (in millimeters)
/// backlash = Gap between two meshing teeth, in the direction along the circumference of the pitch circle
2023-06-20 03:41:39 +00:00
/// internal = If true, create a mask for difference()ing from something else.
2022-03-30 03:21:32 +00:00
/// center = If true, centers the pitch circle of the tooth profile at the origin. Default: false.
2023-07-17 06:10:27 +00:00
/// diam_pitch = The diametral pitch, or number of teeth per inch of pitch diameter. Note that the diametral pitch is a completely different thing than the pitch diameter.
/// mod = The metric module/modulus of the gear, or mm of pitch diameter per tooth.
2022-03-30 03:21:32 +00:00
/// Example(2D):
2023-07-17 06:10:27 +00:00
/// _gear_tooth_profile(circ_pitch=5, teeth=20, pressure_angle=20);
2022-03-30 03:21:32 +00:00
/// Example(2D): Metric Gear Tooth
/// _gear_tooth_profile(mod=2, teeth=20, pressure_angle=20);
/// Example(2D):
/// _gear_tooth_profile(
2023-07-17 06:10:27 +00:00
/// circ_pitch=5, teeth=20, pressure_angle=20
2022-03-30 03:21:32 +00:00
/// );
/// Example(2D): As a function
/// path = _gear_tooth_profile(
2023-07-17 06:10:27 +00:00
/// circ_pitch=5, teeth=20, pressure_angle=20
2022-03-30 03:21:32 +00:00
/// );
/// stroke(path, width=0.1);
2023-07-15 23:06:30 +00:00
2022-03-30 03:21:32 +00:00
function _gear_tooth_profile (
2023-07-17 06:10:27 +00:00
circ_pitch ,
teeth ,
2023-07-15 23:06:30 +00:00
pressure_angle = 20 ,
clearance ,
2022-03-28 03:06:42 +00:00
backlash = 0.0 ,
2023-07-15 23:06:30 +00:00
helical = 0 ,
2023-06-20 03:41:39 +00:00
internal = false ,
2023-07-15 23:06:30 +00:00
profile_shift = 0.0 ,
2023-07-17 06:10:27 +00:00
center = false
2022-03-28 03:06:42 +00:00
) = let (
2023-07-15 23:06:30 +00:00
// Calculate a point on the involute curve, by angle.
_involute = function ( base_r , a )
let ( b = a * PI / 180 ) base_r * [ cos ( a ) + b * sin ( a ) , sin ( a ) - b * cos ( a ) ] ,
steps = 16 ,
// Calculate the important circle radii
2023-07-17 06:10:27 +00:00
arad = outer_radius ( circ_pitch , teeth , helical = helical , profile_shift = profile_shift , internal = internal ) ,
prad = pitch_radius ( circ_pitch , teeth , helical = helical ) ,
brad = _base_radius ( circ_pitch , teeth , pressure_angle , helical = helical ) ,
rrad = _root_radius ( circ_pitch , teeth , clearance , helical = helical , profile_shift = profile_shift , internal = internal ) ,
2023-07-15 23:06:30 +00:00
srad = max ( rrad , brad ) ,
2023-07-17 06:10:27 +00:00
clear = default ( clearance , circ_pitch / PI * 0.25 ) ,
tthick = circ_pitch / PI / cos ( helical ) * ( PI / 2 + 2 * profile_shift * tan ( pressure_angle ) ) - backlash ,
2023-07-15 23:06:30 +00:00
tang = tthick / prad / 2 * 180 / PI ,
// Generate a lookup table for the involute curve angles, by radius
involute_lup = [
if ( rrad < brad )
each xy_to_polar ( arc ( n = 4 , r = min ( brad - rrad , clear ) , corner = [
polar_to_xy ( rrad , 90 + 180 / teeth ) ,
polar_to_xy ( rrad , 90 ) ,
polar_to_xy ( brad , 90 ) ,
] ) ) ,
for ( i = [ 0 : 5 : arad / PI / brad * 360 ] )
let (
xy = _involute ( brad , i ) ,
pol = xy_to_polar ( xy )
)
if ( pol . x < = arad * 1.1 )
[ pol . x , 90 - pol . y ]
2022-03-28 03:06:42 +00:00
] ,
2023-07-15 23:06:30 +00:00
// Generate reverse lookup table for involute radii, by angle
involute_rlup = mirror ( [ - 1 , 1 ] , p = involute_lup ) , // swaps X and Y columns.
a_ang = lookup ( arad , involute_lup ) ,
p_ang = lookup ( prad , involute_lup ) ,
b_ang = lookup ( brad , involute_lup ) ,
r_ang = lookup ( rrad , involute_lup ) ,
s_ang = lookup ( srad , involute_lup ) ,
soff = tang + ( b_ang - p_ang ) ,
ma_rad = min ( arad , lookup ( 90 - soff + 0.05 * 360 / teeth / 2 , involute_rlup ) ) ,
ma_ang = lookup ( ma_rad , involute_lup ) ,
cap_steps = ceil ( ( ma_ang + soff - 90 ) / 5 ) ,
cap_step = ( ma_ang + soff - 90 ) / cap_steps ,
2023-07-17 06:10:27 +00:00
ax = circ_pitch / 4 - ang_adj_to_opp ( pressure_angle , circ_pitch / PI ) ,
2023-07-15 23:06:30 +00:00
// Calculate the undercut a meshing rack might carve out of this tooth.
undercut = [
for ( a = [ atan2 ( ax , rrad ) : - 1 : - 90 ] )
let (
bx = - a / 360 * 2 * PI * prad ,
x = bx + ax ,
2023-07-17 06:10:27 +00:00
y = prad - circ_pitch / PI + profile_shift * circ_pitch / PI ,
pol = xy_to_polar ( x , y )
2023-07-15 23:06:30 +00:00
)
if ( pol . x < arad * 1.05 )
[ pol . x , pol . y - a + 180 / teeth ]
] ,
uc_min = min_index ( column ( undercut , 0 ) ) ,
// Generate a fast lookup table for the undercut.
undercut_lup = [ for ( i = idx ( undercut ) ) if ( i >= uc_min ) undercut [ i ] ] ,
// The u values to use when generating the tooth.
us = [
for ( i = [ 0 : 1 : 20 - 1 ] ) 0.2 * sin ( i / 20 * 90 ) ,
for ( i = [ 2 : 1 : steps - 1 ] ) i / ( steps - 1 ) ,
] ,
// Generate the left half of the tooth.
tooth_half_raw = deduplicate ( [
for ( u = us ) let (
r = lerp ( rrad , ma_rad , u ) ,
a1 = lookup ( r , involute_lup ) + soff ,
a2 = lookup ( r , undercut_lup ) ,
a = internal || r < undercut_lup [ 0 ] . x ? a1 : min ( a1 , a2 )
) if ( a < 90 + 180 / teeth ) polar_to_xy ( r , a ) ,
for ( i = [ 0 : 1 : cap_steps - 1 ] ) let (
a = ma_ang + soff - i * ( cap_step - 1 )
) polar_to_xy ( ma_rad , a ) ,
] ) ,
// Find undercut bottom "jaggie" if it exists.
minima = [
for ( i = idx ( tooth_half_raw ) )
let ( p = tooth_half_raw [ i ] )
if ( i > 0 && i < len ( tooth_half_raw ) - 1 && norm ( p ) < = prad )
let (
pp = tooth_half_raw [ i - 1 ] ,
np = tooth_half_raw [ i + 1 ]
)
if ( p . x > pp . x && p . x > np . x )
i
] ,
// Strip "jaggies" if found.
tooth_half = len ( minima ) < 2 ? tooth_half_raw : [
for ( i = idx ( tooth_half_raw ) )
let ( p = tooth_half_raw [ i ] )
if ( i < = minima [ 0 ] || i >= last ( minima ) )
p
] ,
// Mirror the tooth to complete it.
tooth = deduplicate ( [
each tooth_half ,
each reverse ( xflip ( tooth_half ) ) ,
] ) ,
out = center ? fwd ( prad , p = tooth ) : tooth
) out ;
2020-10-20 05:53:56 +00:00
2019-02-07 05:04:45 +00:00
2022-03-28 03:06:42 +00:00
// Section: Computing Gear Dimensions
// These functions let the user find the derived dimensions of the gear.
// A gear fits within a circle of radius outer_radius, and two gears should have
// their centers separated by the sum of their pitch_radius.
// Function: circular_pitch()
2023-04-05 00:25:13 +00:00
// Synopsis: Returns tooth density expressed as "circular pitch".
// Topics: Gears, Parts
2023-07-17 06:10:27 +00:00
// See Also: spur_gear(), diametral_pitch(), circular_pitch(), pitch_value(), module_value()
2022-03-28 03:06:42 +00:00
// Usage:
2023-07-17 06:10:27 +00:00
// circ_pitch = circular_pitch(circ_pitch);
// circ_pitch = circular_pitch(mod=);
// circ_pitch = circular_pitch(diam_pitch=);
2019-03-23 04:13:18 +00:00
// Description:
2023-07-17 06:10:27 +00:00
// Get tooth density expressed as "circular pitch", or the distance in mm between teeth around the pitch circle.
// For example, if you have a gear with 11 teeth, and the pitch diameter is 35mm, then the circumfrence
// of the pitch diameter is really close to 110mm, making the circular pitch of that gear about 10mm/tooth.
2019-03-23 04:13:18 +00:00
// Arguments:
2023-07-17 06:10:27 +00:00
// circ_pitch = The circular pitch, or distance in mm between teeth around the pitch circle.
// ---
// mod = The metric module/modulus of the gear, or mm of pitch diameter per tooth.
// diam_pitch = The diametral pitch, or number of teeth per inch of pitch diameter. Note that the diametral pitch is a completely different thing than the pitch diameter.
2023-07-17 23:24:03 +00:00
// Example(VPT=[0,31,0];VPR=[0,0,0];VPD=40):
// $fn=144;
// teeth=20;
// circ_pitch = circular_pitch(diam_pitch=8);
// pr = pitch_radius(circ_pitch, teeth);
// stroke(spur_gear2d(circ_pitch, teeth), width=0.1);
// color("cyan")
// dashed_stroke(circle(r=pr), width=0.1);
// color("black") {
// stroke(
// arc(r=pr, start=90+90/teeth, angle=-360/teeth),
// width=0.2, endcaps="arrow");
// back(pr+1) right(3)
// zrot(30) text("Circular Pitch", size=1);
// }
2022-03-28 03:06:42 +00:00
// Example:
2023-07-17 06:10:27 +00:00
// circ_pitch = circular_pitch(circ_pitch=5);
// circ_pitch = circular_pitch(diam_pitch=12);
// circ_pitch = circular_pitch(mod=2);
2023-07-15 23:06:30 +00:00
2023-07-17 06:10:27 +00:00
function circular_pitch ( circ_pitch , mod , pitch , diam_pitch ) =
assert ( one_defined ( [ pitch , mod , circ_pitch , diam_pitch ] , "pitch,mod,circ_pitch,diam_pitch" ) )
pitch ! = undef ? assert ( is_finite ( pitch ) && pitch > 0 ) pitch :
circ_pitch ! = undef ? assert ( is_finite ( circ_pitch ) && circ_pitch > 0 ) circ_pitch :
diam_pitch ! = undef ? assert ( is_finite ( diam_pitch ) && diam_pitch > 0 ) PI / diam_pitch * INCH :
assert ( is_finite ( mod ) && mod > 0 ) mod * PI ;
2022-03-28 03:06:42 +00:00
// Function: diametral_pitch()
2023-04-05 00:25:13 +00:00
// Synopsis: Returns tooth density expressed as "diametral pitch".
// Topics: Gears, Parts
2023-07-17 06:10:27 +00:00
// See Also: spur_gear(), diametral_pitch(), circular_pitch(), pitch_value(), module_value()
2022-03-28 03:06:42 +00:00
// Usage:
2023-07-17 06:10:27 +00:00
// dp = diametral_pitch(circ_pitch);
2023-04-05 03:29:21 +00:00
// dp = diametral_pitch(mod=);
2023-07-17 06:10:27 +00:00
// dp = diametral_pitch(diam_pitch=);
2022-03-28 03:06:42 +00:00
// Description:
2023-07-17 06:10:27 +00:00
// Returns tooth density expressed as "diametral pitch", the number of teeth per inch of pitch diameter.
// For example, if you have a gear with 30 teeth, with a 1.5 inch pitch diameter, then you have a
// diametral pitch of 20 teeth/inch.
2022-03-28 03:06:42 +00:00
// Arguments:
2023-07-17 06:10:27 +00:00
// circ_pitch = The circular pitch, or distance in mm between teeth around the pitch circle.
// ---
// mod = The metric module/modulus of the gear, or mm of pitch diameter per tooth.
// diam_pitch = The diametral pitch, or number of teeth per inch of pitch diameter. Note that the diametral pitch is a completely different thing than the pitch diameter.
2022-03-28 03:06:42 +00:00
// Example:
2023-07-17 06:10:27 +00:00
// diam_pitch = diametral_pitch(mod=2);
// diam_pitch = diametral_pitch(circ_pitch=8);
// diam_pitch = diametral_pitch(diam_pitch=16);
2023-07-15 23:06:30 +00:00
2023-07-17 06:10:27 +00:00
function diametral_pitch ( circ_pitch , mod , pitch , diam_pitch ) =
let ( circ_pitch = circular_pitch ( pitch , mod , circ_pitch , diam_pitch ) )
PI / circ_pitch / INCH ;
2022-03-28 03:06:42 +00:00
// Function: pitch_value()
2023-07-17 06:10:27 +00:00
// Synopsis: Returns tooth density expressed as "circular pitch".
2023-04-05 00:25:13 +00:00
// Topics: Gears, Parts
// See Also: spur_gear(), diametral_pitch(), circular_pitch(), pitch_value(), module_value()
2022-03-28 03:06:42 +00:00
// Usage:
2023-07-17 06:10:27 +00:00
// circ_pitch = pitch_value(mod);
// circ_pitch = pitch_value(circ_pitch=);
// circ_pitch = pitch_value(diam_pitch=);
2022-03-28 03:06:42 +00:00
// Description:
2023-07-17 06:10:27 +00:00
// Returns the circular pitch in mm from module/modulus or diametral pitch.
// The circular pitch of a gear is the number of millimeters per tooth around the pitch radius circle.
// For example, if you have a gear with 11 teeth, and the pitch diameter is 35mm, then the circumfrence
// of the pitch diameter is really close to 110mm, making the circular pitch of that gear about 10mm/tooth.
2022-03-28 03:06:42 +00:00
// Arguments:
2023-07-17 06:10:27 +00:00
// mod = The metric module/modulus of the gear, or mm of pitch diameter per tooth.
// ---
// circ_pitch = The circular pitch, or distance in mm between teeth around the pitch circle.
// diam_pitch = The diametral pitch, or number of teeth per inch of pitch diameter. Note that the diametral pitch is a completely different thing than the pitch diameter.
// Example:
// circ_pitch = pitch_value(mod=2);
// circ_pitch = pitch_value(circ_pitch=8);
// circ_pitch = pitch_value(diam_pitch=16);
2023-07-15 23:06:30 +00:00
2023-07-17 06:10:27 +00:00
function pitch_value ( mod , circ_pitch , diam_pitch ) =
circular_pitch ( mod = mod , circ_pitch = circ_pitch , diam_pitch = diam_pitch ) ;
2022-03-28 03:06:42 +00:00
// Function: module_value()
2023-04-05 00:25:13 +00:00
// Synopsis: Returns tooth density expressed as "module" or "modulus" in millimeters.
// Topics: Gears, Parts
// See Also: spur_gear(), diametral_pitch(), circular_pitch(), pitch_value(), module_value()
2022-03-28 03:06:42 +00:00
// Usage:
2023-07-17 06:10:27 +00:00
// mod = module_value(circ_pitch);
// mod = module_value(mod=);
// mod = module_value(diam_pitch=);
2022-03-28 03:06:42 +00:00
// Description:
// Get tooth density expressed as "module" or "modulus" in millimeters. The module is the pitch
// diameter of the gear divided by the number of teeth on it. For example, a gear with a pitch
// diameter of 40mm, with 20 teeth on it will have a modulus of 2.
// Arguments:
2023-07-17 06:10:27 +00:00
// circ_pitch = The circular pitch, or distance in mm between teeth around the pitch circle.
// ---
// mod = The metric module/modulus of the gear, or mm of pitch diameter per tooth.
// diam_pitch = The diametral pitch, or number of teeth per inch of pitch diameter. Note that the diametral pitch is a completely different thing than the pitch diameter.
// Example:
// mod = module_value(circ_pitch=8);
// mod = module_value(mod=2);
// mod = module_value(diam_pitch=16);
2023-07-15 23:06:30 +00:00
2023-07-17 06:10:27 +00:00
function module_value ( circ_pitch , mod , pitch , diam_pitch ) =
let ( circ_pitch = circular_pitch ( pitch , mod , circ_pitch , diam_pitch ) )
circ_pitch / PI ;
2022-03-28 03:06:42 +00:00
2022-03-30 03:21:32 +00:00
/// Function: _adendum()
/// Usage:
2023-07-17 06:10:27 +00:00
/// ad = _adendum(circ_pitch, [profile_shift]);
/// ad = _adendum(diam_pitch=, [profile_shift=]);
/// ad = _adendum(mod=, [profile_shift=]);
2022-03-30 03:21:32 +00:00
/// Topics: Gears
/// Description:
/// The height of the top of a gear tooth above the pitch radius circle.
/// Arguments:
2023-07-17 06:10:27 +00:00
/// circ_pitch = The circular pitch, or distance between teeth around the pitch circle, in mm.
2023-07-15 23:06:30 +00:00
/// profile_shift = Profile shift factor x.
2023-07-17 06:10:27 +00:00
/// ---
/// diam_pitch = The diametral pitch, or number of teeth per inch of pitch diameter. Note that the diametral pitch is a completely different thing than the pitch diameter.
/// mod = The metric module/modulus of the gear, or mm of pitch diameter per tooth.
2022-03-30 03:21:32 +00:00
/// Example:
2023-07-17 06:10:27 +00:00
/// ad = _adendum(circ_pitch=5);
2022-03-30 03:21:32 +00:00
/// ad = _adendum(mod=2);
/// Example(2D):
2023-07-17 06:10:27 +00:00
/// circ_pitch = 5; teeth = 17;
/// pr = pitch_radius(circ_pitch, teeth);
/// adn = _adendum(circ_pitch=5);
/// #spur_gear2d(circ_pitch=circ_pitch, teeth=teeth);
2022-03-30 03:21:32 +00:00
/// color("black") {
/// stroke(circle(r=pr),width=0.1,closed=true);
/// stroke(circle(r=pr+adn),width=0.1,closed=true);
/// }
2023-07-15 23:06:30 +00:00
2023-07-17 06:10:27 +00:00
function _adendum (
circ_pitch ,
profile_shift = 0 ,
diam_pitch ,
mod ,
pitch
) =
let ( mod = module _value ( circ_pitch , mod , pitch , diam_pitch ) )
mod * ( 1 + profile_shift ) ;
2019-02-07 05:04:45 +00:00
2017-08-30 00:00:16 +00:00
2022-03-30 03:21:32 +00:00
/// Function: _dedendum()
/// Usage:
2023-07-17 06:10:27 +00:00
/// ddn = _dedendum(circ_pitch=, [clearance], [profile_shift]);
/// ddn = _dedendum(diam_pitch=, [clearance=], [profile_shift=]);
/// ddn = _dedendum(mod=, [clearance=], [profile_shift=]);
2022-03-30 03:21:32 +00:00
/// Topics: Gears
/// Description:
/// The depth of the gear tooth valley, below the pitch radius.
/// Arguments:
2023-07-17 06:10:27 +00:00
/// circ_pitch = The circular pitch, or distance between teeth around the pitch circle, in mm.
2022-03-30 03:21:32 +00:00
/// clearance = If given, sets the clearance between meshing teeth.
2023-07-15 23:06:30 +00:00
/// profile_shift = Profile shift factor x.
2023-07-17 06:10:27 +00:00
/// ---
/// diam_pitch = The diametral pitch, or number of teeth per inch of pitch diameter. Note that the diametral pitch is a completely different thing than the pitch diameter.
/// mod = The metric module/modulus of the gear, or mm of pitch diameter per tooth.
2022-03-30 03:21:32 +00:00
/// Example:
2023-07-17 06:10:27 +00:00
/// ddn = _dedendum(circ_pitch=5);
2022-03-30 03:21:32 +00:00
/// ddn = _dedendum(mod=2);
/// Example(2D):
2023-07-17 06:10:27 +00:00
/// circ_pitch = 5; teeth = 17;
/// pr = pitch_radius(circ_pitch, teeth);
/// ddn = _dedendum(circ_pitch=5);
/// #spur_gear2d(circ_pitch=circ_pitch, teeth=teeth);
2022-03-30 03:21:32 +00:00
/// color("black") {
/// stroke(circle(r=pr),width=0.1,closed=true);
/// stroke(circle(r=pr-ddn),width=0.1,closed=true);
/// }
2023-07-15 23:06:30 +00:00
2023-07-17 06:10:27 +00:00
function _dedendum (
circ_pitch ,
clearance ,
profile_shift = 0 ,
diam_pitch ,
mod ,
pitch
) = let (
mod = module _value ( circ_pitch , mod , pitch , diam_pitch ) ,
clearance = default ( clearance , 0.25 * mod )
2023-07-15 23:06:30 +00:00
)
2023-07-17 06:10:27 +00:00
mod * ( 1 - profile_shift ) + clearance ;
2022-03-28 03:06:42 +00:00
2020-10-20 05:53:56 +00:00
2022-03-28 03:06:42 +00:00
// Function: pitch_radius()
2023-04-05 00:25:13 +00:00
// Synopsis: Returns the pitch radius for a gear.
// Topics: Gears, Parts
// See Also: spur_gear(), diametral_pitch(), circular_pitch(), pitch_value(), module_value(), outer_radius()
2022-03-28 03:06:42 +00:00
// Usage:
2023-07-15 23:06:30 +00:00
// pr = pitch_radius(pitch, teeth, [helical]);
// pr = pitch_radius(mod=, teeth=, [helical=]);
2022-03-28 03:06:42 +00:00
// Description:
// Calculates the pitch radius for the gear. Two mated gears will have their centers spaced apart
// by the sum of the two gear's pitch radii.
// Arguments:
2023-07-17 06:10:27 +00:00
// circ_pitch = The circular pitch, or distance between teeth around the pitch circle, in mm.
2022-03-28 03:06:42 +00:00
// teeth = The number of teeth on the gear.
2023-07-15 23:06:30 +00:00
// helical = The helical angle (from vertical) of the teeth on the gear. Default: 0
// ---
2023-07-17 06:10:27 +00:00
// mod = The metric module/modulus of the gear, or mm of pitch diameter per tooth.
// diam_pitch = The diametral pitch, or number of teeth per inch of pitch diameter. Note that the diametral pitch is a completely different thing than the pitch diameter.
2022-03-28 03:06:42 +00:00
// Example:
2023-07-17 06:10:27 +00:00
// pr = pitch_radius(circ_pitch=5, teeth=11);
// pr = pitch_radius(circ_pitch=5, teeth=11, helical=30);
// pr = pitch_radius(diam_pitch=10, teeth=11);
2022-03-28 03:06:42 +00:00
// pr = pitch_radius(mod=2, teeth=20);
2023-07-15 23:06:30 +00:00
// pr = pitch_radius(mod=2, teeth=20, helical=30);
2022-03-28 03:06:42 +00:00
// Example(2D):
2023-07-17 23:24:03 +00:00
// $fn=144;
// teeth=17; circ_pitch = 5;
// pr = pitch_radius(circ_pitch, teeth);
// stroke(spur_gear2d(circ_pitch, teeth), width=0.1);
// color("blue") dashed_stroke(circle(r=pr), width=0.1);
// color("black") {
// stroke([[0,0],polar_to_xy(pr,45)],
// endcaps="arrow", width=0.3);
// fwd(1)
// text("Pitch Radius", size=1.5,
// halign="center", valign="top");
// }
2023-07-15 23:06:30 +00:00
2023-07-17 06:10:27 +00:00
function pitch_radius (
circ_pitch ,
teeth ,
helical = 0 ,
mod ,
diam_pitch ,
pitch
) =
let ( circ_pitch = circular_pitch ( pitch , mod , circ_pitch , diam_pitch ) )
circ_pitch * teeth / PI / 2 / cos ( helical ) ;
2020-10-20 05:53:56 +00:00
2022-03-28 03:06:42 +00:00
// Function: outer_radius()
2023-04-05 00:25:13 +00:00
// Synopsis: Returns the outer radius for a gear.
// Topics: Gears, Parts
// See Also: spur_gear(), diametral_pitch(), circular_pitch(), pitch_value(), module_value(), pitch_radius(), outer_radius()
2022-03-28 03:06:42 +00:00
// Usage:
2023-07-17 06:10:27 +00:00
// or = outer_radius(circ_pitch, teeth, [helical=], [clearance=], [internal=], [profile_shift=]);
2023-07-15 23:06:30 +00:00
// or = outer_radius(mod=, teeth=, [helical=], [clearance=], [internal=], [profile_shift=]);
2023-07-17 06:10:27 +00:00
// or = outer_radius(diam_pitch=, teeth=, [helical=], [clearance=], [internal=], [profile_shift=]);
2020-10-21 05:24:12 +00:00
// Description:
2022-03-28 03:06:42 +00:00
// Calculates the outer radius for the gear. The gear fits entirely within a cylinder of this radius.
2020-10-21 05:24:12 +00:00
// Arguments:
2023-07-17 06:10:27 +00:00
// circ_pitch = The circular pitch, or distance between teeth around the pitch circle, in mm.
2022-03-28 03:06:42 +00:00
// teeth = The number of teeth on the gear.
2023-07-15 23:06:30 +00:00
// ---
2022-03-28 03:06:42 +00:00
// clearance = If given, sets the clearance between meshing teeth.
2023-07-15 23:06:30 +00:00
// profile_shift = Profile shift factor x.
2023-06-20 03:41:39 +00:00
// internal = If true, calculate for an internal gear.
2023-07-15 23:06:30 +00:00
// helical = The helical angle (from vertical) of the teeth on the gear. Default: 0
2023-07-17 06:10:27 +00:00
// mod = The metric module/modulus of the gear, or mm of pitch diameter per tooth.
// diam_pitch = The diametral pitch, or number of teeth per inch of pitch diameter. Note that the diametral pitch is a completely different thing than the pitch diameter.
2020-10-21 05:24:12 +00:00
// Example:
2023-07-17 06:10:27 +00:00
// or = outer_radius(circ_pitch=5, teeth=20);
// or = outer_radius(circ_pitch=5, teeth=20, helical=30);
// or = outer_radius(diam_pitch=10, teeth=17);
2022-03-28 03:06:42 +00:00
// or = outer_radius(mod=2, teeth=16);
// Example(2D):
2023-07-17 23:24:03 +00:00
// $fn=144;
// teeth=17; circ_pitch = 5;
// or = outer_radius(circ_pitch, teeth);
// stroke(spur_gear2d(circ_pitch, teeth), width=0.1);
// color("blue") dashed_stroke(circle(r=or), width=0.1);
// color("black") {
// stroke([[0,0],polar_to_xy(or,45)],
// endcaps="arrow", width=0.3);
// fwd(1)
// text("Outer Radius", size=1.5,
// halign="center", valign="top");
// }
2023-07-15 23:06:30 +00:00
2023-07-17 06:10:27 +00:00
function outer_radius ( circ_pitch = 5 , teeth = 11 , clearance , internal = false , helical = 0 , profile_shift = 0 , mod , pitch , diam_pitch ) =
let ( circ_pitch = circular_pitch ( pitch , mod , circ_pitch , diam_pitch ) )
pitch_radius ( circ_pitch , teeth , helical ) + (
2023-07-15 23:06:30 +00:00
internal
2023-07-17 06:10:27 +00:00
? _dedendum ( circ_pitch , clearance , profile_shift = profile_shift )
: _adendum ( circ_pitch , profile_shift = profile_shift )
2023-07-15 23:06:30 +00:00
) ;
2022-03-30 03:21:32 +00:00
/// Function: _root_radius()
/// Usage:
2023-07-17 06:10:27 +00:00
/// rr = _root_radius(circ_pitch, teeth, [helical], [clearance=], [internal=], [profile_shift=]);
/// rr = _root_radius(diam_pitch=, teeth=, [helical=], [clearance=], [internal=], [profile_shift=]);
/// rr = _root_radius(mod=, teeth=, [helical=], [clearance=], [internal=], [profile_shift=]);
2022-03-30 03:21:32 +00:00
/// Topics: Gears
/// Description:
/// Calculates the root radius for the gear, at the base of the dedendum.
/// Arguments:
2023-07-17 06:10:27 +00:00
/// circ_pitch = The circular pitch, or distance between teeth around the pitch circle, in mm.
2022-03-30 03:21:32 +00:00
/// teeth = The number of teeth on the gear.
2023-07-15 23:06:30 +00:00
/// ---
2022-03-30 03:21:32 +00:00
/// clearance = If given, sets the clearance between meshing teeth.
2023-06-20 03:41:39 +00:00
/// internal = If true, calculate for an internal gear.
2023-07-15 23:06:30 +00:00
/// helical = The helical angle (from vertical) of the teeth on the gear. Default: 0
/// profile_shift = Profile shift factor x.
2023-07-17 06:10:27 +00:00
/// mod = The metric module/modulus of the gear, or mm of pitch diameter per tooth.
/// diam_pitch = The diametral pitch, or number of teeth per inch of pitch diameter. Note that the diametral pitch is a completely different thing than the pitch diameter.
2022-03-30 03:21:32 +00:00
/// Example:
2023-07-17 06:10:27 +00:00
/// rr = _root_radius(circ_pitch=5, teeth=11);
/// rr = _root_radius(circ_pitch=5, teeth=16, helical=30);
/// rr = _root_radius(diam_pitch=10, teeth=11);
2022-03-30 03:21:32 +00:00
/// rr = _root_radius(mod=2, teeth=16);
/// Example(2D):
2023-07-17 06:10:27 +00:00
/// pr = _root_radius(circ_pitch=5, teeth=11);
2022-03-30 03:21:32 +00:00
/// #spur_gear2d(pitch=5, teeth=11);
/// color("black")
/// stroke(circle(r=pr),width=0.1,closed=true);
2023-07-15 23:06:30 +00:00
2023-07-17 06:10:27 +00:00
function _root_radius ( circ_pitch , teeth , clearance , internal = false , helical = 0 , profile_shift = 0 , diam_pitch , mod , pitch ) =
let ( circ_pitch = circular_pitch ( pitch , mod , circ_pitch , diam_pitch ) )
pitch_radius ( circ_pitch , teeth , helical ) - (
2023-07-15 23:06:30 +00:00
internal
2023-07-17 06:10:27 +00:00
? _adendum ( circ_pitch , profile_shift = profile_shift )
: _dedendum ( circ_pitch , clearance , profile_shift = profile_shift )
2023-07-15 23:06:30 +00:00
) ;
2022-03-30 03:21:32 +00:00
/// Function: _base_radius()
/// Usage:
2023-07-17 06:10:27 +00:00
/// br = _base_radius(circ_pitch, teeth, [pressure_angle], [helical]);
/// br = _base_radius(diam_pitch=, teeth=, [pressure_angle=], [helical=]);
/// br = _base_radius(mod=, teeth=, [pressure_angle=], [helical=]);
2022-03-30 03:21:32 +00:00
/// Topics: Gears
/// Description:
/// Get the base circle for involute teeth, at the base of the teeth.
/// Arguments:
/// pitch = The circular pitch, or distance between teeth around the pitch circle, in mm.
/// teeth = The number of teeth on the gear.
/// pressure_angle = Pressure angle in degrees. Controls how straight or bulged the tooth sides are.
2023-07-15 23:06:30 +00:00
/// helical = The helical angle (from vertical) of the teeth on the gear. Default: 0
/// ---
2023-07-17 06:10:27 +00:00
/// mod = The metric module/modulus of the gear, or mm of pitch diameter per tooth.
/// diam_pitch = The diametral pitch, or number of teeth per inch of pitch diameter. Note that the diametral pitch is a completely different thing than the pitch diameter.
2022-03-30 03:21:32 +00:00
/// Example:
2023-07-17 06:10:27 +00:00
/// br = _base_radius(circ_pitch=5, teeth=20, pressure_angle=20);
/// br = _base_radius(circ_pitch=5, teeth=20, pressure_angle=20, helical=30);
/// br = _base_radius(diam_pitch=10, teeth=20, pressure_angle=20);
2022-03-30 03:21:32 +00:00
/// br = _base_radius(mod=2, teeth=18, pressure_angle=20);
/// Example(2D):
2023-07-17 06:10:27 +00:00
/// pr = _base_radius(circ_pitch=5, teeth=11);
/// #spur_gear2d(circ_pitch=5, teeth=11);
2022-03-30 03:21:32 +00:00
/// color("black")
/// stroke(circle(r=pr),width=0.1,closed=true);
2023-07-15 23:06:30 +00:00
2023-07-17 06:10:27 +00:00
function _base_radius ( circ_pitch , teeth , pressure_angle = 20 , helical = 0 , diam_pitch , mod , pitch ) =
2023-07-15 23:06:30 +00:00
let (
2023-07-17 06:10:27 +00:00
circ_pitch = circular_pitch ( pitch , mod , circ_pitch , diam_pitch ) ,
2023-07-15 23:06:30 +00:00
trans_pa = atan ( tan ( pressure_angle ) / cos ( helical ) )
)
2023-07-17 06:10:27 +00:00
pitch_radius ( circ_pitch , teeth , helical ) * cos ( trans_pa ) ;
2020-10-21 05:24:12 +00:00
2022-03-28 03:06:42 +00:00
// Function: bevel_pitch_angle()
2023-04-05 00:25:13 +00:00
// Synopsis: Returns the pitch cone angle for a bevel gear.
// Topics: Gears, Parts
// See Also: bevel_gear(), pitch_radius(), outer_radius()
2022-03-28 03:06:42 +00:00
// Usage:
2023-04-05 03:29:21 +00:00
// ang = bevel_pitch_angle(teeth, mate_teeth, [drive_angle=]);
2020-10-21 05:24:12 +00:00
// Description:
2023-04-05 00:25:13 +00:00
// Returns the correct pitch cone angle for a bevel gear with a given number of teeth, that is
2022-03-28 03:06:42 +00:00
// matched to another bevel gear with a (possibly different) number of teeth.
// Arguments:
// teeth = Number of teeth that this gear has.
// mate_teeth = Number of teeth that the matching gear has.
// drive_angle = Angle between the drive shafts of each gear. Default: 90º.
// Example:
// ang = bevel_pitch_angle(teeth=18, mate_teeth=30);
// Example(2D):
// t1 = 13; t2 = 19; pitch=5;
// pang = bevel_pitch_angle(teeth=t1, mate_teeth=t2, drive_angle=90);
// color("black") {
// zrot_copies([0,pang])
// stroke([[0,0,0], [0,-20,0]],width=0.2);
// stroke(arc(r=3, angle=[270,270+pang]),width=0.2);
// }
// #bevel_gear(
// pitch=5, teeth=t1, mate_teeth=t2,
// spiral_angle=0, cutter_radius=1000,
// slices=12, anchor="apex", orient=BACK
// );
2023-07-15 23:06:30 +00:00
2022-03-28 03:06:42 +00:00
function bevel_pitch_angle ( teeth , mate_teeth , drive_angle = 90 ) =
atan ( sin ( drive_angle ) / ( ( mate_teeth / teeth ) + cos ( drive_angle ) ) ) ;
// Function: worm_gear_thickness()
2023-04-05 00:25:13 +00:00
// Synopsis: Returns the thickness for a worm gear.
// Topics: Gears, Parts
// See Also: worm(), worm_gear(), pitch_radius(), outer_radius()
2022-03-28 03:06:42 +00:00
// Usage:
2023-04-05 03:29:21 +00:00
// thick = worm_gear_thickness(pitch, teeth, worm_diam, [worm_arc=], [crowning=], [clearance=]);
// thick = worm_gear_thickness(mod=, teeth=, worm_diam=, [worm_arc=], [crowning=], [clearance=]);
2022-03-28 03:06:42 +00:00
// Description:
// Calculate the thickness of the worm gear.
2020-10-21 05:24:12 +00:00
// Arguments:
2023-07-17 06:10:27 +00:00
// circ_pitch = The circular pitch, or distance between teeth around the pitch circle, in mm. Default: 5
2020-10-21 05:24:12 +00:00
// teeth = Total number of teeth along the rack. Default: 30
// worm_diam = The pitch diameter of the worm gear to match to. Default: 30
2023-07-17 06:10:27 +00:00
// ---
2020-10-21 05:24:12 +00:00
// worm_arc = The arc of the worm to mate with, in degrees. Default: 60 degrees
2023-04-05 00:25:13 +00:00
// crowning = The amount to oversize the virtual hobbing cutter used to make the teeth, to add a slight crowning to the teeth to make them fit the work easier. Default: 1
2020-10-21 05:24:12 +00:00
// clearance = Clearance gap at the bottom of the inter-tooth valleys.
2023-07-17 06:10:27 +00:00
// mod = The metric module/modulus of the gear, or mm of pitch diameter per tooth.
// diam_pitch = The diametral pitch, or number of teeth per inch of pitch diameter. Note that the diametral pitch is a completely different thing than the pitch diameter.
2022-03-28 03:06:42 +00:00
// Example:
2023-07-17 06:10:27 +00:00
// thick = worm_gear_thickness(circ_pitch=5, teeth=36, worm_diam=30);
2022-03-28 03:06:42 +00:00
// thick = worm_gear_thickness(mod=2, teeth=28, worm_diam=25);
// Example(2D):
2023-07-17 06:10:27 +00:00
// circ_pitch = 5; teeth=17;
2022-03-28 03:06:42 +00:00
// worm_diam = 30; starts=2;
2023-07-17 06:10:27 +00:00
// y = worm_gear_thickness(circ_pitch=circ_pitch, teeth=teeth, worm_diam=worm_diam);
2022-03-28 03:06:42 +00:00
// #worm_gear(
2023-07-17 06:10:27 +00:00
// circ_pitch=circ_pitch, teeth=teeth,
2022-03-28 03:06:42 +00:00
// worm_diam=worm_diam,
// worm_starts=starts,
// orient=BACK
// );
// color("black") {
// ycopies(y) stroke([[-25,0],[25,0]], width=0.5);
// stroke([[-20,-y/2],[-20,y/2]],width=0.5,endcaps="arrow");
// }
2023-07-15 23:06:30 +00:00
2023-07-17 06:10:27 +00:00
function worm_gear_thickness ( circ_pitch , teeth , worm_diam , worm_arc = 60 , crowning = 1 , clearance , diam_pitch , mod , pitch ) =
2020-10-21 05:24:12 +00:00
let (
2023-07-17 06:10:27 +00:00
circ_pitch = circular_pitch ( pitch , mod , circ_pitch , diam_pitch ) ,
2022-03-28 03:06:42 +00:00
r = worm_diam / 2 + crowning ,
pitch_thick = r * sin ( worm_arc / 2 ) * 2 ,
2023-07-17 06:10:27 +00:00
pr = pitch_radius ( circ_pitch , teeth ) ,
rr = _root_radius ( circ_pitch , teeth , clearance , false ) ,
2022-03-28 03:06:42 +00:00
pitchoff = ( pr - rr ) * sin ( worm_arc / 2 ) ,
thickness = pitch_thick + 2 * pitchoff
) thickness ;
2023-07-15 23:06:30 +00:00
// Function: mesh_radius()
// Synopsis: Returns the distance between two gear centers.
// Topics: Gears, Parts
// See Also: worm(), worm_gear(), pitch_radius(), outer_radius()
// Usage:
// dist = mesh_radius(pitch, teeth, [helical=], [profile_shift=], [pressure_angle=]);
// dist = mesh_radius(mod=, teeth=, [helical=], [profile_shift=], [pressure_angle=]);
// Description:
// Calculate the distance between the centers of two gears.
// Arguments:
// pitch = The circular pitch, or distance between teeth around the pitch circle, in mm. Default: 5
2023-07-17 06:10:27 +00:00
// teeth = Total number of teeth in the first gear. If given 0, we assume this is a rack or worm.
2023-07-15 23:06:30 +00:00
// ---
// helical = The helical angle (from vertical) of the teeth on the first gear. Default: 0
// profile_shift = Profile shift factor x for the first gear. Default: 0
// pressure_angle = The pressure angle of the gear.
2023-07-17 06:10:27 +00:00
// diam_pitch = The diametral pitch, or number of teeth per inch of pitch diameter. Note that the diametral pitch is a completely different thing than the pitch diameter.
// mod = The metric module/modulus of the gear, or mm of pitch diameter per tooth.
2023-07-15 23:06:30 +00:00
// Example(2D):
// pitch=5; teeth1=7; teeth2=24;
// mr1 = mesh_radius(pitch, teeth1);
// mr2 = mesh_radius(pitch, teeth2);
// left(mr1) spur_gear2d(pitch, teeth1, gear_spin=-90);
// right(mr2) spur_gear2d(pitch, teeth2, gear_spin=90-180/teeth2);
// Example: Non-parallel Helical Gears
// pitch=5; teeth1=15; teeth2=24; ha1=45; ha2=30; thick=10;
// mr1 = mesh_radius(pitch, teeth1, helical=ha1);
// mr2 = mesh_radius(pitch, teeth2, helical=ha2);
// left(mr1) spur_gear(pitch, teeth1, helical=ha1, thickness=thick, gear_spin=-90);
// right(mr2) xrot(ha1+ha2) spur_gear(pitch, teeth2, helical=ha2, thickness=thick, gear_spin=90-180/teeth2);
// Example(2D): Disable Auto Profile Shifting on the Small Gear
// pitch=5; teeth1=7; teeth2=24;
// mr1 = mesh_radius(pitch, teeth1, profile_shift=0);
// mr2 = mesh_radius(pitch, teeth2);
// left(mr1) spur_gear2d(pitch, teeth1, profile_shift=0, gear_spin=-90);
// right(mr2) spur_gear2d(pitch, teeth2, gear_spin=90-180/teeth2);
// Example(2D): Manual Profile Shifting
// pitch=5; teeth1=7; teeth2=24; ps1 = 0.5; ps2 = -0.2;
// mr1 = mesh_radius(pitch, teeth1, profile_shift=ps1);
// mr2 = mesh_radius(pitch, teeth2, profile_shift=ps2);
// left(mr1) spur_gear2d(pitch, teeth1, profile_shift=ps1, gear_spin=-90);
// right(mr2) spur_gear2d(pitch, teeth2, profile_shift=ps2, gear_spin=90-180/teeth2);
function mesh_radius (
2023-07-17 06:10:27 +00:00
circ_pitch ,
2023-07-15 23:06:30 +00:00
teeth ,
helical = 0 ,
profile_shift ,
pressure_angle = 20 ,
2023-07-17 06:10:27 +00:00
diam_pitch ,
mod ,
pitch
2023-07-15 23:06:30 +00:00
) =
let (
2023-07-17 06:10:27 +00:00
circ_pitch = circular_pitch ( pitch , mod , circ_pitch , diam_pitch ) ,
2023-07-15 23:06:30 +00:00
profile_shift = default ( profile_shift , teeth > 0 ? auto_profile_shift ( teeth , pressure_angle ) : 0 ) ,
2023-07-17 06:10:27 +00:00
mod = circ_pitch / PI ,
pr = teeth > 0 ? pitch_radius ( circ_pitch , teeth , helical ) : 0 ,
2023-07-15 23:06:30 +00:00
r = pr + profile_shift * mod
) r ;
// Function: auto_profile_shift()
// Synopsis: Returns the recommended profile shift for a gear.
// Topics: Gears, Parts
// See Also: worm(), worm_gear(), pitch_radius(), outer_radius()
// Usage:
// x = auto_profile_shift(teeth, pressure_angle);
// x = auto_profile_shift(teeth, min_teeth=);
// Description:
// Calculates the recommended profile shift to avoid gear tooth undercutting.
// Arguments:
// teeth = Total number of teeth in the gear.
// pressure_angle = The pressure angle of the gear.
// ---
// min_teeth = If given, the minimum number of teeth on a gear that has acceptable undercut.
function auto_profile_shift ( teeth , pressure_angle = 20 , min_teeth ) =
let (
min_teeth = is_undef ( min_teeth )
? 2 / pow ( sin ( pressure_angle ) , 2 )
: min_teeth
)
teeth > floor ( min_teeth ) ? 0 :
1 - ( teeth / min_teeth ) ;
2020-10-21 05:24:12 +00:00
2020-05-30 02:04:34 +00:00
// vim: expandtab tabstop=4 shiftwidth=4 softtabstop=4 nowrap