Profil denture couronne

  • Auteur de la discussion electroremy
  • Date de début
electroremy
electroremy
Apprenti
23 Mar 2014
147
  • Auteur de la discussion
  • #1
Bonjour

Je suis en train de développer un logiciel maison, qui sert à dessiner des pièces puis à les usiner avec une fraiseuse CNC 2.5D

Mon programme est capable de générer le profil d'un engrenage à denture droite, pour différentes valeurs de nombre de dents, de module, d'angle de pression et de déport.

Par contre, je ne sais pas comment générer le profil d'un engrenage de type "couronne" donc avec denture intérieure.

En effet, il ne suffit pas de prendre le profil d'un engrenage "en négatif", il y a interférence comme le montre la deuxième image :





Voici le code source générant le profil (en VB.NET) :

Public Sub AjouterEngrenage(ByVal Nom As String, ByVal RefForme As Integer, ByVal TypeUsinage As TypeForme, ByVal CentreX As Double, ByVal CentreY As Double, ByVal ModuleE As Double, ByVal NbDents As Integer, ByVal DebutAngle As Double, Optional CoefDeport As Double = 0, Optional Alpha As Double = 20, Optional Resolution As Integer = 100)
Dim Fo As Forme_2D
Dim Ar As Arc_2D
Dim Pt1 As PointReel_2D, Pt2 As PointReel_2D
Dim Li As Ligne_2D

'Dim RayonCreux As Double
Dim RayonTete As Double
Dim RayonPied As Double
Dim RayonMini As Double
Dim i As Integer

Dim A1 As Double
Dim A2 As Double
Dim A3 As Double
Dim A4 As Double
Dim A5 As Double
Dim A6 As Double

'Paramètres de base :
'ModuleE
'NbDents
'Alpha
'CoefDeport

'REMARQUE : DiametrePrimitif = ModuleE * NbDents

'Paramètres calculés :
Dim InvAlpha As Double
Dim AlphaExt As Double
Dim RayonBase As Double
Dim RayonCreux As Double
Dim DemiAngleBase As Double
Dim RayonTangente As Double

'Equation cylindrique :
Dim R As Double
Dim Theta As Double
Dim t As Double, j As Integer
Dim X As Double, Y As Double, tmp As Double

'Tous les angles doivent êtres en DEGRES
If CoefDeport < -0.3 Then CoefDeport = -0.3
If CoefDeport > 0.7 Then CoefDeport = 0.7
InvAlpha = Math.Tan(Alpha * DEG_TO_RAD) - Math.PI * Alpha / 180
AlphaExt = RAD_TO_DEG * Math.Acos(NbDents * Math.Cos(Alpha * DEG_TO_RAD) / (NbDents + 2 + 2 * CoefDeport))
RayonBase = ModuleE * NbDents * Math.Cos(Alpha * DEG_TO_RAD) / 2
RayonCreux = ModuleE * ((NbDents / 2) - 1.25 + CoefDeport)
DemiAngleBase = (90 / Math.PI) * ((Math.PI / NbDents) + 2 * InvAlpha)
If NbDents < 41 Then
RayonTangente = RayonCreux
Else
RayonTangente = RayonBase - 2
End If

Fo = New Forme_2D(Nom, RefForme, TypeUsinage)
Liste_Formes_2D.Add(Fo)


'RayonCreux = (ModuleE * NbDents - 2.5 * ModuleE) * 0.5
'RayonTete = (ModuleE * NbDents + 2 * ModuleE) * 0.5
For i = 0 To NbDents - 1
A1 = i * 360 / NbDents + DebutAngle
'ON DOIT FAIRE VARIER T de 0 à 1 :
'Courbe n°1 :
For j = 0 To Resolution
t = j * 1 / Resolution
R = RayonBase / Math.Cos(t * AlphaExt * DEG_TO_RAD)
Theta = (180 / Math.PI) * (Math.Tan(t * AlphaExt * DEG_TO_RAD) - Math.PI * (t * AlphaExt) / 180) - DemiAngleBase

