[time-nuts] more worm code

beale beale at bealecorner.com
Wed Aug 20 10:12:18 EDT 2014


// worm: 32 diametral pitch   (# of teeth per inch of diameter on pitch circle)
// 32 inch => 32/25.4 = 1.26 DP (in mm)
// nTeeth = DP * 2 * r;

// Create enveloping worm gear / pinion gear by incrementally
// subtracting off parts of the matching worm screw
// very slow to compute full gear with reasonable detail / smoothness
// 2014-08-19 J.Beale
//
// https://github.com/elmom/MCAD/blob/master/involute_gears.scad
// https://github.com/syvwlch/Thingiverse-Projects/blob/master/Threaded%20Library/Thread_Library.scad

use <MCAD/Thread_Library.scad>
use <MCAD/involute_gears.scad>

eps = 0.05;      // Epsilon = a small number
numberTeeth=40;  // number of teeth on worm gear (pinion gear)
pitchRadius=40;  // pitch radius of worm gear (pinion gear)

gearSegAngle = 10;  // toothed part of gear segment (360 = full gear)

length=20;  // length of worm screw
radius=10;  // radius of worm screw

pi = 3.1415926535897932384626433832795;

pitch = 2*pi*pitchRadius/numberTeeth;

angle=360*$t;
offset=7.5;

distance=radius+pitchRadius+0.0*pitch;

GearThick = 10;           // thickness of gear
xoff = -GearThick/2;
rAngle = 360/numberTeeth;

wAoff = -50;  // initial angular offset of worm screw

// ===============================================
// == QUALITY FACTOR (higher = slower, better) ==
// ===============================================

cSteps = 17;  // rotational carving steps for worm: larger = smoother surf.
StepsPerTurn = cSteps+3; // facets around worm screw: larger = smoother

// ===============================================
EngageDepth = pitch*0.3;  // carving out gear from blank
// echo(EngageDepth);

// worm(wA = 10);


module worm(wA = 0) {
 translate([0,distance-EngageDepth,0.2-length/2])
 rotate([0,0,180+wA])
 trapezoidThread(
  length=length, // axial length of the threaded rod
  pitch=pitch,   // axial distance from crest to crest
  pitchRadius=radius, // radial distance from center to mid-profile
  threadHeightToPitch=0.5, // ratio between the height of the profile and the pitch
  // std value for Acme or metric lead screw is 0.5
  profileRatio=0.5,   // ratio between the lengths of the raised part of the profile and the pitch
  // std value for Acme or metric lead screw is 0.5
  threadAngle=14.5, // angle between the two faces of the thread
// std value for Acme is 29 or for metric lead screw is 30
  RH=true, // true/false the thread winds clockwise looking along shaft, i.e.follows the Right Hand Rule
  clearance=0.0, // radial clearance, normalized to thread height
  backlash=0.1, // axial clearance, normalized to pitch
  stepsPerTurn=StepsPerTurn // number of slices to create per turn
 );

} // end module worm()


module myToothBlank() {
  translate([-GearThick/2,pitchRadius-8,0])
  rotate([360/(numberTeeth*2),0,0])
    cube([GearThick,pitch*1.5,pitch]);
}


module oneTooth() {
difference() {
  myToothBlank();     // blank to form tooth via CSG subtraction
  worm(wA = wAoff); // worm screw
  for(f = [-.1:(1.0/cSteps):1.1]) {  // computational machining (gear hobbing)
   rotate([rAngle*f,0,0]) worm(wA = (360*f)+wAoff);
  }
}
} // end module oneTooth()


// full gear = oneTooth * numberTeeth
// deg = 360.0/numberTeeth;

module gearSegment(segAngle = 90) {
  for(deg = [0:360.0/numberTeeth:segAngle]) {
    rotate([deg,0,0]) oneTooth();
  }
}

module hub(ID = 5) {
difference() {
  rotate([0,90,0]) translate([0,0,-GearThick/2])
    cylinder(r=pitchRadius-(radius/2),h=GearThick,$fn=60);
  rotate([0,90,0]) translate([0,0,-eps-GearThick/2])
    cylinder(r=ID/2,h=GearThick+2*eps,$fn=20);
}
}

gearSegment(segAngle=gearSegAngle);  // full gear => segmentAngle = 360
hub(ID = 8);  // inner part of gear wheel with ID boresize

// worm();



More information about the time-nuts mailing list