problème sur easydriver pendant communication bidirectionnel avec nrf24l01

bonjours a tous, je viens de m'inscrire sur ce forum parce que bien évidement j'ai un problème qui me casse la tête depuis un bon moment , et là j'ai vraiment besoin d'aide avant de devenir tarré!! donc voila j'ai construit un ptit robot qui fonctionne sur une mega 2600, deux petit step motor genre nema 14 conduit par des easydriver sparkfun et un petit moteur DC, le tout piloté par une télécommande avec 2 joysticks. 1 pour les steps, un moteur dans l'axe X et un autre sur Y, le deuxième pour le petit DC. La communication avec des nfr24L01 et ca marchait très très bien dans le meilleurs des mondes. le problème et survenue quand j'ai ajouté a mon robot un compas pour avoir son azimute et potentiomètre pour avoir le degré d’élévation de son bras, je voulait que les valeurs s'affiche sur ma télécommande via un lcd donc communication bidirectionnel: la télécommande envoie les valeurs de joystick et reçois les valeurs du compas et du potar et l'inverse sur le robot. la communication se fait mais les deux step moteur réponde presque plus genre un pas toute les 2 secondes et j'arrive pas a comprendre ou j'ai merdé donc je vous joint lecode qui fait des truc d'un autre monde, si quelqu'un a une idée de ce qui m'arrive je suis preneur, merci d'avance.

les code qui partent en cacahuète!

télécommande:

//bibliotheque telecommande
#include <SPI.h>
#include <Mirf.h>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>
//bibli LCD
#include <LiquidCrystal.h>

LiquidCrystal lcd(2, 3, 4, 5, 6, 7);

//tableau de valeurs pour joystick, compas, potar
int valeurs [5];

void setup() {

  lcd.begin(16, 2);

  Mirf.cePin = 9;
  Mirf.csnPin = 10;
  Mirf.spi = &MirfHardwareSpi;
  Mirf.init();
  Mirf.channel = 1;
  Mirf.payload = sizeof(valeurs);
  Mirf.config(); 
  Mirf.setRADDR((byte *)"clie1");

}



void loop() {
 
//j'envoie les valeurs des joystick

  valeurs [0] =  analogRead(A0);
  valeurs [1] =  analogRead(A1);
  valeurs [2] =   analogRead(A2);
  
 Mirf.setTADDR((byte *)"serv1");
 Mirf.send((byte *) &valeurs);
 while (Mirf.isSending());
//je recois les valeurs du compas et du potar

while (!Mirf.dataReady()) {}
Mirf.getData((byte *) &valeurs);

float heading =  valeurs [3];
float potDeg =  valeurs [4] * (360.0 / 1023.0);

//affichage sur lcd de l'azimut et des valeurs du potar converties en degré
if ((heading >= 355) or (heading <= 18))
{ lcd.setCursor(1, 0);
  lcd.print (heading);
  lcd.setCursor(6, 0);
  lcd.print (" D Nord ");
}
if ((heading >= 19) and (heading <= 79))
{ lcd.setCursor(1, 0);
  lcd.print (heading);
  lcd.setCursor(6, 0);
  lcd.print (" D Nord-E");
}
if ((heading >= 80) and (heading <= 105))
{ lcd.setCursor(1, 0);
  lcd.print (heading);
  lcd.setCursor(6, 0);
  lcd.print(" D Est");
}
if ((heading >= 106) and (heading <= 170))
{ lcd.setCursor(1, 0);
  lcd.print (heading);
  lcd.setCursor(6, 0);
  lcd.print ( " D Sud-E");
}
if ((heading >= 171) and (heading <= 200))
{ lcd.setCursor(1, 0);
  lcd.print (heading);
  lcd.setCursor(6, 0);
  lcd.print (" D Sud");
}
if ((heading >= 201) and (heading <= 255))
{ lcd.setCursor(1, 0);
  lcd.print (heading);
  lcd.setCursor(6, 0);
  lcd.print (" D Sud-O");
}
if ((heading >= 256) and (heading <= 280))
{ lcd.setCursor(1, 0);
  lcd.print (heading);
  lcd.setCursor(6, 0);
  lcd.print (" D Ouest");
}
if ((heading >= 281) and (heading <= 354))
{ lcd.setCursor(1, 0);
  lcd.print (heading);
  lcd.setCursor(6, 0);
  lcd.print (" D Nord-O");
}

lcd.setCursor(2, 1);
lcd.print (potDeg);
lcd.setCursor(9, 1);
lcd.print ("Degre");

}