'Conversion coordonnées cylindriques en cartésiennes :
X = R * Math.Cos(Theta * DEG_TO_RAD)
Y = R * Math.Sin(Theta * DEG_TO_RAD)
'Rotation pour la dent en cours :
tmp = X * Math.Cos(A1 * DEG_TO_RAD) - Y * Math.Sin(A1 * DEG_TO_RAD)
Y = X * Math.Sin(A1 * DEG_TO_RAD) + Y * Math.Cos(A1 * DEG_TO_RAD)
X = tmp
'Translation au centre de l'engrennage :
X = CentreX + X
Y = CentreY + Y
If j = 0 Then
RayonMini = R
Pt1 = New PointReel_2D(X, Y, False) : Fo.Liste_Points_2D.Add(Pt1)
ElseIf j = Resolution Then
Pt2 = New PointReel_2D(X, Y, True) : Fo.Liste_Points_2D.Add(Pt2)
Li = New Ligne_2D(Pt1, Pt2) : Fo.Liste_Lignes_2D.Add(Li)
Pt1 = Pt2
A2 = Theta
RayonTete = R
Else
Pt2 = New PointReel_2D(X, Y, False) : Fo.Liste_Points_2D.Add(Pt2)
Li = New Ligne_2D(Pt1, Pt2) : Fo.Liste_Lignes_2D.Add(Li)
Pt1 = Pt2
End If
Next
'Courbe n°2
For j = 0 To Resolution
t = j * 1 / Resolution
R = RayonTangente + t * (RayonBase - RayonTangente)
Theta = -DemiAngleBase

'Conversion coordonnées cylindriques en cartésiennes :
X = R * Math.Cos(Theta * DEG_TO_RAD)
Y = R * Math.Sin(Theta * DEG_TO_RAD)
'Rotation pour la dent en cours :
tmp = X * Math.Cos(A1 * DEG_TO_RAD) - Y * Math.Sin(A1 * DEG_TO_RAD)
Y = X * Math.Sin(A1 * DEG_TO_RAD) + Y * Math.Cos(A1 * DEG_TO_RAD)
X = tmp
'Translation au centre de l'engrennage :
X = CentreX + X
Y = CentreY + Y
If j = 0 Then
RayonPied = R
A4 = A1 + Theta
If RayonPied > RayonMini Then
RayonPied = RayonMini
Exit For
End If
Pt1 = New PointReel_2D(X, Y, True) : Fo.Liste_Points_2D.Add(Pt1)
ElseIf j = Resolution Then
Pt2 = New PointReel_2D(X, Y, False) : Fo.Liste_Points_2D.Add(Pt2)
Li = New Ligne_2D(Pt1, Pt2) : Fo.Liste_Lignes_2D.Add(Li)
Pt1 = Pt2
Else
Pt2 = New PointReel_2D(X, Y, False) : Fo.Liste_Points_2D.Add(Pt2)
Li = New Ligne_2D(Pt1, Pt2) : Fo.Liste_Lignes_2D.Add(Li)
Pt1 = Pt2
End If
Next

If i = 0 Then
A6 = A4
Else
'On trace l'arc entre les pieds des dents :
'entre la valeur courante de A4 et la valeur précédente de A5
Ar = New Arc_2D(CentreX, CentreY, RayonPied, A4, A5 - A4, Fo, False) : Fo.Liste_Arcs_2D.Add(Ar)
End If

'Courbe n°1 symétrique :
For j = 0 To Resolution
t = j * 1 / Resolution
R = RayonBase / Math.Cos(t * AlphaExt * DEG_TO_RAD)
Theta = (180 / Math.PI) * (Math.Tan(t * AlphaExt * DEG_TO_RAD) - Math.PI * (t * AlphaExt) / 180) - DemiAngleBase

'Conversion coordonnées cylindriques en cartésiennes :
X = R * Math.Cos(Theta * DEG_TO_RAD)
Y = -R * Math.Sin(Theta * DEG_TO_RAD)
'Rotation pour la dent en cours :
tmp = X * Math.Cos(A1 * DEG_TO_RAD) - Y * Math.Sin(A1 * DEG_TO_RAD)
Y = X * Math.Sin(A1 * DEG_TO_RAD) + Y * Math.Cos(A1 * DEG_TO_RAD)
X = tmp
'Translation au centre de l'engrennage :
X = CentreX + X
Y = CentreY + Y
If j = 0 Then
RayonMini = R
Pt1 = New PointReel_2D(X, Y, False) : Fo.Liste_Points_2D.Add(Pt1)
ElseIf j = Resolution Then
Pt2 = New PointReel_2D(X, Y, True) : Fo.Liste_Points_2D.Add(Pt2)
Li = New Ligne_2D(Pt1, Pt2) : Fo.Liste_Lignes_2D.Add(Li)
Pt1 = Pt2
A3 = -Theta
Else
Pt2 = New PointReel_2D(X, Y, False) : Fo.Liste_Points_2D.Add(Pt2)
Li = New Ligne_2D(Pt1, Pt2) : Fo.Liste_Lignes_2D.Add(Li)
Pt1 = Pt2
End If
Next
'Courbe n°2 symétrique :
For j = 0 To Resolution
t = j * 1 / Resolution
R = RayonTangente + t * (RayonBase - RayonTangente)
Theta = -DemiAngleBase

'Conversion coordonnées cylindriques en cartésiennes :
X = R * Math.Cos(Theta * DEG_TO_RAD)
Y = -R * Math.Sin(Theta * DEG_TO_RAD)
'Rotation pour la dent en cours :
tmp = X * Math.Cos(A1 * DEG_TO_RAD) - Y * Math.Sin(A1 * DEG_TO_RAD)
Y = X * Math.Sin(A1 * DEG_TO_RAD) + Y * Math.Cos(A1 * DEG_TO_RAD)
X = tmp
'Translation au centre de l'engrennage :
X = CentreX + X
Y = CentreY + Y
If j = 0 Then
A5 = A1 - Theta
If R > RayonMini Then Exit For
Pt1 = New PointReel_2D(X, Y, True) : Fo.Liste_Points_2D.Add(Pt1)
ElseIf j = Resolution Then
Pt2 = New PointReel_2D(X, Y, False) : Fo.Liste_Points_2D.Add(Pt2)
Li = New Ligne_2D(Pt1, Pt2) : Fo.Liste_Lignes_2D.Add(Li)
Pt1 = Pt2
Else
Pt2 = New PointReel_2D(X, Y, False) : Fo.Liste_Points_2D.Add(Pt2)
Li = New Ligne_2D(Pt1, Pt2) : Fo.Liste_Lignes_2D.Add(Li)
Pt1 = Pt2
End If
Next

'Arc correspondant au sommet des dents :
Ar = New Arc_2D(CentreX, CentreY, RayonTete, A1 + A2, A3 - A2, Fo, False) : Fo.Liste_Arcs_2D.Add(Ar)
Next

'Arc entre le pied de la dernière dent et de la première :
Ar = New Arc_2D(CentreX, CentreY, RayonPied, A5, 360 + A6 - A5, Fo, False) : Fo.Liste_Arcs_2D.Add(Ar)

'On ajoute le centre pour qu'il soit sélectionnable avec l'accroche objet (en effet, on a créé les arcs sans centre accrochable) :
Fo.Liste_Points_2D.Add(New PointReel_2D(CentreX, CentreY))
End Sub


Merci pour vos conseils :)
 
Bbr
Bbr
Compagnon
16 Fev 2012
2 918
F-76100 Rouen
Bonsoir,

Il me semble que les diamètre de tête et de pied sont inversés pour une denture intérieure (hauteur 1m et creux 1.25m), de plus il y a aussi un "raccord en creux" dans les coins des dents pour éviter ces interférences...

Pour plus d'info la dessus il faudrait demander à un expert denture comme Méandre. :prayer:

Cordialement,
Bertrand
 
Dodore
Dodore
Compagnon
27 Oct 2008
16 786
F-69400 villefranche sur saone
Bonsoir
T'es ch...t je vivais heureux avant , je ne m'étais jamais posé de question a ce sujet:-D:-D
Une remarque tout de même
Le petit pignon a bien des dents exter
Mais la couronne à des dents inter et il ne me semble pas que le profil de ces dents soit le meme que sur un pignon classique et aparement tu as pris un profil exter pour le mettre a l'intérieur de ta couronne
Il doit certainement y avoir quelque part une inversion de profil
 
