Paso 6: El receptor
Por lo tanto, te aconsejo conseguir un Arduino (o board compatible) y solo Conecte los otros nRF24l01 + radio módulo a su respectivos necesario pernos.
MOSI - pin Digital 11
MISO - pin Digital 12
SCK - pin Digital 13
Adicionalmente necesitará conectar clavijas CE y CSN (desde el módulo de radio) algunos pins gratis de su elección en el Arduino (o compatible) Junta. El valor por defecto en el código que sigue son los pines 9 y 10 respectivamente.
Desde el módulo de radio necesita poder usted también tendrá que conectar los pines GND y 3,3 v voltios.
ADVERTENCIA: es muy importante que alimenta el módulo de RADIO con 3, 3V de lo contrario usted a tostarlos.
Debe subir una versión modificada del siguiente código a la tarjeta receptora. Sólo necesitará modificar las asignaciones de pin si utiliza pines diferentes, y lo más importante es probablemente se necesitará modificar la ESC código de activación. Si usted no tiene trabajo con Arduino + ESC antes de fuertemente recomiendo que probarlas independiente, procedimientos de activación varían de ESC a ESC. El código de abajo funciona bien para dos misterio marca CES clasificada de 30A. Para otros CES que tendrás que investigar a cierta longitud sobre cómo armarlos correctamente.
#include < Servo.h >
#include < SPI.h >
#include "nRF24L01.h"
#include "RF24.h"
/ *---ESTRUCTURAS DE DATOS VIAJE---* /
comandos va dentro de
typedef struct {}
int X;
int Y;
Boolean botones [4];
}
Capacidad de carga;
regeneración va dentro de
typedef struct {}
int rudderAng;
int Z;
int S;
}
Retroalimentación;
/ *---VARIABLES CONTRA REBOTES---* /
previousMillis largo = 0; temporizador para servo
previousButtonMillis largo = 0; temporizador para botones
previousTX largo = 0; temporizador para transmisiones
TXinterval largo = 25; intervalo para transmitir telemetría
const int intervalo = 30; intervalo de actualización de servo
const int binterval = 70; intervalo para contra rebotes
const int TX_timeout = 100; remoto - arte vincular el tiempo de espera
/* ------------------------------------------------------------- */
Servo empuje;
Elevación del servo;
Paquete de carga útil;
Telemetría de respuesta;
Timón del servo;
int oldAngle, newAngle = 0; posiciones de servo
int lift_ang; Levante motor pseudo-'angular' velocidad
vel de int; pseudo-'angular' velocidad de empuje
Boolean ejecutar = false;
RF24 radio (9, 10);
const uint64_t tubos [2] = {}
0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL};
/* ----------------------------------------------------- */
/ * ESTABLECER EL NODO RECEPTOR * /
void setup(void)
{
Serial.Begin(57600);
radio.Begin();
radio.openWritingPipe(pipes[1]);
radio.openReadingPipe(1,pipes[0]);
radio.startListening();
Rudder.Attach(7);
Es importante que el brazo
CADA ESC secuencialmente
Lift.Attach(5);
armESC(lift);
lift_ang = 50;
Delay(100);
thrust.Attach(6);
armESC(thrust);
Vel = 50;
}
void loop(void)
{
started_waiting_at largo sin signo = millis();
tiempo de espera de tipo boolean = false;
mientras (! radio.available() & &! tiempo de espera)
Si (millis() - started_waiting_at > TX_timeout)
tiempo de espera = true;
Si {} (tiempo límite)
Serial.println ("no se pudo, agotado el tiempo de respuesta.");
ejecutar = false;
}
Else {}
radio.Read (& paquete, sizeof(package));
ejecutar = true;
}
Si TX-RX enlace es (vivo) entonces...
if(Run)
{
/ *---EJECUTAREMOS COMANDOS RECIBIDOS---* /
int X = paquete. X;
int Y = paquetes. Y;
CONTROL DEL TIMÓN DE
// ------------------------------------------------------------
Si (X > 480 & & X < 530) {}
newAngle = 90; 90 = servo en posición central
}
Si (X < 480) {}
newAngle = (mapa (X, 480, 150, 155, 91));
}
Si (X > 530) {}
newAngle = (mapa (X, 530, 815, 89, 30));
}
CONTROL DE EMPUJE HACIA ADELANTE... VROOOOMMMMMMM
// ---------------------------------------------------------------------
Si (Y > 550 & & Y < 635) {}
thrust.Write(50); posición neutral, el motor no gira
telemetría. S = 50;
}
Si (Y > = 635) {}
Vel = (mapa (Y, 635, 925, 60, 90));
thrust.Write(vel);
telemetría. S = vel;
}
unsigned currentMillis largo = millis();
Emitir timón reposicionamiento comando solamente si se desea
cambios de posición y de intervalo (contra rebotes) es sobre
Si (oldAngle! = newAngle & & currentMillis - previousMillis > intervalo) {}
previousMillis = currentMillis;
oldAngle = newAngle;
Rudder.Write(newAngle); Dile el servo a la posición en la variable 'pos'
} / / cierre si millis-tierra (para el servo del timón de dirección)
PULSAR UN BOTÓN DE LA MANIJA
// ------------------------------------------------------------------
currentMillis = millis();
Si (currentMillis - previousButtonMillis > binterval) {}
botón Presione para MIN instantáneo (ninguno) Levante la velocidad (sin acelerador)
Si (package.buttons[0] == 1) {}
lift_ang = 50;
}
botón Presione para levantar velocidad incremento
Si (package.buttons[1] == 1) {}
Si (lift_ang < 120) {lift_ang += 5;}
}
botón Presione para instantánea (especie de) "safe estacionario" rondando
Si (package.buttons[2] == 1) {}
lift_ang = 90;
}
botón Presione para levantar velocidad decremento
Si (package.buttons[3] == 1) {}
Si (lift_ang > 50 & & lift_ang < = 115) {lift_ang-= 5;}
}
previousButtonMillis = currentMillis;
Lift.Write(lift_ang);
} / / cierre si "millis-land" (prueba secundaria)--botón millis debounce
/* ---------------------------------------------------------------------- */
Datos de la telemetría sistema para enviar
telemetría. Z = lift_ang;
telemetrics.rudderAng = newAngle;
} / / cerrar declaración "if(run)"
Else {}
Serial.println ("no hay radio disponible");
emergencyStop();
}
PARA transmitir telemetría uso esto:
radio.stopListening();
bool ok = radio.write (& telemetría, sizeof(telemetrics));
radio.startListening();
O esto: (tienen que descomentar las variables previousTX y TXinterval
Si utiliza esta opción)
unsigned currentMillis largo = millis();
//
Si (currentMillis - previousTX > TXinterval) {}
previousTX = currentMillis;
//
radio.stopListening();
bool ok = radio.write (& telemetría, sizeof(telemetrics));
radio.startListening();
// }
} / / cerrar el bloque de "loop()"
Funciones accesorias
void emergencyStop()
{
thrust.Write(50);
Lift.Write(50);
}
void armESC(Servo esc)
{
ESC.Write(10);
Delay(2000);
ESC.Write(50);
Delay(1000);
}