demande d'aide programme projet Bac 2 servo moteur avec 1 joystick

bonjour, je vous demande conseille car je n'arrive pas a contrôler mes servo continue comme je le veux .
mes servo continue serviront comme un pédalo. un servo continue de chaque coter du bateau. Tout comme le pédalo:
-pour avancer: servo continue à droite, rotation dans le sens horaire.
servo continue à gauche, rotation antihoraire.

pour reculer: servo continue à droite, rotation dans le sens antihoraire.
servo continue à gauche, rotation horaire.

tourné a gauche: servo continue à droite, rotation dans le sens horaire.
servo continue à gauche, rotation horaire.

tourné a droite: servo continue à droite, rotation dans le sens antihoraire.
servo continue à gauche, rotation antihoraire.

dans mon programme, j'ai réussi a le faire avancer. mais je n'arrive pas a le faire tourner. Pourriez-vous m'aidez s'il vous play.

#include <Servo.h> // Utilisation de la bibliothèque Servo.h.

#define pinJx A0 // Broche pour l'axe X du joystick.
#define pinJy A1 // Broche pour l'axe Y du joystick.
#define pinSx 9  // Broche pour le signal du servomoteur X.
#define pinSy 10 // Broche pour le signal du servomoteur Y.

unsigned short X, Y; // Variables pour les valeurs du joystick.
Servo Sx, Sy;        // Déclaration de deux objets Servo.

void setup()
{
 
 pinMode(pinSx, OUTPUT); // Broches fixées en sortie.
 pinMode(pinSy, OUTPUT);
 
 Sx.attach(pinSx); // Correspondance broche/servomoteur.
 Sy.attach(pinSy);
 
 Sx.write(90); // Mouvement du servomoteur en position initiale.
 Sy.write(90);
 
}

void loop()
{

 X = analogRead(pinJx); // Lecture des valeurs du joystick.
 Y = analogRead(pinJy);
 
 Sx.write(joyToServo(X)); // Envoi des signaux de rotation.
 Sy.write(joyToServo(X));

}

byte joyToServo(unsigned short n) // Fonction de correspondance.
{
 
 return (byte)(-0.175953 * n + 180); // f(x) calculée précédemment.
 
}

Édite ton message pour mettre ton code entre balises CODE (le bouton </>). C'est plus facile à lire notamment sur un smartphone.
Ça doit ressembler à ça :

Mon code ici

Lis bien ton code : est-ce que ça te semble correct ?

  Sx.write(joyToServo(X)); // Envoi des signaux de rotation.
  Sy.write(joyToServo(X));

Bonjour Xaviervav

xavierxav:
-pour avancer: servo moteur à droite, rotation dans le sens horaire.
servo moteur à gauche, rotation antihoraire.

pour reculer: servo moteur à droite, rotation dans le sens antihoraire.
servo moteur à gauche, rotation horaire.

tourné a gauche: servo moteur à droite, rotation dans le sens horaire.
servo moteur à gauche, rotation horaire.

tourné a droite: servo moteur à droite, rotation dans le sens antihoraire.
servo moteur à gauche, rotation antihoraire.

J'ai un doute sur les sens de rotation ?

Cordialement,
bidouilleelec

Précise ce que sont tes servo-moteurs.
A te lire j'ai l'impression que ce sont " ce qu'on appelle " des servo 360°

Un vrai servo moteur fait des débattement de ± 90 °, certains ± 135 ° mais jamais des tours complets.
Un vrai servo-moteur est fait pour tenir une position.
Ce qu'on appelle " des servos 360 ou servos continus " sont des moteurs classiques dont la commande est copiée sur celle des servo ce qui permet d'en grandement simplifier l'utilisation.

bidouilleelec:
Bonjour XaviervavJ'ai un doute sur les sens de rotation ?

Cordialement,
bidouilleelec

bonjour, je suis sur de mes sens , je les est tester .
:wink:
sa te semble peut être bizarre mais sais parce que il ne sont pas dans le même sens

lesept:
Édite ton message pour mettre ton code entre balises CODE (le bouton </>). C'est plus facile à lire notamment sur un smartphone.
Ça doit ressembler à ça :

Mon code ici

Lis bien ton code : est-ce que ça te semble correct ?

  Sx.write(joyToServo(X)); // Envoi des signaux de rotation.

Sy.write(joyToServo(X));

au départ, mon code était :

Sx.write(joyToServo(X)); // Envoi des signaux de rotation.
Sy.write(joyToServo(Y));

mais les servo moteur ne tournait pas en même temps malheureusement . j'ai donc mis pour essayer

Sx.write(joyToServo(X)); // Envoi des signaux de rotation.
Sy.write(joyToServo(Y));

et la , j'ai réussi à avancer , à reculer, mais pas à tourner

68tjs:
Précise ce que sont tes servo-moteurs.
A te lire j'ai l'impression que ce sont " ce qu'on appelle " des servo 360°

