Vamos a construir un mando de radio control con NRF24L01.
El control se realizará con dos joystiks
Material requerido
|
|
|
|
|
|
|
|
|
|
|
|
|
|
El diseño de la mando.
Se puede consultar el funcionamiento por separado tanto de un joystick como del emisor de radio NRF24L01.
Enlaces:
Esquema de conexiones
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]);
}
}
}