4 servos : fonctionne pas

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 :cry:

merci beaucoup !!!

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);
}

ça ne fonctionne pas

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';
    }

Mets nous le code qui fonctionne et ce que tu rajoute ensuite lorsque ça ne fonctionne plus.

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 :frowning:
étrange non ?

Tu es certain que ton alimentation (le 5V arduino) ne s'écroule pas?

Si tu donnais toutes les informations en une fois on pourrait t'aider plus vite

Dsl, mais j'oubli de mettre toutes les informations :slight_smile:
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é !

D'accord mais quand tout est branché. L'écran, les capteurs, .... ils sont bien alimentés par le 5V de l'arduino? Tout cela consomme combien?

Oui ils sont branchés sur le 5V... et je n'ai jamais pensé a la consommation de ceux-la... je vérifie ça ce soir, merci du conseil :wink:

Alors, après test, le problème ne vient pas d'une sous alimentation :-/

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

Tu parles des broches logiques ou analogiques.

Si c'est les broches logiques, tu as un conflit sur la liaison série qui utilise les I/O logiques 0 et 1

la, je parle des pins logique !
Comment régler ce conflit ?

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...

Les pins 0 et 1 sont respectivement la réception et la transmission de la liaison série.

Par déduction de tes précédents post, il te reste 11, 12 et 13

Ok, merci beaucoup pour votre aide :wink:
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... :-/