mcopy/scad/rack_and_pinion.scad

287 lines
14 KiB
OpenSCAD

// Kopfspiel
spiel = 0.05;
// Hoehe des Zahnkopfes ueber dem Teilkreis
modul=1;
// Laenge der Zahnstange
laenge_stange=50;
// Anzahl der Radzaehne
zahnzahl_ritzel=32;
// Hoehe der Zahnstange bis zur Waelzgeraden
hoehe_stange=4;
// Durchmesser der Mittelbohrung des Stirnrads
bohrung_ritzel=4;
// Breite der Zaehne
breite=8.8;
// Eingriffswinkel, Standardwert = 20 grad gemaess DIN 867. Sollte nicht groesser als 45 grad sein.
eingriffswinkel=20;
// Schraegungswinkel zur Rotationsachse, Standardwert = 0 grad (Geradverzahnung)
schraegungswinkel=20;
// Komponenten zusammengebaut fuer Konstruktion oder auseinander zum 3D-Druck
zusammen_gebaut=0;
// Loecher zur Material-/Gewichtsersparnis bzw. Oberflaechenvergoesserung erzeugen, wenn Geometrie erlaubt
optimiert = 1;
/* Bibliothek fuer ein Zahstangen-Radpaar fuer Thingiverse Customizer
Enthaelt die Module
zahnstange(modul, laenge, hoehe, breite, eingriffswinkel = 20, schraegungswinkel = 0)
stirnrad(modul, zahnzahl, breite, bohrung, eingriffswinkel = 20, schraegungswinkel = 0, optimiert = true)
zahnstange_und_ritzel (modul, laenge_stange, zahnzahl_ritzel, hoehe_stange, bohrung_ritzel, breite, eingriffswinkel=20, schraegungswinkel=0, zusammen_gebaut=true, optimiert=true)
Autor: Dr Joerg Janssen
Stand: 6. Januar 2017
Version: 2.0
Lizenz: Creative Commons - Attribution, Non Commercial, Share Alike
Erlaubte Module nach DIN 780:
0.05 0.06 0.08 0.10 0.12 0.16
0.20 0.25 0.3 0.4 0.5 0.6
0.7 0.8 0.9 1 1.25 1.5
2 2.5 3 4 5 6
8 10 12 16 20 25
32 40 50 60
*/
/* [Hidden] */
pi = 3.14159;
rad = 57.29578;
$fn = 96;
/* Wandelt Radian in Grad um */
function grad(eingriffswinkel) = eingriffswinkel*rad;
/* Wandelt Grad in Radian um */
function radian(eingriffswinkel) = eingriffswinkel/rad;
/* Wandelt 2D-Polarkoordinaten in kartesische um
Format: radius, phi; phi = Winkel zur x-Achse auf xy-Ebene */
function pol_zu_kart(polvect) = [
polvect[0]*cos(polvect[1]),
polvect[0]*sin(polvect[1])
];
/* Kreisevolventen-Funktion:
Gibt die Polarkoordinaten einer Kreisevolvente aus
r = Radius des Grundkreises
rho = Abrollwinkel in Grad */
function ev(r,rho) = [
r/cos(rho),
grad(tan(rho)-radian(rho))
];
/* Wandelt Kugelkoordinaten in kartesische um
Format: radius, theta, phi; theta = Winkel zu z-Achse, phi = Winkel zur x-Achse auf xy-Ebene */
function kugel_zu_kart(vect) = [
vect[0]*sin(vect[1])*cos(vect[2]),
vect[0]*sin(vect[1])*sin(vect[2]),
vect[0]*cos(vect[1])
];
/* prueft, ob eine Zahl gerade ist
= 1, wenn ja
= 0, wenn die Zahl nicht gerade ist */
function istgerade(zahl) =
(zahl == floor(zahl/2)*2) ? 1 : 0;
/* Kopiert und dreht einen Koerper */
module kopiere(vect, zahl, abstand, winkel){
for(i = [0:zahl-1]){
translate(v=vect*abstand*i)
rotate(a=i*winkel, v = [0,0,1])
children(0);
}
}
/* Zahnstange
modul = Hoehe des Zahnkopfes ueber der Waelzgeraden
laenge = Laenge der Zahnstange
hoehe = Hoehe der Zahnstange bis zur Waelzgeraden
breite = Breite der Zaehne
eingriffswinkel = Eingriffswinkel, Standardwert = 20 grad gemaess DIN 867. Sollte nicht groesser als 45 grad sein.
schraegungswinkel = Schraegungswinkel zur Zahnstangen-Querachse; 0 grad = Geradverzahnung */
module zahnstange(modul, laenge, hoehe, breite, eingriffswinkel = 20, schraegungswinkel = 0) {
// Dimensions-Berechnungen
//modul=0.99;// modul*(1-spiel);
c = modul / 6; // Kopfspiel
mx = modul/cos(schraegungswinkel); // Durch Schraegungswinkel verzerrtes modul in x-Richtung
a = 2*mx*tan(eingriffswinkel)+c*tan(eingriffswinkel); // Flankenbreite
b = pi*mx/2-2*mx*tan(eingriffswinkel); // Kopfbreite
x = breite*tan(schraegungswinkel); // Verschiebung der Oberseite in x-Richtung durch Schraegungswinkel
nz = ceil((laenge+abs(2*x))/(pi*mx)); // Anzahl der Zaehne
translate([-pi*mx*(floor(nz/2)-1)-a-b/2,-modul,0]){
intersection(){
kopiere([1,0,0], nz, pi*mx, 0){
polyhedron(
points=[[0,-c,0], [a,2*modul,0], [a+b,2*modul,0], [2*a+b,-c,0], [pi*mx,-c,0], [pi*mx,modul-hoehe,0], [0,modul-hoehe,0], // Unterseite
[0+x,-c,breite], [a+x,2*modul,breite], [a+b+x,2*modul,breite], [2*a+b+x,-c,breite], [pi*mx+x,-c,breite], [pi*mx+x,modul-hoehe,breite], [0+x,modul-hoehe,breite]], // Oberseite
faces=[[6,5,4,3,2,1,0], // Unterseite
[1,8,7,0],
[9,8,1,2],
[10,9,2,3],
[11,10,3,4],
[12,11,4,5],
[13,12,5,6],
[7,13,6,0],
[7,8,9,10,11,12,13], // Oberseite
]
);
};
translate([abs(x),-hoehe+modul-0.5,-0.5]){
cube([laenge,hoehe+modul+1,breite+1]);
}
};
};
}
/* Stirnrad
modul = Hoehe des Zahnkopfes ueber dem Teilkreis
zahnzahl = Anzahl der Radzaehne
breite = Zahnbreite
bohrung = Durchmesser der Mittelbohrung
eingriffswinkel = Eingriffswinkel, Standardwert = 20 grad gemaess DIN 867. Sollte nicht groesser als 45 grad sein.
schraegungswinkel = Schraegungswinkel zur Rotationsachse; 0 grad = Geradverzahnung
optimiert = Loecher zur Material-/Gewichtsersparnis bzw. Oberflaechenvergoesserung erzeugen, wenn Geometrie erlaubt (= 1, wenn wahr) */
module stirnrad(modul, zahnzahl, breite, bohrung, eingriffswinkel = 20, schraegungswinkel = 0, optimiert = true) {
// Dimensions-Berechnungen
d = modul * zahnzahl; // Teilkreisdurchmesser
r = d / 2; // Teilkreisradius
alpha_stirn = atan(tan(eingriffswinkel)/cos(schraegungswinkel));// Schraegungswinkel im Stirnschnitt
db = d * cos(alpha_stirn); // Grundkreisdurchmesser
rb = db / 2; // Grundkreisradius
da = (modul <1)? d + modul * 2.2 : d + modul * 2; // Kopfkreisdurchmesser nach DIN 58400 bzw. DIN 867
ra = da / 2; // Kopfkreisradius
c = (zahnzahl <3)? 0 : modul/6; // Kopfspiel
df = d - 2 * (modul + c); // Fusskreisdurchmesser
rf = df / 2; // Fusskreisradius
rho_ra = acos(rb/ra); // maximaler Abrollwinkel;
// Evolvente beginnt auf Grundkreis und endet an Kopfkreis
rho_r = acos(rb/r); // Abrollwinkel am Teilkreis;
// Evolvente beginnt auf Grundkreis und endet an Kopfkreis
phi_r = grad(tan(rho_r)-radian(rho_r)); // Winkel zum Punkt der Evolvente auf Teilkreis
gamma = rad*breite/(r*tan(90-schraegungswinkel)); // Torsionswinkel fuer Extrusion
schritt = rho_ra/16; // Evolvente wird in 16 Stuecke geteilt
tau = 360/zahnzahl; // Teilungswinkel
r_loch = (2*rf - bohrung)/8; // Radius der Loecher fuer Material-/Gewichtsersparnis
rm = bohrung/2+2*r_loch; // Abstand der Achsen der Loecher von der Hauptachse
z_loch = floor(2*pi*rm/(3*r_loch)); // Anzahl der Loecher fuer Material-/Gewichtsersparnis
optimiert = (optimiert && r >= breite*1.5 && d > 2*bohrung); // ist Optimierung sinnvoll?
// Zeichnung
union(){
rotate([0,0,-phi_r-90*(1-spiel)/zahnzahl]){ // Zahn auf x-Achse zentrieren;
// macht Ausrichtung mit anderen Raedern einfacher
linear_extrude(height = breite, twist = gamma){
difference(){
union(){
zahnbreite = (180*(1-spiel))/zahnzahl+2*phi_r;
circle(rf); // Fusskreis
for (rot = [0:tau:360]){
rotate (rot){ // "Zahnzahl-mal" kopieren und drehen
polygon(concat( // Zahn
[[0,0]], // Zahnsegment beginnt und endet im Ursprung
[for (rho = [0:schritt:rho_ra]) // von null Grad (Grundkreis)
// bis maximalen Evolventenwinkel (Kopfkreis)
pol_zu_kart(ev(rb,rho))], // Erste Evolventen-Flanke
[pol_zu_kart(ev(rb,rho_ra))], // Punkt der Evolvente auf Kopfkreis
[for (rho = [rho_ra:-schritt:0]) // von maximalen Evolventenwinkel (Kopfkreis)
// bis null Grad (Grundkreis)
pol_zu_kart([ev(rb,rho)[0], zahnbreite-ev(rb,rho)[1]])]
// Zweite Evolventen-Flanke
// (180*(1-spiel)) statt 180 Grad,
// um Spiel an den Flanken zu erlauben
)
);
}
}
}
circle(r = rm+r_loch*1.49); // "Bohrung"
}
}
}
// mit Materialersparnis
if (optimiert) {
linear_extrude(height = breite){
difference(){
circle(r = (bohrung+r_loch)/2);
circle(r = bohrung/2); // Bohrung
}
}
linear_extrude(height = (breite-r_loch/2 < breite*2/3) ? breite*2/3 : breite-r_loch/2){
difference(){
circle(r=rm+r_loch*1.51);
union(){
circle(r=(bohrung+r_loch)/2);
for (i = [0:1:z_loch]){
translate(kugel_zu_kart([rm,90,i*360/z_loch]))
circle(r = r_loch);
}
}
}
}
}
// ohne Materialersparnis
else {
linear_extrude(height = breite){
difference(){
circle(r = rm+r_loch*1.51);
circle(r = bohrung/2);
}
}
}
}
}
/* Zahnstange und Ritzel
modul = Hoehe des Zahnkopfes ueber dem Teilkreis
laenge_stange = Laenge der Zahnstange
zahnzahl_ritzel = Anzahl der Radzaehne am Ritzel
hoehe_stange = Hoehe der Zahnstange bis zur Waelzgeraden
bohrung_ritzel = Durchmesser der Mittelbohrung des Ritzels
breite = Breite der Zaehne
eingriffswinkel = Eingriffswinkel, Standardwert = 20 grad gemaess DIN 867. Sollte nicht groesser als 45 grad sein.
schraegungswinkel = Schraegungswinkel, Standardwert = 0 grad (Geradverzahnung)
optimiert = Loecher zur Material-/Gewichtsersparnis bzw. Oberflaechenvergoesserung erzeugen, wenn Geometrie erlaubt (= 1, wenn wahr)
Rack and Pinion
module = Height of the tooth head above the pitch circle
rack_length = Length of the rack
pinion_tooth_count = Number of teeth on the pinion
rack_height = Height of the rack up to the pitch line
pinion_bore = Diameter of the central bore of the pinion
width = Width of the teeth
contact_angle = Contact angle, default value = 20 degrees according to DIN 867. Should not exceed 45 degrees.
helix_angle = Helix angle, default value = 0 degrees (straight tooth)
optimized = Generate holes for material/weight saving or surface enhancement if geometry allows (= 1 if true)
*/
module zahnstange_und_rad (modul, laenge_stange, zahnzahl_ritzel, hoehe_stange, bohrung_ritzel, breite, eingriffswinkel=20, schraegungswinkel=0, zusammen_gebaut=true, optimiert=true) {
abstand = zusammen_gebaut? modul*zahnzahl_ritzel/2 : modul*zahnzahl_ritzel;
zahnstange(modul, laenge_stange, hoehe_stange, breite, eingriffswinkel, -schraegungswinkel);
}
module rad_und_zahnstange (modul, laenge_stange, zahnzahl_ritzel, hoehe_stange, bohrung_ritzel, breite, eingriffswinkel=20, schraegungswinkel=0, zusammen_gebaut=true, optimiert=true) {
abstand = zusammen_gebaut? modul*zahnzahl_ritzel/2 : modul*zahnzahl_ritzel;
translate([0, abstand, 0]) {
if (istgerade(zahnzahl_ritzel)) {
rotate(90 + 180/zahnzahl_ritzel) {
stirnrad (modul, zahnzahl_ritzel, breite, bohrung_ritzel, eingriffswinkel, schraegungswinkel, optimiert);
}
} else {
rotate(a=90) {
stirnrad (modul, zahnzahl_ritzel, breite, bohrung_ritzel, eingriffswinkel, schraegungswinkel, optimiert);
}
}
}
}
//zahnstange_und_rad (modul, laenge_stange, zahnzahl_ritzel, hoehe_stange, bohrung_ritzel, breite, eingriffswinkel, schraegungswinkel, zusammen_gebaut, optimiert);