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);
}
cs_louis14
Messages postés793Date d'inscriptionmardi 8 juillet 2003StatutMembreDernière intervention10 février 20218 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 :