Go Down

Topic: 4 servos : fonctionne pas (Read 3003 times) previous topic - next topic

Lolo

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  :'(

merci beaucoup !!!

fdufnews

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.

Lolo

#2
Feb 22, 2010, 01:16 pm Last Edit: Feb 22, 2010, 02:42 pm by ordinateur Reason: 1
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 :
Code: [Select]
#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);
}

fdufnews

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

fdufnews

#4
Feb 22, 2010, 04:52 pm Last Edit: Feb 22, 2010, 04:57 pm by fdufnews Reason: 1
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
Code: [Select]
   if (valeur == 'Z') {  //  TOUCHE Z
     ledState = HIGH;
       MotorState = 'Forward';
   }
   if (valeur == 'X'){
     ledState = LOW;
       MotorState = 'Stop';
   }

Jean-François

Mets nous le code qui fonctionne et ce que tu rajoute ensuite lorsque ça ne fonctionne plus.
MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

Lolo

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 ?

fdufnews

#7
Feb 22, 2010, 07:39 pm Last Edit: Feb 22, 2010, 07:41 pm by fdufnews Reason: 1
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

Lolo

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é !

fdufnews

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?

Lolo

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

Lolo

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

fdufnews

#12
Feb 23, 2010, 09:20 am Last Edit: Feb 23, 2010, 11:08 am by fdufnews Reason: 1
Quote
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

Lolo

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

Lolo

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

Go Up