From 71ac571346fca7e2459dcdda579084f69a19082d Mon Sep 17 00:00:00 2001 From: Chris Palmer Date: Mon, 6 Jul 2020 23:22:11 +0100 Subject: [PATCH] Added a utility for making involute spur gears --- lib.scad | 1 + readme.md | 64 +++++++++++++++++++++++------ tests/gears.scad | 58 ++++++++++++++++++++++++++ tests/png/gears.png | Bin 0 -> 59122 bytes utils/gears.scad | 96 ++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 206 insertions(+), 13 deletions(-) create mode 100644 tests/gears.scad create mode 100644 tests/png/gears.png create mode 100644 utils/gears.scad diff --git a/lib.scad b/lib.scad index 81257ec..eab0bac 100644 --- a/lib.scad +++ b/lib.scad @@ -84,6 +84,7 @@ use use use use +use use use use diff --git a/readme.md b/readme.md index a6d4457..3aede3a 100644 --- a/readme.md +++ b/readme.md @@ -22,19 +22,19 @@ See [usage](docs/usage.md) for requirements, installation instructions and a usa Ball_bearings KP_pillow_blocks Ring_terminals Butt_box Bezier Clip Batteries LDRs Rockers Cable_grommets Dogbones Global Belts LED_meters Rod Carriers Fillet Polyholes - Blowers LEDs SCS_bearing_blocks Corner_block Hanging_hole Rounded_rectangle - Bulldogs Leadnuts SK_brackets Door_hinge Layout Sphere - Buttons Light_strips SMDs Door_latch Maths Teardrops - Cable_strips Linear_bearings SSRs Fan_guard Offset - Cameras Mains_sockets Screws Fixing_block Quadrant - Circlips Microswitches Sealing_strip Flat_hinge Round - Components Microview Sheets Foot Rounded_cylinder - DIP Modules Spades Handle Rounded_polygon - D_connectors Nuts Spools PCB_mount Sector - Displays O_ring Springs PSU_shroud Sweep - Extrusion_brackets Opengrab Stepper_motors Printed_box Thread - Extrusions PCB Swiss_clips Ribbon_clamp Tube - Fans PCBs Toggles SSR_shroud + Blowers LEDs SCS_bearing_blocks Corner_block Gears Rounded_rectangle + Bulldogs Leadnuts SK_brackets Door_hinge Hanging_hole Sphere + Buttons Light_strips SMDs Door_latch Layout Teardrops + Cable_strips Linear_bearings SSRs Fan_guard Maths + Cameras Mains_sockets Screws Fixing_block Offset + Circlips Microswitches Sealing_strip Flat_hinge Quadrant + Components Microview Sheets Foot Round + DIP Modules Spades Handle Rounded_cylinder + D_connectors Nuts Spools PCB_mount Rounded_polygon + Displays O_ring Springs PSU_shroud Sector + Extrusion_brackets Opengrab Stepper_motors Printed_box Sweep + Extrusions PCB Swiss_clips Ribbon_clamp Thread + Fans PCBs Toggles SSR_shroud Tube Fuseholder PSUs Transformers Screw_knob Geared_steppers Panel_meters Tubings Socket_box Green_terminals Pillars Variacs Strap_handle @@ -5221,6 +5221,44 @@ Rounded fillet for adding to corners. ![fillet](tests/png/fillet.png) +Top + +--- + +## Gears +Utilities for making involute gears. + +Formulas from +and + +```involute_gear_profile()``` returns a polygon that can have the bore and spokes, etc, subtracted from it before linear extruding it to 3D. +Helical gears can be made using ```twist``` and bevel gears using ```scale``` parameters of ```linear_extrude()```. + +Gears with less than 19 teeth (when pressure angle is 20) are profile shifted to avoid undercutting the tooth root. 7 teeth is considered +the practical minimum. + +The clearance between tip and root defaults to module / 6, but can be overridden by setting the ```clearance``` parameter. + + +[utils/gears.scad](utils/gears.scad) Implementation. + +[tests/gears.scad](tests/gears.scad) Code for this example. + +### Functions +| Function | Description | +|:--- |:--- | +| ```centre_distance(m, z1, z2, pa)``` | Calculate distance between centres taking profile shift into account | +| ```involute(r, u)``` | Involute of circle radius r at angle u in radians | +| ```profile_shift(z, pa)``` | Calculate profile shift for small gears | + +### Modules +| Module | Description | +|:--- |:--- | +| ```involute_gear_profile(m, z, pa = 20, clearance = undef, steps = 20)``` | Calculate profile given module, number of teeth and pressure angle | + +![gears](tests/png/gears.png) + + Top --- diff --git a/tests/gears.scad b/tests/gears.scad new file mode 100644 index 0000000..1bb2aeb --- /dev/null +++ b/tests/gears.scad @@ -0,0 +1,58 @@ +// +// NopSCADlib Copyright Chris Palmer 2020 +// nop.head@gmail.com +// hydraraptor.blogspot.com +// +// This file is part of NopSCADlib. +// +// NopSCADlib is free software: you can redistribute it and/or modify it under the terms of the +// GNU General Public License as published by the Free Software Foundation, either version 3 of +// the License, or (at your option) any later version. +// +// NopSCADlib is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +// without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License along with NopSCADlib. +// If not, see . +// +include <../utils/core/core.scad> +use <../utils/gears.scad> + +// left gear teeth +z1 = 39; // [7 : 1 : 99] + +// Right gear teeth +z2 = 7; // [7 : 1 : 99] + +// Modulus +m = 2.0; // [0.1 : 0.1 : 5.0] + +// Pressure angle +pa = 20; // [14.5, 20, 22.5, 25] + +$show_numbers = false; + +module gears() { + color(pp1_colour) + rotate($t * 360) + linear_extrude(eps, center = true, convexity = z1) + difference() { + involute_gear_profile(m, z1, pa); + + circle(r = m * z1 / 10); + } + + color(pp2_colour) + translate([centre_distance(m, z1, z2, pa), 0]) + rotate(180 + 180 / z2 + -$t * 360 * z1 / z2) + linear_extrude(eps, center = true, convexity = z2) + difference() { + involute_gear_profile(m, z2, pa); + + circle(r = m * z2 / 10); + } +} + +rotate(is_undef($bom) ? 0 : [70, 0, 315]) + gears(); diff --git a/tests/png/gears.png b/tests/png/gears.png new file mode 100644 index 0000000000000000000000000000000000000000..07d3aa9148f9c5ab4f13389ffe9bf1dc5bfd26ea GIT binary patch literal 59122 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
-&tICDYf!|U_?_VO=6Y#7B~v0FWi{_ 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 xt@`mL!XX{N}Yir|yV-#?@ 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. +// + +// +//! Utilities for making involute gears. +//! +//! Formulas from +//! and +//! +//! ```involute_gear_profile()``` returns a polygon that can have the bore and spokes, etc, subtracted from it before linear extruding it to 3D. +//! Helical gears can be made using ```twist``` and bevel gears using ```scale``` parameters of ```linear_extrude()```. +//! +//! Gears with less than 19 teeth (when pressure angle is 20) are profile shifted to avoid undercutting the tooth root. 7 teeth is considered +//! the practical minimum. +//! +//! The clearance between tip and root defaults to module / 6, but can be overridden by setting the ```clearance``` parameter. +// +include +use + +function involute(r, u) = let(a = degrees(u), c = cos(a), s = sin(a)) r * [c + u * s, s - u * c]; //! Involute of circle radius r at angle u in radians + +function profile_shift(z, pa) = max(1 - z * sqr(sin(pa)) / 2, 0); //! Calculate profile shift for small gears + +function centre_distance(m, z1, z2, pa) = //! Calculate distance between centres taking profile shift into account + let(x1 = profile_shift(z1, pa), x2 = profile_shift(z2, pa)) m * (z1/2 + z2/2 + x1 + x2); + +module involute_gear_profile(m, z, pa = 20, clearance = undef, steps = 20) { //! Calculate profile given module, number of teeth and pressure angle + assert(z >= 7, "Gears must have at least 7 teeth."); + d = m * z; // Reference pitch circle diameter + x = profile_shift(z, pa); // Profile shift + c = is_undef(clearance) ? m / 6 : clearance; // Clearance from tip to root + + base_d = d * cos(pa); // Base diameter + root_r = d / 2 + m * (x - 1) - c; // Root radius (dedendum circle radius) + tip_d = d + 2 * m * (1 + x); // Tip diameter (addendum circle diameter) + tpa = acos(base_d / tip_d); // Tip pressure angle + inva = tan(pa) - radians(pa); // Involute alpha + invaa = tan(tpa) - radians(tpa); // Involute alphaa + ta = PI / (2 * z) + 2 * x * tan(pa) / z + inva - invaa; // Tooth tip thickness angle, radians + crest_w = ta * tip_d; // Crest width + umax = sqrt(sqr(tip_d / base_d) - 1); // Max value of the involute parameter + + base_r = base_d / 2; + p1 = involute(base_r, 0); + p2 = involute(base_r, umax); + dist = norm(p2 - p1); // distance between beginning and end of the involute curve + + base_angle = 2 * acos((sqr(base_r) + sqr(tip_d / 2) - sqr(dist)) / base_r / tip_d) + degrees(2 * ta); + root_angle = 360 / z - base_angle; + root_circle_r = base_r * sin(root_angle / 2); + + if(!is_undef($show_numbers) && $show_numbers) { + echo(d=d); + echo(base_d=base_d); + echo(tip_d=tip_d); + echo(tpa = tpa); + echo(inva=inva); + echo(invaa=invaa); + echo(x=x); + echo(ta=ta); + echo(crest_w=crest_w); + echo(umax = umax); + echo(base_angle=base_angle); + echo(root_angle=root_angle); + } + involute = [for(i = [0 : steps], u = umax * i / steps) involute(base_r, u)]; // involute for the bottom side of the tooth + truncated = [for(p = involute) if((rot2_z(-base_angle / 2) * p).y <= 0) p]; // removed any above the centreline to prevent overlap + reflection = reverse([for(p = truncated) rot2_z(base_angle) * [p.x, -p.y] ]); // reflect and rotate to make the top edge + + root = reverse([for(a = [90 : 180 / steps : 270]) rot2_z(base_angle + root_angle / 2) * ([base_r, 0] + root_circle_r * [cos(a), sin(a)]) ]); + tooth = concat(truncated, reflection, root); + gear = concat([for(i = [0 : z - 1], p = tooth) rot2_z(i * 360 / z) * p]); + rotate(-base_angle / 2) + union() { + polygon(gear); + + circle(root_r); + } +}