Problème avec des servomoteurs!

Bonjour, je suis débutant dans le domaine d'arduino mais je me suis lancé dans un projet qui consiste à créer un bras robotisé programmable avec des servomoteurs contrôlés par une arduino ATmega2560.
Pour l'instant je souhaite contrôler mes moteurs avec des joysticks. Au total il y aura 6 axes ce qui me fait 3 joysticks pour les contrôler. Mais avant cela, et n'ayant pas le programme, j'ai décidé de faire des tests. Et j'ai bien fait car je me suis rendu compte qu'il n'existait pas beaucoup de programmes pour cela. Le problème est que je n'aimerais pas associer une valeur du joystick à un angle du servo mais faire en sorte que quand le joystick est à gauche le servomoteur tourne petit a petit jusqu'à ce qu'il arrive au bout et la même chose de l'autre coté.
Voici mon code :

#include <Servo.h>  

Servo servo1;
Servo servo2;

int x_key = A1;                                               
int y_key = A0;                                               

int x_pos;
int y_pos;

int servo1_pin = 8;
int servo2_pin = 9;  

int initial_position = 0;
int initial_position1 = 0;

void setup ( ) {
Serial.begin (9600) ;
servo1.attach (servo1_pin ) ; 
servo2.attach (servo2_pin ) ; 
servo1.write (initial_position);
servo2.write (initial_position1);
pinMode (x_key, INPUT) ;                     
pinMode (y_key, INPUT) ;                      
}

void loop ( ) {
x_pos = analogRead (x_key) ;  
y_pos = analogRead (y_key) ;                      

if (x_pos < 300){
if (initial_position < 10) { }
else{ initial_position = initial_position - 1; 
servo1.write ( initial_position ) ; 
delay (40) ; } } 

if (x_pos > 700){
if (initial_position > 180)
{  
}  
else{
initial_position = initial_position + 1;
servo1.write ( initial_position ) ;
delay (40) ;
}
}

if (y_pos < 300){
if (initial_position1 < 10) { } 
else{ initial_position1 = initial_position1 - 1; 
servo2.write ( initial_position1 ) ; 
delay (40) ; } } 

if (y_pos > 700){
if (initial_position1 > 180)
{  
}        
else{
initial_position1 = initial_position1 + 1;
servo2.write ( initial_position1 ) ;
delay (40) ;
}
}
}

Le problème est le suivant, quand je met le circuit sous tension les servomoteurs s'initialisent puis quand j'incline le joystick a droite par exemple le servo avance, jusque-là tout est parfait, mais ensuite dès que je lâche le joystick le servo revient a ca position initiale alors que je voudrais qu'il reste dans sa position.
Est-ce normal ?
Qu'est-ce que je pourrais faire pour changer cela ?

Merci d'avance pour votre aide précieuse !

Bonjour maxspace03

J'ai fait l'essai de ton programme tel quel et il fonctionne comme tu le désires, quand on pousse le joystick, le servo se déplace progressivement, quand on relâche le joystick, le servo reste à sa position initial_position ou initial_position1.

Cordialement
jpbbricole

vérifiez les valeurs du joystick au repos

testez éventuellement ce code modifié (tapé ici sur la base du votre avec des noms de variables plus clairs)

#include <Servo.h>
Servo servoX, servoY;

const byte xPin = A1;
const byte yPin = A0;

const byte servoXPin = 8;
const byte servoYPin = 9;

int xPosition = 0;
int yPosition = 0;

void setup() {
  Serial.begin(115200) ;
  servoX.attach(servoXPin) ;
  servoY.attach(servoYPin) ;
  servoX.write(xPosition);
  servoY.write(yPosition);
}

void loop() {
  bool deplacement = false;
  // gestion des X
  int xJoy = analogRead(xPin);
  if ((xJoy < 300) && (xPosition >= 10)) {
    servoX.write(--xPosition) ;
    deplacement = true;
  } else if ((xJoy > 700) && (xPosition < 180)) {
    servoX.write(++xPosition);
    deplacement = true;
  }
  // gestion des Y
  int yJoy = analogRead(yPin);
  if ((yJoy < 300) && (yPosition >= 10)) {
    servoY.write(--yPosition) ;
    deplacement = true;
  } else if ((yJoy > 700) && (yPosition < 180)) {
    servoY.write(++yPosition);
    deplacement = true;
  }
  // debug + attente déplacement
  if (deplacement) {
    Serial.print(xPosition);
    Serial.write('\t');
    Serial.println(yPosition);
    delay(40) ;
  }
}

--> ouvrez le moniteur série à 115200 bauds et vous verrez comme cela les affichages des X/Y

Bonjour a vous,
tout d'abord merci d'avoir pris le temps de tester le code et de trouver une solution.
Suite à ton message jpbbricole j'ai décidé de faire encore des tests et effectivement ca ne fonctionne pas chez moi, mais merci quand même d'avoir pris le temps de faire le test.

J'ai également modifié mon code et je vais appliquer les conseils que tu m'a donner J-M-L, c'est clair que c'est tout de suite plus lisible, merci.

Je reviendrai vers vous pour vous tenir au courant si je rencontre d'autres problèmes et aussi si cela fonctionne.

Merci encore a vous et bonne journée,

maxspace03.

avez vous testé avec mon code? regardez ce que dit le moniteur série.

Bonjour J-M-L,

Non je n'ai pas encore eu l'occasion de tester votre code, je l'ai enregistrer et je le testerai ce soir si j'en ai le temps car je suis en cours en distanciel en ce moment.

Je vous tiendrai au courant de l'avancée des tests.

Cordialement,
Maxspace03.

Rebonjour,

Je viens de tester le code et il s'avère que cela ne fonctionne pas.

Le moniteur série indique bien les valeurs du servomoteur mais des que j'actionne le joystick a droite le servo va à droite mais une fois que je lâche le joystick le servo reviens au point de départ.
Mais je pense que cela ne peut-être un problème du code car jpbbricole la testé et cela fonctionnait.

Dans ce cas là, est-ce un problème de la carte, des joysticks ou bien des servomoteurs ?

Merci d'avance pour votre réponse.

Bonne journée,
Maxspace03.

Quand vous relâchez le joystick et que la valeur revient - que dit la console ? Il se peut que votre joystick soit mal calibré

Bonjour

Oui, il faut vérifier, qu'au repos la valeur est bien entre
if (x_pos > 700)
et
if (y_pos < 300)

Cordialement
jpbbricole

Oui c’était ce que j’avais proposé au post 3

Bonjour,

Tout d'abord merci beaucoup à vous de vos réponses très rapides.

Pas de problème, je vais tester les valeurs des joysticks, mais cela ne me paraissait pas nécessaire puisque je les avait déjà utilisés dans d'autres projets.

Bonjour maxspace03

J'ai revérifié ton programme, copié/collé, il fonctionne exactement comme désiré.

Cordialement
jpbbricole

Bonjour jpbbricole,

merci beaucoup d'avoir testé.
Oui effectivement je pense que c'est plutôt un problème de composants.

Si tu n'enregistres pas quelque part que le servo doit continuer à aller à droite, c'est peut-être un peu normal qu'il revienne à la dernière position imposée.

jetez un oeil au code. Le servo reçoit un ordre de déplacement que si le joystick est en dehors d'une zone "centrale". Donc si le servo bouge alors que le joystick est relâché, c'est que le code ne voit pas la position du joystick dans cette zone centrale sans doute.

Bonjour 68tjs

C'est cette condition qui règle tout
if (x_pos > 700)
et
if (y_pos < 300)
qui incrémente ou décrémente la position du servo

initial_position = initial_position + 1;
servo1.write ( initial_position ) ;

initial_position = initial_position - 1;
servo1.write ( initial_position ) ;

donc, un relâchement du joystick, pour autant que sa valeur se situe entre 300 et 700 ne doit pas influencer la position du servo.

Cordialement
jpbbricole

J'aurais préféré que ce soit le demandeur qui réponde, pas vous.

J'ai juste répondu pragmatiquement : si cela doit le faire et que cela ne le fait pas, c'est que quelque chose n'est pas fait comme on peut croire qu'il doit être fait.

Il me semble qu'une analyse systématique à coup de Serial.print de ce qu'il doit y avoir de mis en mémoire permettrait de faire un état des lieux solide qui permettrait de mener une analyse sur des bases saines.

Parce que si tout ce qui ne doit pas se produire ne se produisait pas, cela se saurait.

Mais bon je dis ça ...

@68tjs le point c'est que la question ne porte pas sur ce que vous exprimez

que le servo doit continuer à aller à droite

Il faut bien incrémenter quelque chose tant que le joystick est mis à droite ou à gauche pour que le servo aille à droite ou à gauche.
Je suis très bourrin, et très ras les pâquerettes, mais je vérifie avec des serial.print que la valeur qui doit être incrémentée est bien incrémenté.
Si c'est bon je vérifie qu'elle n'est pas réinitialisée par erreur.

Mais bon ....

OK.. mais cette partie là fonctionne.

le souci exprimé, c'est quand on relâche le joystick, il se replace au centre et chez @jpbbricole le servo ne bouge plus (c'est ce que dit le code) et chez @maxspace03 le servo revient vers 0
==> le pb semble plus dans le hardware ou le montage que dans le code