Mando de control remoto con NRF24L01

Vamos a construir un mando de radio control con NRF24L01.

Captura de pantalla 2023-04-17 a las 8.28.47

El control se realizará con dos joystiks

Material requerido

 arduino-nano
  • Arduino Nano.
 UNO-Shield-Nano-Shield-para-placa-de-expansi-n-NANO-3-0-y-UNO-R3-duemilanove.jpg_Q90.jpg_
  •  Shield para arduino nano
 Img_3_6-300x185
  • Algunos cables de Protoboard.
j
  • Dos joysticks
Various-modules-based-on-the-NRF24L01-chip-768x446
  • Un Emisor y un receptor NRF24L01
pila
  • Una batería de 9v.
inter
  • Un interruptor
   

El diseño de la mando.

Puedes descargar el diseño del mando RC en el siguiente enlace:
Captura de pantalla 2023-04-17 a las 8.46.10
 

 

Se puede consultar el funcionamiento por separado tanto de un joystick como del emisor de radio NRF24L01.

Enlaces:

Esquema de conexiones

mando2Joysticks_bb

Emisor NRF24L01 Joystick izquierdo Joystick derecho
VCC -> 3,3 v
GND -> GND
CSN -> pin 10
CE -> pin 9
SCK -> Pin 13
MOSI -> pin 11
MISO -> pin 12
VCC -> 5v
GND -> GND
VRx -> pin A0
VRy -> pin A1
VCC -> 5v
GND -> GND
VRx -> pin A2
VRy -> pin A3

El código emisor:

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

//Declaremos los pines CE y el CSN
#define CE_PIN 9
#define CSN_PIN 10

//Variable con la dirección del canal por donde se va a transmitir
byte direccion[5] = {‘p’, ‘l’, ‘a’, ‘n’, ‘e’};

//creamos el objeto radio (NRF24L01)
RF24 radio(CE_PIN, CSN_PIN);

//vector con los datos a enviar
int datos[4];

// Arduino pin joysticks izq
const int X_pinI = 0; // analog pin connected to X output
const int Y_pinI = 1; // analog pin connected to Y output
// Arduino pin joysticks der
const int X_pinD = 2; // analog pin connected to X output
const int Y_pinD = 3; // analog pin connected to Y output

void setup() {
    //inicializamos el NRF24L01
    radio.begin();
    //inicializamos el puerto serie
    Serial.begin(9600);

    //Abrimos un canal de escritura
    radio.openWritingPipe(direccion);
}

void loop() {
    //cargamos los datos en la variable datos[]
   // leeremos los joysticks

   datos[0] = analogRead(X_pinI);
   datos[1] = analogRead(Y_pinI);
   datos[2] = analogRead(X_pinD);
   datos[3] = analogRead(Y_pinD);

    //enviamos los datos
    bool ok = radio.write(datos, sizeof(datos));

    // reportamos por el puerto serial los datos enviados
   // luego comentaremos todo el if, no será necesario
   if (ok) {
       Serial.print(«Datos enviados: «);
       Serial.print(datos[0]);
       Serial.print(» , «);
       Serial.print(datos[1]);
       Serial.print(» , «);
       Serial.print(datos[2]);
       Serial.print(» , «);
       Serial.println(datos[3]);
    }
    else {
         Serial.println(«no se ha podido enviar y recibir»);
    }

    delay(100);
}

El código receptor (podría ser algo así):

Aquí los pines dependerán de como este el circuito receptor:

// Librerías
#include <RF24.h> // Driver de Radio – Módulos nRF24L01+
#include <Servo.h>

// definimos el servo para la velocidad
#define PIN_VELO 2

// definimos el servo para la dirección
// faltarán el resto de servos
#define PIN_DIRE 3
#define RECTO 90
#define MAXDER 170
#define MINIZQ 20

// Pines RF24L01
#define PIN_CE 9
#define PIN_CSN 10

int x_axis = A0;
int y_axis = A1;
int velo, dire;

const byte direccion[5] = {‘p’, ‘l’, ‘a’, ‘n’, ‘e’};
RF24 radio(PIN_CE, PIN_CSN);

int data[4];

Servo velocidad, direc;

// Configuración
void setup() {
   velocidad.attach(PIN_VELO, 1000, 2000);
   velocidad.writeMicroseconds(900); // send “stop” signal to ESC.
   delay(4000);

   direc.attach(PIN_DIRE);
   direc.write(RECTO);

    // Configuración Consola – Depuración
    Serial.begin(9600);

   // Inicializa Sistema RF sobre el bus SPI
   if (!radio.begin()) {
       Serial.println(F(«¡¡¡El Hardware de Radio no responde!!!»));
       while (1) {
                        } // Bucle infinito
   }

   // Modo Lectura > Pipe 1 + Dirección
   radio.openReadingPipe(1, direccion);
   Serial.println(«escuchando»);
   // Sistema RF en Recepción – RX Mode
   radio.startListening();
}

void loop() {
    // Enlace TX / RX
    boolean radioOK = radio.available();
    delay(100);
    // Datos Recibidos > Sistema RF
if (radioOK) {
     // Leer Datos > Estructura
    radio.read(data, sizeof(data));

    // Depuración – Datos recibidos
    // lo comentaremos cunado se compruebe que todo funciona
    Serial.print(F(«Joystick 1 : «));
    Serial.print(F(«X: «));
    Serial.print(data[0]);
    Serial.print(F(» – Y:»));
    Serial.print(data[1]);
    Serial.print(F(» Joystick 2 : «));
    Serial.print(F(«X: «));
    Serial.print(data[0]);
    Serial.print(F(» – Y:»));
    Serial.print(data[3]);
    Serial.println();

    if (data[1] >= MINIZQ && data[1] <= MAXDER) {
       direc.write(data[1]);
    }
    if (data[0] >= 0 && data[0] <= 180) {
       velocidad.write(data[0]);

    }
}
}