Bonjour,
j'ai un gros problème, avec 4 servos moteur sur une arduino Duemilanove, ça ne fonctionne pas !!! Je veu les controler a distance via Xbee. Avec une LED ça fonctionne, mais pas avec les servos ! Pourriez vous me passer un bout de code qui fonctionne svp, parceque la je suis vraiment perdu et que je doit rendre le projet la semaine prochaine
Si on regarde tes anciens post tu alimentais ta carte avec une pile de 9V. Ta configuration avec 4 servos elle est alimentée comment?
Parce que un servo cela consomme quelques centaines de milliampères donc si tu mulitplies par 4 lorsqu'ils sont activés il faut fournir près d'un ampère. Donc les piles de 9V il faut oublier.
Alors la carte est alimentée en 9V.
Et les servos sont alimentés avec 4 piles AA 1.5V, avec une diode pour baisser la tension a 5.4V.
J'ai branché mes servos sur les ports 5,6,9,10 de l'arduino.
avec un code simple sans liaison série, les 4 servos tournent. Mais vaec le code de la liason série, ça ne fonctionne pas. Personne n'aurait quelques lignes de code pour moi ?
Voila mon code :
#include <Servo.h>
#define LTSERVOPIN 10
#define RTSERVOPIN 9
#define LBSERVOPIN 6
#define RBSERVOPIN 5
Servo LTServo;
Servo RTServo;
Servo LBServo;
Servo RBServo;
int speed = 100; //sets the speed of the robot (both servos) a percentage between 0 and 100
int ledState;
int MotorState;
void setup()
{
// Initialisation liaison série
Serial.begin(9600);
pinMode(13,OUTPUT); // LED en SORTIE
SetSpeed(speed); // Sélection d'\une vitesse
pinMode(LTSERVOPIN, OUTPUT); // Servo Gauche Haut en SORTIE
pinMode(RTSERVOPIN, OUTPUT); // Servo Droit Haut en SORTIE
pinMode(LBSERVOPIN, OUTPUT); // Servo Gauche Bas en SORTIE
pinMode(RBSERVOPIN, OUTPUT); // Servo Droit Bas en SORTIE
LTServo.attach(LTSERVOPIN); // Attache le Servo Gauche Haut
RTServo.attach(RTSERVOPIN); // Attache le Servo Droit Haut
LBServo.attach(LBSERVOPIN); // Attache le Servo Gauche Bas
RBServo.attach(RBSERVOPIN); // Attache le Servo Droit Bas
GoStop(); // Stop des Servos
}
void loop()
{
// test if a new value has been received
if (Serial.available())
{
// update without any control
char valeur = Serial.read();
if (valeur == 'Z') { // TOUCHE Z
ledState = HIGH;
MotorState = 'Forward';
}
else{
ledState = LOW;
MotorState = 'Stop';
}
digitalWrite(13,ledState);
switch (MotorState) {
case 'Forward':
GoForward();
break;
case 'Stop':
GoStop();
break;
}
}
}
void SetSpeed(int NewSpeed){
if(NewSpeed >= 100) {NewSpeed = 100;} // Si la vitesse > 100 alors on lui attribue 100
if(NewSpeed <= 0) {NewSpeed = 0;} // Si la vitesse < 0 alors on lui attribue 0
speed = NewSpeed * 0.9; // Dimensionne la vitesse entre 0 et 100
}
/*
* Fait avancer le robot
*/
void GoForward(){
LTServo.write(180);
RTServo.write(180);
LBServo.write(180);
RBServo.write(180);
}
/*
* Fait reculer le robot
*/
void GoBackward(){
LTServo.write(90 - speed);
RTServo.write(90 + speed);
LBServo.write(90 - speed);
RBServo.write(90 + speed);
}
/*
* Fait pivoter à droite le robot
*/
void GoRight(){
LTServo.write(90 + speed);
RTServo.write(90 + speed);
LBServo.write(90 + speed);
RBServo.write(90 + speed);
}
/*
* Fait pivoter à gauche le robot
*/
void GoLeft(){
LTServo.write(90 - speed);
RTServo.write(90 - speed);
LBServo.write(90 - speed);
RBServo.write(90 - speed);
}
/*
* Stop le robot
*/
void GoStop(){
LTServo.write(90);
RTServo.write(90);
LBServo.write(90);
RBServo.write(90);
}
Ca veut dire quoi:
La led ne s'allume pas?
Les moteurs font n'importe quoi?
Si la LED ne s'allume pas c'est que le code envoyé n'est pas reconnu. Tu envoies bien un Z (majuscule) à partir de la console. Il me semble que la console dans l'IDE arduino envoie des chaines (donc avec un retour chariot à la fin) cela ne t'embrouillerait pas. Tu pourrais essayer avec hyperterminal ou un soft de terminal quelconque.
En fait reconnaitre Z pour avancer et n'importe quoi pour arreter c'est prendre le risque de voir ton robot s'arreter si il reçoit Z+(retour chariot) par exemple.
Il est préférable de dire
si je reçoit Z j'avance
si je reçoit X j'arrete
si je reçoit autre chose j'ignore.
Comme ça il n'y a pas de perturbation par des réceptions de caractères inattendues
if (valeur == 'Z') { // TOUCHE Z
ledState = HIGH;
MotorState = 'Forward';
}
if (valeur == 'X'){
ledState = LOW;
MotorState = 'Stop';
}
OK donc, en faite c'est assez bizzare puisque mon code fonctionne.
Lorsque je branche mes 4 moteurs (sur les memes pins 5,6,9,10) et SEULEMENT les moteurs, ça fonctionne nickel (j'utilise Processing qui envoi le "Z" par sérial) et donc, ça fonctionne. Je précise que le Z uniquement était pour des tests, je met habituellement :
soit Z ; soit S ; soit Q ; soit D sinon il se passe rien
Mais le problème, c'est que lorsque je connecte mon écran et mes capteurs sur les pins 0,1,2,3,4,7,8 sur l'arduino, ça ne fonctionne plus
étrange non ?
Dsl, mais j'oubli de mettre toutes les informations
Pour mes tests, l'arduino est connectée au cable USB de l'ordinateur, donc tension fixe.
Et les 4 piles de 1.5V fonctionnent et sont casi pleines.
Le problème bizzare c'est que ça ne fonctionne pas quand tout est branché !
J'ai simplement déconnecté ce que j'avai branché sur les pins digital 0 et 1 (les 2 premiers...) et apparement ça a l'air de fonctionner.
Ces pins ne seraient-ils pas utilisés par la carte pour envoyer/recevoir les signaux ou quelque chose du genre ?
C'est dommage, du coup je perd 2 pins...
Ok, merci beaucoup pour votre aide
Je trouve dommage que la liaison prenne 2 pins, déjà qu'il n'y en a pas beaucoup sur l'arduino duemilanove, mais bon... :-/