J'ai utilisé la méthode de Telson, chercher la variation maximum et lui attribuer la vitesse max.
Voila ce que j'ai réussi à pondre :
//on appel la fonction comme ceci : Mouvements_moteurs(50, 20, 0, 0, 15); //Rotation 1, Bras 1, Bras 2, Rotation 2, Bras 3 void Mouvements_moteurs(int Rotation1, int Bras1, int Bras2, int Rotation2, int Bras3){ int boucle = 0; float temps_mouvement; float Variation_angle[6]; //Déclaration du tableau pour les différents angles et calcul des variaitions d'angle (absolu) Variation_angle[0] = 1; Variation_angle[1] = abs(position_Rotation1-Rotation1); Variation_angle[2] = abs(position_Bras1-Bras1); Variation_angle[3] = abs(position_Bras2-Bras2); Variation_angle[4] = abs(position_Rotation2-Rotation2); Variation_angle[5] = abs(position_Bras3-Bras3); for(int i = 0; i <= 5; i++){ Variation_angle[0] = max(Variation_angle[0],Variation_angle[i]); // Compare les valeurs pour connaitre la plus grande variation. } //J'assigne à chaque moteur sa futur position Calculs_step_moteur(Rotation1, 1); stepper_Rotation1.moveTo(calcul_step); position_Rotation1 = Rotation1; Calculs_step_moteur(Bras1, 2); stepper_Bras1.moveTo(calcul_step); position_Bras1 = Bras1; Calculs_step_moteur(Bras2, 3); stepper_Bras2.moveTo(calcul_step); position_Bras2 = Bras2; Calculs_step_moteur(Rotation2, 4); stepper_Rotation2.moveTo(calcul_step); position_Rotation2 = Rotation2; Calculs_step_moteur(Bras3, 5); stepper_Bras3.moveTo(calcul_step); position_Bras3 = Bras3; while(boucle != 2){ if(Variation_angle[0] == Variation_angle[1]){ //********* Rotation 1 ********* Calculs_step_moteur(Variation_angle[1], 1); temps_mouvement = calcul_step/vitesse_Rotation1; } else{ Calculs_step_moteur(Rotation1, 1); vitesse_Rotation1 = calcul_step/temps_mouvement; stepper_Rotation1.setMaxSpeed(vitesse_Rotation1); } if(Variation_angle[0] == Variation_angle[2]){ //********* Bras 1 ********* Calculs_step_moteur(Variation_angle[2], 2); temps_mouvement = calcul_step/vitesse_Bras1; } else{ Calculs_step_moteur(Bras1, 2); vitesse_Bras1 = calcul_step/temps_mouvement; stepper_Bras1.setMaxSpeed(vitesse_Bras1); } if(Variation_angle[0] == Variation_angle[3]){ //********* Bras 2 ********* Calculs_step_moteur(Variation_angle[3], 3); temps_mouvement = calcul_step/vitesse_Bras2; } else{ Calculs_step_moteur(Bras2, 3); vitesse_Bras2 = calcul_step/temps_mouvement; stepper_Bras2.setMaxSpeed(vitesse_Bras2); } if(Variation_angle[0] == Variation_angle[4]){ //********* Rotation 2 ********* Calculs_step_moteur(Variation_angle[4], 4); temps_mouvement = calcul_step/vitesse_Rotation2; } else{ Calculs_step_moteur(Rotation2, 4); vitesse_Rotation2 = calcul_step/temps_mouvement; stepper_Rotation2.setMaxSpeed(vitesse_Rotation2); } if(Variation_angle[0] == Variation_angle[5]){ //********* Bras 3 ********* Calculs_step_moteur(Variation_angle[5], 5); temps_mouvement = calcul_step/vitesse_Bras3; } else{ Calculs_step_moteur(Bras3, 5); vitesse_Bras3 = calcul_step/temps_mouvement; stepper_Bras3.setMaxSpeed(vitesse_Bras3); } boucle ++ ; } if(hors_limite == true){ while(stepper_Rotation1.isRunning() || stepper_Bras1.isRunning() || stepper_Bras2.isRunning()|| stepper_Rotation2.isRunning() || stepper_Bras3.isRunning()){ stepper_Rotation1.run();stepper_Bras1.run();stepper_Bras2.run();stepper_Rotation2.run();stepper_Bras3.run(); } } // On remt la vitesse maximal pour chaque moteur pour les prochaines fois vitesse_Rotation1 = 1000.0; vitesse_Bras1 = 1000;//1000 vitesse_Bras2 = 800.0; //3000 vitesse_Rotation2 = 250.0; vitesse_Bras3 = 500;//500 stepper_Rotation1.setMaxSpeed(vitesse_Rotation1);stepper_Bras1.setMaxSpeed(vitesse_Bras1);stepper_Bras2.setMaxSpeed(vitesse_Bras2);stepper_Rotation2.setMaxSpeed(vitesse_Rotation2);stepper_Bras3.setMaxSpeed(vitesse_Bras3); } void Calculs_step_moteur(int angle, int moteur_step){ //fonction qui calcul les steps moteur et évite les hors-limites switch(moteur_step){ case 1: //Rotation 1 calcul_step = (angle/0.1)/(1.8/4); //0.1 correspond au rapport menant/mené donc 10/100 ; 1.8°/Step ; 4 = 1/4 if ((calcul_step < -888.9) || (calcul_step > 5111.2)){ //limite Rotation 1 à -40° et +230° lcd.clear(); lcd.print(" Hors limites ! ");lcd.setCursor(0, 1);lcd.print("Max 230");lcd.print((char)223);lcd.print(" Min -40");lcd.print((char)223); delay(2300); hors_limite = false; return; } break; case 2: //Bras 1 calcul_step = (angle/0.1299)/(1.8/8); //0.1299 correspond au rapport menant/mené donc 10/77 ; 1.8°/Step ; 8 = 1/8 if ((calcul_step < -3422) || (calcul_step > 3422)){ //limite Rotation 1 à -100° et +100° lcd.clear(); lcd.print(" Hors limites ! ");lcd.setCursor(0, 1);lcd.print("Max 100");lcd.print((char)223);lcd.print("Min -100");lcd.print((char)223); delay(2300); hors_limite = false; return; } break; case 3: //Bras 2 calcul_step = (angle/(0.1639/5))/(1.8/2); //0.1639 correspond au rapport menant/mené donc 10/61 ; 1.8°/Step ; 2 = 1/2 if ((calcul_step < -4068) || (calcul_step > 4068)){ //limite Rotation 1 à -120° et +120° lcd.clear(); lcd.print(" Hors limites ! ");lcd.setCursor(0, 1);lcd.print("Max 120");lcd.print((char)223);lcd.print(" Min -120");lcd.print((char)223); delay(2300); hors_limite = false; return; } break; case 4: //Rotation 2 calcul_step = angle/(1.8/4); // 1.8°/Step ; 4 = 1/4 if ((calcul_step < -100000) || (calcul_step > 100000)){ //limite Rotation 1 à -40° et +230° lcd.clear(); lcd.print(" Hors limites ! ");lcd.setCursor(0, 1);lcd.print("Max 230");lcd.print((char)223);lcd.print(" Min -40");lcd.print((char)223); delay(2300); hors_limite = false; return; } break; case 5: //Bras 3 calcul_step = (angle/0.2222)/(1.8/4); //0.2222 correspond au rapport menant/mené donc 10/45 ; 1.8°/Step ; 4 = 1/4 if ((calcul_step < -1000.2) || (calcul_step > 1000.2)){ //limite Rotation 1 à -100° et +100° lcd.clear(); lcd.print(" Hors limites ! ");lcd.setCursor(0, 1);lcd.print("Max 100");lcd.print((char)223);lcd.print("Min -100");lcd.print((char)223); delay(2300); hors_limite = false; return; } break; } valeur_Angle = ""; }Le problème que j'ai, c'est que la premiers fois ça fonctionne bien, tous les mouvements finissent en même temps et la seconde fois, j'ai un soucis avec les vitesses. les mouvements vont bien à leurs nouvelles positions mais hyper lentement.
Je peux me tromper mais quick guess comme ça : dis moi ton problème d'aller lentement , c'est pas par ce que tu essaye d'aller dans l'autre sens et que tu as des angles négatifs et que le " max " de tes angles et donc celui dont la valeur absolue est la plus faible ??
Essaye ton code en allant deux fois dans le même sens juste pour vérifier avec tout tes angles positifs =)
Si l'erreur est bien là je te laisse essayer de corriger par toi même normalement j'ai donné suffisamment de détails pour que tu trouves
Sinon je vais regarder ça un peu plus en détails car on peut pas laisser un si beau bras robot avec un petit problème de code comme ça =)
ça me fait penser au super robot de Pascal aka serveur perso qu'on pouvait piloter à distance et qui avait un super lidar, mais qui était pas capable de se localiser dans la carte , planifier une trajectoire et éviter un obstacle ( Heureusement maintenant on a remédié à ces 3 points avec le robot de pascal
)