le robot:

// bibliotheque telecomande
#include <SPI.h>
#include <Mirf.h>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>
// bibli pour le compas
#include <Arduino.h>
#include <Wire.h>
#include <HMC5883L_Simple.h>



// easydriver step_moteur X
#define step_pinX 5
#define dir_pinX 4
#define MS1X 6
#define SLEEPY 7
// easydriver step_moteur Y
#define step_pinY 16
#define dir_pinY 17
#define MS1Y 15
#define SLEEPY 14
//moteur DC
#define ENABLE 10
#define DIRA 8
#define DIRB 9
// limite butoir
#define Limit01 18
#define Limit02 19
// objet compas
HMC5883L_Simple Compass;

int valeurs [5];


int step_speedX =10 ; // vitesse: plus le chiffre est haut moins ca va vite
int step_speedY =1;

void setup() {


  //step moteur axe X
  pinMode(MS1X, OUTPUT);
  pinMode(dir_pinX, OUTPUT);
  pinMode(step_pinX, OUTPUT);
  pinMode(SLEEPY, OUTPUT);
  //step moteur axe Y
  pinMode(MS1Y, OUTPUT);
  pinMode(dir_pinY, OUTPUT);
  pinMode(step_pinY, OUTPUT);
  pinMode(SLEEPY, OUTPUT);
  // DC moteur mise au point
  pinMode(ENABLE, OUTPUT);
  pinMode(DIRA, OUTPUT);
  pinMode(DIRB, OUTPUT);
  // limite de course pour axe X
  pinMode(Limit01, INPUT);
  pinMode(Limit02, INPUT);



digitalWrite(SLEEPX, HIGH);  // reveil EasyDriverX
    delay(5);  // le temps de le reveiller*/

  digitalWrite(SLEEPY, HIGH);   // reveil EasyDriverY
  delay(5);  // le temps de le reveiller

  digitalWrite(MS1X, LOW);
                           // Configuré en Full Steps
  digitalWrite(MS1Y, LOW);      // Configuré en Full Steps


  //telecomande
  Mirf.cePin = 48;            //pin CE
  Mirf.csnPin = 49;            //pin CSN
  Mirf.spi = &MirfHardwareSpi;
  Mirf.init();
  Mirf.setRADDR((byte *)"serv1");
  Mirf.payload = sizeof(valeurs);
  Mirf.config();

  //compas
  Wire.begin();
  Compass.SetDeclination(15, 00, 'E');
  Compass.SetSamplingMode(COMPASS_SINGLE);
  Compass.SetScale(COMPASS_SCALE_130);
  Compass.SetOrientation(COMPASS_HORIZONTAL_Y_NORTH);

}



