On Wednesday, December 29, 2021 8:31:49 PM EST John Dammeyer wrote:
> Small progress report on Todd's version of the harmonic drive.
> 
> I added a back mount that holds a 19x40x12 bearing.  A cap to hold the
> bearing in place.   Then a new drive arm sized to 19mm and a 19x1.25mm
> thread along with a nut.  The end of the drive shaft has an 8mm hole for
> the stepper motors that arrived last week.  Will likely require a metal
> collar around that part with threaded holes to clamp the flats on the
> motor shaft.  The plastic just isn't strong enough to hold these types of
> threads.

Yes is is John. lay and gently clamp the motor on the mill table, and use a 
CBN wheel intended for a valve grinder, a turn the flat as level as you can, 
power it up with the driver so its locked, and sweep slowly back and forth 
across the flat until you've removed another mm. Size the rest of the 8mm 
hole in the printout by positioning a square shape so as to use up that 
wider flat with plastic. I am assembling a much stronger version of the 
drive I've had running for a life test of the design since the first week of 
September. And that's one thing I didn't change. The 8mm hole for that shaft 
is sized to be a deadblow hammer fit on that motor shaft and with the bigger 
flat, it has strength to spare.  I can drive it onto the shaft of a 3nm 
motor, grab it with vice grips and stall the motor. Its normal driver is a 
1mn motor which also has the 8mm shaft. Go easy on the rate of removal as 
the shaft steel is soft and will smear if you push the rate too high.

Might not work in the much more brittle pla, but in petg, piece of cake.

Currently I am using a printed eliptical armature, with 4 printed ball 
bearings 6mm wide riding  on that 24mm long armature, fitted to a loose belt 
that's not really loose as its a drive fit over the stack of bearings, tite 
enough the outer races do not slip on the inside of the belt. And its 
currently set for a 50/1 ratio. I am currently fine tuning some sizes by the 
last .05mm here and there. I just found it possible to split the outer races 
in two trying to dis it to lube for the final assembly and made the armature 
.3mm smaller so I could give that material to the outer race, making it a 
bit stronger.  And I am doing it in OpenSCAD, the AppImage: OpenSCAD version 
2021.12.12.ai9755 (git b5aba496f) downloaded from their site about 3 weeks 
back. My code, as it exists right now, is attached. It's messy, about 80% my 
code, but some borrowed from thingyverse.
  
> http://www.autoartisans.com/harmonicdrive/BearingDriveShaft-1.jpg
> http://www.autoartisans.com/harmonicdrive/BearingDriveShaft-2.jpg
> http://www.autoartisans.com/harmonicdrive/BearingDriveShaft-3.jpg
> 
> Now to contain the green output gear.  Here's one idea.  I have a bag of
> 5.5mm steel balls meant for keeping model paint mixed.  With 80 of them
> held in place by the bearing spacer (which I would probably make out of
> metal for this project) it should theoretically capture the gear and
> reference it to the mounted frame.  A dual row of balls might be better.
> 
> http://www.autoartisans.com/harmonicdrive/BearingPath.jpg
> http://www.autoartisans.com/harmonicdrive/BearingSpacer.jpg
> http://www.autoartisans.com/harmonicdrive/MountFrame.jpg
> 
> Commercial units look like they use rollers set at angles but even a 32mm
> one from aliexpress is over $200.

Which is precisely why I'm using bb's. they aren't as precise as regular 
bearings but then printed plastic is a bit lumpy too. Fit then a bit tight, 
stuff full of bb's, roll it on the keyboard tray with a high loading until 
the knobs in the plastic are mashed down and it turns easy. The whole idea 
is if you break it, you can print another for $15 in petg and bb's plus the 
$1.70 bearing in the far end of the armature. And even that is probably 
optional. With or without supports, the end of the extra bearing hole in the 
armature is messy.

> Probably the next best step to create something like this is to down size
> it to brass or steel gears small enough to fit into a much lower cost set
> of bearings.   The key with this system will be the bearings.
> 
> Anyway, other than printing a conversion base for motor to bearing
> assembly I'm not sure this warrants further work unless I can come up
> with an inexpensive method to contain the front gear.  Suggestions, as
> always are welcome.
> 
> John
> 
> 
> 
> 
> _______________________________________________
> Emc-users mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/emc-users
> .


Cheers, Gene Heskett.
-- 
"There are four boxes to be used in defense of liberty:
 soap, ballot, jury, and ammo. Please use in that order."
-Ed Howdershelt (Author, 1940)
If we desire respect for the law, we must first make the law respectable.
 - Louis D. Brandeis
Genes Web page <http://geneslinuxbox.net:6309/gene>
// an attempt to make a 30/1 harmonic driver for my new smaller drive
// get data from prev. files.
// now, starting 12/22/2021, being made longer and stronger with 50/1
// ratio.
// for "mode" see line 589 1=build houseing,2=build spacer, 3= new armature,
// 4=armature bearings, 5=innerspline, 6=outcup, 7=60 tooth outer,
// 8=62 tooth outer. 9=timing pulley for output belt
// this is intended to be fitted to the A drive supplied with a 4 axis
// 6040 milling machine which due to low gear ratio, doesn't have the cajones
// to hold position. Not in this file, I've made a timing pulley that drives
// over the one
// supplied and replaces the huge belt with a 60 tooth for gt3 belt, with
// a longer offset to align with this drives output pulley.
// And I am in the process of making it for a direct on the motor mount
// whereas the original idea was to mount it on the back face of the
// mount which on the targetted A drive is 1/2" or 12mm thick. However,
// mounting it directly on the motor will put the end of the motor shaft
// into the middle of the output sprocket. Since the motor shaft is an
// 8mm modified dflat, a 10mm hole is now cut thru the bore of the output
// sprocket. In that event, the armature must lose its extended hub but that
// is yet to be done. It needs all the reinforcement it can get. Stay tuned.
hubsizeR=19.5; // it fits, quit diddling
IDofspl=67.05;
splsocht=6.00;
ODofCup=(IDofspl+splsocht*2.5);
sink=.745;// jack up bolt head countersink to top of 3.1 mm thick disk
sht=1.513;// height of countersink+noise in preview fudge
$fn=360;// make circles with 1 degree flats
reghole=38.3;// motor registration hole + printer undersize fudge, exact!
nemahole=(47.2/2); // one side of square pattern, 47.1 is official target, 
ddht=3.1;//input panel with nema 23 bolt pattern 
ddia=5.1;//5mm bolt clearance
//spacer ring height
spcringh =12;//could be 6.3
//spacer ring height1
spcringh1=6;//vertical offset
//spacer ring diameter 1 ID of housing wrapper
spcringd1=82.37;// outside of ring, id of surround band
//spacer ring diameter 2 
spcringd2=67.9;// inside of spacer ring, press fit on spline od
//housing wrapper height
wrapperh=32;//surround band height.
//globals for keys
t1=spcringd1;
t2=(spcringd2+.1);
y=(spcringh*.5 + .1);
z1=4.2;// key sizes, will need tweaked to fit well, probably by .2 + & -
z2=3.8;
z3=2.3;
z4=1.8;
// globals for output timing pulley
toothType=1;
toothWidth = 1.14; // Teeth of PULLEY, that is. Larger=tighter fit of teeth.
// make motor faceing disk
module disk()
{
    translate([0,0,splsocht/4]) // set z bottom at 0
    difference()
    {
        cylinder(h=splsocht/2,d=spcringd1,center=true);
        cylinder(h=splsocht/1.5,d=reghole,center=true);// make registration
       // hole in center
        translate([nemahole,nemahole,0])cylinder(h=ddht,d=ddia,center=true);
        translate([-nemahole,nemahole,0])cylinder(h=ddht,d=ddia,center=true);
        translate([-nemahole,-nemahole,0])cylinder(h=ddht,d=ddia,center=true);
        translate([nemahole,-nemahole,0])cylinder(h=ddht,d=ddia,center=true);
// Now set flat head countersinks at 45 dgree angle so screw head is buried
        translate([nemahole,nemahole,sink])cylinder(h=sht,d1=ddia,d2=10.10,center=true);
        translate([-nemahole,nemahole,sink])cylinder(h=sht,d1=ddia,d2=10.10,center=true);
        translate([-nemahole,-nemahole,sink])cylinder(h=sht,d1=ddia,d2=10.10,center=true);
        translate([nemahole,-nemahole,sink])cylinder(h=sht,d1=ddia,d2=10.10,center=true);
    }  
};


