Ayuda para añadir un joystick mas a mi coche rc para controlar servos

Buenas a toda la comunidad,he empezado a realizar mis pinitos mas serios con arduino,pero me encuentro en un problemilla.

He conseguido con un joystick controlar mi rc con el modula nrf24L01,pero el problema se me presenta cuando intento añadir otro joystick para controlar dos servos.

Utilizo un arduino mega para el coche y un arduino uno para el emisor.

el codigo del emisor es este:

#include <SPI.h>
#include <MIRF.H>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>


unsigned int joystick;
byte x, y;
void setup()

{

  Mirf.spi = &MirfHardwareSpi;

  // inicializacion del dispositivo
  Mirf.init();

  // Se envia dos bytes cada vez
  Mirf.payload = 2;

  // seleccionamos el canal
  Mirf.channel = 90;
  Mirf.config();

  // 1MHz
  Mirf.configRegister(RF_SETUP, 0x06);

  // Seleccionamos dirección de transmision
  Mirf.setTADDR((byte *)"12345");

  Serial.begin(57600);//podemos monitorizar los datos que enviamos al coche.
}

// enviar dato
void transmit(unsigned int joystick)
{
  Mirf.send((byte *)&joystick);
  while ( Mirf.isSending() ) ;
}


void loop()
{

  x = map(analogRead(5), 0, 1023, 255, 0);
  y = map(analogRead(4), 0, 1023, 255, 0);
  joystick = (x * 0x100) + y;
  transmit(joystick);
  delay(100);
  Serial.print(x);
  Serial.print("   ");
  Serial.print(y);
  Serial.print("   ");
  Serial.println(joystick);

}

y el del coche,gracias a la libreria de coche inteligente y a la shield l298n

#include <CocheDigital.h>
// MOTOR1_CTL1  2 // I1
// MOTOR1_CTL2  4 // I2  MOTOR DERECHO
// MOTOR1_PWM   3 // EA

// MOTOR2_CTL1  6 // I3
// MOTOR2_CTL2  7 // I4  MOTOR IZQUIERDO
// MOTOR2_PWM   5 // EB
CocheDigital CocheDigital(2, 4, 3, 6, 7, 5);

#include <SPI.h>
#include <MIRF.H>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>
// Receptor Wireless nRF24L01+
// Conectamos el emisor de la siguiente forma:
// Hardware SPI:
// MISO -> D12
// MOSI -> D11
// SCK  -> D13
// CE   -> D10
// CSN  -> D9



//constantes
#define velocidad_max 200  //valor máximo de velocidad (como maximo->255)
#define velocidad_dir 100  //valor que aumenta o disminuye la velocidad de las ruedas al girar
                           //aumentando o disminuyendo hacemos que el giro sea más o menos rápido.
//variables
int x, y;
int vel_iz, vel_de;
unsigned int dato;
byte tiempo_sin_recepcion;

void setup() {
  tiempo_sin_recepcion = 0;
  Mirf.spi = &MirfHardwareSpi;

  // inicializacion del dispositivo
  Mirf.init();

  // Se reciben dos byte cada vez
  Mirf.payload = 2;

  // seleccionamos el canal
  Mirf.channel = 90;
  Mirf.config();

  // 1MHz
  Mirf.configRegister(RF_SETUP, 0x06);

  // Seleccionamos dirección de recepcion
  Mirf.setRADDR((byte *)"12345"); //longitud max-> 5 caracteres
                                  //debe ser igual en emisor y receptor
  Serial.begin(57600); //podemos monitorizar los datos que recibimos del mando.

}
void loop()

{


  if ( Mirf.dataReady() )// Esperando recepción
  {
    tiempo_sin_recepcion = 0;
    Mirf.getData((byte *)&dato);
    //Serial.write(c);
    x = dato / 0x100; //en x tenemos la velocidad y sentido de la marcha
    y = dato % 0x100; // en y tenemos el giro a la derecha o izquierda

    x = map(x, 0, 255, -velocidad_max, velocidad_max);
    y = map(y, 0, 255, -velocidad_dir, velocidad_dir);



    Serial.print(x);
    Serial.print("  ");
    Serial.print(y);
    Serial.print("  ");
    //Serial.print(dato);
    if (x > 0)
    {
      Serial.print("++"); //avanza

      vel_iz = x + y;
      vel_de = x - y;
      if (vel_iz > velocidad_max) vel_iz = velocidad_max;
      if (vel_de > velocidad_max) vel_de = velocidad_max;
      if (vel_iz < 0) vel_iz = 0;
      if (vel_de < 0) vel_de = 0;
      CocheDigital.avanza(vel_iz, vel_de);


    }
    else
    {
      Serial.print("--");//retrocede

      x = x * (-1);
      vel_iz = x + y;
      vel_de = x - y;
      if (vel_iz > velocidad_max) vel_iz = velocidad_max;
      if (vel_de > velocidad_max) vel_de = velocidad_max;
      if (vel_iz < 0) vel_iz = 0;
      if (vel_de < 0) vel_de = 0;
      CocheDigital.retrocede(vel_iz, vel_de);
    }
    Serial.print(vel_iz);
    Serial.print("  ");
    Serial.println(vel_de);
  }


  delay(50);
  tiempo_sin_recepcion++;
  if (tiempo_sin_recepcion > 10)
  {
    tiempo_sin_recepcion = 0;
    CocheDigital.para();  //no recibimos del mando durante más de medio segundo
  }
}