void loop() {
// j'envois les valeurs du compas et du potar
  valeurs [3] = Compass.GetHeadingDegrees();
  valeurs [4] =  analogRead(A3);

  Mirf.setTADDR((byte *)"clie1");
  Mirf.send((byte *) &valeurs);
  while (Mirf.isSending());

// je recois les valeurs des deux joysticks

  while (!Mirf.dataReady()) {}
  Mirf.getData((byte *) &valeurs);

  int joystick1X = valeurs [0];
  int joystick1Y = valeurs [1];
  int joystick2X = valeurs [2];



  if ( joystick1X > 712) { //  joystick n° 1 sur axe X
    if (!digitalRead(Limit02)) {}

    else {

      digitalWrite(dir_pinX, LOW);  // en avant (HIGH = arrière / LOW = avant)
      digitalWrite(step_pinX, HIGH);
      delay(1);
      digitalWrite(step_pinX, LOW);
      delay(1);
    }
  }


  if ( joystick1X < 312) {

    if (!digitalRead(Limit01)) {}

    else {

      digitalWrite(dir_pinX, HIGH);// en arrière
      digitalWrite(step_pinX, HIGH);
      delay(1);
      digitalWrite(step_pinX, LOW);
      delay(1);
    }

  }
  if ( joystick1Y > 712)//joystick n°1 sur axe Y en avant
  {

    digitalWrite(dir_pinY, LOW);
    digitalWrite(step_pinY, HIGH);
    delay(1);
    digitalWrite(step_pinY, LOW);
    delay(1);
  }



  if ( joystick1Y < 312)// en arrière
  {
    digitalWrite(dir_pinY, HIGH);
    digitalWrite(step_pinY, HIGH);
    delay(1);
    digitalWrite(step_pinY, LOW);
    delay(1);
  }
  if ( joystick2X < 312) //joystick n° 2 sur axe X
  {

    Motor3Avant(255);

  }
  else if (joystick2X > 712 )
  {
    Motor3Arriere (255);
  }


  else
  {
    Motor3Stop();

  }




}


void Motor3Avant ( byte Spd)
{
  digitalWrite(DIRA, HIGH);
  digitalWrite(DIRB, LOW);
  analogWrite(ENABLE, Spd);
}
void Motor3Arriere( byte Spd)
{
  digitalWrite(DIRA, LOW);
  digitalWrite(DIRB, HIGH);
  analogWrite(ENABLE, Spd);
}
void Motor3Stop()
{
  digitalWrite(DIRA, LOW);
  digitalWrite(DIRB, LOW);
}

pourquoi bloquez vous la loop() en attente de communication

  while (!Mirf.dataReady()) {} // <<== ATTENTE ACTIVE
  Mirf.getData((byte *) &valeurs);

vous feriez mieux de faire un if et traitez les data quand elles arrivent et sinon continuer la boucle.

D'autre part avez vous besoin de balancer à fond la caisse les données sur les ondes ? par exemple est-ce que mettre à jour une ou deux fois par seconde l'azimut et l'angle ne serait pas suffisant ? ils ne vont pas changer drastiquement en quelques millisecondes.

bonjour et merci d'avoir répondu si rapidement. J'ai suivi vos conseil et malheureusement c'est pire si je fait un truc du genre

  if(Mirf.dataReady()){
    Mirf.getData((byte *) &valeur); 
    blabla le reste du code.....
  }

et bien plus rien ne se passe !! et si je met un delay a l'envoie des valeurs du compas et potentiomètre le delay s'applique aussi au joystick et le peu qui fonctionne, fonctionne avec 1 seconde de retard !! donc voila ! ou alors je n'ai pas bien compris ce vous m'avez proposé c'est possible !!

Il ne faut conserver quand le if () que le changement d'ordres et considérer que si vous n'avez pas reçu de message alors les instructions précédentes sont toujours valides

oui mais de toute façon la transmission se fait très bien , le robot reçois les valeurs et les envoient correctement le problème que je ne comprend pas c'est pourquoi easydriver ne fonctionne plus correctement lorsqu'il y a échange bidirectionnelle , et qu'ils fonctionnent parfaitement avec un échange simple! pourquoi le fait de renvoyer des valeurs influe sur les moteurs a pas?C'est un peu étrange non? si encore je n'avais aucun retour ou que rien ne se passait quand j'actionne les joystick, se serait évident que cela viendrait du code de la transmission ,mais non tout fonctionne, c'est juste que ca donne l'impression que les moteurs font 1/16 de pas toutes les 2 secondes!!