module spacer(fudge1,fudge2)
{
    spcOD=81.6; // OD of outer
    spcID=65.2; // ID of inner face, maybe 65.1 next
    spcTH= 12.4; // how thick
    spcJSR=36.6; // rad of jack screw holes
    spcJSS=3.85; // dia of jack screw holes, 2.7 too small for screws available
    outkeyd=4.3;// rad matches housing
    inkeyd=2.9; // dia matches outcup inner keys
    inkeyr=32.6; // rad of outcup inner keys
    echo(85, spcOD, spcID, spcTH, spcJSR, outkeyd, inkeyd);
    translate([0,0,6])
    difference()
    {
        //make outer disk
        cylinder(h=spcTH,d=spcOD,center=true);
        // subtractinner
        cylinder(h=spcTH+1,d=spcID,center=true);
        for(i=[0:15:359])
        {
            // subtract outside key notches
            rotate([0,0,i])
            translate([spcOD/2,0,0])
            cylinder(h=spcTH+1,d=outkeyd,center=true);
        }
        for(nn=[0:60:359]) // and subract jacking screw holes
        {
            rotate([0,0,nn+7.5])
            translate([spcJSR,0,-6.35]) // fix diameter of circle of keys
            cylinder(h=spcTH+1,d=spcJSS,true); // fix size of holes
        }
        for(i=[0:30:359]) //subract inner key notches
        {
            rotate([0,0,i-3])
            translate([inkeyr,0,-.05])
            cylinder(h=spcTH+1,d=inkeyd,center=true);
        }
    }
};

module wrapper() // housing outer wall
{
    translate([0,0,wrapperh/2])
    difference()
    {
        cylinder(h=wrapperh,d=90,center=true);
        cylinder(h=wrapperh+.01,d=spcringd1,center=true);
    }
};

module keys4(t,y,z)
{ // t is diameter of circle of keys, y is height of cylinder, z is diameter.
    if(key!=0)// keys were about .6mm too long.
    {    
        echo(101,t,y,z);
        for(nn=[0:15:359])
        {
            rotate([0,0,nn])
            translate([t/2.0,0,2.35]) // fix diameter of circle of keys
            cylinder(h=y*2,d=z,center=true);
        }
    }
};

module keys5(t,y,z)
{ // t is diameter of circle of keys, y is height of cylinder, z is diameter.
    if(key!=0)
    {    
        echo(115,t,y,z);
        for(nn=[0:60:359])
        {
            rotate([0,0,nn+6.0])
            translate([t/2.0,0,3]) // fix diameter of circle of keys
            cylinder(h=y,d=z,center=true);
        }
    }
};

module keys8(t,y,z)
{ // t is diameter of circle of keys, y is height of cylinder, z is diameter.
    if(key!=0)
    {    
        echo(115,t,y,z);
        for(nn=[0:45:359])
        {
            rotate([0,0,nn+6.0])
            translate([t/2.0,0,3]) // fix diameter of circle of keys
            cylinder(h=y,d=z,center=true);
        }
    }
};

module armature()
{ // now for 4 bearings of mode=4
    // making this a mm smaller (rd) to make room for stronger bearing OD
    // 6-30-21 14:12, even 3mm smaller for stronger splines 12/23/21 
    // and now needs a method to restrict length of hub extention to allow
    // a direct mount on a nema 23 motor.
    // hollow out bottom for bearing when they get here!!!!!!!! last active line
    rd=35.4;// is diameter for driving elipse reduced 12/22/21
    radarm0=(rd/2.0);// is radius of driver elipse
    hubbore=8.28;// is decent fit on motor shaft, check your printer!
    bearthk=6.0;// but not used for armature
    armthk=12.1;//
    armtran=(armthk/2);
    armlen=(4*bearthk);//was(radarm3-hubbore);
    hubhgt=12.0;// only big 12 used
    // below dflat needs motor shaft ground with cbn wheel for 
    // bigger flat=stronger torque, no alu hub needed
    dflat=(hubbore*0.64);// fudged for zero slip room
// need 24mm elipse + 3mm housing wall + 12mm shaft extension= 39mm    
    module disc(r) { cylinder(h=armthk*1.5,r=r);}
    $fn=180;
    rr=rd/2;// get radius
    // raise the .8 below if not enough to skip teeth
    rf1=(1.1/rr);// all this to make scale values, zero is none, was 1.07=too much
echo(149,armlen,rd,rr,rf1);// is .05 of 40=2mm so elipse is plus or minus 2.
    extoff=22;// hub extension offset upward
    hubextd=20;// hub extension OD
echo(152,rd,rr,rf1);
    difference()
    {
      difference()
      {// overall height, diameter of starter elipse, eccentricity=5mm
        scale([1+rf1,1-rf1,2]) disc(rr);// starter for diff, is only
       // elipse here
        difference()// everything below stays round until last 3 lines
        { // take off top to 24mm leaving shaft extension
          translate([0,0,24.6])scale([1,1,.7])disc(21); //take off the top
          translate([0,0,27])cylinder(h=hubhgt*1.8,d=hubextd,center=true,$fn=90);
          echo(163,hubhgt*1.8);
        }
        difference()
        { // hub bore
          translate([0,0,-.05])cylinder(h=hubhgt*3.75,d=hubbore,$fn=90);
          // the shaft hole is round here
          translate(v=[dflat+.5,0,-.2])// move square to side, makes dflat
          //above shifts next 2 lines into the bore to make it a D flat
          rotate(45)// rotate the square 45 degrees, puts broad face to bore
          cylinder(h=hubhgt*3.9,d=hubbore+1.9,$fn=4);//$fn=4 square from cyl.
        }
      }// below cutout for bearing will need supports, but minimal in cura
// put 10mm dia peg on bottom of output sprocket to guide this bearing!!!      
      translate([0,0,-.1])cylinder(h=10.5,d=30.64,true); // -.01, tighter on bearing
    }// added longer hub to reach more motor shaft thru 20.5mm hole in mount,
    // works well
};

module armbearing() // will need 4 now but make ball groove looser
{
// my feeble attempt at generating a ball bearing using bb's.
// NOW MODed for smaller drive, in ~/Dlds/3dp.stf/smaller-harmonic-drive
// armature is eccentric, 37.60mm min to 41.66mm max
// adjust dmtr till it fits the armature when distorted by it.
// was 40.3 but in PETG fit is tighter
    fg=.2; // fudge for over extrusion
    vg=.1;//half width of layer
    india=36.05; // in mm's of ID, inner should rotate with
    // armature w/o walking
    outdia=49.7; // outer diameter, same as loose belt inner
    height=6-vg; // in mm's, armature is 11.5 mm wide uses 2 of these
// everything below is generated center=true
// which means we're dealing in radius
    ctr_ht=(height*.50000); // 1/2 height,mults are faster
    inrad=india*.50000; // rad of inner diameter
    outrad=outdia*.50000;// rad of outer diameter
    bbtrkd=(outdia+india)*.5; // to center it
    bbtrkr=(outrad+inrad)*.495; // ditto the radius, shrink for thicker outer
    echo(201, inrad,outrad,bbtrkr,bbtrkd);
    //adjust bearing size till it fits
    bb=4.39+.45; // crosman bb so when inner is preloaded its about right. Was 4.45,
   // slightly tight. This is close, rolls easy once lumps are mashed down
    bbgap=.42; // wide enough to make inserting bb's easier
// how many bb's?
    racircum=(inrad+outrad)*PI;//length of bb track
    echo(208, PI, racircum);
    bbs=racircum/bb;
    echo(210,bb,bbs,outdia);
    $fn=180;
// draw it
    difference()
    {
        cylinder(h=height,d=outdia);// big outer for a base
        translate([0,0,-.05])cylinder(h=height+.15,d=india);// subtract inner
        for(fn=[0:1.25:359]) // now cut ball track and insertion slot
        {
            rotate(fn)
            {
                union()
                {   // subtract bb
                    translate([bbtrkr,0,2.9])rotate([90,0,0])cylinder(h=1,d=bb,true);
                    // subtract bb insertion slot
                    translate([bbtrkr,0,-.1])scale([bbgap*.35,.1,6.25])
                    rotate([0,0,45])cylinder(h=1,d=bbtrkr+.5,$fn=4);
                }
            }
        }
    }
};

module innerspline()
{   // PETG now on printer, 
// and nozzle troubles started, plugged up whole damned hotend.
// new example, low ratio 30/1 harmonic drive floating splined belt. use lots of infill, 55% gyroid
    teeth = 100; // number  of teeth or splines
    arcx = ( 360 / teeth ); // arc of circle per tooth, is 6 degrees if 60 teeth  
    $fr = 0.000000;// space holder
// adjust this to just barely get an overlap at inner corners of spline triangle, but must
// have enough overlap for continuous infill! Else retraction hell strikes.
    toothdia = arcx/1.1;// no bigger then needed to get infill connections,
//  larger divisor=smaller, is 1.40 now
// adjust this for outer teeth fit in internal spline
    toothrad=52.5 / 2.000;// make radius was 55.09, reduce backlash but don't compress it either
// adjust this to thin or thicken flex valleys
// when retraction hell strikes, render time jumps nearly a hour!!!!!
    linerdia=50.1; // thins web at bottom of spline, helps flex if larger,
//  rch too big at 53.38 try 53.36 later, its slipping on the bearing races,
//  after 10 days running, so is now 53.20 to tighten it 16 rch more. 
// and this time from PETG on the BIQU printer w/H2 head at 235 and 75.
// at same time, reduce toothrad until green starts to go away, then increase
// to get it all back.   
    height=24;
    tranz=height / 2.000;
    echo (256,teeth,arcx,toothdia,toothrad,linerdia) ;
    union()
    { // make splines first
        for($fr=[ 0: arcx : 359 ])
        {
            rotate([0, 0, $fr]) //make teeth
            translate([toothrad, 0, tranz])  // reposition at toothrad
            cylinder(d=toothdia, h=height, $fn=3, center=true); // make triangle
        // made triangles, now smooth inner wall by making 2 rings, inner rad same as base of teeth
        }
        difference() // construct smooth liner for base of tooth, 2nd arg for union
        { //outer liner, merges with base of tooth in union
            translate([0,0,tranz])cylinder(d=linerdia+.9, h=height+.01, $fn=60,center=true);
            // inner liner to make bottoms of teeth circulsr
            translate([0,0,tranz])cylinder(d=linerdia, h=height+.02, $fn=360,center=true);
        } // innards needs smooth finish
    }
};

module outcup() // has runaway, works, takes way too long to render,
{
// new output disk to contain a 102 tooth internal spline
// and incorporate for space savings the output shaft bearings
// and a timing belt pulley for output coupling.
// will superglue timing pulley in 40mm center hole, after verifying fit.
    splsocht=12.0;// height of cup, keys and spline
    ODofCup=82.15;// overall od incorporate bearing in space
    IDofCup=(ODofCup-12);
    bsplit= ((ODofCup-7.7)/2);
    CupBore=(IDofCup-5);
    PlyBore=40; // is diameter
    PlyKeyR=20; // is radius
    OkyRad=(PlyBore-7.5);
    echo(303,ODofCup,splsocht,IDofCup,bsplit);
    //printer is undersize, make bb's bigger, calcs at 4.43
    bb=4.44;// crosman bb dia plus clearance, broken inner on first stuff
    // some data for this module
    ctr_ht=(splsocht/2);// center bb groove vertically
    innrh=(ODofCup-splsocht/2);// get radius of bb groove
    echo(309,ctr_ht,innrh);
    $fn=360;

    difference()
    { // first build outer wall
       cylinder(h=splsocht+4,d=ODofCup); //full height
// first, build bearing, then cut or merge the rest
       translate([0,0,5.5])bearing(bsplit,bb);
       translate([0,0,4])cylinder(h=12.1,d=CupBore);
       translate([0,0,-.05])cylinder(h=4.1,d=PlyBore);
        // now install keys
       for(i=[0:30:359])
       {//for spline outer locking
           rotate([0,0,i])translate([OkyRad,0,4])cylinder(h=12.1,d=3);
       };
       for(i=[0:45:359])
       {// for output sprocket locking
           rotate([0,0,i])translate([PlyKeyR,0,-.05])cylinder(h=4.1,d=3);
       };
    };
};

module bearing(bsplit,bb)
{
    for(i=[0:1:359])
    {
        rotate([0,0,i])translate([bsplit,0,3])
        union()
        {
            rotate([0,90,90])cylinder(h=1.1,d=bb);//make groove slightly deeper
            translate([0,-.4,-5.5])cube([.5,6.4,6.6],true);
            translate([0,0, 4.7])cube([3,3.5,6.5],true);
        };
    };
};
// add keys to lock output sprocket from rotating in socket
//    translate([0,0,1.5])keys5(19.8,3.01,2.0);


module outspline100() // mode must be 7
{
    aa=13.0000; // size of starter triangle, line 392
    xx=11.9800;//thickness
    dd0=64.6; // to fit OD in spacer OR output cup
    dd1=59.4; // inter liner if needed
    outkyr=(dd0/2);
    outkyd=2.9;
    toothrad100=29.15; // getting close, but not global
    fw = ( 360 / 100 ); // arc of circle per tooth
    fd = 0.00000000; // establish its storage
    echo (373, aa, xx, dd0, dd1, fd, fw, toothrad100) ;  // echo? yes, once
    for(i=[0:30:359])
    {// for outer locking keys, draw before of difference directive
        // half of cylinder buried in body here 
        rotate([0,0,i-3])translate([outkyr,0,-.05])cylinder(h=12,d=outkyd);
    };
    difference()
    { // the outside smoother, 1 degree facets=smooth 
        cylinder(d=dd0, h=xx, $fn=360); //outer is fussy
        // line it so teeth are sitting in plastic
        translate([0,0,-.005]) cylinder(d=dd1, h=xx+.01, $fn=90);
        //but the liner isn't, $fn=90 is 4 degee facets, faster render
    }
    // add this for 100 teeth
    for(i=[0:fw:359 ])
    { 
        rotate([0,0,i]) // make 100 copies around circle
        translate([-toothrad100, 0.00, 0.00]) //move out to tooth radius
        scale([.2,.2,1])// scale it down to size
        intersection()
        {  
 
            cylinder(h=xx,d=aa,$fn=3); //thick triangle big enough to play with
            // when scaled -2 below is nozzle size, .4mm
            cylinder(h=xx,d=aa-2,$fn=12);// play, clip the points, splines fit better
        }
    }
};

module outspline102() // mode must be 8?
{
    aa=13.0000; // size of starter triangle, line 392
    xx=11.9800;//thickness
    dd0=64.6; // to fit OD in spacer OR output cup
    dd1=59.4; // inter liner if needed
    outkyr=(dd0/2);
    outkyd=2.9;
    // armature OD=57,20+armature at bottom of teeth=54.11=111.5/4=27.86
    toothrad102=29.15; // getting close, but not global
    fw = ( 360 / 102 ); // arc of circle per tooth
    fd = 0.00000000; // establish its storage
    echo (414, aa, xx, dd0, dd1, fd, fw, toothrad102) ;  // echo? yes, once
    for(i=[0:30:359])
    {// for outer locking keys, draw before of difference directive
        // half of cylinder buried in body here 
        rotate([0,0,i-3])translate([outkyr,0,-.05])cylinder(h=12,d=outkyd);
    };
    difference()
    { // the outside smoother, 1 degree facets=smooth 
        cylinder(d=dd0, h=xx, $fn=360); //outer is fussy
        // line it so teeth are sitting in plastic
        translate([0,0,-.005]) cylinder(d=dd1, h=xx+.01, $fn=90);
        //but the liner isn't, $fn=90 is 4 degee facets, faster render
    }
    // add this for 102 teeth
    for(i=[0:fw:359 ])
    { 
        rotate([0,0,i]) // make 102 copies around circle
        translate([-toothrad102, 0, 0]) //move out to tooth radius
        scale([.2,.2,1])// scale it down to size
        intersection()
        {  
 
            cylinder(h=xx,d=aa,$fn=3); //thick triangle big enough to play with
            // when scaled -2 below is nozzle size, .4mm
            cylinder(h=xx,d=aa-2,$fn=12);// play, clip the points, splines fit better
        }
    }
};

module outputpulley(shaft_clear)
{ // thank you Erik de Bruijn
// By Erik de Bruijn <[email protected]>
// License: GPLv2 or later
//
// Goal: the goal of this parametric model is to generate a high quality custom
// timing pulley that is printable without support material.
// NOTE: The diameter of the gear parts are determined by the belt's pitch and
// number of teeth on a pully.
// updates:
// numSetScrews allows you to specify multiple set screws, 1 or 3 are useful
// values. With 3 you will be able to center the axis.


// Unfortunately, this code is muddled, many variables have no apparent effect
// but cannot be commented away,
// //////////////////////////////
// USER PARAMETERS
// //////////////////////////////

// Pulley properties
    shaftDiameter = shaft_clear; // the shaft at the center, will be subtracted from the
// pulley. Better be too small than too wide.
    hubDiameter = 40.0; // if the hub or timing pulley is big enough to fit a nut,
// this will be embedded. expand for good fit
    hubHeight = 4; // the hub is the thick cylinder connected to the pulley to allow a set screw to go through or as a collar for a nut. has no effect
    flanges = 2; // the rims that keep the belt from going anywhere
    hubSetScewDiameter = 0; // use either a set screw or nut on a shaft. Set to 0 to not use a set screw.
    numSetScrews = 0;
    numTeeth = 49; // this value together with the pitch determines the pulley diameter
    toothType = 1; // 1 = slightly rounded, 2 = oval sharp, 3 = square. For square, set the toothWith a little low.

// Belt properties:
    pitch = 3.15; // 3.15 fits perfectly, put top flange back on it for final make
    beltWidth = 9; // the width/height of the belt. The (vertical) size of the pulley is adapted to this.
    beltThickness = 1.35; // thickness of the part excluding the notch depth!
// which does not clarify. If the belt is measured in a gully, at 1.3mm, its marginally
// too big a circle, and if overall, at 2.5mm, its obviously too small at tooth spacing.
// so trying 2 for belt tooth fit. And elephants foot is being a problem too.
// plus a huge flair UPWARDS for the top flange outer edge. BACK to 1.3 for thickness
    notchDepth = 1.2; // make it slightly bigger than actual, there's an outward
// curvature in the inner solid part of the pulley, smaller = deeper generally


// //////////////////////////////
// Includes
// //////////////////////////////
//<teardrop.scad>
// See the bottom of the script to comment it out if you don't want to use this include!
//

// //////////////////////////////
// OpenSCAD SCRIPT
// //////////////////////////////

    PI = 3.14159265;
    $fs=0.2; // def 1, 0.2 is high res
    $fa=3;//def 12, 3 is very nice
    pulleyDiameter = pitch*numTeeth/PI;
    if(hubSetScewDiameter >= 1) // set screw, no nut
    { // where is this???
        timingPulley( pitch,beltWidth,beltThickness,notchDepth,numTeeth,
        flanges,shaftDiameter,hubDiameter,hubHeight,hubSetScewDiameter);
    }

    if(hubSetScewDiameter == 0) // use a nut
    {
        if(pulleyDiameter >= hubDiameter) // no hub needed
        {
            difference()
            {
                timingPulley(
                pitch,beltWidth,beltThickness,notchDepth,numTeeth,flanges,
                shaftDiameter,hubDiameter,0,hubSetScewDiameter);
//                translate([0,0,-6]) nut(8,8);
            }
        }
        if(pulleyDiameter < hubDiameter) // switched off
        {
            difference()
            {
                timingPulley(
                pitch,beltWidth,beltThickness,notchDepth,numTeeth,flanges,
                shaftDiameter,hubDiameter,hubHeight,hubSetScewDiameter);
//		        translate([0,0,8]) nut(8,12);
            }
        }
    }
};

// also in ~/RepRap/Object Files/nuts.scad
module nut(nutSize,height)
{
    // Based on some random measurements:
    M3 = 5.36;
    M5 = 7.85;
    M8 = 12.87;
    hexSize = nutSize + 12.67 - 8; // only checked this for M8 hex nuts!!
    union()
	{
        for(i=[0:5])
		{
			intersection()
			{
				rotate([0,0,60*i])
                translate([0,-hexSize/2,0])
                cube([hexSize/2,hexSize,height]);
				rotate([0,0,60*(i+1)])
                translate([0,-hexSize/2,0])
                cube([hexSize/2,hexSize,height]);
            }
		}
	}
};

module timingPulley(
	pitch, beltWidth, beltThickness, notchDepth, numTeeth, flanges, shaftDiameter, hubDiameter, hubHeight, hubSetScewDiameter)
{
    totalHeight = beltWidth + flanges + hubHeight;
    difference()
    {
        union()
        {
            timingGear(pitch,beltWidth,beltThickness,numTeeth,notchDepth,flanges);
//			hub(hubDiameter,hubHeight,hubSetScewDiameter);
        }
        translate([0,0,5.5])shaft(20,shaftDiameter);
    }
    module shaft(shaftHeight, shaftDiameter)
    {
        cylinder(h = shaftHeight, r = shaftDiameter/2, center =true);//center 10mm hole
    }

    module timingGear(pitch,beltWidth,beltThickness,numTeeth,notchDepth,flanges)
    {
        flangeHeight = 0;
        if(flanges==1)
        {
            flangeHeight = 2;
        }
	    toothHeight = beltWidth+flangeHeight*2;
        circumference = numTeeth*pitch;
        outerRadius = circumference/PI/2-beltThickness;
        innerRadius = circumference/PI/2-notchDepth-beltThickness;
        union()
        {
            //solid part of gear above hub
            translate([0,0,toothHeight/2])
            cylinder(h = toothHeight, r = innerRadius, center=false);
            //teeth part of gear
            translate([0,0,5.45+toothHeight/2])
            teeth(pitch,numTeeth,toothWidth,notchDepth,toothHeight-1.5);
            // flanges:
            if(flanges>=1)
            {
                //top flange, might do away with to see how belt fits teeth
                translate([0,0,13])// top flange
                cylinder(h = 1.2,r1=outerRadius,r2=outerRadius+1,center=true);
                //bottom flange
                translate([0,0,4.4])// bottom flange
                cylinder(h = 1.2,r1=outerRadius+1,r2=outerRadius,center=true);
                translate([0,0,6.75])// hole thru center
                cylinder(h = 13.5, r=6, center=true);
                translate([0,0,2])// is the bottom HUB and finally 4mm tall!!!1
                cylinder(h=4, r=hubsizeR,center=true); //lower cylinder is HUB
                //translate([0,0,3.4]) cylinder(h = 1.1,r1=outerRadius+1,r2=outerRadius);
            }
        }
    }
    module teeth(pitch,numTeeth,toothWidth,notchDepth,toothHeight)
    {
        // teeth are apart by the 'pitch' distance
        // this determines the outer radius of the teeth
        circumference = numTeeth*pitch;
        outerRadius = circumference/PI/2-beltThickness;
        innerRadius = circumference/PI/2-notchDepth-beltThickness;
        echo("Teeth diameter is: ", outerRadius*2);
        echo("Pulley inside of teeth radius is: ", innerRadius*2);
		for(i = [0:numTeeth-1])
        { // outer teeth of sprocket
            rotate([0,0,i*360/numTeeth])// teeth
            translate([innerRadius,0,-.7]) 
            tooth(toothWidth,notchDepth, toothHeight,toothType);
        }
    }
    module tooth(toothWidth,notchDepth, toothHeight,toothType)
    {
        if(toothType == 1)
        {
            union()
            {
                translate([notchDepth*0.25,0,0]) 
                cube(size = [notchDepth,toothWidth,toothHeight+1],center = true);
                translate([notchDepth*0.75,0,0])
                scale([notchDepth/4, toothWidth/2, 1]) 
				cylinder(h = toothHeight+1, r = 1, center=true);
            }
        }
        if(toothType == 2)
            scale([notchDepth, toothWidth/2, 1]) cylinder(h = toothHeight, r = 1, center=true);

        if(toothType == 3)
        {
            union()
            {
                translate([notchDepth*0.5-1,0,0]) cube(size = [notchDepth+2,toothWidth,toothHeight],center = true);
                //scale([notchDepth/4, toothWidth/2, 1]) cylinder(h = toothHeight, r = 1, center=true);
            }
        }
    }
};

module guide_peg()// mode must be 10
{
    translate([0,0,.5])cylinder(h=1, d=16,center=true);
    translate([0,0,7.4])cylinder(h=12.9,d=11.8,center=true);
    translate([0,0,18])cylinder(h=8.5,d=10,center=true);
};

mode=10;//selects module to render, 1 to 9
key=1;//set to 0 to build without keys - sign WAS a size trigger, not any more

if(mode==1) // do base houseing
{
    t=t1;
    z=z2;
    echo(618,t,y,z);
    union()
    {
        disk();
        if(key!=0)translate([0,0,6]) keys4(t,y,z);//optional
        wrapper();
    }
};

if(mode==2) // do spacer with optional keys, holds 60 tooth outer ring in housing
{ // build it all in module
    spacer();
};


if(mode==3) armature();// do eliptical armature with extended hub
if(mode==4) armbearing();// make bearing between OD of armature and ID of innerspline
if(mode==5) innerspline();// make floating spline
if(mode==6) //make output cup, contains 102 tooth spline
{
    outcup();
//    if(key!=0)
//    {
//        translate([0,0,6])keys4(t2,y,z4);
//    }
};

if(mode==7)
{
//    spacer(); // temp for fit
    outspline100(); // make 100 tooth internal spline
};

if(mode==8)
{
//    spacer(); // temp for fit
    outspline102(); // make 102 tooth internal spline
};

if(mode==9)
{
    shaft_clear=12;// mm
    difference()
    {
        outputpulley(shaft_clear);
    }
    translate([0,0,-1])keys8(hubsizeR*2,4.01,2.3);
};
if(mode==10)
{
    guide_peg();
};
// It is not really intended to be repairable if its broken,
// just print and assemble another.
_______________________________________________
Emc-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/emc-users

Reply via email to