Help : Contrôle Servomoteur via des push button

Bonjour,

J’essaie tant bien que mal (bha oui, ça ne fait que quelques jours que j’ai mon joujou) de contrôler un servomoteur grâce à deux push button…
Je m’explique: -tant que j’appuie sur le bouton 1, je veux que le servomoteur tourne vers la gauche
-tant que j’appuie sur le bouton 2, je veux que le servomoteur tourne vers la droite
-si je ne touche à rien, rien ne doit se passer

Le problème c’est que ca marche pas vraiment comme prévu: je tourne bien dans un sens ou dans l’autre, mais je n’arrive pas à bloquer la position lorsque je ne touche à rien

Pour mon montage électrique, j’ai relier le servomoteur à la pin 13, le B1 à la pin 2 et le B2 à la pin 3. B1 et B2 sont reliés à leur pin respectives puis reliés au 5V via 2 résistances de 10kohm. L’autre borne des B1 et B2 est relié au neutre. Le servo est alimenté en 5v et relié aussi au neutre.

Pour ce qui est du code, voici ce que j’ai composé:

#include <Servo.h>

Servo monservo;
int inputPin1 =2;
int inputPin2 =3;
int val1 =0;
int val2 =0;
int pos;

void setup (){
pinMode (inputPin1, INPUT);
pinMode (inputPin2, INPUT);
monservo.attach(13);
}

void loop () {
val1 =digitalRead (inputPin1);
val2 =digitalRead (inputPin2);
pos =monservo.read ();
if (val1 ==LOW){
monservo.write (pos+5);
}
else if (val2 ==LOW){
monservo.write (pos-5);
}
}

Voila… si vous avez une tite idée de ce qui déconne…
merci

Ps:Sinon, j’ai réussi à faire une variante avec une position de base centrée avec un else { monservo.write(90)}, ca fait un peu comme une télécommande de jouet.

hello!

je suis novice également donc je vais faire ce que je peux pour t'aider ^^

as tu essayé des conditions de ce style ?

Si bouton1 HIGH faire bouger de +5

Si position +5 Position sur +5

Si bouton 2 HIGH faire bouger de -5

Si position -5 Position sur -5

la fonction While pourrait faire l'affaire! je ne suis pas billingue, ce site est pas mal ^^ http://www.mon-club-elec.fr/pmwiki_reference_arduino/pmwiki.php?n=Main.ReferenceEtendue bon courage ;)

Perso, je lirais pas à chaque fois la position du servo.
tu utilises une variable que tu incrémentes et décrémentes.

tu initialises la position de ton servo à l’init et puis après tu ne manipules que ta variable.

void setup (){
  pinMode (inputPin1, INPUT);
  pinMode (inputPin2, INPUT);
  monservo.attach(13);
  pos =monservo.read ();
}

void loop () {
  val1 =digitalRead (inputPin1);
  val2 =digitalRead (inputPin2);

  if (val1 == HIGH) {
    if (pos <= 180) {
      pos +=5;
    }
  }
  if (val2 == HIGH) {
    if (pos >=0) {
      pos -=5;
    }
  }
  monservo.write(pos);
}

Une remarque, quand tu appuies sur les boutons, tu fermes le circuit non ? donc ton niveau logique n’est plus LOW mais HIGH, non ?

if (val1 ==LOW){
monservo.write (pos+5);
}
else if (val2 ==LOW){
monservo.write (pos-5);
}
}

Il faut faire 2 If sinon tu executes toujours l’une des branches

if (val1 ==LOW){
  monservo.write (pos+5);
    }
  if (val2 ==LOW){
  monservo.write (pos-5);
    }   
  }

Merci pour vos idées. Je vais les tester de se pas pour voir comment le joujou se comporte. J'ai trouvé une solution qui marche avec des delay() (avec un temps très court) après mes if et if else.. ca vaut ce que ça vaut, mais ca marche.

@mrbbp, non le niveau est logique est LOW quand j'appuie.. jme suis pas mal cassé la tête dessus parce que j'obtenais des trucs incohérent quand je faisais des montages simples avec LED. En réfléchissant un peu, je pense que c'est du à la structure de mon montage : je connecte le pin du bouttonP sur la broche qui reçoit le courant (avec une résistance de 10kOhm entre les deux), donc de base le niveau est HIGH. voili voilou

Je viens de me relire et en fait j’ai écrit une sottise.
La structure if …else… était pertinente.
Par contre il faut gérer des butées.
Si tu arrives à 0 il faut cesser de décrémenter.
Si tu arrives à “angle max” (dépend du servo) il faut cesser d’incrémenter.
Sinon tu te retrouves avec des valeurs incohérentes.

Au fait c’est bien un servo standard ? Ce n’es pas un servo à rotation continue?

c'est bien de mettre un délai de tout façon, histoire que ton servo aie le temps de bouger de 5 degrés. C'est pas dans ce cas qu'on doit utiliser les interrupts ? Je demande à l'assemblée, pas seulement à Pedro. :.