Servomoteurs arduino mega 2560

Bonjour,
Je suis actuellement depuis presque un an et demi sur la fabrication d'un robot chien et je rencontre un problème avec quelques servomoteurs.
J'utilise une Arduino Méga qui contrôle 12 servomoteurs alimentés par une batterie et non pas par l'Arduino elle même. Je n'utilise aucun driver et cela marche parfaitement. Jusque là j'avais programmé chaque mouvement de chaque servomoteurs pour que mon chien puisse avancer. Mais cette méthode n'est pas du tout optimale donc je me tourne actuellement vers la cinématique inverse.
J'ai donc un programme contenant tous les calculs nécessaires mais lorsque je le téléverse deux des servomoteurs ne réagissent pas, comme s'ils ne recevaient pas de signal de l'Arduino. J'ai d'abord pensé à un problème de connectique donc j'ai vérifié toutes les connections mais cela ne change rien. En revanche, lorsque je téléverse mon ancien programme, les deux servomoteurs se remettent à fonctionner.
Voici mon programme avec les calculs: (j'ai un problème avec le "servo2" et le "servo1")

#include<Servo.h>


// Angles de marche

float anglesup;
float anglemid;
float angleinf;


// Nouveaux angles avec prise en compte d'une avance horizontale

float newanglesup;
float newanglemid;
float newangleinf;


// Longueurs finales des pattes:

float lenght;
float newlenght;
float olenght;



// Paramètres d'avance

float Xavance;
float teta;


// Paramètres avec prise en compte d'une avance horizontale et verticale:

float avnewlenght;
float avnewanglesup;
float avnewanglemid;
float avnewangleinf;
float XYavance;
float Yavance;
float XYteta;


Servo servo1;
Servo servo2;
Servo servo3;
Servo servo4;
Servo servo5;
Servo servo6;
Servo servo7;
Servo servo8;
Servo servo9;
Servo servo10;
Servo servo11;
Servo servo12;

void setup() {
  
  Serial.begin(9600);


// /////////////VARIABLES//////////////////////////////////////////////////
  
  lenght = 111;  // Distance sol - torse
  

  Xavance = 20 ; // Distance que parcours un pas
  
  Yavance = 10;  // Distance de levé de patte
  
// /////////FIN VARIABLES//////////////////////////////////////////////////


// /////////////SETUP DES SERVOS//////////////////////////////////////////////////

  servo1.attach(0);
  servo2.attach(1);
  servo3.attach(2);
  servo4.attach(3);
  servo5.attach(4);
  servo6.attach(5);
  servo7.attach(6);
  servo8.attach(7);
  servo9.attach(8);
  servo10.attach(9);
  servo11.attach(10);
  servo12.attach(11);

  //patte avant gauche
  servo2.write(90);
  servo4.write(78);
  servo6.write(93);

  //patte arrière gauche
  servo11.write(75);
  servo9.write(79);
  servo7.write(83);

  //patte avant droite
  servo5.write(82);
  servo3.write(104);
  servo1.write(111);

  //patte arrière droite
  servo10.write(95);
  servo8.write(82);
  servo12.write(105);

// /////////////SETUP DES SERVOS//////////////////////////////////////////////////




  XYavance = Xavance / 2;

  teta = atan(Xavance / lenght);
  newlenght = lenght / cos(teta);

  XYteta = atan(XYavance / lenght);
  avnewlenght = (lenght / cos(XYteta)) - Yavance;


  //calcul des angles par défaut:

  anglesup = acos((pow(57, 2) - pow(63.391, 2) - pow(lenght, 2)) / (-2 * 63.391 * lenght));
  anglemid = acos((pow(lenght, 2) - pow(63.391, 2) - pow(57, 2)) / (-2 * 63.391 * 57));
  angleinf = acos((pow(63.391, 2) - pow(57, 2) - pow(lenght, 2)) / (-2 * 57 * lenght));
  

  //calcul des angles prenant en compte newlenght:
  
  newanglesup = acos((pow(57, 2) - pow(63.391, 2) - pow(newlenght, 2)) / (-2 * 63.391 * newlenght));
  newanglemid = acos((pow(newlenght, 2) - pow(63.391, 2) - pow(57, 2)) / (-2 * 63.391 * 57));
  newangleinf = acos((pow(63.391, 2) - pow(57, 2) - pow(newlenght, 2)) / (-2 * 57 * newlenght));


  //calcul des angles avec avnewlenght:

  avnewanglesup = acos((pow(57, 2) - pow(63.391, 2) - pow(avnewlenght, 2)) / (-2 * 63.391 * avnewlenght));
  avnewanglemid = acos((pow(avnewlenght, 2) - pow(63.391, 2) - pow(57, 2)) / (-2 * 63.391 * 57));
  avnewangleinf = acos((pow(63.391, 2) - pow(57, 2) - pow(avnewlenght, 2)) / (-2 * 57 * avnewlenght));
  

  //conversion des radians en degrés:

  anglesup = anglesup * (180 / PI) + 90;
  anglemid = anglemid * (180 / PI);
  angleinf = angleinf * (180 / PI) + 90;

  newanglesup = newanglesup * (180 / PI) + 90;
  newanglemid = newanglemid * (180 / PI);
  newangleinf = newangleinf * (180 / PI) + 90;

  avnewanglesup = avnewanglesup * (180 / PI) + 90;
  avnewanglemid = avnewanglemid * (180 / PI);
  avnewangleinf = avnewangleinf * (180 / PI) + 90;

  teta = teta * (180 / PI);
  XYteta = XYteta * (180 / PI);
  

  //on retire teta
  
  avnewanglesup = avnewanglesup - XYteta;
  

  Serial.println("////////// AFFICHAGE /////////////");
  Serial.println(" ");
  Serial.println("-----------PAR DEFAUT-------------");
  Serial.println("longueur:");
  Serial.println(lenght);
  Serial.println("angle supérieur:");
  Serial.println(anglesup);
  Serial.println("angle milieu:");
  Serial.println(anglemid);
  Serial.println("angle inférieur:");
  Serial.println(angleinf);
  Serial.println(" ");
  Serial.println("---------NOUVELLES VALEURS---------");
  Serial.println("nouvelle longueur:");
  Serial.println(newlenght);
  Serial.println("new angle supérieur:");
  Serial.println(newanglesup);
  Serial.println("new angle milieu:");
  Serial.println(newanglemid);
  Serial.println("new angle inférieur:");
  Serial.println(newangleinf);
  Serial.println(" ");
  Serial.println("---------AVANCE X,Y---------");
  Serial.println("avnouvelle longueur:");
  Serial.println(avnewlenght);
  Serial.println("avnew angle supérieur:");
  Serial.println(avnewanglesup);
  Serial.println("avnew angle milieu:");
  Serial.println(avnewanglemid);
  Serial.println("avnew angle inférieur:");
  Serial.println(avnewangleinf);
  Serial.println(" ");
  Serial.println("---------DIVERS---------");
  Serial.println("teta:");
  Serial.println(teta);
  Serial.println("X,Yteta:");
  Serial.println(XYteta);
  Serial.println(" ");
  Serial.println("///////////// FIN ///////////////");


  
}

void loop() {

  
  
  
  
}

et le premier programme avec lequel tous les servomoteurs fonctionnent;

#include<Servo.h>

Servo servo1;
Servo servo2;
Servo servo3;
Servo servo4;
Servo servo5;
Servo servo6;
Servo servo7;
Servo servo8;
Servo servo9;
Servo servo10;
Servo servo11;
Servo servo12;

void setup() {

  servo1.attach(0);
  servo2.attach(1);
  servo3.attach(2);
  servo4.attach(3);
  servo5.attach(4);
  servo6.attach(5);
  servo7.attach(6);
  servo8.attach(7);
  servo9.attach(8);
  servo10.attach(9);
  servo11.attach(10);
  servo12.attach(11);

  servo1.write(96);
  servo2.write(95);
  servo3.write(90);
  servo4.write(95);
  servo5.write(82);
  servo6.write(93);
  servo7.write(83);
  servo8.write(82);
  servo9.write(90);
  servo10.write(95);
  servo11.write(87);
  servo12.write(90);

  delay(2500);
  
  
 
}

void loop() {


  servo4.write(120);
  servo2.write(120);
  servo12.write(60);
  servo8.write(60);
  delay(10);
  
  //Commande aux autres servos de se déporter de 20°
  //pour faire avancer le robot
  
  servo11.write(93);
  servo9.write(82);
  servo3.write(85);
  servo1.write(97);
  
  delay(90);
  servo2.write(95);
  servo4.write(94);
  servo8.write(82);
  servo12.write(90);
  
  delay(350);
  
  servo1.write(60);
  servo3.write(60);
  servo11.write(120);
  servo9.write(120);
  
  //déportation
  
  servo2.write(100);
  servo4.write(85);
  servo8.write(75);
  servo12.write(100);

  delay(90);
  servo3.write(90);
  servo1.write(96);
  delay(10);
  servo9.write(82);
  servo11.write(87);
  delay(350);
  
}

Je sais parfaitement que mes programmes ne sont pas du tout optimisés ou "dans les règles de l'art" mais cela fonctionne mis à part ce problème de servomoteurs et c'est sous cette forme là que je comprends le mieux ce que je fais.

:warning:

Post mis dans la mauvaise section, on parle anglais dans les forums généraux. ➜ déplacé vers le forum francophone.

Merci de prendre en compte les recommandations listées dans « Les bonnes pratiques du Forum Francophone”

Évitez les pins 0 et 1 qui servent au port série vu que vous avez Serial.begin(9600);

Je vais essayer d'enlever la partie affichage qui n'était là que pour vérifier que mes calculs étaient corrects et je vous redis. Merci beaucoup pour cette réponse rapide!

MERCI BEAUCOUP ça fonctionne !!! Je n'aurais jamais pu trouver ça tout seul, un grand merci et bonne journée à vous§

Super

Bonne continuation

1 Like