Un vrai servo moteur fait des débattement de ± 90 °, certains ± 135 ° mais jamais des tours complets.
Un vrai servo-moteur est fait pour tenir une position.
Ce qu'on appelle " des servos 360 ou servos continus " sont des moteurs classiques dont la commande est copiée sur celle des servo ce qui permet d'en grandement simplifier l'utilisation.

oui merci, c'est bien des servo à moteur continue :wink:

j'ai créé un autre programme qui me permet de lire la position du joystick dans le moniteur en série. serais t'il pas préférable qui je continue sur ce programme en disant par example:
la position avancer = au chiffre 1
chiffre 1 = servo continue à droite, rotation dans le sens horaire.
servo continue à gauche, rotation antihoraire.

/*
Programme pour utilisation Joystick
Celui-ci permet de définir la zone en fonction de la position du Joystick
*/
#include <Servo.h>
Servo myservo; 
int pos = 0; 

int port_v = A0; // joystick mouvement vertical
int port_h = A1; // joystick mouvement horizontal    
int valeur_v = 0;
int valeur_h = 0;
int zone = 0;

void setup()
{
Serial.begin(9600);
}



void calcul_zone(int x, int y)
{
if (x <= 250)
{
if (y >= 700){zone = 4;}
if (y <= 200){zone = 6;}
if ((y < 700) && (y > 200)) {zone = 5;}
}
if (x >= 700)
{
if (y >= 700){zone = 2;}
if (y <= 200){zone = 8;}
if ((y < 700) && (y > 200)) {zone = 1;}
}
if ((x > 200) && (x < 700))
{
if (y >= 700){zone = 3;}
if (y <= 200){zone = 7;}
if ((y < 700) && (y > 200)) {zone = 0;}
}
}

void loop()


{

// Lit l’entrée analogique A0
valeur_v = analogRead(port_v);
// lit l’entrée analogique A1
valeur_h = analogRead(port_h);
calcul_zone(valeur_h, valeur_v);
switch (zone)
{
case 0:
 Serial.println("Robot stop");
 break;
case 1:
 Serial.println("Robot avance ");
 break;
case 2:
 Serial.println("Robot avance et tourne à droite  ");
 break;
case 3:
 Serial.println("Robot tourne à droite toute ");
 break;
case 4:
 Serial.println("Robot recule et tourne à droite");
 break;
case 5:
 Serial.println("Robot recule");
 break;
case 6:
 Serial.println("Robot recule et tourne à gauche");
 break;
case 7:
 Serial.println("Robot tourne à gauche toute ");
 break;
case 8:
 Serial.println("Robot avance et tourne à gauche");
 break;      
}
delay(500);
}

Les balises ce ne sont des "quotes" mais des "code"
Icone </>

on lit en titre quote
et il n'y a pas d'asensseur sur le coté
C'est pour faire des citations

Pour le code on avoir ceci:

onlit en titre ;Code 
et la mise en forme du code est respectée.

Ne pas oublier de faire Ctrl T dans l'IDE avant de copier

C'est important de respecter cette règle si tu veux que le code soit lu à partir de tablette ou de smartphone.

Si ça peut aider, j'ai réécrit ta fonction de décision, avec une visu matricielle, et affichage des valeurs x et y :

/*  | 4 | 3 | 2 |
 *  | 5 | 0 | 1 |
 *  | 6 | 7 | 8 |
 *  x  250 700 
 */


void calcul_zone(int x, int y) {
  Serial.print ("x = "); Serial.print(x);
  Serial.print ("\ty = "); Serial.println(y);
  if (x <= 250) {
    if      (y >= 700) zone = 4;
    else if (y <= 200) zone = 6;
    else               zone = 5;
  } else if (x >= 700) {
    if      (y >= 700) zone = 2;
    else if (y <= 200) zone = 8;
    else               zone = 1;
  } else {
    if      (y >= 700) zone = 3;
    else if (y <= 200) zone = 7;
    else               zone = 0;
  }
}

Je pense que c'est une bonne idée, tu peux continuer comme ça en ajoutant tes consignes servo / moteur dans le switch / case.

oui merci, c'est bien des servo à moteur continue :wink:

C'est quoi ? Peux-tu poster une photo, image, référence ou datasheet de ces trucs bizarres ?

Si ce sont des moteurs à courant continu (CC), comment les commandes-tu ? Avec un pont en H ? Au besoin, lis cet article (en deux parties).

pour l'instant c'est un servo a courra

courroie ?

Quote

oui merci, c'est bien des servo à moteur continue ;)

C'est quoi ? Peux-tu poster une photo, image, référence ou datasheet de ces trucs bizarres ?

Ce sont des moteur normaux avec une électronique de puissance intégrée.
L'électronique utilise le protocole des servos :
Position milieu du servo (0°) = moteur arrété
Position vers un coté (disons vers la droite ) : le moteur tourne dans un sens
Position vers l'autre coté (disons vers la gauche) : le moteur tourne dans l'autre sens

Plus on se rapproche de la position extrême = plus la vitesse augmente.

bidouilleelec:
J'ai un doute sur les sens de rotation ?

J'imagine ... les deux moteurs sont "cul à cul". Ils tournent donc en sens inverse ... non ?

j'ai du nouveau !
j'arrive a commander parfaitement un moteur comme je le veux avec ce code

/*
Programme pour utilisation Joystick
Celui-ci permet de définir la zone en fonction de la position du Joystick
*/
#include <Servo.h>
Servo myservo; 
int pos = 90; 

int port_v = A0; // joystick mouvement vertical
int port_h = A1; // joystick mouvement horizontal    
int valeur_v = 0;
int valeur_h = 0;
int zone = 0;

void setup()
{
Serial.begin(9600);
 myservo.attach(9);
}



void calcul_zone(int x, int y)
{
if (x <= 250)
{
   if ((y < 700) && (y > 200)) {zone = 3;}
}
if (x >= 700)
{
   if ((y < 700) && (y > 200)) {zone = 1;}
}
if ((x > 200) && (x < 700))
{
   if (y >= 700){zone = 2;}
   if (y <= 200){zone = 4;}
   if ((y < 700) && (y > 200)) {zone = 0;}
}
}

void loop()


{

// Lit l’entrée analogique A0
valeur_v = analogRead(port_v);
// lit l’entrée analogique A1
valeur_h = analogRead(port_h);
calcul_zone(valeur_h, valeur_v);
switch (zone)
{
  case 0:
    Serial.println("Robot stop");
    for(pos = 90 ; pos >= 90; pos--)                  
    myservo.write(pos);
    break;
  case 1:
    Serial.println("Robot avance "); 
    for(pos = 180 ; pos >= 0; pos--)                  
    myservo.write(pos);
    break;
  case 2:
    Serial.println("Robot tourne à droite toute ");
    for(pos = 180 ; pos >= 0; pos--)                  
    myservo.write(pos);
    break;
  case 3:
    Serial.println("Robot recule");  
    for(pos = 180 ; pos >= 0; pos++)                  
    myservo.write(pos);
    break;
  case 4:
    Serial.println("Robot tourne à gauche toute ");
    for(pos = 180 ; pos >= 0; pos++)                  
    myservo.write(pos);
    break;
   
}
delay(500);
}

maintenant il faudrait que j'arrive a faire tourné le deuxième servo moteur dans le même sens pour avancer, reculer. et le sens contraire pour tourné a droite ou tourné a gauche. comment définir moteur x et moteur y. comment les commander avec mon programe

Je comprends mal ce que tu veux faire ici

for(pos = 90 ; pos >= 90; pos--)                  
    myservo.write(pos);
    break;

Il suffit de faire

myservo.write(90);

Tu n'utilises plus les zones 5, 6, 7 & 8 ?

Pour le deuxième moteur, tu définis une autre instance du second servo

Servo myservo2;

Tu ferais mieux de les appeler servoD et servoG par exemple, ce serait plus parlant.

Puis tu fais le attach et les write selon la pin et le besoin, comme pour le premier servo. Plus d'informations ici

j'ai réussi mon programme merci à vous, maintenant manque plus que je m'informe pour mettre les moteurs et la télécommande avec un arduino bluetooth shield v2.01

/*
  Programme pour utilisation Joystick
  Celui-ci permet de définir la zone en fonction de la position du Joystick
*/
#include <Servo.h>
Servo myservoG; 
Servo myservoD; 


int port_v = A0; // joystick mouvement vertical
int port_h = A1; // joystick mouvement horizontal    
int valeur_v = 0;
int valeur_h = 0;
int zone = 0;

void setup()
{
  Serial.begin(9600);
   myservoG.attach(9);
   myservoD.attach(10);
}

 

void calcul_zone(int x, int y)
{
  if (x <= 250)
  {
     if ((y < 700) && (y > 200)) {zone = 3;}
  }
  if (x >= 700)
  {
     if ((y < 700) && (y > 200)) {zone = 1;}
  }
  if ((x > 200) && (x < 700))
  {
     if (y >= 700){zone = 2;}
     if (y <= 200){zone = 4;}
     if ((y < 700) && (y > 200)) {zone = 0;}
  }
}

void loop()


  {
 
  // Lit l’entrée analogique A0
  valeur_v = analogRead(port_v);
  // lit l’entrée analogique A1
  valeur_h = analogRead(port_h);
  calcul_zone(valeur_h, valeur_v);
  switch (zone)
  {
    case 0:
      Serial.println("Robot stop");
      myservoG.write(95);
      myservoD.write(87);
      break;
    case 1:
      Serial.println("Robot avance "); 
      myservoG.write(0);
      myservoD.write(0);
      break;
    case 2:
      Serial.println("Robot tourne à droite toute ");
      myservoG.write(0);
      myservoD.write(180);
      break;
    case 3:
      Serial.println("Robot recule");  
      myservoG.write(180);
      myservoD.write(180);
      break;
    case 4:
      Serial.println("Robot tourne à gauche toute ");
      myservoG.write(180);
      myservoD.write(0);
      break;
     
  }
  delay(500);
}

finalement je n'arrive pas à coder pour envoyer en Bluetooth mes état de sevo moteur à une autre carte Bluetooth shield 2v01. pourriez vous encore m'aidez s'il vous play