Commander 2 MCC avec un joystick.

Bonjour,

Dans mon projet de PPE qui est de créer un robot de surveillance télécommandé, je rencontre un probleme.

J'utilise arduino pour la partie commande du robot, mais je n'arrive pas a obtenir un code qui permet de commander les moteurs avec le joystick. Je me suis assuré que tout fonctionnait avec un programme de test des moteurs ainsi que du joystick (https://www.sparkfun.com/tutorials/171) j'ai essayé de les melanger afin d'obtenir un programme me permettant de commander les moteurs, mais je rencontre à chaque fois des erreurs.

Je precise que je n'ai que tres peu de bases sur arduino,jeviens de m'y mettre.

Je dispose d'une carte joystick shield, une carte motor shield et une arduino uno.

Bonjour,
Demande au modérateur de mettre ton topic dans la bonne rubrique
@+

http://www.lmgtfy.com/?q=joystick+arduino+moteur

Si je viens demander ici, evidemment c'est que j'ai deja recherché et que je n'ai pas trouver de reponse a mon probleme.

Pour l'instant j'ai ce programme, les sens des moteurs etc sont pas encore forcement coherents, je cherche d'abord a voir si le robot reagi !

Cependant j'ai encore un probleme, lorsque je bouge le joystick, il reste bloqué sur une commande meme quand je le lache !

const int vitesseMotA=3; // Constante pour la broche 3
const int sensMotA=12; // Constante pour la broche 12
const int freinMotA=9; // Constante pour la broche 9
const int intensiteMotA=A0; // intensité du moteur 0

const int vitesseMotB=11; // Constante pour la broche 11
const int sensMotB=13; // Constante pour la broche 13
const int freinMotB=8; // Constante pour la broche 8
const int intensiteMotB=A1; // intensité du moteur 1

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); 
  
   pinMode (vitesseMotA,OUTPUT); // Broche vitesseMotA configurée en sortie
 pinMode (freinMotA,OUTPUT); // Broche freinMotA configurée en sortie
 pinMode (vitesseMotB,OUTPUT); // Broche vitesseMotB configurée en sortie
 pinMode (sensMotA,OUTPUT); // Broche sensMotA configurée en sortie
 pinMode (sensMotB,OUTPUT); // Broche senMotB configurée en sortie
  
  digitalWrite(vitesseMotA,LOW); // a l'arret
digitalWrite(sensMotA,LOW); 
digitalWrite(freinMotA,LOW); // frein off 

digitalWrite(vitesseMotB,LOW); // à l'arret 
digitalWrite(sensMotB,LOW);  
digitalWrite(freinMotB,LOW); // frein off
  
}

void calcul_zone(int x, int y) 
{ 
  if (x >= 38) 
  { 
     if (y >= 23){zone = 2;} 
     if (y <= 36){zone = 4;} 
     if ((y < 36) && (y > 23)) {zone = 3;} 
  } 
  if (x <= 23) 
  { 
     if (y >= 23){zone = 8;} 
     if (y <= 36){zone = 6;} 
     if ((y < 36) && (y > 23)) {zone = 7;} 
  } 
  if ((x > 23) && (x < 38)) 
  { 
     if (y >= 23){zone = 1;} 
     if (y <= 36){zone = 5;} 
     if ((y < 36) && (y > 23)) {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 recule"); 
      digitalWrite(sensMotA,HIGH); // sens 1
      digitalWrite(vitesseMotA, HIGH); // vitesse maximale
      digitalWrite(sensMotB,HIGH); // sens 1
      digitalWrite(vitesseMotB, HIGH); // vitesse maximale
      break; 
    case 2: 
      Serial.println("Robot recule et tourne à droite"); 
      digitalWrite(sensMotA,HIGH); // sens 1
      digitalWrite(vitesseMotA, HIGH); // vitesse maximale
      digitalWrite(sensMotB,HIGH); // sens 1
      digitalWrite(vitesseMotB,LOW); // vitesse maximale
      break; 
    case 3: 
      Serial.println("Robot tourne à droite toute"); 
      digitalWrite(sensMotA,HIGH); // sens 1
      digitalWrite(vitesseMotA, HIGH); // vitesse maximale
      digitalWrite(sensMotB,LOW); // sens 1
      digitalWrite(vitesseMotB, HIGH); // vitesse maximale
      break; 
    case 4: 
      Serial.println("Robot avance et tourne à droite"); 
         digitalWrite(sensMotA,LOW); // sens 1
      digitalWrite(vitesseMotA, HIGH); // vitesse maximale
      digitalWrite(sensMotB,LOW); // sens 1
      digitalWrite(vitesseMotB,LOW); // vitesse maximale
      break; 
    case 5: 
      Serial.println("Robot avance"); 
       digitalWrite(sensMotA,LOW); // sens 1
      digitalWrite(vitesseMotA, HIGH); // vitesse maximale
      digitalWrite(sensMotB,LOW); // sens 1
      digitalWrite(vitesseMotB, HIGH); // vitesse maximale
      break; 
    case 6: 
      Serial.println("Robot avance et tourne à gauche"); 
         digitalWrite(sensMotA,LOW); // sens 1
      digitalWrite(vitesseMotA, LOW); // vitesse maximale
      digitalWrite(sensMotB,LOW); // sens 1
      digitalWrite(vitesseMotB,HIGH); // vitesse maximale
      break; 
    case 7: 
      Serial.println("Robot tourne à gauche toute"); 
      digitalWrite(sensMotA,LOW); // sens 1
      digitalWrite(vitesseMotA, HIGH); // vitesse maximale
      digitalWrite(sensMotB,HIGH); // sens 1
      digitalWrite(vitesseMotB, HIGH); // vitesse maximale
      break; 
    case 8: 
      Serial.println("Robot recule et tourne à gauche"); 
      digitalWrite(sensMotA,HIGH); // sens 1
      digitalWrite(vitesseMotA, LOW); // vitesse maximale
      digitalWrite(sensMotB,HIGH); // sens 1
      digitalWrite(vitesseMotB,HIGH); // vitesse maximale
      break;       
  } 
  delay(100); 
}

Voilà mon programme, merci.

J'ai eu une réponse aussi constructive que ta question : pas de code, pas d'hardware, tu nous parles d'erreurs : lesquelles !! Enfin on a même pas idée de la gueule de ton robot : deux roues, quatre roues , quelle direction ... Bref si tu voulais une réponse intelligente il fallait peut-être faire un effort pour poser tes question intelligemment.

Pour ton problème de robot qui reste bloqué : bah normal. Imaginons que zone = 8 ==> digitalWrite(vitesseMotB,HIGH);
Puis ton joystick revient à zéro => zone 0 = Serial.println("Robot stop"); ==> et et la broche vitessemotB ? Et bien toujours HIGH ...

Sinon l'organisation de ton code n'est pas plus optimisé : tu veux gérer tous les cas possible ensemble. Normalement vitesse et direction sont géré différemment. Mais comme on ne sait pas à quoi ressemble ton robot ...

Comme je l'ai deja precisé, je DEBUTE !!!! Donc forcement ma question n'etait pas tres precise, je partais de rien appart des codes trouvés sur internet que je n'arrivait pas a modifier ! Depuis j'ai progressé !

Qu'importe la gueule de mon robot ? Je precise que je cherche a commander 2 MCC, qu'y avait-il besoin de savoir d'autre pour le code ? S'il y avait quelque chose, je l'ignorais, car comme je l'ai deja repeté, JE DEBUTAIS !! Ce qui vous semble evident ne l'est pas forcement pour moi.

Pour ton problème de robot qui reste bloqué : bah normal. Imaginons que zone = 8 ==> digitalWrite(vitesseMotB,HIGH);
Puis ton joystick revient à zéro => zone 0 = Serial.println("Robot stop"); ==> et et la broche vitessemotB ? Et bien toujours HIGH.

Ok ! Mais comment pourrais-je m'y prendre pour y remedier ?

Sinon l'organisation de ton code n'est pas plus optimisé : tu veux gérer tous les cas possible ensemble. Normalement vitesse et direction sont géré différemment. Mais comme on ne sait pas à quoi ressemble ton robot ...

Comment ca differemment ? Dans deux codes separés ? Mais comment pourrais-je alors les charger ?

Mon robot aura ces 2 roues motrices avec chacune un MCC, ainsi qu'une roue libre en plus ou bien 2 autres roues devant.

En gros si je dirige vers l'avant, je veux que les deux roues aillent en avant, si je dirige mon joystick vers l'arriere je veux que les deux aillent en arriere, si je dirige mon joystick vers la droite que la roue de droite recule et celle de gauche avance.

Merci de faire preuve d'un peu d'indulgence, comme je l'ai plusieurs fois repeté maintenant, je debute, ce qui est evident pour vous ne l'est pas pour moi, j'ai peu de temps pour realiser mon projet et j'ai beaucoup d'autres choses a faire a coté, si c'est pour se moquer de moi avec ce genre de liens sans rien m'expliquer je prefere autant qu'on ne me reponde pas.

Tu débutes en Arduino, on est bien d'accord, mais pas dans la vie en générale ? Sans être mécanicien, si t'as un problème sur ta voiture, tu te doutes bien que le garagiste aura au moins besoin de ta voiture et d'une explication du problème. La c'est pareil ...

La gueule de ton robot a bien évidemment une importance : entre un robot à deux roues motrices qui servent à la propulsion ET à la direction tu te doutes bien que ça se gère pas de la même manière qu'un robot à roues motrices + 1 roue directionnelle ! Et encore j'ai pris que deux cas, il y a des dizaines d'autres configurations possible ... Donc avant de dire qu'on se fout de ta gueule, essaye de respecter un minimum les gens qui viennent t'aider bénévolement. Si tu viens ici c'est justement que tu as besoin d'aide, le minimum c'est quand même d'essayer de fournir un maximum d'info pour éviter que ces personnes galèrent sur des choses qui n'ont pas lieu d'être. Tu veux qu'on t'aide à diriger ton robot ? Faudrait qu'on sache au moins comment il marche non ? Ca te semble si extraordinaire ?! Tu débarques sans code et sans présentation du hardware et tu t'étonnes qu'on puisse pas te répondre ... Essaye de te mettre ne serais-ce que deux secondes à la place des personnes qui vont te lire !

Bref et si on revenait à ce qui importe ?

Ok ! Mais comment pourrais-je m'y prendre pour y remedier ?

Tout simplement en mettant tout à zéro

Comment ca differemment ? Dans deux codes separés ? Mais comment pourrais-je alors les charger ?

J'ai pas parlé de deux codes séparés, juste d'une gestion séparées. Un code qui ne marchera pas tel quel mais devrait te donner l'idée :

void loop() {

 valeur_v = map(analogRead(port_v),0,1024,-255,255); // règle de trois
 valeur_h = map(analogRead(port_h),0,1024,-255,255);

if( valeur_v<10 && valeur_v>-10) valeur_v=0; // permet d'éviter d'avoir des mouvements involontaire joystick à zéro
if( valeur_h<10 &&  valeur_h>-10) valeur_h=0;

if(valeur_v>=10) { // pour l'instant on va faire simple, le robot ne peut pas tourner sur lui même
digitalWrite(sensMotA,HIGH);
digitalWrite(sensMotB,HIGH);
} else {
digitalWrite(sensMotA,LOW);
digitalWrite(sensMotB,LOW);
}

// on va maintenant créer la direction en décalant les vitesses des moteurs et en les forçant à rester dans la plage 0-255

byte VMot_A=constrain(abs(valeur_v)+ valeur_h,0,255); 
byte VMot_B=constrain(abs(valeur_v)- valeur_h,0,255);

analogWrite(vitesseMotA,abs(VMot_A)); // à supposer une gestion en PWM
analogWrite(vitesseMotA,abs(VMot_B));

}

Pas sûr que ça marche du premier coup, encore moins sûr qu'en marche arrière ça fonctionne dans le bon sens et j'ai pas tenu compte du frein mais on s'en fout, désactive le pour le moment

Oui je veux bien reconnaitre le fait qu'on veule bien m'aider benevolement, mais il y a une maniere de faire les choses.

Venir me prendre de haut et se moquer de moi avec ton lien, c'etait pas la meilleur maniere d'engager un dialogue, si tu veux que j'te respecte, evite d'etre hautain et moqueur comme tu l'a ete.

Excuse moi, commander 2MCC avec un joystick sachant que c'est un robot, ca me paraissait logique, y'a pas 10 possibilités. Ceux a qui j'en avait parlé, les profs, sur d'autres forums, etc. ont pas eu de mal a voir ce que je voulais dire, ca n'a pas ete le cas pour toi faut croire, dans ce cas la je veux bien donner plus d'info et expliquer plus, mais il y a une maniere de le demander.

De plus j'ai fourni par la suite le programme, qui (Si on a des bases...) permet de clairement visualiser ce que je cherche a faire je pense.. Dire que je n'ai fourni aucune information, ca releve de la mauvaise foi.

Merci bien pour ton aide en tout cas, j'essayerais ton code des que je le pourrais.

Elyes17:
Venir me prendre de haut et se moquer de moi avec ton lien, c'etait pas la meilleur maniere d'engager un dialogue, si tu veux que j'te respecte, evite d'etre hautain et moqueur comme tu l'a ete.

J'aimerais voir la gueule du garagiste (et encore lui tu le paye !) si tu arrives tu lui balances les clés en disant "voiture, panne" et que tu te barres. Ton attitude est sans aucun doute plus irrespectueuse que la mienne ...

Elyes17:
Excuse moi, commander 2MCC avec un joystick sachant que c'est un robot, ca me paraissait logique, y'a pas 10 possibilités. Ceux a qui j'en avait parlé, les profs, sur d'autres forums, etc. ont pas eu de mal a voir ce que je voulais dire, ca n'a pas ete le cas pour toi faut croire, dans ce cas la je veux bien donner plus d'info et expliquer plus, mais il y a une manière de le demander.

Pas ma faute si les gens à qui tu te demandes ne connaisse qu'une seule chose ... C'est bien la config classique mais tu aurais très bien pu en utiliser une autre, donc je n'allais pas m'amuser à perdre du temps à coder du vent.

Elyes17:
De plus j'ai fourni par la suite le programme,[/color] qui (Si on a des bases...) permet de clairement visualiser ce que je cherche a faire je pense.. Dire que je n'ai fourni aucune information, ca releve de la mauvaise foi.

"Par la suite", "je pense" ... Une fois encore, toi t'es ton projet, ça te semble évident. Réfléchis juste 2 sec ...

La question porte depuis ton topic, comment tu présente ton sujet, ce qui fait gagner du temps à tous le monde et en particulier à ceux qui le donne aux autres. Parce que ton robot, désolé, mais j'en ai rien à foutre. Par contre j'étais bien content que des gens qui n'en avait rien à foutre de mes projets m'aide quand même, donc je suis content à mon tour de rendre la pareil et de faire partager mes connaissances. Masi quand je suis obligé plusieurs fois par jour de demander "code ? hardware ?" alors que ça me semble un minimum, parce que balancer trois phrase comme un voleur, je suis désolé c'est de l'irrespect.

Donc oui tu as donné des infos, APRES qu'on ait perdu du temps à te demander donc c'est pas la peine d'utiliser ça pour ta défense ...

"J'aimerais voir la gueule du garagiste (et encore lui tu le paye !) si tu arrives tu lui balances les clés en disant "voiture, panne" et que tu te barres. Ton attitude est sans aucun doute plus irrespectueuse que la mienne ..."

Tu prends des exemples inadaptés et tu pousse a l'extreme. C'est trop facile, ce que tu me dis la, c'est exactement comme si je te disais : "J'aimerais bien voir la gueule du mendiant si tu lui jettais une piece a la gueule en te foutant de lui."

Pas ma faute si les gens à qui tu te demandes ne connaisse qu'une seule chose ... C'est bien la config classique mais tu aurais très bien pu en utiliser une autre, donc je n'allais pas m'amuser à perdre du temps à coder du vent.

En general, quand on precise pas une chose, c'est qu'elle n'a rien de particulier.

""Par la suite", "je pense" ... Une fois encore, toi t'es ton projet, ça te semble évident. Réfléchis juste 2 sec ..."

Le je pense c'est une facon de parler, certes c'est mon projet, certes il est possible que je n'ai pas pris assez de recule pour expliquer ce que je vous demande, mais encore une fois, il y a des manieres de demander les choses. Et encore une fois, je l'ai expliquer a bien d'autre personne, le probleme ne s'est jamais posé.

alors que ça me semble un minimum

L'hopital qui se fout de la charité, ca te semble etre le minimum A TOI, pas a un novice.

Autrement dit, tu attendais de moi ce que tu n'as pas ete capable de faire.

parce que balancer trois phrase comme un voleur, je suis désolé c'est de l'irrespect."

*Un manque de precisions du a un manque de conaissances. Ne dis pas n'importe quoi s'il te plait.

Donc oui tu as donné des infos, APRES qu'on ait perdu du temps à te demander donc c'est pas la peine d'utiliser ça pour ta défense ...

Ah ? J'ai relu, tout ce que je vois avant mon code, c'est une personne qui m'a signalé que mon topic etait mal situé et toi avec ton lien (Qui n'indiquait en rien que je n'avais pas ete assez precis, mais qui me preconisait plutot de rechercher sur google, ce que j'avais deja fait.) , j'ai beau chercher, aucune demande... Donc oui, je maintiens, les info en plus je les ai bien ajouté AVANT qu'on me le demande, et non avant.

Perte de temps ? Excuse moi, a cause de moi t'a perdu du temps pour bien te foutre de ma gueule avec ton lien a la mords moi le noeud XD

Mon cher Elyes17,
Tu fais partie de la vague actuelle de TPE de première et STI2D/S-SI de terminale qui déferle sur ce forum.

La vague précédente d'avant Noël était plus respectueuse des usages du Forum. Sans doute parce que s'y prenant à temps elle était moins traumatisée par l'échéance qui s'approche à grand pas.

Mais cette situation c'est toi et tes collègues qui en êtes les les seuls responsables.

Ce forum est animé par des bénévoles qui ont leur façon de travailler, nous sommes sans doute des vieux c**, quoique il y a des jeunes qui s'y trouvent très à l'aise, mais c'est comme ça.
Et comme ce n'est pas nous les demandeurs mais toi et tes collègues du moment, c'est à vous de vous adapter a nos méthodes de travail et non pas l'inverse.

Donc dans ton intérêt (un TPE quel coefficient ?) si tu veux de l'aide tu baisse d'un ton et tu répond aux questions complémentaires qu'on est obligé de poser pour réussir à comprendre ton besoin ou tu vas voir ailleurs si d'autres acceptent l'impolitesse.

Pour avoir une idée de ce qu'un certain nombre d'entre nous pensons de la vague actuelle à laquelle tu appartiens et de l'état de saturation dans lequel nous sommes va jeter un oeil sur le post:
http://forum.arduino.cc/index.php?topic=226850.msg1640158#msg1640158

Sans animosité, bonne chance quand même pour ton TPE

Le respect c'est mutuel, vos methodes de travail je veux bien m'y plier, mais il y a des limites. On me demande de prendre du recule, je vous demande d'en prendre vous aussi, les vagues d'eleves demandant des renseignements pour les PPE, je l'ignorais, j'aurais fais differemment si je l'avais su, les renseignements "elementaires" qu'il fallait fournir, ca aussi je l'ignorais, je m'en excuse.

Mais je n'admet pas et je n'admettrais jamais que sous pretexte qu'on aide quelqu'un on puisse se permettre de lui manquer de respect et d'etre aussi hautain, parce que moi, son lien pour moi c'etait un manque de respect total.

Oulala pauvre chou un Let Me Google That For You ... Hey faut arrêter de déconner. C'est juste une manière taquine de dire qu'on est pas des moteur de recherche, t'es le premier à te sentir insulter par ça

Bonjour,

B@tto:
Oulala pauvre chou un Let Me Google That For You ... Hey faut arrêter de déconner. C'est juste une manière taquine de dire qu'on est pas des moteur de recherche, t'es le premier à te sentir insulter par ça

+1
Le reste est dans la forme.
Merci

Je n'ai pas parler d'insulte, mais de manque de respect.

Bref, si vous voulez toujours m'aider, j'ai essayer ton programme, je n'ai rien reussi a en faire, je suis revenu au mien, j'ai fais comme tu me l'a dit tout a 0 pour la position "robot stop", mais la ou s'affichent les positions, meme en position stop, la position qui s'imprime en est une autre.

Comme si les valeurs du joystick avaient ete decalée, savez vous a quoi cela pourrait etre du ?

Il faut débuguer en utilisant la liaison série. Fait des des Serial.print() aux endroits stratégiques, soit en envoyant des trucs genre "j'ai bien reçu la commande X" soit en transmettant les valeurs des variables. C'est certains que ça n'allait pas marcher du premier coup, maintenant il faut savoir pourquoi.

Je suis pas sur d'avoir compris tes consignes, mais il y a deja des serial.print() dans mon programme, mais les positions imprimées restent bloquées

/*
Programme pour utilisation Joystick
Celui-ci permet de définir la zone en fonction de la position du Joystick
*/

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 >= 38)
{
if (y >= 23){zone = 2;}
if (y <= 36){zone = 4;}
if ((y < 36) && (y > 23)) {zone = 3;}
}
if (x <= 23)
{
if (y >= 23){zone = 8;}
if (y <= 36){zone = 6;}
if ((y < 36) && (y > 23)) {zone = 7;}
}
if ((x > 23) && (x < 38))
{
if (y >= 23){zone = 1;}
if (y <= 36){zone = 5;}
if ((y < 36) && (y > 23)) {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 recule");
break;
case 2:
Serial.println("Robot recule et tourne à droite");
break;
case 3:
Serial.println("Robot tourne à droite toute");
break;
case 4:
Serial.println("Robot avance et tourne à droite");
break;
case 5:
Serial.println("Robot avance");
break;
case 6:
Serial.println("Robot avance et tourne à gauche");
break;
case 7:
Serial.println("Robot tourne à gauche toute");
break;
case 8:
Serial.println("Robot recule et tourne à gauche");
break;
}
delay(100);
}

Le programme a cet etat ne fait pas marcher mes moteurs, mais il imprime ce que ferait mon robot par rapport a la position de mon joystick, les positions ne restent pas dans ce programme. Mais dans l'autre version, (celle que j'ai posté en premier) cabloque.

Edit : J'ai remarqué que les positions imprimées réagissaient en fonction des moteurs, et plus du joystick. Si je bloque un moteur, ca change les positions imprimées, mais le joystick n'influe presque plus.

Avec ces serial.print, si le code de calcul_zone ou si les valeur retournées par les analogRead sont incohérentes tu ne vas rien voir, comme l'indique B@tto des SerialPrint indiquant les valeurs de valeur_v, valeur_h et zone sont un minimum.

D'autre part, la logique des tests sur y dans calcul_zone est pour le moins bizarre.

Serge

D'accord, mais dois-je les placer dans ou à l'exterieur de la boucle ?

Je pense que le probleme de mon programme est qu'il ne se remet pas à 0 a la fin de la boucle, j'ai donc mis "int valeur_v = 0;
int valeur_h = 0;
int zone = 0; " dans la boucle, mais du coup ca reste bloqué à 0.

Oui, moi aussi les coordonnées m'ont semblé bizarre au debut, la position initiale a pour coordonnées (28;29) et non (0;0), mon prof aussi ne comprenait pas pourquoi j'avais de telles valeur.

Quand est il interessant de connaitre les valeurs de valeur_v, valeur_h et zone ?