He realizado pruebas y he conectado en el emisor otro joystick,y he conseguido enviar datos al coche,pero no me separa los datos y al final controlo el coche con los dos joystick.

Si alguien pudiera echarme una mano se lo agradeceria de todo corazon,y cuando termine el codigo y el proyecto lo compartire en esta grandiosa comunidad.

Yo veo que todo pasa por esto

  // Se envia dos bytes cada vez[i][/i]
  Mirf.payload = 2;

aunmenta Mirf.payload a la cantidad de bytes que deseas enviar por ejemplo 4 y lo mismo en el receptor. Luego decodifica adecuadamente y listo

Esta tarde realizaré las pruebas.

Para decodificarlo bien los dos joystick uno de ellos nombrado con byte x,y,servox,servox,servoy y aumentar el envío de datos a 4 bytes
Valdría así?, y luego en el receptor hacer las variables de los dos servidores con servox y servoy

Por eso no me gusta esa librería porque con Maniac o TMR20 puedes usar una estructura y luego enviarla y leerla con mucha simpleza.
En tu caso creo que también.

Tienes algún ejemplo con esas librerías?

Los ejemplos estan en este foro. Solo buscalos.
Hay un tutorial en Documentación. Que te puede servir también.
Gepd lo hizo.
Aca lo tienes, todo está generalmente preguntado, no hay que volver a preguntar sino buscarlo y buscarlo.

No consigo entender esa biblioteca la verdad.

Ya logre separar los dos joystick,ahora a ver como puedo mover dos servos con esos datos :frowning:

el emisor:

// Emisor Wireless nRF24L01+
// Conectamos el emisor de la siguiente forma:
// Hardware SPI:
// MISO -> D12
// MOSI -> D11
// SCK  -> D13
// CE   -> D10
// CSN  -> D9
// Todas las entradas son Digitales
// El joystick x se conecta en analog5 el y en analog4

#include <SPI.h>
#include <Mirf.h>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>
       
int joystick;
int joystick1;
byte x, y ,servoX,servoY;
void setup()

{

  Mirf.spi = &MirfHardwareSpi;

  // inicializacion del dispositivo
  Mirf.init();

  // Se envia dos bytes cada vez
  Mirf.payload = sizeof(joystick);
  Mirf.payload = sizeof(joystick1);
  // seleccionamos el canal
  Mirf.channel = 90;
  Mirf.config();

  // 1MHz
  Mirf.configRegister(RF_SETUP, 0x06);

  // Seleccionamos dirección de transmision
  Mirf.setTADDR((byte *)"12345");

  Serial.begin(57600);//podemos monitorizar los datos que enviamos al coche.
}

// enviar dato
void transmit(unsigned int joystick);
void transmit(unsigned int joystick1)
{
  Mirf.send((byte *)&joystick);Mirf.send((byte *)&joystick1);
  while ( Mirf.isSending() ) ;
}


void loop()
{
 
  servoX = map(analogRead(2), 0, 1023, 255, 0);
  servoY = map(analogRead(1), 0, 1023, 255, 0);
  joystick1 = (x * 0x100) + y;
  transmit(joystick1);
  delay(100);
  Serial.print(servoX);
  Serial.print("   ");
  Serial.print(servoY);
  Serial.print("   ");
  Serial.println(joystick1);
  
  x = map(analogRead(5), 0, 1023, 255, 0);
  y = map(analogRead(4), 0, 1023, 255, 0);
  joystick = (x * 0x100) + y;
  transmit(joystick);
  delay(100);
  Serial.print(x);
  Serial.print("   ");
  Serial.print(y);
  Serial.print("   ");
  Serial.println(joystick);

}

