Bonjour,
Je rencontre un problème sur un projet utilisant 2 servos... J'ai branché les 2 servos sur une plaque labdec, ils sont alimentés via le pin 5V de l'arduino à travers un motor shield r3, lorsque je lance le programme seul un des servos réagit et lorsque j'inverse leurs positions cela me donne le même problème avec le servo devant tourner à 90° qui reste inerte. Comment puis-je résoudre le problème? Merci par avance pour l'aide apportée.
Le code:
#include <Servo.h>
#include <TinyGPS++.h>
#include <SoftwareSerial.h> // certains include sont inutiles mais c'est juste un prgm test en vue d'un plus gros...
#define RXPIN 0
#define TXPIN 1
#define GPSBaud 9600ul // verifier le Baud
double latitude;
double longitude;
double latitude_fixe;
double longitude_fixe;
double lacourse;
Servo servo1; //axe x
Servo servo2; //axe z
TinyGPSPlus gps;
float r; //module
float phi; // angle de déphasage
float alpha;
const int L5D=5; //verif valid GPS data (rouge)
const int L3D=3; //verif satellites (bleue)
const int L7D=7; //verif demarrage (verte)
int position_voulue[]={0,0}; // liste de l'endroit que l'on veut atteindre... {longitude, latitude}
void setup()
{
pinMode (L3D, OUTPUT);
pinMode (L5D, OUTPUT);
pinMode (L7D, OUTPUT);
digitalWrite (L7D,HIGH);
servo1.attach(9);
servo2.attach(8);
delay(8000);
servo1.write(135); //etalonnage des servos
servo2.write(90);
}
void loop()
{
}
Merci pour cette reponse rapide, j'ai essayé avec une batterie également cela ne fonctionne pas, faut il alors que chaque servo ai sa batterie ? J'ai essayé mais je n'ai pas plus de résultat...
#include <Servo.h>
Servo servo1; //axe x
Servo servo2; //axe z
void setup()
{
servo1.attach(9);
servo2.attach(8);
delay(8000);
servo1.write(135); //etalonnage des servos
servo2.write(90);
}
void loop()
{
}
Si ça fonctionne, tu rajoutes le reste morceau par morceau jusqu'à voir ce qui provoque l'erreur. Si ça ne fonctionne pas, c'est dû à autre chose : le shield, les branchements, l'alim...
Après réflexion, je pense que le delay devrait venir APRES les servo.write
Dans le contexte du programme les servo s'etalonnent à 90 et 135° apres 8 secondes car ces 8 secondes permettent au module que je veux commander de se stabiliser (c'est un microsatellite qui doit utiliser ses servos pour diriger un parachute, il doit démarrer l'etalonnage apres 8 secondes où le parachute se place bien.) Donc mon delay est je pense bien placé, j'ai essayé le prgm épuré et là plus aucun des servos ne fonctionne, ils sont alimentés en parallele par le 5V de l'arduino à travers une carte de puissance motor shield donc niveau alim je pense qu'on est bon (j'ai du mal avec l'elec donc je peux me tromper...) Les branchements fonctionnent puisque lorsque j'echange les servos ce n'est pas le même qui tourne... Enfin j'ai changé la valeur des pins des attach() au cas où... Donc je ne vois pas de solution, je teste le programme petit à petit mais cela à commencer à bugger lorsque j'ai ajouter les servos (j'ai commncer par inserer la Led). Si tu as une solution potentielle je suis preneur, je suis carrement désemparé...
Tu dois lire des tutos avant de te lancer si tu ne connais pas le sujet. Voir ici par exemple.
Un servo a besoin de temps pour aller à sa position. Essaie par exemple :
#include <Servo.h>
Servo servo1; //axe x
Servo servo2; //axe z
void setup()
{
servo1.attach(9);
servo2.attach(8);
delay(8000);
servo1.write(135); //etalonnage des servos
delay(10000);
}
void loop()
{
}
Ça teste un seul servo : si ça marche, diminue la durée du delay pour voir jusqu'à combien tu peux descendre avant que ça ne marche plus.
Ensuite, même chose avec le second servo SEUL et la consigne que tu veux lui donner.
Ensuite les deux, chacun avec son delay, l'un après l'autre.
Ensuite les deux mais uniquement avec le second delay...
On va y arriver, il faut essayer pour comprendre le fonctionnement des servos !
Je viens de faire l'essai avec deux IDE (1.6.7 et 1.8.5) et deux servos moteurs en suivant le petit sketch suivant : pas de problème, les servo tournent.
il n'y a pas de soucis en effet pour les faire tourner en même temps, donc si votre montage fonctionne avec le code de @ChPr ci dessus (ie vous tapez dans la console série un angle et les 2 moteurs y vont) c'est que la partie câblage est sans doute correcte et que le soucis provident du reste de votre code....
If faut noter cependant que la génération du signal de consigne des servo utilise un timer et les interruptions sur votre UNO et que Software Serial dépend aussi des interruptions - suivant ce que vous faites avec votre GPS en même temps qu'avec les servos, ça peut être un soucis
--> j'imagine que votre montage a pour vocation à ne pas être connecté à un PC et donc je serais tenté de vous conseiller de connecter le GPS directement aux pins 0/1 (le port série matériel)..Bien sûr il faut débrancher quand vous chargez un programme dans l'arduino et vous perdez la possibilité de faire des affichages de debug.... la LED embarquée sur la carte peut vous servir à faire afficher un état particulier par exemple
Alors j'ai testé le sketch proposé par ChPr mais cela ne fonctionne pas chez moi, un des servos tourne instantanément puis se redéplace legèrement tandis que l'autre ne fais rien, j'ai échangé les servos et constate que ce n'est pas un dysfonctionnement lié au servo. je suis branché sur plaque avec les cables d'alimentation et l'arduino délivre 5V sur cette plaque, la masse est commune et est celle de l'arduino...
J'ai egalement testé avec d'autres valeurs d'angle ( en dessous de 90°)et même problème... Le deuxième servo n'a vraiment aucune reaction pas même un petit bruit...
J'ai également testé le code qui suit mais un seul des servos tourne et pour le coup c'est toujours le même indépendament du pin... j'ai testé plusieurs servos et le problème persiste ( y compris ceusx qui ont déja fonctionné... ). Pourrait ce etre une question de priorité ou d'intensité insuffisante ?
#include <Servo.h>
Servo servoLeft; // Define left servo
Servo servoRight; // Define right servo
void setup() {
servoLeft.attach(10); // Set left servo to digital pin 10
servoRight.attach(9); // Set right servo to digital pin 9
}
void loop() { // Loop through motion tests
forward(); // Example: move forward
delay(2000); // Wait 2000 milliseconds (2 seconds)
reverse();
delay(2000);
turnRight();
delay(2000);
turnLeft();
delay(2000);
stopRobot();
delay(2000);
}
// Motion routines for forward, reverse, turns, and stop
void forward() {
servoLeft.write(0);
servoRight.write(180);
}
void reverse() {
servoLeft.write(180);
servoRight.write(0);
}
void turnRight() {
servoLeft.write(180);
servoRight.write(180);
}
void turnLeft() {
servoLeft.write(0);
servoRight.write(0);
}
void stopRobot() {
servoLeft.write(90);
servoRight.write(90);
}