engrenage.scad 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705
  1. include <math.scad>
  2. /*Certaines fonctions utilisées dans ce fichier
  3. sont définies dans le fichier math.scad.
  4. Notamment la développante de cercle et la fonction permettant
  5. de calculer son point d'intersection avec un cercle.
  6. Pour des détails et explications il faut donc regarder
  7. dans le fichier math.scad*/
  8. /**************ENGRENAGE DROIT**************
  9. **************DÉFINITIONS**************
  10. le cercle de pied, qui est le cercle passant par la base des dents ;
  11. le cercle de tête, qui passe par le sommet des dents ;
  12. le cercle de base, qui est celui qui sert à générer le profil des dents (les dents sont des développantes de ce cercle) ;
  13. le cercle primitif : les cercles primitifs des roues dentées d'un engrenage ont la même vitesse tangentielle ; ils passent à peu près au milieu des dents.
  14. **************NOTATIONS**************
  15. diamètre primitif => d
  16. diamètre de pied => df
  17. diamètre de tête => da
  18. diamètre de base => db
  19. angle de pression => alpha
  20. module => m
  21. pas (distance entre 2 dents sur le cercle primitif) => p
  22. saillie => ha
  23. creux => hf
  24. hauteur de dent => h
  25. nombre de dents => z
  26. largeur de la dent sur le cercle primitif => l
  27. angle d'une dent sur le cercle primitif => la
  28. **************RELATIONS**************
  29. d = m*z
  30. p = m*pi
  31. ha = m
  32. si m<=1.25 hf = 1.40*m
  33. sinon hf = 1.25*m
  34. si m<=1.25 h = 2.40*m
  35. sinon h = 2.25*m
  36. h = ha + hf <=> ha = h - hf <=> ha = 2.25m - 1.25m = m
  37. ha = m
  38. da = d + 2*ha = d + 2*m
  39. df = d - 2*hf = d -2.5*m
  40. db = d*cos(alpha)
  41. l = pi*m/2 = pi/2 * d/z = (pi * d)/(2 * z) = pi*r/z = p/2
  42. deport de denture
  43. calcul de la largeur d'une dent avec déport :
  44. http://www.sidermeca.com/ficheconseil.php?fiche=1
  45. /*************ATTENTION*************
  46. la différence entre le nombre de dents de 2 roues
  47. est limité dans certains cas
  48. si Za=13, Zbmax=16
  49. si Za=14, Zbmax=26
  50. si Za=15, Zbmax=45
  51. si Za=16, Zbmax=101
  52. si Za=17, Zbmax=sans limite
  53. de préférence choisir des nombres premiers entres eux
  54. */
  55. $fn = 200;
  56. /*FONCTION EXPERIMENTALE*/
  57. //function recherche_limite(limite = 6, etape = 0, x = 0, y = 0, angle = 0) =
  58. //limite == etape ? atan(x) :
  59. //etape%2 == 0 ? recherche_limite(limite = limite, etape = etape + 1, x = y + rad(angle), y = y, angle = angle) :
  60. //recherche_limite(limite = limite, etape = etape + 1, x = x, y = rad(atan(x)), angle = angle);
  61. function creux(m = 1) = m <= 1.25 ? 1.4*m : 1.25*m;
  62. module evider(diam_int = 15, diam_ext = 50, larg = 8, nbr = 6)
  63. {
  64. facteur = 1.7;
  65. offset(r = larg/facteur)
  66. {
  67. difference()
  68. {
  69. circle(d = diam_ext -0.1);
  70. union()
  71. {
  72. for(i = [0:nbr - 1])
  73. {
  74. rotate([0, 0, i*360/nbr])
  75. {square([diam_ext - larg/2, facteur*larg], center = true);}
  76. }
  77. difference()
  78. {
  79. circle(d = diam_ext);
  80. circle(d = diam_ext - 2*larg);
  81. }
  82. }
  83. }
  84. }
  85. }
  86. module dent_cremaillere_2D(m = 1, alpha = 20)
  87. {
  88. //hauteurs
  89. hf = creux(m);
  90. ha = m;
  91. h = hf + ha;
  92. //pas
  93. p = m*pi;
  94. //vecteurs
  95. /*calcul des points de la dents
  96. 1) Premier point [0, 0]
  97. En partant de l'origine, on monte jusqu'à y = h suivant un angle alpha. On notera l la longueur de la dent.
  98. On peut donc écrire :
  99. l*sin(alpha) = decalage_x
  100. l*cos(alpha) = h
  101. en faisant la première ligne divisé par la seconde on obtient :
  102. l*sin(alpha) / l*cos(alpha) = decalage_x / h
  103. Or l se simplifie et sin/cos = tan, on obtient donc :
  104. tan(alpha) = decalage_x / h
  105. et donc decalage_x = h*tan(alpha)
  106. 2) Deuxième point : [h*tan(alpha), h]
  107. Pour le troisième point il faut connaitre la largeur de la dent. Pour y = hf, la largeur de la dent vaut p/2, la largeur de la base est donc :
  108. largeur_base = hf*tan(alpha) + p/2 + hf*tan(alpha)
  109. <=> largeur_base = 2*hf*tan(alpha) + p/2
  110. 3) Troisième point : [largeur_base - h*tan(alpha), h]
  111. Le quatrième point lui est simplement la largeur de la dent avec y = 0
  112. 4) Quatrième point : [largeur_base, 0]
  113. */
  114. largeur_base = 2*hf*tan(alpha) + p/2;
  115. polygon([ [0, 0], [h*tan(alpha), h], [largeur_base - h*tan(alpha), h], [largeur_base, 0] ]);
  116. }
  117. module cremaillere_2D(z = 10, m = 1, alpha = 20, largeur = 10)
  118. {
  119. //hauteurs
  120. hf = creux(m);
  121. //pas
  122. p = m*pi;
  123. union()
  124. {
  125. //corps de la crémaillère
  126. translate([0, -largeur, 0])
  127. {square([p* (z - 1) + p/2 + 2*hf*tan(alpha), largeur]);}
  128. //dents de la crémaillère
  129. for(i=[0:z-1])
  130. {
  131. translate([p*i, 0, 0])
  132. {dent_cremaillere_2D(m, alpha);}
  133. }
  134. }
  135. }
  136. module cremaillere_3D(z = 10, m = 1, alpha = 20, largeur = 10, epaisseur = 3)
  137. {
  138. linear_extrude(epaisseur)
  139. {cremaillere_2D(z, m, alpha, largeur);}
  140. }
  141. module roue_dentee_2D(z = 40, m = 1, alpha = 20, deport = 0, evider = false)
  142. {
  143. //hauteurs
  144. hf = creux(m) - deport;
  145. ha = m + deport;
  146. //pas
  147. p = m*pi;
  148. //calcul des diamètres
  149. d = m * z;
  150. db = d * cos(alpha);
  151. df = d - 2*hf;
  152. da = d + 2*ha;
  153. //calcul de l'angle entre 2 dents
  154. angle_dent = 360 / z;
  155. //largeur de la dent sur le cercle primitif
  156. //l = pi*d/(2*z) + 2*deport*sin(alpha);
  157. l = p/2 + 2*deport*sin(alpha);
  158. //angle de la dent sur le cercle primitif
  159. la = degre(2*l/d);
  160. //paramètre d'intersection de la developpante avec le cercle primitif
  161. //Id = intersect(db/2, d/2); équivalent à :
  162. Id = intersect(db, d);
  163. Idx = developpante_x(db/2,Id);
  164. Idy = developpante_y(db/2,Id);
  165. //angle entre la base de la dent et l'intersection avec le cercle primitif
  166. angle = atan2(Idy, Idx);
  167. //angle de la dent à sa base
  168. angle_base = la + 2*angle;
  169. //paramètre d'intersection de la developpante avec le cercle de tête
  170. //Ida = intersect(db/2, da/2); équivalent à :
  171. Ida = intersect(db, da);
  172. //GENERATION DE LA DENT
  173. /*Lors d'un déport de denture trop prononcé les développantes de cercles se croisent donnant lieu à
  174. un "petit triangle" sur la pointe de la dent. Pour éviter ça il faut déterminer l'angle à ne pas dépasser.
  175. La développante de cercle ne devrait jamais croiser l'axe de symétrie de la dent.
  176. On en déduit donc que la droite passant par l'origine O et faisant un angle de "angle_base/2" avec l'axe x est la limite.
  177. On note I le point d'intersection de cette droite avec la développante de cercle et T un point du cercle de base (angle positif) tel que
  178. IT soit une tangente.
  179. CARACTÉRISTIQUES CONNUES DE LA FIGURE :
  180. 0) L'angle xOI est angle_base/2
  181. 1) L'angle IOT sera appelé alpha
  182. 2) L'angle xOT est le paramètre de la développante de cercle, on le notera a.
  183. 3) De part sa construction le triangle OIT est rectangle en T.
  184. 4) OT est un rayon du cercle de base, on notera sa longueur r
  185. 5) La longueur IT est proportionnelle à r et à l'angle xOT. Avec a en radiant on obtient : IT = ra
  186. 6) D'après le théorème de pythagore OI² = IT² + TO²
  187. 7) Dans un triangle rectangle : hypothénuse * cos(alpha) = coté adjacent
  188. DÉDUCTIONS :
  189. OI² = IT² + TO²
  190. OI² = r²a² + r² = r² * (1 + a²)
  191. OI = sqrt(r² * (1 + a²) )
  192. OI = r * sqrt(1 + a²)
  193. Or OI est l'hypoténuse on peut dont écrire :
  194. OI * cos(alpha) = r
  195. r * sqrt(1 + a²) * cos(alpha) = r
  196. sqrt(1 + a²) * cos(alpha) = 1
  197. cos(alpha) = 1 / sqrt(1 + a²)
  198. alpha = acos( 1 / sqrt(1 + a²) )
  199. Dans le cas où la developpante de cercle est tracé jusqu'au point I alors on a :
  200. a = angle_base/2 + alpha
  201. Le paramètre a ne doit donc pas dépasser cette valeur.
  202. */
  203. A = [ for(i=[0: ceil(Ida)])
  204. if( i < angle_base/2 + acos( sqrt( 1/(1 + rad(i) * rad(i)))) )
  205. [developpante_x(db/2,i), developpante_y(db/2,i)] ];
  206. Matrice_de_rotation = [ [cos(angle_base), -sin(angle_base)], [sin(angle_base), cos(angle_base)] ];
  207. //Pour continuer le polygone il faut parcourir les valeurs dans l'autre sens
  208. B = [ for(i=[floor(-Ida):0])
  209. if( i > -angle_base/2 - acos( sqrt( 1/(1 + rad(i) * rad(i)))) )
  210. Matrice_de_rotation*[developpante_x(db/2,i), developpante_y(db/2,i)] ];
  211. C = concat(A, B);
  212. difference()
  213. {
  214. union()
  215. {
  216. //pied de la dent
  217. circle(d=df);
  218. for(j = [0:1:z-1])
  219. {
  220. rotate([0, 0, j*angle_dent])
  221. {polygon(C);}
  222. }
  223. }
  224. if(evider)
  225. {evider(diam_int = 3*da/10, diam_ext = 9*da/10, larg = 1.2*da/10, nbr = 6);}
  226. }
  227. }
  228. module roue_dentee_3D(z = 20, m = 5, alpha = 20, epaisseur = 2, deport = 0, evider = false)
  229. {
  230. linear_extrude(epaisseur)
  231. {roue_dentee_2D(z,m,alpha, deport, evider);}
  232. }
  233. module roue_dentee_3D_globoide(z = 20, m = 5, alpha = 20, epaisseur = 2, deport = 0, evider = false)
  234. {
  235. /*pour créer une roue globoïde on coupe les dents de la roue avec un tore
  236. le rayon R du cercle qui engendre le tore par révolution peut être calculer en considérant
  237. que les extrémités d'une dent forment une corde de ce cercle.
  238. https://fr.wikipedia.org/wiki/Segment_circulaire
  239. l'angle theta peut être trouvé en traçant la bissectrice de cet angle,
  240. on obtient un triangle rectangle avec des cotés ayant pour longueur h et c/2.
  241. B angle beta
  242. |\
  243. h| \
  244. __|__\A
  245. c/2
  246. l'angle beta peut se calculer en utilisant la tangente :
  247. tan(beta) = (c/2)/h
  248. beta = atan(c/2h)
  249. Or le triangle ABO, avec O le centre du cercle est isocèle, et l'angle en 0 est theta/2
  250. On en déduit que 2*beta + theta/2 = 180 et donc que :
  251. theta/2 = 180 - 2*beta
  252. En remplaçant dans la relation c = 2*R*sin(theta/2) on obtient :
  253. c = 2*R*sin(180 - 2*beta)
  254. or sin(180 - x) = sin(x)
  255. c = 2*R*sin(2*beta)
  256. on peut maintenant déduire R :
  257. R = c / 2*sin(2*beta) = c / 2*sin( 2*atan(c/2h) )
  258. Dans le cas de notre roue dentée :
  259. c = epaisseur
  260. h = (da - d)/2
  261. On en conclue que :
  262. R = epaisseur / 2*sin(2*atan(epaisseur/(da-d))
  263. On peut également utiliser la fonction atan2
  264. R = epaisseur / 2*sin(2*atan2(epaisseur, (da-d))
  265. */
  266. d = m*z;
  267. da = d + 2*m;
  268. difference()
  269. {
  270. linear_extrude(epaisseur)
  271. {roue_dentee_2D(z,m,alpha, deport, evider);}
  272. rayon = epaisseur / (2*sin(2*atan2(epaisseur, (da-d))));
  273. translate([0, 0, epaisseur/2])
  274. {
  275. rotate_extrude()
  276. {
  277. translate([d/2 + rayon, 0, 0])
  278. {circle(rayon);}
  279. }
  280. }
  281. }
  282. }
  283. /**************ENGRENAGE HELICOÏDAL**************/
  284. /*Dans un engrenage hélicoïdal la denture est "penchée", on distingue donc 2 profiles
  285. -Le profil réel, qui correspond à une coupe droite de la dent, une coupe par un plan perpendiculaire aux arêtes, module réel noté mr (noté parfois mn)
  286. -Le profil apparent, qui correspond à une coupe selon un plan perpendiculaire à l'axe du cylindre, module apparent : ma (noté parfois mt)
  287. le module réel "mr" et le module apparent "ma" sont lié par :
  288. mr = ma*cos(beta)
  289. beta étant l'angle que fait la dent avec l'axe de rotation
  290. **************RELATIONS**************
  291. relation pas - module :
  292. p = pi*m
  293. relation pas réel - pas apparent :
  294. pa = pr/cos(beta)
  295. relation module apparent - module réel :
  296. ma = mr/cos(beta)
  297. relation angle de pression réel - angle de pression apparent :
  298. tan(alpha_r) = tan(alpha_a)*cos(beta)
  299. alpha_a = arctan(tan(alpha_r)/cos(beta))
  300. diamètre primitif :
  301. d = Z*mr / cos(beta)
  302. d = Z*ma
  303. diamètre de tête
  304. D = d + 2*mr
  305. nombre de dent :
  306. Z = d*cos(beta)/mr
  307. */
  308. module roue_dentee_helicoidale(z = 40, m = 1, alpha = 20, beta = 60, epaisseur = 10, deport = 0, evider = false)
  309. {
  310. /*le paramètre twist est le nombre de degrés effectué pendant l'extrusion
  311. pour un schéma détaillé voir :
  312. http://www.zpag.net/Machines_Simples/engrenage_droit_dent_helicoidale.htm
  313. ATTENTION !!
  314. Pour engrainer les différentes roues dentées doivent avoir :
  315. - le même MODULE RÉEL !!
  316. - Le même angle Bêta, pour un contact extérieur : beta1 = -beta2
  317. pour un contact intérieur : beta1 = beta2
  318. Or roue_dentee_2D correspond à la coupe transversale de la roue dentée, dans ce plan là il s'agit du module apparent.
  319. La conversion se fait grâce à la relation : mr = ma*cos(beta);
  320. */
  321. //CALCUL DES PARAMETRES APPARENTS
  322. ma = m/cos(beta);
  323. alpha_a = atan2(tan(alpha),cos(beta));
  324. //CALCUL DU TWIST
  325. /*Dans la suite tous les paramètres seront sur le cercle primitif. Pour calculer l'angle de rotation pendant l'extrusion il faut résoudre 2 triangles. Le premier est celui qui part du bord d'une dent à la base de la roue dentée (point A), monte à la verticale sur surface supérieure (point B) et termine sur le point équivalent au point A mais sur la surface supérieure (point C). Le deuxième triangle est OBC avec O le centre de la roue dentée.
  326. CARACTÉRISTIQUES CONNUES DE LA FIGURE :
  327. 0) l'angle BAC = beta
  328. 1) la distance AB est l'épaisseur de la roue dentée
  329. 2) les distances OB et OC sont le rayon du cercle primitif
  330. DÉDUCTIONS :
  331. Sachant que AB*tan(beta) = BC et que BC est une corde du cercle alors si on nomme l'angle BOC theta on peut écrire :
  332. 2*OC*sin(theta/2) = BC. En égalisant les deux relations on obtient :
  333. AB*tan(beta) = 2*OC*sin(theta/2)
  334. AB*tan(beta)/(2*OC) = sin(theta/2)
  335. asin(AB*tan(beta)/(2*OC)) = theta/2
  336. 2*asin(AB*tan(beta)/(2*OC)) = theta
  337. Theta est notre angle de twist. Les notations du script sont :
  338. AB = epaisseur
  339. beta = beta
  340. 2*OC = d = z*ma
  341. theta = angle
  342. On obtient donc :
  343. angle = 2*asin(epaisseur * tan(beta) / (z*ma));
  344. Cependant lorsque l'épaisseur devient trop importante alors on sort du domaine de définition de la fonction asin et le résultat devient incohérent. Pour palier à ce problème on va considérer que notre roue dentée est une succession de couches, comme lors d'une impression 3D. De ce fait on peut calculer l'angle entre 2 couches et par une règle de 3 on obtient le twist total.
  345. */
  346. h = 0.01; //couches fines
  347. gamma = 2*asin(h * tan(beta) / (z*ma));
  348. angle = epaisseur*gamma/h;
  349. linear_extrude(height = epaisseur, twist = angle)
  350. {roue_dentee_2D(z, ma, alpha_a, deport, evider);}
  351. }
  352. module roue_dentee_helicoidale_globoide(z = 40, m = 1, alpha = 20, beta = 60, epaisseur = 10, deport = 0, evider = false)
  353. {
  354. //CALCUL DES PARAMETRES APPARENTS
  355. ma = m/cos(beta);
  356. d = ma*z;
  357. da = d + 2*ma;
  358. difference()
  359. {
  360. roue_dentee_helicoidale(z, m, alpha, beta, epaisseur, deport, evider);
  361. rayon = epaisseur / (2*sin(2*atan2(epaisseur, (da-d))));
  362. translate([0, 0, epaisseur/2])
  363. {
  364. rotate_extrude()
  365. {
  366. translate([d/2 + rayon, 0, 0])
  367. {circle(rayon);}
  368. }
  369. }
  370. }
  371. }
  372. module roue_dentee_helicoidale_globoide_vis(z = 40, m = 1, alpha = 20, vis_diam = 10, deport = 0, evider = false)
  373. {
  374. //Calcul de l'angle beta
  375. /*C'est la vis qui va imposer son angle beta, car il dépend à la fois de son pas et de son diamètre,
  376. alors que pour la roue dentée il peut posséder n'importe quelle valeur.
  377. Si on développe une vis sans fin les filets seront des lignes droites espacées du pas de la vis.
  378. Par conséquent, la longueur d'un de ces filet vérifie :
  379. l*cos(beta) = 2*pi*r = pi*d
  380. l*sin(beta) = p
  381. avec r le rayon de la vis
  382. on en déduit que :
  383. p/(pi*d) = tan(beta)
  384. beta = atan(p/pi*d)
  385. */
  386. //CALCUL DES PARAMETRES APPARENTS
  387. beta = -atan(m/vis_diam);
  388. ma = m/cos(beta);
  389. d = ma*z;
  390. da = d + 2*ma;
  391. epaisseur = 2*sqrt( pow(vis_diam/2, 2) - pow(vis_diam/2 - ma, 2));
  392. difference()
  393. {
  394. roue_dentee_helicoidale(z, m, alpha, beta, epaisseur, deport, evider);
  395. translate([0, 0, epaisseur/2])
  396. {
  397. rotate_extrude()
  398. {
  399. #translate([ d/2 + vis_diam/2, 0, 0])
  400. {circle(r=vis_diam/2);}
  401. }
  402. }
  403. }
  404. }
  405. module roue_dentee_chevron(z = 40, m = 1, alpha = 20, beta = 60, epaisseur = 10, deport = 0, evider = false)
  406. {
  407. //CALCUL DES PARAMETRES APPARENTS
  408. ma = m/cos(beta);
  409. //CALCUL DU TWIST
  410. h = 0.1; //couches fines
  411. gamma = 2*asin(h * tan(beta) / (z*ma));
  412. angle = epaisseur*gamma/h;
  413. roue_dentee_helicoidale(z, m, alpha, beta, epaisseur/2, deport, evider);
  414. translate([0, 0, epaisseur/2])
  415. {
  416. rotate([0, 0, -angle/2])
  417. {roue_dentee_helicoidale(z, m, alpha, -beta, epaisseur/2, deport, evider);}
  418. }
  419. }
  420. module roue_dentee_couronne_2D(z = 10, m = 1, alpha = 20, deport = 0, marge = 10)
  421. {
  422. d = m * z;
  423. ha = m + deport;
  424. da = d + 2*ha;
  425. difference()
  426. {
  427. circle(d = da + marge);
  428. roue_dentee_2D(z, m, alpha, deport);
  429. }
  430. echo("diamètre de la couronne = ", da + marge);
  431. }
  432. /**************ENGRENAGE PLANÉTAIRE**************/
  433. function rayon_satellites(m, zp, zs) = m*(zp + zs)/2;
  434. function nbr_max_satellites(R, da) = floor(180/asin(da/(2*R)));
  435. function nbr_satellites_equilibre(zp, zs, nbr) = ceil((zp + zs)/nbr) == (zp + zs)/nbr ? nbr : nbr_satellites_equilibre(zp, zs, nbr - 1);
  436. module planetaire_2D(zp = 33, zs = 27, m = 1, alpha = 26, deport = 0, marge = 10)
  437. {
  438. /*DÉFINITIONS :
  439. Planétaires : roue dentée tournant autour d'un axe fixe
  440. Satellites : roue dentée tournant autour d'un axe mobile
  441. La roue dentée centrale est appelée : planétaire
  442. La roue dentée extérieure est appelée : couronne
  443. Ce module génère un engrenage planétaire (de type 1) à partir du nombre de dent du planétaire et des satellites,
  444. respectivement zp et zs
  445. Comme pour tous engrenages, les différentes roues engrènent au niveau de leurs cercles primitifs d.
  446. En ce plaçant dans le cas d'un engrenage planétaire composé d'un planétaire, de 2 satellites et
  447. d'une couronne, on comprend que le diamètre de la couronne est égale au diamètre du planétaire (dp)
  448. plus 2 fois le diamètres d'un satellite (ds).
  449. dc = dp + 2*ds
  450. Pour que les roues engrènent il est nécessaire qu'elles aient le même module, la formule générale qui lie
  451. le diamètre et le nombre de dent est :
  452. d = m*z
  453. On en déduit :
  454. dc = dp + 2*ds
  455. <=> m*zc = m*zp + 2*m*zs
  456. <=> m*zc = m*(zp + 2*zs)
  457. <=> zc = zp + 2*zs
  458. CONTRAINTES :
  459. 1)Pour maximiser le couple transmis, il faut maximiser le nombre de satellites. Cependant il existe une limite pour laquelle
  460. les satellites se chevaucheront. Pour touver le nombre de satellites maximum il faut comparer le diamètre de tête d'un satellite,
  461. avec la longueur du coté du polygone régulier crée par le centre des satellites.
  462. La longueur d'un coté du polygone est :
  463. l = 2*R*sin(180/n)
  464. avec R le rayon du cercle circonscrit
  465. n le nombre de cotés du polygone qui est égal à nbr_satellites
  466. Sachant que l > da on peut en déduire :
  467. <=> 2*R*sin(180/nbr_satellites) > da
  468. <=> sin(180/nbr_satellites) > da/(2*R)
  469. <=> 180/nbr_satellites > asin(da/(2*R))
  470. <=>180/asin(da/(2*R)) > nbr_satellites
  471. <=> nbr_satellites = floor(180/asin(da/(2*R)))
  472. On trouve ainsi le nombre maximum de satellites qui permet au train de continuer de fonctionner.
  473. 2)Connaitre le nombre maximum de satellites possible n'est pas suffisant, faut-il encore que l'engrenage soit équilibré.
  474. Pour se faire il faut respecter :
  475. (zp + zs)/nbr_satellites = k, avec k un nombre entier
  476. Cette condition permet de déterminer toutes les configurations possible.
  477. Exemple : zp = 20, zs = 20
  478. La condition nous indique la possibilité d'utiliser :
  479. 1, 2, 4, 5, 10 ou même 20 satellites.
  480. En combinant les 2 conditions on est capable de déterminer le nombre de satellites maximum pour générer un système équilibré.
  481. La formule de Willis permet de calculer le rapport de réduction, dans le cas d'un engrenage de type 1 :
  482. lambda = zs*zc/zs*zp = zc/zp
  483. */
  484. zc = zp + 2*zs;
  485. dp = m*zp;
  486. ds = m*zs;
  487. dc = m*zc;
  488. //calcul du rayon sur lequel circulent les satellites
  489. rayon = (dp + ds)/2;
  490. rapport1 = zc/zp + 1;
  491. rapport2 = zc/zs - 1;
  492. //on commence par placer le planétaire
  493. //les calculs qui suivent permettent d'orienter correctement la roue dentée
  494. l1 = pi*dp/(2*zp) + 2*deport*sin(alpha);
  495. la1 = 2*degre(l1/dp);
  496. db1 = dp * cos(alpha);
  497. Idp = intersect(db1, dp);
  498. angle1 = atan2( developpante_y(db1/2,Idp), developpante_x(db1/2,Idp));
  499. angle_base1 = la1 + 2*angle1;
  500. rotate([0, 0, 360*(rapport1)*$t - angle_base1/2.0 + la1 + 180*(zs/zp + 2)])
  501. {
  502. roue_dentee_2D(z = zp, m = m, alpha = alpha, deport = deport);
  503. }
  504. //puis les satellites
  505. //pareil ici
  506. l2 = pi*ds/(2*zs) + 2*deport*sin(alpha);
  507. la2 = 2*degre(l2/ds);
  508. db2 = ds * cos(alpha);
  509. Ids = intersect(db2, ds);
  510. angle2 = atan2( developpante_y(db2/2,Ids), developpante_x(db2/2,Ids) );
  511. angle_base2 = la2 + 2*angle2;
  512. nbr_satellites = nbr_satellites_equilibre(zp, zs, nbr_max_satellites(rayon_satellites(m, zp, zs), m*zs+2*(m+deport)));
  513. if( ceil((zp + zs)/nbr_satellites) == (zp + zs)/nbr_satellites)
  514. {
  515. for(i=[1:nbr_satellites])
  516. {
  517. translate([ rayon*cos(360*$t + 360*i/nbr_satellites), rayon*sin(360*$t + 360*i/nbr_satellites), 0])
  518. {
  519. rotate([0, 0, -360*rapport2*$t - angle_base2/2 - 360*i/nbr_satellites * rapport2])
  520. {roue_dentee_2D(z = zs, m = m, alpha = alpha, deport = deport);}
  521. }
  522. }
  523. }
  524. //et enfin on place la couronne
  525. //et pareil là
  526. lc = pi*dc/(2*zc) + 2*deport*sin(alpha);
  527. lac = 2*degre(lc/dc);
  528. dbc = dc * cos(alpha);
  529. Idc = intersect(dbc, dc);
  530. anglec = atan2( developpante_y(dbc/2,Idc), developpante_x(dbc/2,Idc) );
  531. angle_basec = lac + 2*anglec;
  532. rotate([0, 0, -angle_basec/2])
  533. {roue_dentee_couronne_2D(z = zc, m = m, alpha = alpha, deport = deport, marge = marge);}
  534. echo("nombre de dent de la couronne = ", zc);
  535. echo("rapport = ", zc/zp);
  536. echo(nbr_satellites = nbr_satellites);
  537. }