Bouton poussoir et servomoteur

Bonjour à tous,

Je me lance dans mon premier projet sur arduino, étant un grand novice j’avance petit à petit mais là je bute sur un petit souci.

Pour le moment j’essaie de piloter un servomoteur avec 5 boutons poussoir (pas de mouvement, +5°, +10°, +15°, retour à 0)
Le programme fonctionne mais j’obtiens un décalage. Le premier appui sur un BP (+5, +10, +15) le servo ne bouge pas, lors du 2eme appui sur le même BP il avance. Mais quand je change de BP il avance de la valeur du précèdent, le 2eme appuis l’incrémentation est correcte.
J’ai beau chercher une solution je coince :S

#include <Servo.h>

Servo Player1;

int const des0 = 3;
int const des1 = 4;
int const des2 = 5;
int const des3 = 6;
int const reset = 7;
int position;
int posMini = 0;
int posMaxi = 160;

void setup()
{
pinMode(des0,INPUT);
pinMode(des1,INPUT);
pinMode(des2,INPUT);
pinMode(des3,INPUT);
pinMode(reset,INPUT);

Player1.attach(9);
Player1.write(0);
  
  
Serial.begin(9600);
}

void loop()
{
int b1 = digitalRead(des0); 
int b2 = digitalRead(des1);
int b3 = digitalRead(des2);
int b4 = digitalRead(des3);
int bR = digitalRead(reset);
delay(10);
  
  if (b1 == HIGH) { // Si b1 = 1 
    Player1.write(position); // le servo ne bouge pas
    delay(500);
  }

  if (b2 == HIGH) { // Si b2 = 1
    Player1.write(position);
    position = position + 5; // le servo incrémente de +5
    if (position > posMaxi) {  
      position = posMaxi;
    }
    delay(500);
  }

  if (b3 == HIGH) { // Si b3 = 1
    Player1.write(position);
    position = position + 10; // le servo incrémente de +10
    if (position > posMaxi) {
      position = posMaxi;
    }
    delay(500);
  }

  if (b4 == HIGH) { // Si b4 = 1
    Player1.write(position);
    position = position + 15; // le servo incrémente de +15
    if (position > posMaxi) {
      position = posMaxi;
    }
    delay(500);
  }

  if (bR == HIGH) { // Si bR = 1
    Player1.write(position);
    position = posMini; // le servo reviens à 0
    if (position < posMini) {
      position = posMini;
    }
    delay(500);
  }

  Serial.print("Position du servo : "); Serial.println(position);


}

Je met le câblage en PJ
Bonne journée et merci d’avance :slight_smile:

Déjà, vous auriez interet à créer des fonctions, et ne ppas trop travailler par copier coller (si on détecte une bug dans un code affecté par la “programmation” par copier coller, répercuter partout la correction est une horreur indicible.
JE peux vous proposer une correction pour un bouton:

  if (b2 == HIGH) { // Si b2 = 1
    Player1.write(position);
    position = position + 5; // le servo incrémente de +5
    if (position > posMaxi) { 
      position = posMaxi;
    }
    delay(500);
  }

devient

  if (b2 == HIGH) { // Si b2 == 1 -même dans les commentaires, la distinction affectation != egalité est primordiale

   position = position + 5; // le servo incrémente de +5
    if (position > posMaxi) {       position = posMaxi;    }
    Player1.write(position);
 
    delay(500);
  }

Je vais vous proposer de mettre une fonction qui vous cadre les positions (rend le code plus facile à lire)

int cadrer(int position, const int postionMini, const int positionMaxi){
  //  return (min(max(position, postionMini), positionMaxi);
  int aux = position;
  if (aux < positionMini) aux = positionMini;
  if (aux > positionMaxi) aux = positionMaxi;
  return(aux);
}

OoMatsu:
Mais quand je change de BP il avance de la valeur du précèdent, le 2eme appuis l’incrémentation est correcte

C'est logique. C'est exactement ce que tu demandes à ton code de faire. Regarde bien ton code. Tu fais:

    Player1.write(position);
    position = position + 5; // le servo incrémente de +5

Donc tu dis au servo de bouger à l'angle position et ENSUITE tu changes la valeur de position

Merci dbrion06 et fdufnews,

fdufnews:
C’est logique. C’est exactement ce que tu demandes à ton code de faire. Regarde bien ton code. Tu fais:

    Player1.write(position);

position = position + 5; // le servo incrémente de +5



Donc tu dis au servo de bouger à l'angle position et ENSUITE tu changes la valeur de position

Effectivement, sur ce coup je suis pas très malin >:(
Après modif, ça fonctionne parfaitement. je vais essayer de rajouter plusieurs servo maintenant

dbrion06:
Je vais vous proposer de mettre une fonction qui vous cadre les positions (rend le code plus facile à lire)

int cadrer(int position, const int postionMini, const int positionMaxi){

//  return (min(max(position, postionMini), positionMaxi);
  int aux = position;
  if (aux < positionMini) aux = positionMini;
  if (aux > positionMaxi) aux = positionMaxi;
  return(aux);
}

J’ai du mal de comprendre le but de cette fonction, désolé. je commence tous juste la programmation.
je vais me renseigner sur “return”.
Encore merci