File:Pseudogear-differential-workinprogress.gif: Difference between revisions
Jump to navigation
Jump to search
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> |
codeblock |
||
| (2 intermediate revisions by the same user not shown) | |||
| Line 4: | Line 4: | ||
Date: 2023-09-21 <br> | Date: 2023-09-21 <br> | ||
License: CC-BY-SA-4.0 <br> | License: CC-BY-SA-4.0 <br> | ||
OpenSCAD code: | |||
<pre> | |||
/* | |||
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); | |||
} | |||
} | |||
</pre> | |||
== Licensing == | == Licensing == | ||
{{self|cc-by-sa-4.0}} | {{self|cc-by-sa-4.0}} | ||
Latest revision as of 05:15, 20 April 2025
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
File history
Click on a date/time to view the file as it appeared at that time.
| Date/Time | Thumbnail | Dimensions | User | Comment | |
|---|---|---|---|---|---|
| current | 04:21, 20 April 2025 | 480 × 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> |
You cannot overwrite this file.
File usage
The following page uses this file: