Aide pour programmation de joystick

Eleve - Modifié par Whismeril le 5/03/2015 à 20:56
 Eleve - 21 mars 2015 à 12:06
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.

5 réponses

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.
0
yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 26
5 mars 2015 à 20:31
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...
0
Bah on avait essayer mais le programme avec "==" ne fonctionne plus derrière...
donc je ne sais pas trop quoi en pensé :x
0
cs_louis14 Messages postés 793 Date d'inscription mardi 8 juillet 2003 Statut Membre Dernière intervention 10 février 2021 8
9 mars 2015 à 08:53
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
{
}

}
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Bon bah le problème a été résolut 3 jours avant le passage à l'oral hihi ^^

En vous remerciant.

Bonne continuation!
0
Rejoignez-nous