File:Pseudogear-differential-workinprogress.gif

From apm
Revision as of 05:15, 20 April 2025 by Apm (talk | contribs) (codeblock)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

Pseudogear-differential-workinprogress.gif (480 × 270 pixels, file size: 1.81 MB, MIME type: image/gif, looped, 129 frames, 13 s)

Note: Due to technical limitations, thumbnails of high resolution GIF images such as this one will not be animated.

Summary

Author: Lukas M. Süss aka mechadense
Title: Pseudogear differential (WIP)
Date: 2023-09-21
License: CC-BY-SA-4.0


OpenSCAD code:

/*
Title: Three-Way Pseudogear Differential
Author: Lukas M. Süss aka mechadense
Date: 2023-09-16

#######
someting is off here 
there's no adding going on
was this all completely bogus ??
check later again ...

seems I have to couple out using 
a astraight grooved red-rod
#######

This is not a good mechanism for 
macroscale mechanics. It is specifically 
meant for atomically precise crystolecules.

This is meant to be a proof of principle
The design should be improvable e.g. by
duplicating inputs to avert torsion loads 

Note that this is just a three way differential.
The fourth output is just redundant and preesent for symmetry.

These can easily be put in series 
for a multi way differential 
(electrical analogy multy way junction)


TODO 
- improve colors again (the yellow is ugly)
- fix the mismatch of the teeth
- what to do about the box now??
I guess I need a 90 turn after all??

teeth asymmetry ??
add in out asyymetry for intuition??
straight cutoff ugly ... 

- >> add triangular side protrusions
at the end of the rods for grippability/connectibility
- make a printplate


-- make it 3d printable
- maybe improve cutouts
- break some edges a bit eventually maybe
- check existing clearings (needed only for box I guess)


*/

eps = 0.05;

// be careful 
//the toothnumber and the rod lengths
// do not yet auto-adjust (prolong
maxtravel = 6; // 5

t0 = 2;
ttooth = 2;

t0floatplate = t0;
tfloatplate = ttooth + t0floatplate + ttooth;

// rack rod ??
t0rod = t0;
wrod = 10;
lrod = 100;

pitch0 = 4;
w0 = (maxtravel+wrod+maxtravel);
wfloatplate = 2*w0;
xfloatplate = wfloatplate;
yfloatplate = wfloatplate;
platebasecolor = "cyan";
plateteethcolor = "blue";

xboxin = xfloatplate +2*maxtravel;
yboxin = yfloatplate +2*maxtravel;
tboxwallz = 2;
tboxwallxy = 4;

clr = 0.1; // clearing to tune
zboxin = t0floatplate + 2*(ttooth+t0rod+clr);


// I'll leave implementations for
// rack angles different than 45° for later
// wild guesses for now
x1 = 0+sin($t*360*8)*maxtravel;
x2 = 0-sin($t*360*1)*maxtravel;
xplate = (x1+x2)/2; // = (y1-y2)/2
yplate = (x1-x2)/2; // = (y1+y2)/2
// y-position of y-rods
y1 = x1; // ??
y2 = -x2; // ??


/*
difference()
{
  box();
  translate([0,0,200/2])
  color("black")
  cube([200,200,200],center=true);
}*/

module box()
{
  difference()
  {
    // basebody
    color("grey")
    cube([xboxin+tboxwallxy*2,
          yboxin+tboxwallxy*2,
          zboxin+tboxwallz*2],center=true);
    color("pink")
    cube([xboxin,yboxin,zboxin+clr*2],center=true);

    // t0rod+ttooth
    // y1 rod slotcut    
    translate([-xfloatplate/4,0,0])
    cube([wrod+2*clr,yboxin*2,zboxin+clr*2-2*eps],center=true);
    // y2 rod slotcut    
    translate([+xfloatplate/4,0,0])
    cube([wrod+2*clr,yboxin*2,zboxin+clr*2-2*eps],center=true);

    // cuts for the x-rods the lazy way
    rotate(90,[0,0,1])
    {
      translate([-xfloatplate/4,0,0])
      cube([wrod+2*clr,yboxin*2,zboxin+clr*2-2*eps],center=true);
      translate([+xfloatplate/4,0,0])
      cube([wrod+2*clr,yboxin*2,zboxin+clr*2-2*eps],center=true);
    }
    
  }
}


translate([xplate,yplate,0])
floatplate();

/*
// y rod - neg x - neg z
translate([0,+y1,0])
translate([-xfloatplate/4,0,0])
rotate(90,[0,0,1])
translate([0,0,-t0floatplate/2])
  pseudogearrack("red");

// y rod - pos x - neg z
translate([0,+y2,0])
scale([-1,1,1])
translate([-xfloatplate/4,0,0])
rotate(90,[0,0,1])
translate([0,0,-t0floatplate/2])
  pseudogearrack("red");
*/

