File:Pseudogear-differential-workinprogress.gif

From apm
Revision as of 05:12, 20 April 2025 by Apm (talk | contribs) (Summary: added openscad code)
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: