Aller au contenu


Photo
- - - - -

arduino code servo


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

#1 matsu

matsu

    Membre

  • Membres
  • 16 messages

Posté 17 mars 2012 - 09:37

Bonjours je voudrai savoir quelle commande utiliser pour faire fonctionner des servos a rotation continue de façon acceleré
cad qu'elles aillent de plus en plus vite jusqu'à atteindre une valeur max fixée ! (si c'est possible ?)
j'ai une carte arduino et 2 servos à rotation continue!

pour l'instant j'utilise tout simplement
myservo.attach();
myservo.writeMicroseconds();
pour les faire fonctionner à une vitesse constante que je fixe

Je veux juste quelques indications, pour le reste je vais essayer de me débrouiller !

Mercii d'avance !!

#2 Francky

Francky

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 967 messages
  • Gender:Male

Posté 17 mars 2012 - 11:06

Bonjour,

Tu peux résoudre ton problème d'une manière "différente". Je m'explique : il suffit que tu pilotes tes servomoteurs en ralenti (pwm de rapport cyclique 0.5 par exemple), puis que tu changes la valeur du rapport cyclique en l'augmentant progressivement jusqu'à la valeur 1.

#3 Francky

Francky

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 967 messages
  • Gender:Male

Posté 17 mars 2012 - 11:06

désolé du double post, j'ai pas beaucoup cherché, mais je vois pas comment supprimer le mess. Si un modo passe dans le coin est-ce qu'il peut le faire svp ? "^^

#4 matsu

matsu

    Membre

  • Membres
  • 16 messages

Posté 20 avril 2012 - 11:01

Bon avec un peu de retard je me replonge dans ce problème..

j'ai essayé d'augmenter la vitesse progressivement avec un code simple mais cela ne fonctionne pas (le code compile mais donne pas ce que je veux ^^ )

#include <Servo.h>

Servo myservo1;
int vitesse =1520;

void setup()
{
myservo1.attach(9);
}

void loop () {

while (vitesse<1800) { vitesse= vitesse +0,5 ; }


myservo1.writeMicroseconds(vitesse);


}



concernant les cycles je dois utiliser la fonction analogwrite je crois mais je vois pas trop comment?

#5 Black Templar

Black Templar

    Membre

  • Membres
  • PipPipPipPipPip
  • 1 430 messages
  • Gender:Male
  • Location:Lille

Posté 20 avril 2012 - 11:18

Salut !

Bon avec un peu de retard je me replonge dans ce problème..

j'ai essayé d'augmenter la vitesse progressivement avec un code simple mais cela ne fonctionne pas (le code compile mais donne pas ce que je veux ^^ )

concernant les cycles je dois utiliser la fonction analogwrite je crois mais je vois pas trop comment?


Tu peux utiliser le bouton Image IPB pour mettre en forme le code ! c'est plus agréable à lire :)

#include <Servo.h>

Servo myservo1;
int vitesse =1520; 

void setup()
{
myservo1.attach(9);
}

void loop () {
  
while (vitesse<1800) { vitesse= vitesse +0,5 ; }


myservo1.writeMicroseconds(vitesse);  


}

Ici, ce que tu fais, c'est que tu incrémentes de 0.5 la valeur de la variable vitesse.
Une fois que cette variable est arrivé à 1800, tu fixes la vitesse de ton servo.
Du coup, la vitesse est fixé une fois pour toute ! Pour faire varier la vitesse, il faut faire un writeMicroseconds A CHAQUE FOIS que tu modifies ta variable vitesse, donc dans ta boucle while !
Si tu veux voir quelque chose, je te conseil de mettre un petit delay de quelque millisecondes à chaque fois que tu utilises writeMicroseconds !

++
Black Templar

Mon site internet : http://ferdinandpiette.com/


#6 matsu

matsu

    Membre

  • Membres
  • 16 messages

Posté 20 avril 2012 - 01:54

Pour faire varier la vitesse, il faut faire un writeMicroseconds A CHAQUE FOIS que tu modifies ta variable vitesse, donc dans ta boucle while !


ça veut dire qu'il faut que je declare plusieur variable vitesse? je suis pas sur d avoir compris?

#7 swolf

swolf

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 626 messages
  • Gender:Male

Posté 20 avril 2012 - 02:33

Edit: j'ai écrit trop vite :-S en fait ce que BT voulais dire c'est toi ce que tu faisait c'est dans ta boucle tu modifiais ta variable en lui rajoutant plusieirs fois 0,5 , et tu l'envoyait à ton servo une fois qu'elle valait 1800 du coup pour ton servo ça revient au même que si tu lui envoi directement 1800 sans la boucle... ce qu'il faut c'est lui envoyer ta variable entre chaque incrementation de celle-ci, donc mettre le writeMicrosecond dans ta boucle...
Notre blog, à FJprod et moi: http://2froblog.wordpress.com/

#8 matsu

matsu

    Membre

  • Membres
  • 16 messages

Posté 20 avril 2012 - 02:46

Edit: j'ai écrit trop vite :-S en fait ce que BT voulais dire c'est toi ce que tu faisait c'est dans ta boucle tu modifiais ta variable en lui rajoutant plusieirs fois 0,5 , et tu l'envoyait à ton servo une fois qu'elle valait 1800 du coup pour ton servo ça revient au même que si tu lui envoi directement 1800 sans la boucle... ce qu'il faut c'est lui envoyer ta variable entre chaque incrementation de celle-ci, donc mettre le writeMicrosecond dans ta boucle...


oui mais je comprend pas comment le mettre dans la boucle?

while (vitesse<1800) { vitesse= vitesse +0,5 ; myservo1.writeMicroseconds(vitesse); }



????

#9 Black Templar

Black Templar

    Membre

  • Membres
  • PipPipPipPipPip
  • 1 430 messages
  • Gender:Male
  • Location:Lille

Posté 20 avril 2012 - 03:14

oui
ajoute un delay de quelques millisecondes dans la boucle aussi afin de "voir" l'accélération

Mon site internet : http://ferdinandpiette.com/


#10 matsu

matsu

    Membre

  • Membres
  • 16 messages

Posté 20 avril 2012 - 03:24

oui
ajoute un delay de quelques millisecondes dans la boucle aussi afin de "voir" l'accélération


#include <Servo.h>

Servo myservo1;
int vitesse =1520; 

void setup()
{
myservo1.attach(9);
}

void loop () {
  
while (vitesse<1800)
{ vitesse= vitesse +0,5;
myservo1.writeMicroseconds(vitesse);
delay(25); }


 
}

ça fonctionne pas rien ce passe? il prend seulement en compte le int vitesse=1520; (mon neutre)

#11 swolf

swolf

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 626 messages
  • Gender:Male

Posté 20 avril 2012 - 04:29

je ne sais pas si c'est ça qui est responsable de ton bug mais tu as déclaré ta variable vitesse comme int et tu lui rajoute un nombre à virgule... il aurait fallu que tu la déclares en float
Notre blog, à FJprod et moi: http://2froblog.wordpress.com/

#12 matsu

matsu

    Membre

  • Membres
  • 16 messages

Posté 21 avril 2012 - 02:09

je ne sais pas si c'est ça qui est responsable de ton bug mais tu as déclaré ta variable vitesse comme int et tu lui rajoute un nombre à virgule... il aurait fallu que tu la déclares en float


En effet j'avais pas remarqué merci !
malheureusement ça change pas le résultat..

#13 Thor

Thor

    Habitué

  • Membres
  • PipPip
  • 251 messages
  • Gender:Male

Posté 23 avril 2012 - 07:23

Il y a ça dans les exemples présent fans l'ide de l'Arduino.
C'est prévu pour faire tourer un servo dans un sens puis dans l'autre, mais avec un servo à rotation continue ça le fait accélérer jusqu'à une certaine vitesse, ralentir, réaccélerer, etc.
J'ai juste modifier les delays pour que ça soit plus flagrant:

// Sweep
// by BARRAGAN <http://barraganstudio.com> 
// This example code is in the public domain.


#include <Servo.h> 
 
Servo myservo;  // create servo object to control a servo 
                // a maximum of eight servo objects can be created 
 
int pos = 0;    // variable to store the servo position 
 
void setup() 
{ 
  myservo.attach(9);  // attaches the servo on pin 9 to the servo object 
} 
 
 
void loop() 
{ 
  for(pos = 0; pos < 180; pos += 1)  // goes from 0 degrees to 180 degrees 
  {                                  // in steps of 1 degree 
    myservo.write(pos);              // tell servo to go to position in variable 'pos' 
    delay(150);                       // waits 15ms for the servo to reach the position 
  } 
  for(pos = 180; pos>=1; pos-=1)     // goes from 180 degrees to 0 degrees 
  {                                
    myservo.write(pos);              // tell servo to go to position in variable 'pos' 
    delay(150);                       // waits 15ms for the servo to reach the position 
  } 
}


#14 Thor

Thor

    Habitué

  • Membres
  • PipPip
  • 251 messages
  • Gender:Male

Posté 23 avril 2012 - 09:58

En effet j'avais pas remarqué merci !
malheureusement ça change pas le résultat..

En modifiant le 0,5 par un 1 ça marches très bien aussi:)

Edit:

Essayes ton code précédent avec float au lieux de int comme déja dit mais aussi avec 0.5 au lieux de 0,5.

#15 swolf

swolf

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 626 messages
  • Gender:Male

Posté 23 avril 2012 - 11:18

Ah aussi je suis pas sur mais je crois que quand tu initialise un float tu dois lui donner une valeur à virgule, même si c'est un entier (genre float var = 0.0)
Notre blog, à FJprod et moi: http://2froblog.wordpress.com/




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

0 members, 0 guests, 0 anonymous users