Coucou Path, simple je sais pas vu comme je me suis pris la tête dessus, mais pour quelqu'un avec de bonnes connaissances en math cela ne doit poser aucun problème, je place le code, n'hésite pas à poser des questions.
Par contre pour l'instant je ne suis que sur un seul servomoteur pour tester, je vais attaquer le reste après, mais déjà vos impressions m'intéresse.
from Adafruit_PWM_Servo_Driver import PWM
import time
import numpy as np
pwm = PWM(0x40, debug = False)
pwm.setPWMFreq(50)
anglemin = 0
anglemax = 340
servomin = 94 #JX300 95#HD 515
servomax = 537 #JX300 551#HD 100
servo = 9
initservo = 225 #position du servo qui sera égal au 0 trigonométrique
r = 33.2 #r est égal à la longueur du segment
def fmapservo (posinit, posfin) : #fonction convertisseur, position du servo avec le 0 trigonométrique
result = posinit + posfin
return result
def fdegres () :
result = int((degres - anglemin) * (servomax - servomin) / (anglemax - anglemin) + servomin)
return result
def fangletrigo (value) : #fonction qui nous permet de calculer
theta, thetad = np.radians(value), value
tsin, tcos = round(np.sin(theta), 2), round(np.cos(theta), 2)
rsin, rcos = round(r * tsin, 2), round(r * tcos, 2)
sinr, cosr = round(np.degrees(np.arcsin(rsin / r))), round(np.degrees(np.arccos(rcos / r)))
maty = np.array([[tcos, 0, tsin], [0, 1, 0], [-tsin, 0, tcos]])
mr = np.array([[r], [0], [r]])
resmatymr = maty * mr
print ("-----")
print ("Test avec une matrice de rotation sur l'axe Y pour vérification \n")
print ("{0} \n * \n{1} \n = \n{2}".format(maty, mr, resmatymr))
print ("-----")
print ("r : {0} * sin({1}) = {2} ".format(r, tsin, rsin))
print ("r : {0} * cos({1}) = {2} ".format(r, tcos, rcos))
print ("arcsin : {0} / r : {1} = {2} ".format(rsin, r, sinr))
print ("arccos : {0} / r : {1} = {2} ".format(rcos, r, cosr))
if value >= 180 :
result = 180 + sinr
print ("-----")
print ("Résultat de 180 + sinus en récupérant le signe")
print (result)
elif value >= 90 :
result = cosr
print ("-----")
print ("Résultat du cosinus")
print (result)
elif value <= -180 :
result = -180 + (np.sign(value)*sinr)
print ("-----")
print ("Résultat de -180 + sinus en récupérant le signe")
print (result)
elif value <= -90 :
result = np.sign(value)*cosr
print ("-----")
print ("Résultat du cosinus en récupérant le signe")
print (result)
else :
result = sinr
print ("-----")
print ("Résultat du sinus")
print (sinr)
return result
while True :
angletrigo = fangletrigo((int(input("Valeur en degrés : "))))
degres = round(fmapservo(initservo, angletrigo), 0)
print ("-----")
print ("angle trigo : {0} ; position du servo : {1}".format(angletrigo, degres))
print ("-----")
pwm.setPWM(servo, 0, fdegres())
ps : j'ai laissé tous les print si besoin.
dessous un test avec -180°
Valeur en degrés : -180
-----
Test avec une matrice de rotation sur l'axe Y pour vérification
[[-1. 0. -0.]
[ 0. 1. 0.]
[ 0. 0. -1.]]
*
[[ 33.2]
[ 0. ]
[ 33.2]]
=
[[-33.2 0. -0. ]
[ 0. 0. 0. ]
[ 0. 0. -33.2]]
-----
r : 33.2 * sin(-0.0) = -0.0
r : 33.2 * cos(-1.0) = -33.2
arcsin : -0.0 / r : 33.2 = -0.0
arccos : -33.2 / r : 33.2 = 180.0
-----
Résultat de -180 + sinus en récupérant le signe
-180.0
-----
angle trigo : -180.0 ; position du servo : 45.0
On retrouve le map du servo sur le cercle trigo.
Merci ^^
Modifié par Oliver17, 02 mai 2017 - 05:32 .