Aller au contenu


Photo
- - - - -

programme pour le neutre du servomoteur


  • Veuillez vous connecter pour répondre
12 réponses à ce sujet

#1 jady2909

jady2909

    Membre

  • Membres
  • 37 messages

Posté 27 février 2011 - 05:41

Bonjour débutant dans la programation en c++ je voudrai trouver le neutre des servomoteur que j'ai acheter pour mon robot voici le code

1.#include
2.
3.#define SERVOG 1
4.#define SERVOD 0
5.
6.Servo servog;
7.Servo servod;
8.
9.int getNeutral(int s)
10.{
11. if(s == SERVOG)
12. return 86; //cette valeur va varier jusqu'à ce que le servomoteur va arrété
13. else
14. return 84; // pareille pour ici
15.}

mai mon code manque les fonctions setup et loop . Ne sachant pas ou les integré dans mon code je voudrai votre aide .Merci...



#2 julkien

julkien

    Pilier du forum

  • Membres
  • PipPipPipPipPip
  • 1 032 messages
  • Gender:Male

Posté 27 février 2011 - 06:13

même si je me répète
la fonction loop est une boucle qui recommence sans fin donc si tu l'intergre pas dans ton code il ne feras pas grand chose

int monetat = false // mon état physique apres un samedi soir trop arrosé :

void loop(){

if (monetat == false) {
// si mon etat est egale a false"off" on le met a "on":
monetat = true;
}
else {
// si mon etat n'est pas égale a false"off" alors on le met a "off":
monetat =false ;
}
}
[/code]
bon c'est qu'un exemple mais mon etat va passer de "on" a "off" et de "off" a "on" sans fin (comme un dimanche la tete dans le c...)

PS: utilise les balise pour présente ton code il seras que plus lisible
te donné la solution toute faite ne t'aideras pas mais si tu arrive a comprendre s'a serras que mieux ,tu verras c pas bien compliqué(enfin un peu quand même ;) )
n’hésite pas a demandé plus d'info si je ne suis pas claire


#3 jady2909

jady2909

    Membre

  • Membres
  • 37 messages

Posté 27 février 2011 - 11:58

Ou alors tu tapes manuellement <*code type="cpp"]...<*/code>, sans les astérisques évidemment. Esprit][/color]

voila ce que je vais mettre comme code


2.
3.Servo servo;
4.
5.void setup()
6.{
7. servo.attach(10);
8. Serial.begin(9600);
9.}
10.
11.void loop()
12.{
13. int i = 0;
14. while(i <= 180)
15. {
16. servo.write(i);
17. Serial.println(i);
18. delay(1000);
19.
20. i = i+5;
21. }
22. while(i >= 180)
23. {
24. servo.write(i);
25. Serial.println(i);
26. delay(1000);
27. i = i-5;
28. }
29.
30. }
31. [/code]

désoler pour la balise j'arrive pas a les utiliser.

#4 julkien

julkien

    Pilier du forum

  • Membres
  • PipPipPipPipPip
  • 1 032 messages
  • Gender:Male

Posté 28 février 2011 - 06:19


mais c'est un balayage que tu nous fais la, Non?

ton servo va pas faire plutôt des allez et retour ? de 5 degrés comme ça 175;180;175;180....
non?



#5 lordcuty

lordcuty

    Habitué

  • Membres
  • PipPip
  • 298 messages

Posté 28 février 2011 - 06:58

de plus dans le 2ieme while il y a un pb: remplaces
while(i >= 180)
par
while(i >= 0)

#6 Luj

Luj

    Habitué

  • Membres
  • PipPip
  • 295 messages
  • Gender:Not Telling

Posté 09 mars 2011 - 10:25

J'imagine qu'il s'agit d'un servomoteur à rotation continue et qu'il fait un balayage avec affichage sur la console pour voir quand le moteur s'arrête de tourner et noter la valeur. C'est ce que j'ai fait pour mes robots avec servos.

#7 jady2909

jady2909

    Membre

  • Membres
  • 37 messages

Posté 11 mars 2011 - 03:27

bonjour , je viens de recevoir mes servomoteur a rotation continus le code qui dont je vous et parler au deçu n'a pas l'aire de fonctionné En effet mon servomoteur fait 13 tours dans un sens puis s'arret une seconde puis fait 13 tours de l'autre sens . SVP j'ai besoin d'aide pour pouvoir trouver la valeur de mes servomoteur a rotation continu

#8 Esprit

Esprit

    Pilier du forum

  • Membres
  • PipPipPipPipPip
  • 1 503 messages
  • Gender:Male
  • Location:Belgique

Posté 11 mars 2011 - 04:25

Bête question peut-être... Est-ce qu'il y a un neutre sur des servomoteurs à rotation continue ?
Si tu veux les arrêter, il suffit de ne plus rien leur envoyer, c'est pas plus simple ?

Tu trouves une valeur pour les faire tourner dans un sens et dans l'autre et pour les arrêter, tu n'envoies plus rien. C'est pas le plus simple ?

#9 jady2909

jady2909

    Membre

  • Membres
  • 37 messages

Posté 11 mars 2011 - 06:54

Salut avec un programme celui la
#include

#define AVANT 1
#define ARRIERE 0
#define GAUCHE 2
#define DROITE 3

#define SERVOG 1
#define SERVOD 0

#define VMAX 5

Servo servog;


int getNeutral(int s)
{
if(s == SERVOG)
return 60; // valeur que je modifie a 60 il s'arrete 50: sens de l'aiguille d'une montre 70 sens contraire.


}


void handleS(int s, int speed)
{
//Vitesse :
// 0 -> 0; 1 -> 1; 2 -> 3; 3 -> 8; 4 -> 10; v => 5 -> 30
int tab[6] = {0,1,3,8,10,30};
int pos = getNeutral(s);

int acc;
if (speed < 0)
acc = - tab[abs(speed)];
else
acc = tab[speed];

if(s == SERVOG)
servog.write(pos += acc);


}


void move(int direction)
{
int m1 = 0, m2 = 0;
switch(direction)
{
case DROITE: m1 = 1; m2 = -1; break;
case GAUCHE: m1 = -1; m2 = 1; break;
case AVANT: m1 = 1; m2 = 1; break;
case ARRIERE: m1 = -1; m2 = -1; break;
}
handleS(SERVOG, m1*VMAX);
handleS(SERVOD, m2*VMAX);
}



void setup()
{
servog.attach(10);

move(AVANT);
}

void loop()
{
delay(15);
}

[/code]
j'ai réussi a trouver la valeur de mon neutre en modifiant return 60>50>70
donc environ 60 pour mes deux servomoteur.En faite je souhaite faire un roby avec un capteur infrarouge uniquement mai je bloque pour le code.
Pour l'instant je m'entraine a faire fonctionner mes deux servomoteur dans le meme sens mai sans resulta je suis impeu perdu voici le code #include



#define AVANT 1

#define ARRIERE 0

#define GAUCHE 2

#define DROITE 3



#define SERVOG 1

#define SERVOD 0



#define VMAX 5



Servo servog;

Servo servod;



int getNeutral(int s)

{

if(s == SERVOG)

return 65;

else

return 65;

}




void handleS(int s, int speed)

{

//Vitesse :

// 0 -> 0; 1 -> 1; 2 -> 3; 3 -> 8; 4 -> 10; v => 5 -> 30

int tab[6] = {0,1,3,8,10,30};

int pos = getNeutral(s);



int acc;

if (speed < 0)

acc = - tab[abs(speed)];

else

acc = tab[speed];



if(s == SERVOG)

servog.write(pos += acc);

else

servod.write(pos -= acc);

}





void move(int direction)

{

int m1 = 0, m2 = 0;

switch(direction)

{

case DROITE: m1 = 1; m2 = -1; break;

case GAUCHE: m1 = -1; m2 = 1; break;

case AVANT: m1 = 1; m2 = 1; break;

case ARRIERE: m1 = -1; m2 = -1; break;

}

handleS(SERVOG, m1*VMAX);

handleS(SERVOD, m2*VMAX);

}







void setup()

{

servog.attach(10);

servod.attach(9);

move(AVANT);

}



void loop()

{

delay(15);

}
[/code] j'ai que un des deux servomoteur qui tourne ^^
Je rappel que j'ai découvert la robotique il y a que 2 mois j'ai besoin de votre aide merci.


#10 Luj

Luj

    Habitué

  • Membres
  • PipPip
  • 295 messages
  • Gender:Not Telling

Posté 11 mars 2011 - 11:23

Bonsoir,

Tu devrais faire CTRL+T dans l'éditeur avant de copier/coller ton code, ce serait plus en ordre.

- tu peux enlever le delay(15) dans ta boucle (et ne rien mettre).
- un micro-contrôleur a une "pile" d'appel de fonctions limitée, tu devrais éviter les appels en cascade (setup appelle move qui appelle handle qui appelle getNeutral). Pour le "getNeutral", une macro #define fera très bien l'affaire.
- le "- tab" me semble douteux. "-1 *" serait préférable
- même si ça fonctionne comme ça, mets toujours des accolades après un if

Il y a tout un tas d'exemples pour un robot à base de deux servomoteurs ici : http://code.google.com/p/pobot-playground/source/browse/#svn%2Ftrunk%2FPobotKey%2FProjects%2FArduino%2FProjets%20complets%2FPobotEasy

Il y a bien un neutre sur un servomoteur à rotation continue. Son intérêt est qu'autour de cette position, le moteur tourne très lentement (voir les courbes dans la partie "odométrie" de notre robot à servos). Quand on utilise un asservissement en position, c'est bien pratique de laisser l'algorithme arrêter une roue sans avoir à traiter ce cas par un arrêt de la commande du servomoteur.


#11 jady2909

jady2909

    Membre

  • Membres
  • 37 messages

Posté 12 mars 2011 - 05:33

Bonjour Luj ton lien ne fonctionne pas , pourai tu m'envoyer un autre car jai cruellement besoin d'exemple merci.

#12 jady2909

jady2909

    Membre

  • Membres
  • 37 messages

Posté 12 mars 2011 - 06:15

[quote"Luj"]


- le "- tab" me semble douteux. "-1 *" serait préférable
[/quote]

si tu peu me donner plus d'info je suis preneur merci.

#13 Luj

Luj

    Habitué

  • Membres
  • PipPip
  • 295 messages
  • Gender:Not Telling

Posté 12 mars 2011 - 07:54

J'ai tout mis dans une archive : http://www.pobot.org/IMG/zip/PobotEasy_-_Arduino.zip
Et la présentation du robot car je remplacerai l'archive par un article détaillant chacun des programmes (http://www.pobot.org/-Pobot-Easy-.html).

Il ne faut pas prendre l'habitude d'écrire une inversion avec un -, mais préférer une multiplication par -1.




0 utilisateur(s) li(sen)t ce sujet

0 members, 0 guests, 0 anonymous users