electroremy
electroremy
Apprenti
23 Mar 2014
147
  • Auteur de la discussion
  • #4
Bonjour,

sur l'image, les trois engrenages dessinés par mon programme sont tous des engrenages à denture externe classique

l'engrenage du milieu n'est pas une couronne, j'ai fait cette image pour mettre en évidence qu'une couronne n'est pas juste un engrenage "en creux"

j'ai continué mes recherches et j'ai trouvé un super site avec des cours en ligne : http://www.raymondnicolet.ch/telechargement.htm; le volume n°3 traite des engrenages en détail (environ 400 pages) avec de la chance la réponse à mes questions se trouve probablement dedans :)

si je trouve je publierais le code permettant de calculer tout types d'engrenages ici :)

A+
 
G
gaston48
Compagnon
26 Fev 2008
9 699
59000
Bonjour,
Dans ton programme, ou se trouve le calcul de la développante s'il te plait ?
 
electroremy
electroremy
Apprenti
23 Mar 2014
147
  • Auteur de la discussion
  • #6
Mon programme calcule chaque dent 'i' en plusieurs étapes, voici les grandes étapes (le code complet est dans mon premier post) :

- Données du calcul :
'ModuleE
'NbDents
'Alpha (par défaut 20°)
'CoefDeport (par défaut 0)


- calcul des autres paramètres :
InvAlpha = Math.Tan(Alpha * DEG_TO_RAD) - Math.PI * Alpha / 180
AlphaExt = RAD_TO_DEG * Math.Acos(NbDents * Math.Cos(Alpha * DEG_TO_RAD) / (NbDents + 2 + 2 * CoefDeport))
RayonBase = ModuleE * NbDents * Math.Cos(Alpha * DEG_TO_RAD) / 2
RayonCreux = ModuleE * ((NbDents / 2) - 1.25 + CoefDeport)
DemiAngleBase = (90 / Math.PI) * ((Math.PI / NbDents) + 2 * InvAlpha)
If NbDents < 41 Then
RayonTangente = RayonCreux
Else
RayonTangente = RayonBase - 2
End If


- calcul de l'angle correspondant à la position de la dent n°i :
A1 = i * 360 / NbDents + DebutAngle

- courbe n°1 qui est la partie supérieure du profil gauche de la dent (t varie de 0 à 1 avec un pas définit par le nombre de points de la courbe, qui est faite de seguements de droites) :
R = RayonBase / Math.Cos(t * AlphaExt * DEG_TO_RAD)
Theta = (180 / Math.PI) * (Math.Tan(t * AlphaExt * DEG_TO_RAD) - Math.PI * (t * AlphaExt) / 180) - DemiAngleBase
X = R * Math.Cos(Theta * DEG_TO_RAD)
Y = R * Math.Sin(Theta * DEG_TO_RAD)


- la courbe n°1 est tournée pour correspondre à la dent n°i
tmp = X * Math.Cos(A1 * DEG_TO_RAD) - Y * Math.Sin(A1 * DEG_TO_RAD)
Y = X * Math.Sin(A1 * DEG_TO_RAD) + Y * Math.Cos(A1 * DEG_TO_RAD)
X = tmp


- et enfin on fait la translation pour tenir compte de la position du centre de l'engrennage :
X = CentreX + X
Y = CentreY + Y


- courbe n°2 qui est la partie inférieure du profil gauche de la dent - REMARQUE IMPORTANTE : pour certaines valeurs d'angle, cette courbe est de longeur nulle ; si on essaye de la calculer, le calcul donne un résultat abérant, dans le programme un test est fait pour ne pas calculer cette courbe
R = RayonTangente + t * (RayonBase - RayonTangente)
Theta = -DemiAngleBase
X = R * Math.Cos(Theta * DEG_TO_RAD)
Y = R * Math.Sin(Theta * DEG_TO_RAD)


- la courbe n°2 est tournée pour correspondre à la dent n°i
tmp = X * Math.Cos(A1 * DEG_TO_RAD) - Y * Math.Sin(A1 * DEG_TO_RAD)
Y = X * Math.Sin(A1 * DEG_TO_RAD) + Y * Math.Cos(A1 * DEG_TO_RAD)
X = tmp


- et enfin on fait la translation pour tenir compte de la position du centre de l'engrennage :
X = CentreX + X
Y = CentreY + Y


- pour obtenir le profil DROIT de la dent, on répète la même chose mais avec une symétrie suivant l'axe Y (donc au moment de convertir les coordonnées polaires en cartésiennes ont fait Y = - xxx au lieu de Y = + xxx)

- il faut ensuite dessiner un arc de cercle au sommet de la dent, pour relier les deux profils droits et gauche :
Ar = New Arc_2D(CentreX, CentreY, RayonTete, A1 + A2, A3 - A2, Fo, False) : Fo.Liste_Arcs_2D.Add(Ar)

- et enfin un autre arc de cercle pour relier le pied de la dent i avec la dent i-1 :
Ar = New Arc_2D(CentreX, CentreY, RayonPied, A4, A5 - A4, Fo, False) : Fo.Liste_Arcs_2D.Add(Ar)

Les équations polaires des courbes n°1 et n°2 sont issues de la mise en équation d'un morceau de développante de cercle, avec la prise en compte du déport, de l'angle de pression et du nombre de dents. Ces équations sont utilisées en CAO / FAO quand on veut représenter précisément ou découper un engrenage. On avait calculé ces équations en cours, ça n'était pas simple et l'enseignement était fait en mode bourrage de crâne (il y a ~15 ans pour moi :P ) ; on peut aussi retrouver ces équations dans des tutoriels de logiciels CAO ou FAO.

Par contre, ni en cours, ni dans les tutos, je n'ai vu la mise en équation du profil d'une couronne; dans mon manuel de mécanique, j'ai juste le dessin d'une couronne avec les différents diamètres et c'est tout.

En fait, maintenant que je suis en train de créer un logiciel et que je commence à fabriquer des choses concrètes, je me rends compte que pas mal de cours expliquent la théorie mais pas jusqu'au bout, il manque souvent la dernière étape permettant de faire une application pratique.

Ainsi, pour ce qui est des engrenages, très concrètement, avoir X=f(t) et Y=g(t) décrivant la forme d'une dent avec t allant de 0 à 1 est ce qu'il me faut mais beaucoup de livres et de cours ne donnent pas la réponse. Ils explique juste comment construite la développante de cercle avec une ficelle ou quelque chose qui s'en approche grossièrement point à point avec un compas, une règle et une équerre.

C'est pour ça que je demande si quelqu'un sait le faire sur le forum :)

Surtout qu'avec ce genre de choses très techniques c'est facile de croire qu'on a trouvé la bonne solution avec un dessin qui à l'air correct à l'écran... mais qui coince, qui a du jeu et/ou qui frotte trop une fois usiné :P

Le cours que je viens de télécharger sur http://www.raymondnicolet.ch/ est beaucoup plus complet que tout ce que j'ai vu alors, je vais me plonger dedans. Mais si quelqu'un a la solution sur le forum qu'il n'hésite pas à la publier :)
 
G
gaston48
Compagnon
26 Fev 2008
9 699
59000
Merci beaucoup electroremy, je vais essayer d'approfondir à tête reposée. Tes équations sont reprises dans
le Nicolet aussi il me semble. N'oublie pas de tester le logiciel Filengrène de Méandre. Il simule également
les couronnes intérieures avec possibilité d'export en dxf pour comparer avec tes profils.

fileng.jpg

fileng2.jpg
 
Dernière édition:
electroremy
electroremy
Apprenti
23 Mar 2014
147
  • Auteur de la discussion
  • #8
C'est quoi "le Nicolet" ?

Le logiciel de Méandre à l'air pas mal du tout... et il est fait en VB6 (je développe en VB5 et en VB.NET) j'aimerais jeter un oeuil au code source :P

A bientôt !
 
Haut