// x rod - pos y - pos z
translate([+x2,0,0])
translate([0,+yfloatplate/4*2,0])
translate([0,0,+t0floatplate/2])
scale([1,1,-1])
  pseudogearrack("black",text="in: x1");



// x rod - pos y - pos z
translate([+x1,0,0])
translate([0,-yfloatplate/4*2,0])
translate([0,0,+t0floatplate/2])
scale([1,1,-1])
  pseudogearrack("black",text="in: x2",a=-45);

// TEETH WRONG DIRECTION ATM 
// x rod output
translate([xplate,0,0])
//translate([-xfloatplate/4,0,0])
translate([0,0,+t0floatplate/2])
scale([1,1,-1])
  pseudogearrack("grey",text="out: (x1+x2)/2",a=0);

//  pseudogearrack();



module pseudogearrack(col,col2="white",text="",a=45)
{

  //translate([0,0,-(t0rod+ttooth)/2-t0floatplate/2-0])
  difference()
  {
    color(col)
    translate([0,0,-t0rod])
      cube([lrod,wrod,t0rod+ttooth],center=true);

    // we'll do that on the plate instead

    pitchshift = pitch0*0;
    m=4;
    color(col2)
    translate([pitchshift,0,-ttooth/2])
    for(i=[-m:m])
    {
      translate([i*pitch0*2,0,0])
      pseudogeartoothcutter
        (pitch0, angle=a, w=wrod);
    }
    // as an indent cut for printability
    if(text != "")
    {  
      color("white")
      translate([0,0,-(ttooth + t0rod)])
        text(text,size=5,halign="center",valign="center");    // ,align = "center"
    }
  }
}


// ############################


module floatplate()
{
  intersection()
  {
   union()
   {
     color(platebasecolor)
     //color([1,0,1]*0.85)
       cube([xfloatplate,w0*3,t0floatplate],
         center=true);
     
     color(plateteethcolor)
       floatplateteeth();

     color(plateteethcolor)     
     // we want straigth teeth instead
     rotate(0,[0,0,1]) scale([1,1,1])
       floatplateteethstraight();
   }
   //b2cube(); // TODO
  }
}

module floatplateteethstraight()
{
  translate([0,0,ttooth/2+t0floatplate/2-eps])
    pseudogearrackteeth
      (5,0,pitch=pitch0,l=xfloatplate,w=w0);  
}


module floatplateteeth()
{
  translate([0,w0,ttooth/2+t0floatplate/2-eps])
    pseudogearrackteeth(5,+45);
  translate([0,-w0,ttooth/2+t0floatplate/2-eps])
    pseudogearrackteeth(5,-45);
}

// ############################


module pseudogearrackteeth
  (n,angle, pitch=pitch0, l=xfloatplate, w=yfloatplate/2)
{
  difference()
  {
    pitchshift = pitch0*(1);
    
    cube([l,w,ttooth],
      center=true);
    translate([pitchshift*1,0,0])
    for(i=[-n:n])
    {
      translate([pitch*i*2,0,0])
        pseudogeartoothcutter(pitch,angle); // angle has no effect here
    }
  }
}




module pseudogeartoothcutter
  (pitch, angle=45, w=wfloatplate/2)
{ //angle == 0 ... straight-tooth-rack
  shift = w * sin(angle);
  
  translate([0,0,0])
  hull()
  {
    translate([-shift,-w/2,0])
      trapezohullcutter(pitch,ttooth/2);
    translate([+shift,+w/2,0])
      trapezohullcutter(pitch,ttooth/2);
  }
}

// note higher angles
module trapezohullcutter
  (pitch=10, amplitude=2, angle=30)
{ //angle == 0 ... vertical flanks square wave
  shift = amplitude * sin(angle)*2;  //*2??
  
  eps = 0.05;
  hull()
  {
    translate([+(pitch+shift)/2, 0, +amplitude]) 
      cube([1,1,1]*eps,center=true);
    translate([-(pitch+shift)/2, 0, +amplitude]) 
      cube([1,1,1]*eps,center=true);
    translate([+(pitch-shift)/2,0,-amplitude]) 
      cube([1,1,1]*eps,center=true);
    translate([-(pitch-shift)/2,0,-amplitude]) 
      cube([1,1,1]*eps,center=true);
  }
}


module b2cube(x,y,z,b1,b2)
{ 
  hull()
  {
    cube([x-b1,y-b1,z-0 ],center=true);
    cube([x-b1,y-0 ,z-b2],center=true);
    cube([x-0 ,y-b1,z-b2],center=true);
  }
}


Licensing

Template:Self

File history

Click on a date/time to view the file as it appeared at that time.

Date/TimeThumbnailDimensionsUserComment
current04:21, 20 April 2025Thumbnail for version as of 04:21, 20 April 2025480 × 270 (1.81 MB)Apm (talk | contribs)Author: Lukas M. Süss aka mechadense <br> Title: Pseudogear differential (WIP) <br> Date: 2023-09-21 <br> License: CC-BY-SA-4.0 <br>

The following page uses this file: