Joystick, commander des moteurs à courant continu; besoin d'aide

Bonjour, je vous ai mis tout mon code mais on ne s'intéressera pas à la librairies Mirf, seulement au niveau ou je commande les moteurs, mon problème est que quand j'ajoute la fonction pour n'allumer qu'un moteur avec l'axe X de mon joytick que j'ai ici nommé numero 2, et l'axe Y c'est à dire pour faire marcher les deux moteurs du sens avant et arrière, que j'ai nommé numéro 1. Sauf quand je mets la fonction "val" dans mon code, la fonction val2 ne tourne plus, enfin elle tourne mais les moteurs ne tourne plus, comment pourrais je faire pour faire tourné le moteur de droite quand je tounre le joystick a gauche et le moteur de gauche quand je tourne le joystick à droite ? merci

#include <SPI.h>
#include <Mirf.h>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>

//Assignation des pins de l'Arduino
#define motorPin1a 7 // Marche avant du premier moteur
#define motorPin1b 8 // Marche arrière du premier moteur
#define speedPin1 6 // L293D enable pin pour le premier moteur
#define motorPin2a 3 // Marche avant du deuxième moteur
#define motorPin2b 4 // Marche arrière du deuxième moteur
#define speedPin2 5 // L293D enable pin pour le deuxième moteur

// jusqu'à nouvel ordre, la vitesse du moteur est nulle
int Mspeed= 0;
int Mspeed1 = 0; 
int Mspeed2 = 0;  



void setup() {

  // réglage des broches à output
  pinMode(motorPin1a, OUTPUT);
  pinMode(motorPin1b, OUTPUT);
  pinMode(speedPin1, OUTPUT);
  pinMode(motorPin2a, OUTPUT);
  pinMode(motorPin2b, OUTPUT);
  pinMode(speedPin2, OUTPUT);

  Serial.begin(9600);  // pour le débogage
  
  Mirf.cePin = 9; // CE sur D9
  Mirf.csnPin = 10; // CSN sur D10
  Mirf.spi = &MirfHardwareSpi; 
  Mirf.init();

  Mirf.channel = 0; 
  Mirf.payload = 4; 
  Mirf.config(); 
  
  Mirf.setTADDR((byte *)"nrf01"); // Le 2eme module va envoyer ses info au 1er module
  Mirf.setRADDR((byte *)"nrf02"); // On définit ici l'adresse du 2eme module
  
}

void loop(){
  int numero1;
  int numero2;
  byte numero;
  int pairimpair;
  byte data[Mirf.payload]; // Tableau de byte qui va stocker le message recu
  
  if(!Mirf.isSending() && Mirf.dataReady()){ // Si un message a été recu et qu'un autre n'est pas en cours d'emission
    
   Mirf.getData(data); // on récupére le message 
  
  // la suite de 4 bytes est convertie en 2 int   
   numero1 = ((long )data[0]) << 8;
   numero1 |= data[1];
   numero2 = ((long )data[2]) << 8;
   numero2 |= data[3];
    
   // pour débogage, on pourra enlever ensuite:
   Serial.print("Recu les numeros ");    
   Serial.print(numero1,DEC);
   Serial.print(" , ");
   Serial.println(numero2,DEC);
 
   
 int val2 = numero1 ;
 int val = numero2 ; 
  
  if (val2 > 320)  // donc marche arrière
  {
    val2 = map(val2, 311, 0, 0, 255);
    analogWrite(speedPin1, val2); 
    digitalWrite(motorPin1a, HIGH); 
    digitalWrite(motorPin1b, LOW);
    analogWrite(speedPin2, val2); 
    digitalWrite(motorPin2a, HIGH); 
    digitalWrite(motorPin2b, LOW);
    Serial.print("Marche avant ");    
    Serial.print(val2,DEC);
    Serial.print(" , "); 
  }
  else if(val2 < 316) {
    val2 = map(val2, 311, 0, 0, 255) ;
    analogWrite(speedPin1,val2);
    digitalWrite(motorPin1a,LOW) ;
    digitalWrite(motorPin1b,HIGH); 
    analogWrite(speedPin2,val2);
    digitalWrite(motorPin2a,LOW) ;
    digitalWrite(motorPin2b,HIGH) ;
    Serial.print("marche arriere ");    
    Serial.print(val2,DEC);
    Serial.print(" , "); 
}

  if (val > 335)  //  moteur 1 en marche pour aller a droite
  {
    val = map(val, 311, 0, 0, 255);
    analogWrite(speedPin1, val); 
    digitalWrite(motorPin1b, HIGH); 
    Serial.print("gauche ");    
    Serial.print(val2,DEC);
    Serial.print(" , "); 
  }
  else if(val < 332) moteur deux en marche  pour aller à gauche 
{
    val = map(val, 311, 0, 0, 255) ;
    analogWrite(speedPin2,val);
    digitalWrite(motorPin2b,HIGH) ;
    Serial.print("droite ");    
    Serial.print(val2,DEC);
    Serial.print(" , "); 
}


    else 
   {
       analogWrite(speedPin1,0);
       analogWrite(speedPin2, 0); 
   }
   
}
}

J'ai vraiment d'aide je passe le bac la semaine prochaine si quelqu'un peut m'aider merci

Bonjour,

Dans ta logique "val", tu devrais aussi affecter motorPin1a et motorPin2a, comme dans la logique "val2".

Devils_Kills:
J'ai vraiment d'aide je passe le bac la semaine prochaine si quelqu'un peut m'aider merci

tu en aurais peut être plus si tu ne créais pas plusieurs posts sur la même chose et en lisant les réponses faites.
http://forum.arduino.cc/index.php?topic=477737.msg3263206#msg3263206

infobarquee:
tu en aurais peut être plus si tu ne créais pas plusieurs posts sur la même chose et en lisant les réponses faites.
Besoin d'aide pour comprendre un code qui sert à varier des moteurs - Français - Arduino Forum

Bonjour
j'ai créé un autre post car comme je l'ai expliqué, ce n'est pas du tout le même problèmes, j'ai préféré en créer un autre pour ne pas porter à confusion dans le problème, j'ai bien lu la réponse sur l'autre post et il y en a qu'une, j'ai fais mon propre code, mon problème précédent à été résolue.

3Sigma:
Bonjour,

Dans ta logique "val", tu devrais aussi affecter motorPin1a et motorPin2a, comme dans la logique "val2".

Bonjour merci de votre réponse
j'ai fait quelque modification, j'ai fais ce que vous m'avez demandé mais le problèmes persiste. Au bruit, j'ai comme la sensation que les moteurs sont "bloqués"
merci

 int val2 = numero1 ; // valeur de repos pour l'axe des X du joystick est de 318
 int val = numero2 ; // valeur de repos pour l'axe des Y du joystick est de 333



   if (val2 > 320)  // donc marche arrière
  {
    val2 = map(val2, 311, 0, 0, 255);
    analogWrite(speedPin1, val2); 
    digitalWrite(motorPin1a, HIGH); 
    digitalWrite(motorPin1b, LOW);
    analogWrite(speedPin2, val2); 
    digitalWrite(motorPin2a, HIGH); 
    digitalWrite(motorPin2b, LOW);
    Serial.print("Marche avant ");    
    Serial.print(val2,DEC);
    Serial.print(" , "); 
  }
  else if(val2 < 316) {

    val2 = map(val2, 311, 0, 0, 255) ;
    analogWrite(speedPin1,val2);
    digitalWrite(motorPin1a,LOW) ;
    digitalWrite(motorPin1b,HIGH); 
    analogWrite(speedPin2,val2);
    digitalWrite(motorPin2a,LOW) ;
    digitalWrite(motorPin2b,HIGH) ;
    Serial.print("marche arriere ");    
    Serial.print(val2,DEC);
    Serial.print(" , "); 
}

   if (val > 335)  // donc marche arrière
  {
    val2= 318; 
    val = map(val, 311, 0, 0, 255);
    analogWrite(speedPin1, val); 
    digitalWrite(motorPin1a,HIGH) ;
    digitalWrite(motorPin1b, LOW); 
    Serial.print("gauche ");    
    Serial.print(val,DEC);
    Serial.print(" , "); 
  }
  else if(val < 332) {
    val2= 318;
    val = map(val, 311, 0, 0, 255) ;
    analogWrite(speedPin2,val);
    digitalWrite(motorPin2a,HIGH) ;
    digitalWrite(motorPin2b,LOW) ;
    Serial.print("droite ");    
    Serial.print(val,DEC);
    Serial.print(" , "); 
}


    if (val == 332) 
  {
        analogWrite(speedPin1, 0);
        analogWrite(speedPin2,0); 
        
  }

    if (val2==317) 
  {
        analogWrite(speedPin1,0);
        analogWrite(speedPin2,0); 
  }
   
}
}

val et val2 se marchent dessus, les deux logiques sont exécutées. Peux-tu expliquer clairement ce que tu veux faire à partir du joystick ?

3Sigma:
val et val2 se marchent dessus, les deux logiques sont exécutées. Peux-tu expliquer clairement ce que tu veux faire à partir du joystick ?

Avec le joystick, j'aimerais avec l'axe des Y, avancé et reculé, et avec l'axe des X tournée, mais pour que la voiture tourne, il faut que une des deux roues tournent, c'est à dire quand je tourne le joystick à gauche sur l'axe des Y, je veux donc avoir ma roue de droite que tourne pour que la voiture tourne à gauche. Ma logique "val" fonctionne, mais quand je met cette logique la val2 ne fonctionne plus , alors que sans, cela fonctionne très bien.

Ton mouvement doit être une combinaison d'un mouvement longitudinal pur et d'un mouvement de rotation pure.
Donc dans le principe, dans ton programme tu devras écrire une seule fois un truc du style:

analogWrite(speedPin1, val + val2);

3Sigma:
Ton mouvement doit être une combinaison d'un mouvement longitudinal pur et d'un mouvement de rotation pure.
Donc dans le principe, dans ton programme tu devras écrire une seule fois un truc du style:

analogWrite(speedPin1, val + val2);

J'ai fais ce que vous m'avez demandé.
Mais je ne sais pas si vous avez compris, mes roues ne change pas de direction, elle se mettent seulement en marche de l'avant vers l'arrière donc on parle ici de deux mouvement longitudinales, que ce soit pour avancer ou pour tourner, car si seulement la roue de droite avance, la voiture va tourne à gauche par principe, il me faut donc que quand la valeur de val est supérieur au point de repos de l'axe Y, il faut que une des deux roues soient en marches.

    if (val2 > 320)  // donc marche arrière

{
      val2 = map(val2, 311, 0, 0, 255);
      analogWrite(speedPin1, val + val2);
      digitalWrite(motorPin1a, HIGH);
      digitalWrite(motorPin1b, LOW);
      analogWrite(speedPin2, val2 + val);
      digitalWrite(motorPin2a, HIGH);
      digitalWrite(motorPin2b, LOW);
      Serial.print("Marche avant ");   
      Serial.print(val2,DEC);
      Serial.print(" , ");
    }
    else if(val2 < 316)
    { //marche arrière

val2 = map(val2, 311, 0, 0, 255) ;
      analogWrite(speedPin1,val + val2); 
      digitalWrite(motorPin1a,LOW) ;
      digitalWrite(motorPin1b,HIGH);
      analogWrite(speedPin2,val2 + val);
      digitalWrite(motorPin2a,LOW) ;
      digitalWrite(motorPin2b,HIGH) ;
      Serial.print("marche arriere ");   
      Serial.print(val2,DEC);
      Serial.print(" , ");
    }

if (val > 335)  // marche avant
    {
     
      val = map(val, 311, 0, 0, 255);
      analogWrite(speedPin1, val + val2);
      digitalWrite(motorPin1a,HIGH) ; //marche avant pour aller a droite
      digitalWrite(motorPin1b, LOW);
      Serial.print("gauche ");   
      Serial.print(val,DEC);
      Serial.print(" , ");
    }
      else if(val < 332)
      {
       
        val = map(val, 311, 0, 0, 255) ;
        analogWrite(speedPin2,val + val2 );
        digitalWrite(motorPin2a,HIGH) ; //marche avant pour aller a gauche
        digitalWrite(motorPin2b,LOW) ;
        Serial.print("droite ");   
        Serial.print(val,DEC);
        Serial.print(" , ");
      }

else
      {
        analogWrite(speedPin1,0);
        analogWrite(speedPin2,0);
      }
 
  }// fin du if (!Mirf.isSending() && Mirf.dataReady())
} //fin loop

Il a combien de roues ton robot ? S'il a deux roues, tu dois pouvoir autoriser un mouvement de pivot: une roue qui tourne dans un sens, une autre dans l'autre sens, avec la même vitesse en valeur absolue.

3Sigma:
Il a combien de roues ton robot ? S'il a deux roues, tu dois pouvoir autoriser un mouvement de pivot: une roue qui tourne dans un sens, une autre dans l'autre sens, avec la même vitesse en valeur absolue.

Il y a deux roues sur mon robot !
Comment puis-je faire pour autoriser un mouvement de pivot ? je n'ai pas très bien compris
Ou dois je mettre les valeurs absolues?

Il faut faire tourner les deux roues en sens inverse mais à la même vitesse.

Je viens de remarquer mon problème.
quand je mettais le else à la fin pour bloqué les moteurs, le else chevauchait les deux fonctions, du coup, si j'avais une des deux valeurs > ou < les moteurs bloquait à cause du else.
Donc mon problème maintenant c'est que tout fonctionne, mais mes moteurs continue de tourné seul, comment puis je faire pour les arreter ?
Même si je fais tourné les deux roues au sens inverse j'aurais le même problème, mes variables val et val2 se chevauchent, elles commandent les même moteurs !

Bien sûr, c'est pour ça que tu ne dois commander qu'une seule fois chaque moteur, à partir d'une combinaison de val et de val2.
Que est le module de commande moteur que tu utilises ?

3Sigma:
Bien sûr, c'est pour ça que tu ne dois commander qu'une seule fois chaque moteur, à partir d'une combinaison de val et de val2.
Que est le module de commande moteur que tu utilises ?

Merci de ton aide 3sigma j'ai enfin réussi ! j'utilise un L293D

#include <SPI.h>
#include <Mirf.h>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>

//Assignation des pins de l'Arduino
#define motorPin1a 7 // Marche avant du premier moteur
#define motorPin1b 8 // Marche arrière du premier moteur
#define speedPin1 6 // L293D enable pin pour le premier moteur
#define motorPin2a 3 // Marche avant du deuxième moteur
#define motorPin2b 4 // Marche arrière du deuxième moteur
#define speedPin2 5 // L293D enable pin pour le deuxième moteur

// jusqu'à nouvel ordre, la vitesse du moteur est nulle



void setup(void) {

  // réglage des broches à output
  pinMode(motorPin1a, OUTPUT);
  pinMode(motorPin1b, OUTPUT);
  pinMode(speedPin1, OUTPUT);
  pinMode(motorPin2a, OUTPUT);
  pinMode(motorPin2b, OUTPUT);
  pinMode(speedPin2, OUTPUT);
  Serial.begin(9600); 
  
  Mirf.cePin = 9; // CE sur D9
  Mirf.csnPin = 10; // CSN sur D10
  Mirf.spi = &MirfHardwareSpi; 
  Mirf.init(); 

  Mirf.channel = 0; //canal de fréquence à utiliser pour l’émission et la réception
  Mirf.payload = 4; //la taille des messages à transmettre en octect 
  Mirf.config(); //Active la partie réception du module et vide la mémoire du buffer de réception.
  
  Mirf.setTADDR((byte *)"nrf01"); // Le 2eme module va envoyer ses info au 1er module
  Mirf.setRADDR((byte *)"nrf02"); // On définit ici l'adresse du 2eme module

  

}
void loop(){
int numero1;
int numero2;
byte numero;
int pairimpair;
byte data[Mirf.payload]; // Tableau de byte qui va stocker le message recu
  
  if(!Mirf.isSending() && Mirf.dataReady())
  { // Si un message a été recu et qu'un autre n'est pas en cours d'emission
    
  Mirf.getData(data); // on récupére le message 
  
  // la suite de 4 bytes est convertie en 2 int   
  numero1 = ((long )data[0]) << 8;
  numero1 |= data[1];
  numero2 = ((long )data[2]) << 8;
  numero2 |= data[3];
    
  // valeur des donnés du joysticks reçu:
  Serial.print("Recu les numeros ");    
  Serial.print(numero1,DEC);
  Serial.print(" , ");
  Serial.println(numero2,DEC);
 
  int val2 = numero1 ;
  int val = numero2  ; // valeur de repos pour l'axe des X du joystick est de 318 // valeur de repos pour l'axe des Y du joystick est de 333
  int stop = val + val2; 




        
    if (val2 > 30)  // donc marche avant
    {
      val2 = map((val2), 300, 0, 0, 255);
      analogWrite(speedPin1, (val2)); 
      digitalWrite(motorPin1a, HIGH); 
      digitalWrite(motorPin1b, LOW);
      analogWrite(speedPin2, (val2)); 
      digitalWrite(motorPin2a, HIGH); 
      digitalWrite(motorPin2b, LOW);
      Serial.print("Marche avant ");    
      Serial.print(val2,DEC);
      Serial.print(" , "); 

       }
        else if (val2 < -30)
       { //marche arrière

      val2 = map((val2), 0, 280, 0, 255) ;
      analogWrite(speedPin1,(val2));  
      digitalWrite(motorPin1a,LOW) ;
      digitalWrite(motorPin1b,HIGH); 
      analogWrite(speedPin2,val2);
      digitalWrite(motorPin2a,LOW) ;
      digitalWrite(motorPin2b,HIGH) ;
      Serial.print("marche arriere ");    
      Serial.print(val2,DEC);
      Serial.print(" , "); 
}

else if (-40<stop<40)
  {      
    analogWrite(speedPin2,0);
    analogWrite(speedPin1,0);
    Serial.print("stop");
    Serial.print(stop,DEC);
    Serial.print(" , "); 
  }
    
    if (val > 30)  // donc marche avant
    {
      val = map((val), 300, 0, 0, 255);
      analogWrite(speedPin1, (val)); 
      digitalWrite(motorPin1a, HIGH); 
      digitalWrite(motorPin1b, LOW);
      analogWrite(speedPin2, (0)); 
      digitalWrite(motorPin2a, LOW); 
      digitalWrite(motorPin2b, LOW);
      Serial.print("droite ");    
      Serial.print(val,DEC);
      Serial.print(" , "); 
  
   }

        else if (val < -30)
       { //marche arrière

      val = map((val), 0, 300, 0, 255) ;
      analogWrite(speedPin1,(0));  
      digitalWrite(motorPin1a,LOW) ;
      digitalWrite(motorPin1b,LOW); 
      analogWrite(speedPin2,val);
      digitalWrite(motorPin2a,HIGH) ;
      digitalWrite(motorPin2b,LOW) ;
      Serial.print("gauche ");    
      Serial.print(val,DEC);
      Serial.print(" , "); 
      }

      
      

     

  }// fin du if (!Mirf.isSending() && Mirf.dataReady()) 

} //fin loop

j'ai juste combiné les deux variables des deux axes comme tu me l'as dis :wink: