getriebe.scad 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671
  1. $fn = 96;
  2. /* Bibliothek für Evolventen-Zahnräder
  3. Enthält die Module
  4. 1. stirnrad(modul, zahnzahl, hoehe, bohrung, eingriffswinkel = 20, schraegungswinkel = 0)
  5. 1. pfeilrad(modul, zahnzahl, hoehe, bohrung, eingriffswinkel = 20, schraegungswinkel = 0)
  6. 3. hohlrad(modul, zahnzahl, hoehe, randbreite, eingriffswinkel = 20, schraegungswinkel = 0
  7. 4. pfeilhohlrad(modul, zahnzahl, hoehe, randbreite, eingriffswinkel = 20, schraegungswinkel = 0)
  8. 5. planetengetriebe(modul, zahnzahl_sonne, zahnzahl_planet, hoehe, randbreite, bohrung, eingriffswinkel=20, schraegungswinkel=0)
  9. 6. kegelrad(modul, zahnzahl, teilkegelwinkel, zahnbreite, bohrung, eingriffswinkel = 20)
  10. 7. pfeilkegelrad(modul, zahnzahl, teilkegelwinkel, zahnbreite, bohrung, eingriffswinkel = 20, schraegungswinkel=10)
  11. 8. kegelradpaar(modul, zahnzahl_rad, zahnzahl_ritzel, zahnbreite, bohrung, eingriffswinkel = 20, schraegungswinkel=0)
  12. Beispiele für jedes Modul befinden sich auskommentiert am Ende dieser Datei
  13. Autor: Dr Jörg Janssen
  14. Stand: 20. Juni 2016
  15. Version: 1.3
  16. Lizenz: Creative Commons - Attribution, Non Commercial, Share Alike
  17. Erlaubte Module nach DIN 780:
  18. 0.05 0.06 0.08 0.10 0.12 0.16
  19. 0.20 0.25 0.3 0.4 0.5 0.6
  20. 0.7 0.8 0.9 1 1.25 1.5
  21. 2 2.5 3 4 5 6
  22. 8 10 12 16 20 25
  23. 32 40 50 60
  24. */
  25. // Allgemeine Variablen
  26. pi = 3.14159;
  27. rad = 57.29578;
  28. spiel = 0.05; // Spiel zwischen Zähnen
  29. /* Wandelt Radian in Grad um */
  30. function grad(eingriffswinkel) = eingriffswinkel*rad;
  31. /* Wandelt Grad in Radian um */
  32. function radian(eingriffswinkel) = eingriffswinkel/rad;
  33. /* Wandelt 2D-Polarkoordinaten in kartesische um
  34. Format: radius, phi; phi = Winkel zur x-Achse auf xy-Ebene */
  35. function pol_zu_kart(polvect) = [
  36. polvect[0]*cos(polvect[1]),
  37. polvect[0]*sin(polvect[1])
  38. ];
  39. /* Kreisevolventen-Funktion:
  40. Gibt die Polarkoordinaten einer Kreisevolvente aus
  41. r = Radius des Grundkreises
  42. rho = Abrollwinkel in Grad */
  43. function ev(r,rho) = [
  44. r/cos(rho),
  45. grad(tan(rho)-radian(rho))
  46. ];
  47. /* Kugelevolventen-Funktion
  48. Gibt den Azimutwinkel einer Kugelevolvente aus
  49. theta0 = Polarwinkel des Kegels, an dessen Schnittkante zum Großkugel die Evolvente abrollt
  50. theta = Polarwinkel, für den der Azimutwinkel der Evolvente berechnet werden soll */
  51. function kugelev(theta0,theta) = 1/sin(theta0)*acos(cos(theta)/cos(theta0))-acos(tan(theta0)/tan(theta));
  52. /* Wandelt Kugelkoordinaten in kartesische um
  53. Format: radius, theta, phi; theta = Winkel zu z-Achse, phi = Winkel zur x-Achse auf xy-Ebene */
  54. function kugel_zu_kart(vect) = [
  55. vect[0]*sin(vect[1])*cos(vect[2]),
  56. vect[0]*sin(vect[1])*sin(vect[2]),
  57. vect[0]*cos(vect[1])
  58. ];
  59. /* prüft, ob eine Zahl gerade ist
  60. = 1, wenn ja
  61. = 0, wenn die Zahl nicht gerade ist */
  62. function istgerade(zahl) =
  63. (zahl == floor(zahl/2)*2) ? 1 : 0;
  64. /* größter gemeinsamer Teiler
  65. nach Euklidischem Algorithmus.
  66. Sortierung: a muss größer als b sein */
  67. function ggt(a,b) =
  68. a%b == 0 ? b : ggt(b,a%b);
  69. /* Stirnrad
  70. modul = Höhe des Zahnkopfes über dem Teilkreis
  71. zahnzahl = Anzahl der Radzähne
  72. hoehe = Höhe des Zahnrads
  73. bohrung = Durchmesser der Mittelbohrung
  74. eingriffswinkel = Eingriffswinkel, Standardwert = 20° gemäß DIN 867
  75. schraegungswinkel = Schrägungswinkel zur Rotationsachse; 0° = Geradverzahnung */
  76. module stirnrad(modul, zahnzahl, hoehe, bohrung, eingriffswinkel = 20, schraegungswinkel = 0) {
  77. // Dimensions-Berechnungen
  78. d = modul * zahnzahl; // Teilkreisdurchmesser
  79. r = d / 2; // Teilkreisradius
  80. alpha_stirn = atan(tan(eingriffswinkel)/cos(schraegungswinkel)); // Schrägungswinkel im Stirnschnitt
  81. db = d * cos(alpha_stirn); // Grundkreisdurchmesser
  82. rb = db / 2; // Grundkreisradius
  83. da = (modul <1)? d + modul * 2.2 : d + modul * 2; // Kopfkreisdurchmesser nach DIN 58400 bzw. DIN 867
  84. ra = da / 2; // Kopfkreisradius
  85. c = modul / 6; // Kopfspiel
  86. df = d - 2 * (modul + c); // Fußkreisdurchmesser
  87. rf = df / 2; // Fußkreisradius
  88. rho_ra = acos(rb/ra); // maximaler Abrollwinkel;
  89. // Evolvente beginnt auf Grundkreis und endet an Kopfkreis
  90. rho_r = acos(rb/r); // Abrollwinkel am Teilkreis;
  91. // Evolvente beginnt auf Grundkreis und endet an Kopfkreis
  92. phi_r = grad(tan(rho_r)-radian(rho_r)); // Winkel zum Punkt der Evolvente auf Teilkreis
  93. gamma = rad*hoehe/(r*tan(90-schraegungswinkel)); // Torsionswinkel für Extrusion
  94. schritt = rho_ra/16; // Evolvente wird in 16 Stücke geteilt
  95. tau = 360/zahnzahl; // Teilungswinkel
  96. // Zeichnung
  97. rotate([0,0,-phi_r-90*(1-spiel)/zahnzahl]){ // Zahn auf x-Achse zentrieren;
  98. // macht Ausrichtung mit anderen Rädern einfacher
  99. linear_extrude(height = hoehe, twist = gamma){
  100. difference(){
  101. union(){
  102. zahnbreite = (180*(1-spiel))/zahnzahl+2*phi_r;
  103. circle(rf); // Fußkreis
  104. for (rot = [0:tau:360]){
  105. rotate (rot){ // "Zahnzahl-mal" kopieren und drehen
  106. polygon(concat( // Zahn
  107. [[0,0]], // Zahnsegment beginnt und endet im Ursprung
  108. [for (rho = [0:schritt:rho_ra]) // von null Grad (Grundkreis)
  109. // bis maximalen Evolventenwinkel (Kopfkreis)
  110. pol_zu_kart(ev(rb,rho))], // Erste Evolventen-Flanke
  111. [pol_zu_kart(ev(rb,rho_ra))], // Punkt der Evolvente auf Kopfkreis
  112. [for (rho = [rho_ra:-schritt:0]) // von maximalen Evolventenwinkel (Kopfkreis)
  113. // bis null Grad (Grundkreis)
  114. pol_zu_kart([ev(rb,rho)[0], zahnbreite-ev(rb,rho)[1]])]
  115. // Zweite Evolventen-Flanke
  116. // (180*(1-spiel)) statt 180 Grad,
  117. // um Spiel an den Flanken zu erlauben
  118. )
  119. );
  120. }
  121. }
  122. }
  123. circle(r = bohrung/2); // Bohrung
  124. }
  125. }
  126. }
  127. }
  128. /* Pfeilrad; verwendet das Modul "stirnrad"
  129. modul = Höhe des Zahnkopfes über dem Teilkreis
  130. zahnzahl = Anzahl der Radzähne
  131. hoehe = Höhe des Zahnrads
  132. bohrung = Durchmesser der Mittelbohrung
  133. eingriffswinkel = Eingriffswinkel, Standardwert = 20° gemäß DIN 867
  134. schraegungswinkel = Schrägungswinkel zur Rotationsachse, Standardwert = 0° (Geradverzahnung) */
  135. module pfeilrad(modul, zahnzahl, hoehe, bohrung, eingriffswinkel = 20, schraegungswinkel = 0){
  136. hoehe = hoehe/2;
  137. translate([0,0,hoehe]){
  138. union(){
  139. stirnrad(modul, zahnzahl, hoehe, bohrung, eingriffswinkel, schraegungswinkel); // untere Hälfte
  140. mirror([0,0,1]){
  141. stirnrad(modul, zahnzahl, hoehe, bohrung, eingriffswinkel, schraegungswinkel); // obere Hälfte
  142. }
  143. }
  144. }
  145. }
  146. /* Hohlrad
  147. modul = Höhe des Zahnkopfes über dem Teilkreis
  148. zahnzahl = Anzahl der Radzähne
  149. hoehe = Höhe des Zahnrads
  150. randbreite = Breite des Randes ab Fußkreis
  151. bohrung = Durchmesser der Mittelbohrung
  152. eingriffswinkel = Eingriffswinkel, Standardwert = 20° gemäß DIN 867
  153. schraegungswinkel = Schrägungswinkel zur Rotationsachse, Standardwert = 0° (Geradverzahnung) */
  154. module hohlrad(modul, zahnzahl, hoehe, randbreite, eingriffswinkel = 20, schraegungswinkel = 0) {
  155. // Dimensions-Berechnungen
  156. ha = (zahnzahl >= 20) ? 0.02 * atan((zahnzahl/15)/pi) : 0.6; // Verkürzungsfaktor Zahnkopfhöhe
  157. d = modul * zahnzahl; // Teilkreisdurchmesser
  158. r = d / 2; // Teilkreisradius
  159. alpha_stirn = atan(tan(eingriffswinkel)/cos(schraegungswinkel));// Schrägungswinkel im Stirnschnitt
  160. db = d * cos(alpha_stirn); // Grundkreisdurchmesser
  161. rb = db / 2; // Grundkreisradius
  162. c = modul / 6; // Kopfspiel
  163. da = (modul <1)? d + (modul+c) * 2.2 : d + (modul+c) * 2; // Kopfkreisdurchmesser
  164. ra = da / 2; // Kopfkreisradius
  165. df = d - 2 * modul * ha; // Fußkreisdurchmesser
  166. rf = df / 2; // Fußkreisradius
  167. rho_ra = acos(rb/ra); // maximaler Evolventenwinkel;
  168. // Evolvente beginnt auf Grundkreis und endet an Kopfkreis
  169. rho_r = acos(rb/r); // Evolventenwinkel am Teilkreis;
  170. // Evolvente beginnt auf Grundkreis und endet an Kopfkreis
  171. phi_r = grad(tan(rho_r)-radian(rho_r)); // Winkel zum Punkt der Evolvente auf Teilkreis
  172. gamma = rad*hoehe/(r*tan(90-schraegungswinkel)); // Torsionswinkel für Extrusion
  173. schritt = rho_ra/16; // Evolvente wird in 16 Stücke geteilt
  174. tau = 360/zahnzahl; // Teilungswinkel
  175. // Zeichnung
  176. rotate([0,0,-phi_r-90*(1+spiel)/zahnzahl]) // Zahn auf x-Achse zentrieren;
  177. // macht Ausrichtung mit anderen Rädern einfacher
  178. linear_extrude(height = hoehe, twist = gamma){
  179. difference(){
  180. circle(r = ra + randbreite); // Außenkreis
  181. union(){
  182. zahnbreite = (180*(1+spiel))/zahnzahl+2*phi_r;
  183. circle(rf); // Fußkreis
  184. for (rot = [0:tau:360]){
  185. rotate (rot) { // "Zahnzahl-mal" kopieren und drehen
  186. polygon( concat(
  187. [[0,0]],
  188. [for (rho = [0:schritt:rho_ra]) // von null Grad (Grundkreis)
  189. // bis maximaler Evolventenwinkel (Kopfkreis)
  190. pol_zu_kart(ev(rb,rho))],
  191. [pol_zu_kart(ev(rb,rho_ra))],
  192. [for (rho = [rho_ra:-schritt:0]) // von maximaler Evolventenwinkel (Kopfkreis)
  193. // bis null Grad (Grundkreis)
  194. pol_zu_kart([ev(rb,rho)[0], zahnbreite-ev(rb,rho)[1]])]
  195. // (180*(1+spiel)) statt 180,
  196. // um Spiel an den Flanken zu erlauben
  197. )
  198. );
  199. }
  200. }
  201. }
  202. }
  203. }
  204. echo("Außendurchmesser Hohlrad = ", 2*(ra + randbreite));
  205. }
  206. /* Pfeil-Hohlrad; verwendet das Modul "hohlrad"
  207. modul = Höhe des Zahnkopfes über dem Teilkegel
  208. zahnzahl = Anzahl der Radzähne
  209. hoehe = Höhe des Zahnrads
  210. bohrung = Durchmesser der Mittelbohrung
  211. eingriffswinkel = Eingriffswinkel, Standardwert = 20° gemäß DIN 867
  212. schraegungswinkel = Schrägungswinkel zur Rotationsachse, Standardwert = 0° (Geradverzahnung) */
  213. module pfeilhohlrad(modul, zahnzahl, hoehe, randbreite, eingriffswinkel = 20, schraegungswinkel = 0) {
  214. hoehe = hoehe / 2;
  215. translate([0,0,hoehe])
  216. union(){
  217. hohlrad(modul, zahnzahl, hoehe, randbreite, eingriffswinkel, schraegungswinkel); // untere Hälfte
  218. mirror([0,0,1])
  219. hohlrad(modul, zahnzahl, hoehe, randbreite, eingriffswinkel, schraegungswinkel); // obere Hälfte
  220. }
  221. }
  222. /* Planetengetriebe; verwendet die Module "pfeilrad" und "pfeilhohlrad"
  223. modul = Höhe des Zahnkopfes über dem Teilkegel
  224. zahnzahl_sonne = Anzahl der Zähne des Sonnenrads
  225. zahnzahl_planet = Anzahl der Zähne eines Planetenrads
  226. hoehe = Höhe des Zahnrads
  227. randbreite = Breite des Randes ab Fußkreis
  228. bohrung = Durchmesser der Mittelbohrung
  229. eingriffswinkel = Eingriffswinkel, Standardwert = 20° gemäß DIN 867
  230. schraegungswinkel = Schrägungswinkel zur Rotationsachse, Standardwert = 0° (Geradverzahnung) */
  231. module planetengetriebe(modul, zahnzahl_sonne, zahnzahl_planet, hoehe, randbreite, bohrung, eingriffswinkel=20, schraegungswinkel=0){
  232. // Dimensions-Berechnungen
  233. d_sonne = modul*zahnzahl_sonne; // Teilkreisdurchmesser Sonne
  234. d_planet = modul*zahnzahl_planet; // Teilkreisdurchmesser Planeten
  235. achsabstand = (modul*zahnzahl_sonne + modul*zahnzahl_planet) / 2; // Abstand von Sonnenrad-/Hohlradachse und Planetenachse
  236. zahnzahl_hohlrad = zahnzahl_sonne + 2*zahnzahl_planet; // Anzahl der Zähne des Hohlrades
  237. drehen = istgerade(zahnzahl_planet); // Muss das Sonnenrad gedreht werden?
  238. n_planeten = (zahnzahl_planet>zahnzahl_sonne) ? ggt(zahnzahl_planet,zahnzahl_sonne) : ggt(zahnzahl_sonne,zahnzahl_planet);
  239. // Anzahl Planetenräder = größter gemeinsamer
  240. // Teiler von Anzahl der Zähne des Sonnen- und
  241. // Planetenrads
  242. // Zeichnung
  243. rotate([0,0,180/zahnzahl_sonne*drehen]){
  244. pfeilrad (modul, zahnzahl_sonne, hoehe, bohrung, eingriffswinkel, -schraegungswinkel); // Sonnenrad
  245. }
  246. for(rot=[0:360/n_planeten:360/n_planeten*(n_planeten-1)]){
  247. translate(kugel_zu_kart([achsabstand,90,rot]))
  248. pfeilrad (modul, zahnzahl_planet, hoehe, bohrung, eingriffswinkel, schraegungswinkel); // Planetenräder
  249. }
  250. pfeilhohlrad (modul, zahnzahl_hohlrad, hoehe, randbreite, eingriffswinkel, schraegungswinkel); // Hohlrad
  251. }
  252. /* Kegelrad
  253. modul = Höhe des Zahnkopfes über dem Teilkegel; Angabe für die Aussenseite des Kegels
  254. zahnzahl = Anzahl der Radzähne
  255. teilkegelwinkel = (Halb)winkel des Kegels, auf dem das jeweils andere Hohlrad abrollt
  256. zahnbreite = Breite der Zähne von der Außenseite in Richtung Kegelspitze
  257. bohrung = Durchmesser der Mittelbohrung
  258. eingriffswinkel = Eingriffswinkel, Standardwert = 20° gemäß DIN 867
  259. schraegungswinkel = Schrägungswinkel, Standardwert = 0° */
  260. module kegelrad(modul, zahnzahl, teilkegelwinkel, zahnbreite, bohrung, eingriffswinkel = 20, schraegungswinkel=0) {
  261. // Dimensions-Berechnungen
  262. d_aussen = modul * zahnzahl; // Teilkegeldurchmesser auf der Kegelgrundfläche,
  263. // entspricht der Sehne im Kugelschnitt
  264. r_aussen = d_aussen / 2; // Teilkegelradius auf der Kegelgrundfläche
  265. rg_aussen = r_aussen/sin(teilkegelwinkel); // Großkegelradius für Zahn-Außenseite, entspricht der Länge der Kegelflanke;
  266. rg_innen = rg_aussen - zahnbreite; // Großkegelradius für Zahn-Innenseite
  267. r_innen = r_aussen*rg_innen/rg_aussen;
  268. alpha_stirn = atan(tan(eingriffswinkel)/cos(schraegungswinkel));// Schrägungswinkel im Stirnschnitt
  269. delta_b = asin(cos(alpha_stirn)*sin(teilkegelwinkel)); // Grundkegelwinkel
  270. da_aussen = (modul <1)? d_aussen + (modul * 2.2) * cos(teilkegelwinkel): d_aussen + modul * 2 * cos(teilkegelwinkel);
  271. ra_aussen = da_aussen / 2;
  272. delta_a = asin(ra_aussen/rg_aussen);
  273. c = modul / 6; // Kopfspiel
  274. df_aussen = d_aussen - (modul +c) * 2 * cos(teilkegelwinkel);
  275. rf_aussen = df_aussen / 2;
  276. delta_f = asin(rf_aussen/rg_aussen);
  277. rkf = rg_aussen*sin(delta_f); // Radius des Kegelfußes
  278. hoehe_f = rg_aussen*cos(delta_f); // Höhe des Kegels vom Fußkegel
  279. echo("Teilkegeldurchmesser auf der Kegelgrundfläche = ", d_aussen);
  280. // Größen für Komplementär-Kegelstumpf
  281. hoehe_k = (rg_aussen-zahnbreite)/cos(teilkegelwinkel); // Höhe des Komplementärkegels für richtige Zahnlänge
  282. rk = (rg_aussen-zahnbreite)/sin(teilkegelwinkel); // Fußradius des Komplementärkegels
  283. rfk = rk*hoehe_k*tan(delta_f)/(rk+hoehe_k*tan(delta_f)); // Kopfradius des Zylinders für
  284. // Komplementär-Kegelstumpf
  285. hoehe_fk = rk*hoehe_k/(hoehe_k*tan(delta_f)+rk); // Hoehe des Komplementär-Kegelstumpfs
  286. echo("Höhe Kegelrad = ", hoehe_f-hoehe_fk);
  287. phi_r = kugelev(delta_b, teilkegelwinkel); // Winkel zum Punkt der Evolvente auf Teilkegel
  288. // Torsionswinkel gamma aus Schrägungswinkel
  289. gamma_g = 2*atan(zahnbreite*tan(schraegungswinkel)/(2*rg_aussen-zahnbreite));
  290. gamma = 2*asin(rg_aussen/r_aussen*sin(gamma_g/2));
  291. schritt = (delta_a - delta_b)/16;
  292. tau = 360/zahnzahl; // Teilungswinkel
  293. start = (delta_b > delta_f) ? delta_b : delta_f;
  294. spiegelpunkt = (180*(1-spiel))/zahnzahl+2*phi_r;
  295. // Zeichnung
  296. rotate([0,0,phi_r+90*(1-spiel)/zahnzahl]){ // Zahn auf x-Achse zentrieren;
  297. // macht Ausrichtung mit anderen Rädern einfacher
  298. translate([0,0,hoehe_f]) rotate(a=[0,180,0]){
  299. union(){
  300. translate([0,0,hoehe_f]) rotate(a=[0,180,0]){ // Kegelstumpf
  301. difference(){
  302. linear_extrude(height=hoehe_f-hoehe_fk, scale=rfk/rkf) circle(rkf);
  303. translate([0,0,-1]){
  304. cylinder(h = hoehe_f-hoehe_fk+2, r = bohrung/2); // Bohrung
  305. }
  306. }
  307. }
  308. for (rot = [0:tau:360]){
  309. rotate (rot) { // "Zahnzahl-mal" kopieren und drehen
  310. union(){
  311. if (delta_b > delta_f){
  312. // Zahnfuß
  313. flankenpunkt_unten = 1*spiegelpunkt;
  314. flankenpunkt_oben = kugelev(delta_f, start);
  315. polyhedron(
  316. points = [
  317. kugel_zu_kart([rg_aussen, start*1.001, flankenpunkt_unten]), // 1 promille Überlappung mit Zahn
  318. kugel_zu_kart([rg_innen, start*1.001, flankenpunkt_unten+gamma]),
  319. kugel_zu_kart([rg_innen, start*1.001, spiegelpunkt-flankenpunkt_unten+gamma]),
  320. kugel_zu_kart([rg_aussen, start*1.001, spiegelpunkt-flankenpunkt_unten]),
  321. kugel_zu_kart([rg_aussen, delta_f, flankenpunkt_unten]),
  322. kugel_zu_kart([rg_innen, delta_f, flankenpunkt_unten+gamma]),
  323. kugel_zu_kart([rg_innen, delta_f, spiegelpunkt-flankenpunkt_unten+gamma]),
  324. kugel_zu_kart([rg_aussen, delta_f, spiegelpunkt-flankenpunkt_unten])
  325. ],
  326. faces = [[0,1,2],[0,2,3],[0,4,1],[1,4,5],[1,5,2],[2,5,6],[2,6,3],[3,6,7],[0,3,7],[0,7,4],[4,6,5],[4,7,6]],
  327. convexity =1
  328. );
  329. }
  330. // Zahn
  331. for (delta = [start:schritt:delta_a-schritt]){
  332. flankenpunkt_unten = kugelev(delta_b, delta);
  333. flankenpunkt_oben = kugelev(delta_b, delta+schritt);
  334. polyhedron(
  335. points = [
  336. kugel_zu_kart([rg_aussen, delta, flankenpunkt_unten]),
  337. kugel_zu_kart([rg_innen, delta, flankenpunkt_unten+gamma]),
  338. kugel_zu_kart([rg_innen, delta, spiegelpunkt-flankenpunkt_unten+gamma]),
  339. kugel_zu_kart([rg_aussen, delta, spiegelpunkt-flankenpunkt_unten]),
  340. kugel_zu_kart([rg_aussen, delta+schritt, flankenpunkt_oben]),
  341. kugel_zu_kart([rg_innen, delta+schritt, flankenpunkt_oben+gamma]),
  342. kugel_zu_kart([rg_innen, delta+schritt, spiegelpunkt-flankenpunkt_oben+gamma]),
  343. kugel_zu_kart([rg_aussen, delta+schritt, spiegelpunkt-flankenpunkt_oben])
  344. ],
  345. faces = [[0,1,2],[0,2,3],[0,4,1],[1,4,5],[1,5,2],[2,5,6],[2,6,3],[3,6,7],[0,3,7],[0,7,4],[4,6,5],[4,7,6]],
  346. convexity =1
  347. );
  348. }
  349. }
  350. }
  351. }
  352. }
  353. }
  354. }
  355. }
  356. /* Pfeil-Kegelrad; verwendet das Modul "kegelrad"
  357. modul = Höhe des Zahnkopfes über dem Teilkreis
  358. zahnzahl = Anzahl der Radzähne
  359. hoehe = Höhe des Zahnrads
  360. bohrung = Durchmesser der Mittelbohrung
  361. eingriffswinkel = Eingriffswinkel, Standardwert = 20° gemäß DIN 867
  362. schraegungswinkel = Schrägungswinkel, Standardwert = 0° */
  363. module pfeilkegelrad(modul, zahnzahl, teilkegelwinkel, zahnbreite, bohrung, eingriffswinkel = 20, schraegungswinkel=0){
  364. // Dimensions-Berechnungen
  365. zahnbreite = zahnbreite / 2;
  366. d_aussen = modul * zahnzahl; // Teilkegeldurchmesser auf der Kegelgrundfläche,
  367. // entspricht der Sehne im Kugelschnitt
  368. r_aussen = d_aussen / 2; // Teilkegelradius auf der Kegelgrundfläche
  369. rg_aussen = r_aussen/sin(teilkegelwinkel); // Großkegelradius, entspricht der Länge der Kegelflanke;
  370. c = modul / 6; // Kopfspiel
  371. df_aussen = d_aussen - (modul +c) * 2 * cos(teilkegelwinkel);
  372. rf_aussen = df_aussen / 2;
  373. delta_f = asin(rf_aussen/rg_aussen);
  374. hoehe_f = rg_aussen*cos(delta_f); // Höhe des Kegels vom Fußkegel
  375. // Torsionswinkel gamma aus Schrägungswinkel
  376. gamma_g = 2*atan(zahnbreite*tan(schraegungswinkel)/(2*rg_aussen-zahnbreite));
  377. gamma = 2*asin(rg_aussen/r_aussen*sin(gamma_g/2));
  378. echo("Teilkegeldurchmesser auf der Kegelgrundfläche = ", d_aussen);
  379. // Größen für Komplementär-Kegelstumpf
  380. hoehe_k = (rg_aussen-zahnbreite)/cos(teilkegelwinkel); // Höhe des Komplementärkegels für richtige Zahnlänge
  381. rk = (rg_aussen-zahnbreite)/sin(teilkegelwinkel); // Fußradius des Komplementärkegels
  382. rfk = rk*hoehe_k*tan(delta_f)/(rk+hoehe_k*tan(delta_f)); // Kopfradius des Zylinders für
  383. // Komplementär-Kegelstumpf
  384. hoehe_fk = rk*hoehe_k/(hoehe_k*tan(delta_f)+rk); // Hoehe des Komplementär-Kegelstumpfs
  385. modul_innen = modul-zahnbreite/rg_aussen;
  386. union(){
  387. kegelrad(modul, zahnzahl, teilkegelwinkel, zahnbreite, bohrung, eingriffswinkel, schraegungswinkel); // untere Hälfte
  388. translate([0,0,hoehe_f-hoehe_fk])
  389. rotate(a=-gamma,v=[0,0,1])
  390. kegelrad(modul_innen, zahnzahl, teilkegelwinkel, zahnbreite, bohrung, eingriffswinkel, -schraegungswinkel); // obere Hälfte
  391. }
  392. }
  393. /* Spiral-Kegelrad; verwendet das Modul "kegelrad"
  394. modul = Höhe des Zahnkopfes über dem Teilkreis
  395. zahnzahl = Anzahl der Radzähne
  396. hoehe = Höhe des Zahnrads
  397. bohrung = Durchmesser der Mittelbohrung
  398. eingriffswinkel = Eingriffswinkel, Standardwert = 20° gemäß DIN 867
  399. schraegungswinkel = Schrägungswinkel, Standardwert = 0° */
  400. module spiralkegelrad(modul, zahnzahl, teilkegelwinkel, zahnbreite, bohrung, eingriffswinkel = 20, schraegungswinkel=30){
  401. schritte = 16;
  402. // Dimensions-Berechnungen
  403. b = zahnbreite / schritte;
  404. d_aussen = modul * zahnzahl; // Teilkegeldurchmesser auf der Kegelgrundfläche,
  405. // entspricht der Sehne im Kugelschnitt
  406. r_aussen = d_aussen / 2; // Teilkegelradius auf der Kegelgrundfläche
  407. rg_aussen = r_aussen/sin(teilkegelwinkel); // Großkegelradius, entspricht der Länge der Kegelflanke;
  408. rg_mitte = rg_aussen-zahnbreite/2;
  409. // c = modul / 6; // Kopfspiel
  410. //df_aussen = d_aussen - (modul +c) * 2 * cos(teilkegelwinkel);
  411. //rf_aussen = df_aussen / 2;
  412. //delta_f = asin(rf_aussen/rg_aussen);
  413. //hoehe_f = rg_aussen*cos(delta_f); // Höhe des Kegels vom Fußkegel
  414. echo("Teilkegeldurchmesser auf der Kegelgrundfläche = ", d_aussen);
  415. // Größen für Komplementär-Kegelstumpf
  416. //hoehe_k = (rg_aussen-zahnbreite)/cos(teilkegelwinkel); // Höhe des Komplementärkegels für richtige Zahnlänge
  417. //rk = (rg_aussen-zahnbreite)/sin(teilkegelwinkel); // Fußradius des Komplementärkegels
  418. //rfk = rk*hoehe_k*tan(delta_f)/(rk+hoehe_k*tan(delta_f)); // Kopfradius des Zylinders für
  419. // Komplementär-Kegelstumpf
  420. //hoehe_fk = rk*hoehe_k/(hoehe_k*tan(delta_f)+rk); // Hoehe des Komplementär-Kegelstumpfs
  421. //modul_innen = modul*(rg_aussen-zahnbreite)/rg_aussen;
  422. a=tan(schraegungswinkel)/rg_mitte;
  423. union(){
  424. for(i=[0:1:schritte-1]){
  425. r = rg_aussen-i*b;
  426. schraegungswinkel = a*r;
  427. modul_r = modul-b*i/rg_aussen; //modul*r/rg_aussen;
  428. translate([0,0,b*cos(teilkegelwinkel)*i])
  429. rotate(a=-schraegungswinkel*i,v=[0,0,1])
  430. kegelrad(modul_r, zahnzahl, teilkegelwinkel, b, bohrung, eingriffswinkel, schraegungswinkel); // obere Hälfte
  431. }
  432. }
  433. }
  434. /* Kegelradpaar mit beliebigem Achsenwinkel; verwendet das Modul "kegelrad"
  435. modul = Höhe des Zahnkopfes über dem Teilkegel; Angabe für die Aussenseite des Kegels
  436. zahnzahl_rad = Anzahl der Radzähne am Rad
  437. zahnzahl_ritzel = Anzahl der Radzähne am Ritzel
  438. achsenwinkel = Winkel zwischen den Achsen von Rad und Ritzel
  439. zahnbreite = Breite der Zähne von der Außenseite in Richtung Kegelspitze
  440. bohrung_rad = Durchmesser der Mittelbohrung des Rads
  441. bohrung_ritzel = Durchmesser der Mittelbohrungen des Ritzels
  442. eingriffswinkel = Eingriffswinkel, Standardwert = 20° gemäß DIN 867
  443. schraegungswinkel = Schrägungswinkel, Standardwert = 0° */
  444. module kegelradpaar(modul, zahnzahl_rad, zahnzahl_ritzel, achsenwinkel=90, zahnbreite, bohrung_rad, bohrung_ritzel, eingriffswinkel=20, schraegungswinkel=0, zusammen_gebaut=1){
  445. // Dimensions-Berechnungen
  446. r_rad = modul*zahnzahl_rad/2; // Teilkegelradius des Rads
  447. delta_rad = atan(sin(achsenwinkel)/(zahnzahl_ritzel/zahnzahl_rad+cos(achsenwinkel))); // Kegelwinkel des Rads
  448. delta_ritzel = atan(sin(achsenwinkel)/(zahnzahl_rad/zahnzahl_ritzel+cos(achsenwinkel)));// Kegelwingel des Ritzels
  449. rg = r_rad/sin(delta_rad); // Radius der Großkugel
  450. c = modul / 6; // Kopfspiel
  451. df_ritzel = 4*pi*rg*delta_ritzel/360 - 2 * (modul + c); // Fußkegeldurchmesser auf der Großkugel
  452. rf_ritzel = df_ritzel / 2; // Fußkegelradius auf der Großkugel
  453. delta_f_ritzel = rf_ritzel/(2*pi*rg) * 360; // Kopfkegelwinkel
  454. rkf_ritzel = rg*sin(delta_f_ritzel); // Radius des Kegelfußes
  455. hoehe_f_ritzel = rg*cos(delta_f_ritzel); // Höhe des Kegels vom Fußkegel
  456. echo("Kegelwinkel Rad = ", delta_rad);
  457. echo("Kegelwinkel Ritzel = ", delta_ritzel);
  458. df_rad = 4*pi*rg*delta_rad/360 - 2 * (modul + c); // Fußkegeldurchmesser auf der Großkugel
  459. rf_rad = df_rad / 2; // Fußkegelradius auf der Großkugel
  460. delta_f_rad = rf_rad/(2*pi*rg) * 360; // Kopfkegelwinkel
  461. rkf_rad = rg*sin(delta_f_rad); // Radius des Kegelfußes
  462. hoehe_f_rad = rg*cos(delta_f_rad); // Höhe des Kegels vom Fußkegel
  463. echo("Höhe Rad = ", hoehe_f_rad);
  464. echo("Höhe Ritzel = ", hoehe_f_ritzel);
  465. drehen = istgerade(zahnzahl_ritzel);
  466. // Zeichnung
  467. // Rad
  468. rotate([0,0,180*(1-spiel)/zahnzahl_rad*drehen])
  469. kegelrad(modul, zahnzahl_rad, delta_rad, zahnbreite, bohrung_rad, eingriffswinkel, schraegungswinkel);
  470. // Ritzel
  471. if (zusammen_gebaut == 1)
  472. translate([-hoehe_f_ritzel*cos(90-achsenwinkel),0,hoehe_f_rad-hoehe_f_ritzel*sin(90-achsenwinkel)])
  473. rotate([0,achsenwinkel,0])
  474. kegelrad(modul, zahnzahl_ritzel, delta_ritzel, zahnbreite, bohrung_ritzel, eingriffswinkel, -schraegungswinkel);
  475. else
  476. translate([rkf_ritzel*2+modul+rkf_rad,0,0])
  477. kegelrad(modul, zahnzahl_ritzel, delta_ritzel, zahnbreite, bohrung_ritzel, eingriffswinkel, -schraegungswinkel);
  478. }
  479. /* Pfeil-Kegelradpaar mit beliebigem Achsenwinkel; verwendet das Modul "pfeilkegelrad"
  480. modul = Höhe des Zahnkopfes über dem Teilkegel; Angabe für die Aussenseite des Kegels
  481. zahnzahl_rad = Anzahl der Radzähne am Rad
  482. zahnzahl_ritzel = Anzahl der Radzähne am Ritzel
  483. achsenwinkel = Winkel zwischen den Achsen von Rad und Ritzel
  484. zahnbreite = Breite der Zähne von der Außenseite in Richtung Kegelspitze
  485. bohrung_rad = Durchmesser der Mittelbohrung des Rads
  486. bohrung_ritzel = Durchmesser der Mittelbohrungen des Ritzels
  487. eingriffswinkel = Eingriffswinkel, Standardwert = 20° gemäß DIN 867
  488. schraegungswinkel = Schrägungswinkel, Standardwert = 0° */
  489. module pfeilkegelradpaar(modul, zahnzahl_rad, zahnzahl_ritzel, achsenwinkel=90, zahnbreite, bohrung_rad, bohrung_ritzel, eingriffswinkel = 20, schraegungswinkel=10, zusammen_gebaut=1){
  490. r_rad = modul*zahnzahl_rad/2; // Teilkegelradius des Rads
  491. delta_rad = atan(sin(achsenwinkel)/(zahnzahl_ritzel/zahnzahl_rad+cos(achsenwinkel))); // Kegelwinkel des Rads
  492. delta_ritzel = atan(sin(achsenwinkel)/(zahnzahl_rad/zahnzahl_ritzel+cos(achsenwinkel)));// Kegelwingel des Ritzels
  493. rg = r_rad/sin(delta_rad); // Radius der Großkugel
  494. c = modul / 6; // Kopfspiel
  495. df_ritzel = 4*pi*rg*delta_ritzel/360 - 2 * (modul + c); // Fußkegeldurchmesser auf der Großkugel
  496. rf_ritzel = df_ritzel / 2; // Fußkegelradius auf der Großkugel
  497. delta_f_ritzel = rf_ritzel/(2*pi*rg) * 360; // Kopfkegelwinkel
  498. rkf_ritzel = rg*sin(delta_f_ritzel); // Radius des Kegelfußes
  499. hoehe_f_ritzel = rg*cos(delta_f_ritzel); // Höhe des Kegels vom Fußkegel
  500. echo("Kegelwinkel Rad = ", delta_rad);
  501. echo("Kegelwinkel Ritzel = ", delta_ritzel);
  502. df_rad = 4*pi*rg*delta_rad/360 - 2 * (modul + c); // Fußkegeldurchmesser auf der Großkugel
  503. rf_rad = df_rad / 2; // Fußkegelradius auf der Großkugel
  504. delta_f_rad = rf_rad/(2*pi*rg) * 360; // Kopfkegelwinkel
  505. rkf_rad = rg*sin(delta_f_rad); // Radius des Kegelfußes
  506. hoehe_f_rad = rg*cos(delta_f_rad); // Höhe des Kegels vom Fußkegel
  507. echo("Höhe Rad = ", hoehe_f_rad);
  508. echo("Höhe Ritzel = ", hoehe_f_ritzel);
  509. drehen = istgerade(zahnzahl_ritzel);
  510. // Rad
  511. rotate([0,0,180*(1-spiel)/zahnzahl_rad*drehen])
  512. pfeilkegelrad(modul, zahnzahl_rad, delta_rad, zahnbreite, bohrung_rad, eingriffswinkel, schraegungswinkel);
  513. // Ritzel
  514. if (zusammen_gebaut == 1)
  515. translate([-hoehe_f_ritzel*cos(90-achsenwinkel),0,hoehe_f_rad-hoehe_f_ritzel*sin(90-achsenwinkel)])
  516. rotate([0,achsenwinkel,0])
  517. pfeilkegelrad(modul, zahnzahl_ritzel, delta_ritzel, zahnbreite, bohrung_ritzel, eingriffswinkel, -schraegungswinkel);
  518. else
  519. translate([rkf_ritzel*2+modul+rkf_rad,0,0])
  520. pfeilkegelrad(modul, zahnzahl_ritzel, delta_ritzel, zahnbreite, bohrung_ritzel, eingriffswinkel, -schraegungswinkel);
  521. }
  522. /*
  523. Berechnet eine eingängige Schnecke (Zähnezahl = 1)
  524. modul = Höhe des Schneckenkopfes über dem Teilzylinder
  525. laenge = Länge der Schnecke
  526. bohrung = Durchmesser der Mittelbohrung
  527. eingriffswinkel = Eingriffswinkel, Standardwert = 20° gemäß DIN 867
  528. steigungswinkel = Steigungswinkel der Schnecke, entspricht 90°-Schrägungswinkel. Positiver Steigungswinkel = rechtsdrehend
  529. */
  530. module schnecke(modul, laenge, bohrung, eingriffswinkel=20, steigungswinkel){
  531. // Dimensions-Berechnungen
  532. alpha_stirn = atan(tan(eingriffswinkel)/cos(steigungswinkel)); // Schrägungswinkel im Stirnschnitt
  533. r=1*2*modul/(pi*tan(steigungswinkel)); // Fußkreisradius
  534. tau_max = 360*modul*tan(alpha_stirn)/(pi*r*tan(steigungswinkel));
  535. a=tau_max/(2*modul);
  536. gamma = -rad*laenge/(r*tan(steigungswinkel)); //Torsionswinkel für Extrusion
  537. schritt = tau_max/16;
  538. echo("Teilkreisdurchmesser = ", 2*(r+modul));
  539. // Zeichnung
  540. linear_extrude(height = laenge, center = false, convexity = 10, twist = gamma){
  541. difference(){
  542. union(){
  543. polygon(
  544. concat(
  545. [[0,0]],
  546. [for (tau = [0:schritt:tau_max])
  547. pol_zu_kart([r+tau/a, tau])],
  548. [for (tau = [tau_max:schritt:180])
  549. pol_zu_kart([r+2*modul, tau])],
  550. [for (tau = [180:schritt:180+tau_max])
  551. pol_zu_kart([r+(180+tau_max-tau)/a, tau])]
  552. )
  553. );
  554. circle(r);
  555. }
  556. circle(bohrung/2);
  557. }
  558. }
  559. }
  560. // stirnrad (modul=1, zahnzahl=30, hoehe=5, bohrung=0, eingriffswinkel=20, schraegungswinkel=20);
  561. // pfeilrad (modul=1, zahnzahl=30, hoehe=5, bohrung=4, eingriffswinkel=20, schraegungswinkel=30);
  562. // hohlrad (modul=1, zahnzahl=30, hoehe=5, randbreite=5, eingriffswinkel=20, schraegungswinkel=20);
  563. // pfeilhohlrad (modul=1, zahnzahl=30, hoehe=5, randbreite=5, eingriffswinkel=20, schraegungswinkel=30);
  564. // planetengetriebe(modul=1, zahnzahl_sonne=15, zahnzahl_planet=12, hoehe=6, randbreite=5, bohrung=4, eingriffswinkel=20, schraegungswinkel=30);
  565. // kegelrad(modul=1, zahnzahl=30, teilkegelwinkel=45, zahnbreite=5, bohrung=4, eingriffswinkel=20, schraegungswinkel=20);
  566. // pfeilkegelrad(modul=1, zahnzahl=30, teilkegelwinkel=45, zahnbreite=5, bohrung=4, eingriffswinkel=20, schraegungswinkel=30);
  567. // spiralkegelrad(modul=1, zahnzahl=30, teilkegelwinkel=45, zahnbreite=5, bohrung=4, eingriffswinkel=20, schraegungswinkel=20);
  568. // kegelradpaar(modul=1, zahnzahl_rad=30, zahnzahl_ritzel=11, achsenwinkel=100, zahnbreite=5, bohrung=4, eingriffswinkel = 20, schraegungswinkel=20, zusammen_gebaut=1);
  569. // pfeilkegelradpaar(modul=1, zahnzahl_rad=30, zahnzahl_ritzel=11, achsenwinkel=100, zahnbreite=5, bohrung=4, eingriffswinkel = 20, schraegungswinkel=30, zusammen_gebaut=1);
  570. schnecke(modul=1, laenge=10, bohrung=4, eingriffswinkel=30, steigungswinkel=10);