Aide pour programmation de joystick

-
Bonjour,

je suis actuellement dans la partie programmation pour mes TPE et notre robot aura un joystick pour pouvoir le controller.
Seulement, lorsque l'on téléverse ce programme ci-dessous, le robot a pas mal de petit problème, notamment dans les directions avancé et reculé qui ne fonctionne pas ou encore la direction gauche qui "fonctionne" sauf quand le joystick est positionné a la position maximum.

En espérant des solutions,
Merci

Un élève dans la galère.


/* 
  Utilisation Joystick 


*/

int port_v = 0; // joystick mouvement vertical 
int port_h = 1; // joystick mouvement horizontal     
long valeur_v = 0;
long valeur_h = 0;
int dir_g;
int dir_d;
int vit_g;
int vit_d;
long dif_vit;
long Vit_Moteur_G=5;
long Dir_Moteur_G=4;
long Vit_Moteur_D=6;
long Dir_Moteur_D=7;

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


 


  pinMode(Vit_Moteur_G, OUTPUT);
  pinMode(Dir_Moteur_G, OUTPUT);
  pinMode(Vit_Moteur_D, OUTPUT);
  pinMode(Dir_Moteur_D, OUTPUT);

  analogWrite(Vit_Moteur_G,0);
  digitalWrite(Dir_Moteur_G,0);
  analogWrite(Vit_Moteur_D,0);
  digitalWrite(Dir_Moteur_D,0);
}
void loop() 
{
  valeur_v=analogRead(port_v);
  valeur_h=analogRead(port_h);
  dif_vit=512-valeur_h;
  if ((dif_vit>0)&&(valeur_v=512)){          //tourne à gauche, zone 1
    dir_d=0;
    dir_g=0;
    vit_g=0;
    vit_d=(512-valeur_h)/2;
      analogWrite(Vit_Moteur_G,vit_g);
      digitalWrite(Dir_Moteur_G,dir_g);
      analogWrite(Vit_Moteur_D,vit_d);
      digitalWrite(Dir_Moteur_D,dir_d);}
  if ((dif_vit>0)&&(valeur_v=512)){          //tourne à gauche, à fond, zone 1
    dir_d=0;
    dir_g=0;
    vit_g=0;
    vit_d=(512-valeur_h)/2;
      analogWrite(Vit_Moteur_G,vit_g);
      digitalWrite(Dir_Moteur_G,dir_g);
      analogWrite(Vit_Moteur_D,vit_d);
      digitalWrite(Dir_Moteur_D,dir_d);}
  if ((dif_vit<0)&&(valeur_v=512)){           //tourne à droite, zone 2
    dir_d=0;
    dir_g=0;
    vit_g=(valeur_h-512)/2;
    vit_d=0;
      analogWrite(Vit_Moteur_G,vit_g);
      digitalWrite(Dir_Moteur_G,dir_g);
      analogWrite(Vit_Moteur_D,vit_d);
      digitalWrite(Dir_Moteur_D,dir_d);}
  if ((dif_vit=0)&&(valeur_v>512)){           //avance, zone 3
    dir_d=0;
    dir_g=0;
    vit_g=512/2;
    vit_d=vit_g;
      analogWrite(Vit_Moteur_G,vit_g);
      digitalWrite(Dir_Moteur_G,dir_g);
      analogWrite(Vit_Moteur_D,vit_d);
      digitalWrite(Dir_Moteur_D,dir_d);}
   if ((dif_vit=0)&&(valeur_v<512)){           //recule, zone 4
    dir_d=1;
    dir_g=1;
    vit_g=(512-valeur_v)/2;
    vit_d=vit_g;
      analogWrite(Vit_Moteur_G,vit_g);
      digitalWrite(Dir_Moteur_G,dir_g);
      analogWrite(Vit_Moteur_D,vit_d);
      digitalWrite(Dir_Moteur_D,dir_d);}
   
  Serial.print("X");
  Serial.print(valeur_h); 
  Serial.print(" Y:"); 
  Serial.println(valeur_v); 
  Serial.print(" vit mot gauche:"); 
  Serial.println(vit_g);
  Serial.print(" Vit mot droit:"); 
  Serial.println(vit_d);
  Serial.print(" dif_vit:"); 
  Serial.println(dif_vit);
  delay(500); 
}


EDIT: Ajout de la coloration syntaxique.
Afficher la suite 

5 réponses

0
Merci
Re :
Le problème concernant le joystick qui ne fonctionner pas quand on positionné le joystick à la valeur maximal à été résolut!

Mais on recherche encore pour avancer et reculé!

Merci encore,

Un élève un peu moins dans la galère.
Commenter la réponse de Eleve
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
17
0
Merci
Salut,

dans les instructions if de loop , tous les test sont VRAI

if ((dif_vit>0)&&(valeur_v = 512)){
// TOUJOURS VRAI
}

c'est comme si il était écrit

if ( (dif_vit>0) && (true) ){

}

ce serait pas == par hazard ?

bye...
Commenter la réponse de yann_lo_san
0
Merci
Bah on avait essayer mais le programme avec "==" ne fonctionne plus derrière...
donc je ne sais pas trop quoi en pensé :x
Commenter la réponse de Eleve
Messages postés
792
Date d'inscription
mardi 8 juillet 2003
Statut
Membre
Dernière intervention
12 juillet 2019
7
0
Merci
Bonjour,
Comme l'a fait remarquer yann le test v_valeur=512 est incorrect. Vous affecter systématiquement la valeur 512 à v_Valeur lors du premier test. De même pour dif_vit dans les tests suivants.

Mettez vous en mode debug pour le vérifier.

Posez correctement toutes vos conditions en clair dans un tableau et ensuite traduisez le en code. Le premier et le deuxième test de votre code sont identiques. Il y a un différent qui manque.
de plus mettez des "else", ce n'est pas la peine de faire toutes ces comparaisons. Le code ci-dessous correspond normalement à tous les états :
if(dif_vit == 0)
{

if(v_valeur == 512)
{
}
else if(v_valeur < 512)
{
}
else
{
}

}
else if(dif_vit < 0)
{

if(v_valeur == 512)
{
}
else if(v_valeur < 512)
{
}
else
{
}

}
else
{
if(v_valeur == 512)
{
}
else if(v_valeur < 512)
{
}
else
{
}

}
Commenter la réponse de cs_louis14
0
Merci
Bon bah le problème a été résolut 3 jours avant le passage à l'oral hihi ^^

En vous remerciant.

Bonne continuation!
Commenter la réponse de Eleve