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.