y el receptor:

// MOTOR1_CTL1  2 // I1
// MOTOR1_CTL2  4 // I2  MOTOR DERECHO
// MOTOR1_PWM   3 // EA

// MOTOR2_CTL1  6 // I3
// MOTOR2_CTL2  7 // I4  MOTOR IZQUIERDO
// MOTOR2_PWM   5 // EB
#include <Servo.h>
#include <CocheDigital.h>
CocheDigital CocheDigital(2, 4, 3, 6, 7, 5);

#include <SPI.h>
#include <Mirf.h>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>
// Receptor Wireless nRF24L01+
// Conectamos el emisor de la siguiente forma:
// Hardware SPI:
// MISO -> D12
// MOSI -> D11
// SCK  -> D13
// CE   -> D10
// CSN  -> D9



//constantes
#define velocidad_max 255  //valor máximo de velocidad (como maximo->255)
#define velocidad_dir 200  //valor que aumenta o disminuye la velocidad de las ruedas al girar
                           //aumentando o disminuyendo hacemos que el giro sea más o menos rápido.
//variables
Servo servo1;
Servo servo2; 
int joystick;
int joystick1;
int x, y ,servoX,servoY;
int vel_iz, vel_de;
unsigned int dato;
byte tiempo_sin_recepcion;

void setup() {
  tiempo_sin_recepcion = 0;
  Mirf.spi = &MirfHardwareSpi;

  // inicializacion del dispositivo
  Mirf.init();

  // Se reciben dos byte cada vez
  Mirf.payload = sizeof(joystick);

  // seleccionamos el canal
  Mirf.channel = 90;
  Mirf.config();

  // 1MHz
  Mirf.configRegister(RF_SETUP, 0x06);

  // Seleccionamos dirección de recepcion
  Mirf.setRADDR((byte *)"12345"); //longitud max-> 5 caracteres
                                  //debe ser igual en emisor y receptor
  Serial.begin(57600); //podemos monitorizar los datos que recibimos del mando.

}
void loop()

{


  if ( Mirf.dataReady() )// Esperando recepción
  {
    tiempo_sin_recepcion = 0;
    Mirf.getData((byte *)&dato);
    //Serial.write(c);
    servoX = dato / 0x100; //en x tenemos la velocidad y sentido de la marcha
    servoY = dato % 0x100; // en y tenemos el giro a la derecha o izquierda

    servoX = map(servoX, 0, 255, -velocidad_max, velocidad_max);
    servoY = map(servoY, 0, 255, -velocidad_dir, velocidad_dir);
    
    x = dato / 0x100; //en x tenemos la velocidad y sentido de la marcha
    y = dato % 0x100; // en y tenemos el giro a la derecha o izquierda

    x = map(x, 0, 255, -velocidad_max, velocidad_max);
    y = map(y, 0, 255, -velocidad_dir, velocidad_dir);


    Serial.print(servoX);
    Serial.print("  ");
    Serial.print(servoY);
    Serial.print("  ");
    
    Serial.print(x);
    Serial.print("  ");
    Serial.print(y);
    Serial.print("  ");
    //Serial.print(dato);
    if (x > 0)
    {
      Serial.print("++"); //avanza

      vel_iz = x + y;
      vel_de = x - y;
      if (vel_iz > velocidad_max) vel_iz = velocidad_max;
      if (vel_de > velocidad_max) vel_de = velocidad_max;
      if (vel_iz < 0) vel_iz = 0;
      if (vel_de < 0) vel_de = 0;
      CocheDigital.avanza(vel_iz, vel_de);


    }
    else
    {
      Serial.print("--");//retrocede

      x = x * (-1);
      vel_iz = x + y;
      vel_de = x - y;
      if (vel_iz > velocidad_max) vel_iz = velocidad_max;
      if (vel_de > velocidad_max) vel_de = velocidad_max;
      if (vel_iz < 0) vel_iz = 0;
      if (vel_de < 0) vel_de = 0;
      CocheDigital.retrocede(vel_iz, vel_de);
    }
    Serial.print(vel_iz);
    Serial.print("  ");
    Serial.println(vel_de);
  }
  

  delay(50);
  tiempo_sin_recepcion++;
  if (tiempo_sin_recepcion > 10)
  {
    tiempo_sin_recepcion = 0;
    CocheDigital.para();  //no recibimos del mando durante más de medio segundo
  }
}

estoy un poco liadete en el receptor de como añadir los dos servos uno para el ejeX y otro ejeY que los tengo como servoX y servoY.

Es mi primera toma con el rf y me esta costando bastante :frowning:

Por ahora el coche va bien,me falta ese detallito con el otro joystick y un boton que podria utilizar el digital del joystick para añadir un par de pocos led

Por favor, los códigos van con este tag </> no con el tag de citas o quote.
Edita por favor que cuesta leer el código, al menos para mi que ya tengo unos años.

que tal si haces esto

struct { 
   int X1; // posición X joystick 1
   int Y1; // posicion Y joystick 1
   int X2; // posición X joystick 2
   int Y2; // posicion Y joystick 2 
 } typedef JOYSTICK_XY;
// luego defines asi
JOYSTICK_XY res; // Entonces res contiene los 4 datos

NOTA: y por favor usa este tag </> deja de usar citas. SI puedes EDITA lo anterior que cuesta leerlo.

Cuando tengas que indicar cuantos bytes usas escribirás

  Mirf.payload = sizeof(res);

y los valores de cada joystick los asignas de este modo

  res.X1 = map(analogRead(5), 0, 1023, 255, 0);
  res.Y1 = map(analogRead(4), 0, 1023, 255, 0);
  res.X2 = map(analogRead(3), 0, 1023, 255, 0); // supongo que x2 esta conectado a A3
  res.Y2 = map(analogRead(2), 0, 1023, 255, 0); // supongo que y2 esta conectado a A2

ya ves que es un modo muy fácil de manejarse.
Prueba a ver si funciona

Modificado,por ahora lo he probado y no me va,pero esta tarde lo intentare mas concienzudamente.

Te hago la parte del transmisor, corrige del mismo modo el receptor.

#include <SPI.h>
#include <MIRF.H>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>


unsigned int joystick;
byte x, y;
const byte pinX1 = 5;
const byte pinY1 = 4;
const byte pinX2 = 3;
const byte pinY2 = 2;

struct { 
   int X1; // posición X joystick 1
   int Y1; // posicion Y joystick 1
   int X2; // posición X joystick 2
   int Y2; // posicion Y joystick 2 
 } typedef JOYSTICK_XY;
// luego defines asi
JOYSTICK_XY res; // Entonces res contiene los 4 datos

void setup() {

  Mirf.spi = &MirfHardwareSpi;

  // inicializacion del dispositivo
  Mirf.init();

  // Se envia dos bytes cada vez
  Mirf.payload = sizeof(res);

  // seleccionamos el canal
  Mirf.channel = 90;
  Mirf.config();

  // 1MHz
  Mirf.configRegister(RF_SETUP, 0x06);

  // Seleccionamos dirección de transmision
  Mirf.setTADDR((byte *)"12345");

  Serial.begin(57600);//podemos monitorizar los datos que enviamos al coche.
}

void loop() { 

  char buffer[30];

  res.X1 = map(analogRead(pinX1), 0, 1023, 255, 0);
  res.Y1 = map(analogRead(pinY1), 0, 1023, 255, 0);
  res.X2 = map(analogRead(pinX2), 0, 1023, 255, 0); // supongo que x2 esta conectado a A3
  res.Y2 = map(analogRead(pinY2), 0, 1023, 255, 0); // supongo que y2 esta conectado a A2
  
  
  Mirf.send((byte *)&res);
  while ( Mirf.isSending() ) ;
  delay(100);

  sprintf(buffer, "X1 = %3d Y1 = %3d X2 = %3d Y2 = %3d", res.X1, res.Y1, res.X2, res.Y2);
  Serial.println(buffer);
}

No consigo que lo recepcione bien el coche,nada mas encenderlo los motores avanzan,pero con el joystick en una direccion consigo reducir la velocidad de un motor del tanquecito.

#include <CocheDigital.h>
// MOTOR1_CTL1  2 // I1
// MOTOR1_CTL2  4 // I2  MOTOR DERECHO
// MOTOR1_PWM   3 // EA

// MOTOR2_CTL1  6 // I3
// MOTOR2_CTL2  7 // I4  MOTOR IZQUIERDO
// MOTOR2_PWM   5 // EB
CocheDigital CocheDigital(2, 4, 3, 6, 7, 5);

#include <SPI.h>
#include <Mirf.h>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>
#include <Servo.h>
// Receptor Wireless nRF24L01+
// Conectamos el emisor de la siguiente forma:
// Hardware SPI:
// MISO -> D12
// MOSI -> D11
// SCK  -> D13
// CE   -> D10
// CSN  -> D9



//constantes
#define velocidad_max 255  //valor máximo de velocidad (como maximo->255)
#define velocidad_dir 100  //valor que aumenta o disminuye la velocidad de las ruedas al girar
const int servo1 = 3;     
const int servo2 = 10;  

Servo Miservo1;  //objeto de la libreria servo para controlar el servo 1  
Servo Miservo2;  //objeto de la libreria servo para controlar el servo 2 
//variables
int Y1 , Y2 ,X1 ,X2;
int vel_iz, vel_de;
unsigned int dato;
byte tiempo_sin_recepcion;
struct { 
   int X1; // posición X joystick 1
   int Y1; // posicion Y joystick 1
   int X2; // posición X joystick 2
   int Y2; // posicion Y joystick 2 
 } typedef JOYSTICK_XY;
// luego defines asi
JOYSTICK_XY res;

void setup() {
  tiempo_sin_recepcion = 0;
  Mirf.spi = &MirfHardwareSpi;

  // inicializacion del dispositivo
  Mirf.init();

  // Se reciben dos byte cada vez
  Mirf.payload = sizeof(res);

  // seleccionamos el canal
  Mirf.channel = 90;
  Mirf.config();

  // 1MHz
  Mirf.configRegister(RF_SETUP, 0x06);

  // Seleccionamos dirección de recepcion
  Mirf.setRADDR((byte *)"12345"); //longitud max-> 5 caracteres
                                  //debe ser igual en emisor y receptor
  Serial.begin(57600); 
  Miservo1.attach(servo1);    
  Miservo2.attach(servo2); //podemos monitorizar los datos que recibimos del mando.

}
void loop()

{


  if ( Mirf.dataReady() )// Esperando recepción
  {
    tiempo_sin_recepcion = 0;
    Mirf.getData((byte *)&dato);
    //Serial.write(c);
    X1 = dato / 0x100; //en x tenemos la velocidad y sentido de la marcha
    Y1 = dato % 0x100; // en y tenemos el giro a la derecha o izquierda

    X1 = map(X1, 0, 255, -velocidad_max, velocidad_max);
    Y1 = map(Y1, 0, 255, -velocidad_dir, velocidad_dir);





    Serial.print(X1);
    Serial.print(" x1 ");
    Serial.print(Y1);
    Serial.print(" y1 ");
    //Serial.print(dato);
    if (X1 > 0)
    {
      Serial.print("++"); //avanza

      vel_iz = X1 + Y1;
      vel_de = X1 - Y1;
      if (vel_iz > velocidad_max) vel_iz = velocidad_max;
      if (vel_de > velocidad_max) vel_de = velocidad_max;
      if (vel_iz < 0) vel_iz = 0;
      if (vel_de < 0) vel_de = 0;
      CocheDigital.avanza(vel_iz, vel_de);


    }
    else
    {
      Serial.print("--");//retrocede

      X1 = X1 * (-1);
      vel_iz = X1 + Y1;
      vel_de = X1 - Y1;
      if (vel_iz > velocidad_max) vel_iz = velocidad_max;
      if (vel_de > velocidad_max) vel_de = velocidad_max;
      if (vel_iz < 0) vel_iz = 0;
      if (vel_de < 0) vel_de = 0;
      CocheDigital.retrocede(vel_iz, vel_de);
    }
    Serial.print(vel_iz);
    Serial.print("  ");
    Serial.println(vel_de);
  }


  delay(20);
  
  
    
  
}

No… si trabajas con estructuras define a dato como estructura no como unsigned int

#include <CocheDigital.h>
// MOTOR1_CTL1  2 // I1
// MOTOR1_CTL2  4 // I2  MOTOR DERECHO
// MOTOR1_PWM   3 // EA

// MOTOR2_CTL1  6 // I3
// MOTOR2_CTL2  7 // I4  MOTOR IZQUIERDO
// MOTOR2_PWM   5 // EB
CocheDigital CocheDigital(2, 4, 3, 6, 7, 5);

#include <SPI.h>
#include <Mirf.h>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>
#include <Servo.h>
// Receptor Wireless nRF24L01+
// Conectamos el emisor de la siguiente forma:
// Hardware SPI:
// MISO -> D12
// MOSI -> D11
// SCK  -> D13
// CE   -> D10
// CSN  -> D9



//constantes
#define velocidad_max 255  //valor máximo de velocidad (como maximo->255)
#define velocidad_dir 100  //valor que aumenta o disminuye la velocidad de las ruedas al girar
const int servo1 = 3;     
const int servo2 = 10;  

Servo Miservo1;  //objeto de la libreria servo para controlar el servo 1  
Servo Miservo2;  //objeto de la libreria servo para controlar el servo 2 
//variables
int Y1 , Y2 ,X1 ,X2;
int vel_iz, vel_de;

byte tiempo_sin_recepcion;
struct { 
   int X1; // posición X joystick 1
   int Y1; // posicion Y joystick 1
   int X2; // posición X joystick 2
   int Y2; // posicion Y joystick 2 
 } typedef JOYSTICK_XY;
// luego defines asi
JOYSTICK_XY dato;  // Asi llegan tus datos, asi los vas a recuperar.

void setup() {
  tiempo_sin_recepcion = 0;
  Mirf.spi = &MirfHardwareSpi;

  // inicializacion del dispositivo
  Mirf.init();

  // Se reciben dos byte cada vez
  Mirf.payload = sizeof(res);

  // seleccionamos el canal
  Mirf.channel = 90;
  Mirf.config();

  // 1MHz
  Mirf.configRegister(RF_SETUP, 0x06);

  // Seleccionamos dirección de recepcion
  Mirf.setRADDR((byte *)"12345"); //longitud max-> 5 caracteres
                                  //debe ser igual en emisor y receptor
  Serial.begin(57600); 
  Miservo1.attach(servo1);    
  Miservo2.attach(servo2); //podemos monitorizar los datos que recibimos del mando.

}
void loop() {

  if ( Mirf.dataReady()) {// Esperando recepción
 
    tiempo_sin_recepcion = 0;
    Mirf.getData((byte *)&dato);
    //Serial.write(c);
    
    X1 = map(dato.X1, 0, 255, -velocidad_max, velocidad_max);
    Y1 = map(dato.Y1, 0, 255, -velocidad_dir, velocidad_dir);

    
    Serial.print(X1);
    Serial.print(" x1 ");
    Serial.print(Y1);
    Serial.print(" y1 ");
    //Serial.print(dato);
    if (X1 > 0)     {
      Serial.print("++"); //avanza

      vel_iz = X1 + Y1;
      vel_de = X1 - Y1;
      if (vel_iz > velocidad_max) vel_iz = velocidad_max;
      if (vel_de > velocidad_max) vel_de = velocidad_max;
      if (vel_iz < 0) vel_iz = 0;
      if (vel_de < 0) vel_de = 0;
      CocheDigital.avanza(vel_iz, vel_de);


    }
    else     {
      Serial.print("--");//retrocede

      X1 = X1 * (-1);
      vel_iz = X1 + Y1;
      vel_de = X1 - Y1;
      if (vel_iz > velocidad_max) vel_iz = velocidad_max;
      if (vel_de > velocidad_max) vel_de = velocidad_max;
      if (vel_iz < 0) vel_iz = 0;
      if (vel_de < 0) vel_de = 0;
      CocheDigital.retrocede(vel_iz, vel_de);
    }
    Serial.print(vel_iz);
    Serial.print("  ");
    Serial.println(vel_de);
  }
  delay(20);
}

he modificado alguna cosilla y si que hace el enlace,lo unico que tengo que mirar el tema de recepcion de las int,porque me recibe x1 y y1 pero no realiza la funcion que he dado.

#include <CocheDigital.h>
// MOTOR1_CTL1  2 // I1
// MOTOR1_CTL2  4 // I2  MOTOR DERECHO
// MOTOR1_PWM   3 // EA

// MOTOR2_CTL1  6 // I3
// MOTOR2_CTL2  7 // I4  MOTOR IZQUIERDO
// MOTOR2_PWM   5 // EB
CocheDigital CocheDigital(2, 4, 3, 6, 7, 5);

#include <SPI.h>
#include <Mirf.h>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>
#include <Servo.h>
// Receptor Wireless nRF24L01+
// Conectamos el emisor de la siguiente forma:
// Hardware SPI:
// MISO -> D12
// MOSI -> D11
// SCK  -> D13
// CE   -> D10
// CSN  -> D9



//constantes
#define velocidad_max 255  //valor máximo de velocidad (como maximo->255)
#define velocidad_dir 100  //valor que aumenta o disminuye la velocidad de las ruedas al girar
const int servo1 = 3;     
const int servo2 = 10;  

Servo Miservo1;  //objeto de la libreria servo para controlar el servo 1  
Servo Miservo2;  //objeto de la libreria servo para controlar el servo 2 
//variables
int Y1 , Y2 ,X1 ,X2;
int vel_iz, vel_de;

byte tiempo_sin_recepcion;
struct { 
   int X1; // posición X joystick 1
   int Y1; // posicion Y joystick 1
   int X2; // posición X joystick 2
   int Y2; // posicion Y joystick 2 
 } typedef JOYSTICK_XY;
// luego defines asi
JOYSTICK_XY dato;  // Asi llegan tus datos, asi los vas a recuperar.

void setup() {
  tiempo_sin_recepcion = 0;
  Mirf.spi = &MirfHardwareSpi;

  // inicializacion del dispositivo
  Mirf.init();

  // Se reciben dos byte cada vez
  Mirf.payload = sizeof(dato);

  // seleccionamos el canal
  Mirf.channel = 90;
  Mirf.config();

  // 1MHz
  Mirf.configRegister(RF_SETUP, 0x06);

  // Seleccionamos dirección de recepcion
  Mirf.setRADDR((byte *)"12345"); //longitud max-> 5 caracteres
                                  //debe ser igual en emisor y receptor
  Serial.begin(57600); 
  Miservo1.attach(servo1);    
  Miservo2.attach(servo2); //podemos monitorizar los datos que recibimos del mando.

}
void loop() {

  if ( Mirf.dataReady()) {// Esperando recepción
 
    tiempo_sin_recepcion = 0;
    Mirf.getData((byte *)& dato);
    //Serial.write(c);
    
    X1 = map(dato.X1, 0, 255, -velocidad_max, velocidad_max);
    Y1 = map(dato.Y1, 0, 255, -velocidad_dir, velocidad_dir);

    
    Serial.print(X1);
    Serial.print(" x1 ");
    Serial.print(Y1);
    Serial.print(" y1 ");
    //Serial.print(dato);
    if (dato.X1 > 0)     {
      Serial.print("++"); //avanza

      vel_iz = dato.X1 + dato.Y1;
      vel_de = dato.X1 - dato.Y1;
      if (vel_iz > velocidad_max) vel_iz = velocidad_max;
      if (vel_de > velocidad_max) vel_de = velocidad_max;
      if (vel_iz < 0) vel_iz = 0;
      if (vel_de < 0) vel_de = 0;
      CocheDigital.avanza(vel_iz, vel_de);


    }
    else     {
      Serial.print("--");//retrocede

      dato.X1 = dato.X1 * (-1);
      vel_iz = dato.X1 + dato.Y1;
      vel_de = dato.X1 - dato.Y1;
      if (vel_iz > velocidad_max) vel_iz = velocidad_max;
      if (vel_de > velocidad_max) vel_de = velocidad_max;
      if (vel_iz < 0) vel_iz = 0;
      if (vel_de < 0) vel_de = 0;
      CocheDigital.retrocede(vel_iz, vel_de);
    }
    Serial.print(vel_iz);
    Serial.print("  ");
    Serial.println(vel_de);
  }
  delay(20);

porque me recibe x1 y y1 pero no realiza la funcion que he dado.

Y que función no hace.
Yo me pregunto y comprendo mi comentario, cuando escribes te lees? Digo porque debes intentar pensar si del otro lado te van a entender.
Yo no entiendo que quieres decir.

Perdona surbyte , no realiza bien el movimiento de los motores,ya que uno se queda encendido continuamente y el movimiento que realizo con el joystick no concuerda con lo recibido en el receptor.

Creo el payload esta bien,lo unico que no se es porque falla el codigo de los motores:

 X1 = map(dato.X1, 0, 255, -velocidad_max, velocidad_max);
    Y1 = map(dato.Y1, 0, 255, -velocidad_dir, velocidad_dir);

    
    Serial.print(X1);
    Serial.print(" x1 ");
    Serial.print(Y1);
    Serial.print(" y1 ");
    //Serial.print(dato);
    if (dato.X1 > 0)     {
      Serial.print("++"); //avanza

      vel_iz = dato.X1 + dato.Y1;
      vel_de = dato.X1 - dato.Y1;
      if (vel_iz > velocidad_max) vel_iz = velocidad_max;
      if (vel_de > velocidad_max) vel_de = velocidad_max;
      if (vel_iz < 0) vel_iz = 0;
      if (vel_de < 0) vel_de = 0;
      CocheDigital.avanza(vel_iz, vel_de);


    }
    else     {
      Serial.print("--");//retrocede

      dato.X1 = dato.X1 * (-1);
      vel_iz = dato.X1 + dato.Y1;
      vel_de = dato.X1 - dato.Y1;
      if (vel_iz > velocidad_max) vel_iz = velocidad_max;
      if (vel_de > velocidad_max) vel_de = velocidad_max;
      if (vel_iz < 0) vel_iz = 0;
      if (vel_de < 0) vel_de = 0;
      CocheDigital.retrocede(vel_iz, vel_de);
    }
    Serial.print(vel_iz);
    Serial.print("  ");
    Serial.println(vel_de);
  }
  delay(20);
}

Tu código no esta comentado como quieres que alguien lo comprenda?

#include <CocheDigital.h>
// MOTOR1_CTL1  2 // I1
// MOTOR1_CTL2  4 // I2  MOTOR DERECHO
// MOTOR1_PWM   3 // EA

// MOTOR2_CTL1  6 // I3
// MOTOR2_CTL2  7 // I4  MOTOR IZQUIERDO
// MOTOR2_PWM   5 // EB
CocheDigital CocheDigital(2, 4, 3, 6, 7, 5);

#include <SPI.h>
#include <Mirf.h>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>
#include <Servo.h>
// Receptor Wireless nRF24L01+
// Conectamos el emisor de la siguiente forma:
// Hardware SPI:
// MISO -> D12
// MOSI -> D11
// SCK  -> D13
// CE   -> D10
// CSN  -> D9



//constantes
#define velocidad_max 255  //valor máximo de velocidad (como maximo->255)
#define velocidad_dir 100  //valor que aumenta o disminuye la velocidad de las ruedas al girar
const int servo1 = 3;     
const int servo2 = 10;  

Servo Miservo1;  //objeto de la libreria servo para controlar el servo 1  
Servo Miservo2;  //objeto de la libreria servo para controlar el servo 2 
//variables
int X1,Y1,X2,Y2;
int vel_iz, vel_de;

byte tiempo_sin_recepcion;
struct { 
   int X1; // posición X joystick 1
   int Y1; // posicion Y joystick 1
   int X2; // posición X joystick 2
   int Y2; // posicion Y joystick 2 
 } typedef JOYSTICK_XY;
// luego defines asi
JOYSTICK_XY dato;  // Asi llegan tus datos, asi los vas a recuperar.

void setup() {
  tiempo_sin_recepcion = 0;
  Mirf.spi = &MirfHardwareSpi;

  // inicializacion del dispositivo
  Mirf.init();

  // Se reciben dos byte cada vez
  Mirf.payload = sizeof(dato);

  // seleccionamos el canal
  Mirf.channel = 90;
  Mirf.config();

  // 1MHz
  Mirf.configRegister(RF_SETUP, 0x06);

  // Seleccionamos dirección de recepcion
  Mirf.setRADDR((byte *)"12345"); //longitud max-> 5 caracteres
                                  //debe ser igual en emisor y receptor
  Serial.begin(57600); 
  Miservo1.attach(servo1);    
  Miservo2.attach(servo2); //podemos monitorizar los datos que recibimos del mando.

}
void loop() {

  if ( Mirf.dataReady()) {// Esperando recepción
 
    tiempo_sin_recepcion = 0;
    Mirf.getData((byte *)& dato);
    //Serial.write(c);
    
    X1 = map(dato.X1, 0, 255, -velocidad_max, velocidad_max);
    Y1 = map(dato.Y1, 0, 255, -velocidad_dir, velocidad_dir);

    
    Serial.print(X1);
    Serial.print(" x1 ");
    Serial.print(Y1);
    Serial.print(" y1 ");
    //Serial.print(dato);
    if (dato.X1 > 0)     {
      Serial.print("++"); //avanza

      vel_iz = dato.X1 + dato.Y1;//suma de X1 Y X2
      vel_de = dato.X1 - dato.Y1;
      if (vel_iz > velocidad_max) vel_iz = velocidad_max;//x1+y1 es mayor que 255,motor izquierdo a maxima velocidad
      if (vel_de > velocidad_max) vel_de = velocidad_max;//x1-y1 es mayor que 255 motor derecho a velocidad maxima
      if (vel_iz < 0) vel_iz = 0;
      if (vel_de < 0) vel_de = 0;
      CocheDigital.avanza(vel_iz, vel_de);


    }
    else     {
      Serial.print("--");//retrocede

      dato.X1 = dato.X1 * (-1);
      vel_iz = dato.X1 + dato.Y1;
      vel_de = dato.X1 - dato.Y1;
      if (vel_iz > velocidad_max) vel_iz = velocidad_max;
      if (vel_de > velocidad_max) vel_de = velocidad_max;
      if (vel_iz < 0) vel_iz = 0;
      if (vel_de < 0) vel_de = 0;
      CocheDigital.retrocede(vel_iz, vel_de);
    }
    Serial.print(vel_iz);
    Serial.print("  ");
    Serial.println(vel_de);
  }
  delay(20);
}