E
electroremy
Ouvrier
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
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