RC svävare + Customized fjärrkontroll (6 / 8 steg)
Steg 6: Mottagaren
Så jag råder att få en Arduino (eller kompatibel board) och en bara ansluta andra nRF24l01 + radio-modul för att det är respektive behövs stiften.
MOSI - Digital stift 11
MISO - Digital stift 12
SCK - Digital stift 13
Dessutom måste du ansluta stift CE och CSN (från radio-modulen) till några gratis pins som du väljer på Arduino (eller kompatibel) styrelse. Standard i den kod som kommer att följa är stift 9 och 10 respektive.
Eftersom modulen radio behöver makt också måste du ansluta GND och 3,3 v volt stiften.
Varning: det är mycket viktigt att du makt RADIO modulen med 3.3V annars du ska Rosta det.
Du bör ladda upp en modifierad version av koden nedan till mottagaren styrelsen. Du behöver bara ändra pin tilldelningar om du använt olika stift, och framför allt kommer förmodligen måste du ändra ESK beväpna kod. Om du inte har arbete med Arduino + ESC innan jag starkt rekommenderar att du testar dem fristående, varierar beväpna från ESC till ESC. Koden nedan fungerar bra för två mysterium varumärke ekonomiska fått för 30A. Du kan behöva undersöka några längder om hur man korrekt arm dem för andra ekonomiska och sociala råden.
#include < Servo.h >
#include < SPI.h >
#include "nRF24L01.h"
#include "RF24.h"
/ *---RESER DATA STRUCTS---* /
kommandon går inuti
TypeDef struct {
int X;
int Y;
booleska knappar [4].
}
Nyttolast;
feedback går inuti
TypeDef struct {
int rudderAng;
int Z;
int S;
}
Feedback;
/ *---DEBOUNCING VARIABLER---* /
lång previousMillis = 0; timer för servo
lång previousButtonMillis = 0; timer för knappar
lång previousTX = 0; timer för överföringar
lång TXinterval = 25; intervall för att överföra telemetri
CONST int intervall = 30. intervall för att uppdatera servo
CONST int binterval = 70. intervall för debouncing
CONST int TX_timeout = 100; Remote - craft länka timeout
/* ------------------------------------------------------------- */
Servo dragkraft;
Servo hiss.
Nyttolast paketet;
Feedback telemetrics;
Servo roder;
int oldAngle, newAngle = 0; servo positioner
int lift_ang; lyfta motor pseudo-"kantiga" velocity
int vel; dragkraft pseudo-"kantiga" velocity
Boolean kör = false;
RF24 radio (9, 10);
CONST uint64_t rör [2] = {
0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL};
/* ----------------------------------------------------- */
/ * KONFIGURERA NODEN MOTTAGARE * /
void setup(void)
{
Serial.BEGIN(57600);
radio.BEGIN();
radio.openWritingPipe(pipes[1]);
radio.openReadingPipe(1,pipes[0]);
radio.startListening();
Rudder.attach(7);
Det är viktigt att beväpna
VARJE ESC sekventiellt
Lift.attach(5);
armESC(lift);
lift_ang = 50;
Delay(100);
Thrust.attach(6);
armESC(thrust);
Vel = 50;
}
void loop(void)
{
osignerade långa started_waiting_at = millis();
booleska timeout = false;
medan (! radio.available() & &! timeout)
om (millis() - started_waiting_at > TX_timeout)
timeout = sant;
om (timeout) {
Serial.println ("misslyckades, svar timeout.");
köra = false;
}
annat {
radio.Read (& paketet, sizeof(package));
köra = sant;
}
om TX-RX länk (alive) sedan...
IF(Run)
{
/ *---KÖRA MOTTAGNA KOMMANDON---* /
int X = paketet. X;
int Y = paketet. Y;
RODRET KONTROLL
// ------------------------------------------------------------
om (X > 480 & & X < 530) {
newAngle = 90. 90 = servo i mittläget
}
om (X < 480) {
newAngle = (karta (X, 480, 155, 91, 150));
}
om (X > 530) {
newAngle = (karta (X, 530, 815, 89, 30));
}
FRAMÅT FRAMSTÖTEN KONTROLL... VROOOOMMMMMMM
// ---------------------------------------------------------------------
om (Y > 550 & & Y < 635) {
Thrust.write(50); neutralläge--motor inte snurrar
telemetrics. S = 50;
}
om (Y > = 635) {
Vel = (karta (Y, 635, 925, 60, 90));
Thrust.write(Vel);
telemetrics. S = vel;
}
osignerade långa currentMillis = millis();
Utfärda roder ompositionering kommandot endast om så önskas
Utmatningspositionen ändras och (debouncing) intervall är över
om (oldAngle! = newAngle & & currentMillis - previousMillis > intervall) {
previousMillis = currentMillis;
oldAngle = newAngle;
Rudder.write(newAngle); berätta servo gå för att placera i variabel "pos"
} / / nära om millis-land (för roder servo)
HANTERA KNAPPTRYCKNINGAR
// ------------------------------------------------------------------
currentMillis = millis();
om (currentMillis - previousButtonMillis > binterval) {
Tryck på knapp för omedelbar MIN (ingen) lyft hastighet (ingen throtle)
om (package.buttons[0] == 1) {
lift_ang = 50;
}
Tryck på knapp för lift hastighet öka
om (package.buttons[1] == 1) {
om (lift_ang < 120) {lift_ang += 5.}
}
knapp pressa för omedelbar (typ av) "stationära safe" svävar
om (package.buttons[2] == 1) {
lift_ang = 90.
}
Tryck på knapp för lift hastighet DEKREMENT
om (package.buttons[3] == 1) {
om (lift_ang > 50 & & lift_ang < = 115) {lift_ang-= 5.}
}
previousButtonMillis = currentMillis;
Lift.write(lift_ang);
} / / nära om "millis-land" (sekundär test)--knappen millis Dämpningstid
/* ---------------------------------------------------------------------- */
Ställ in telemetridata att skicka
telemetrics. Z = lift_ang;
telemetrics.rudderAng = newAngle;
} / / nära "if(run)" uttalande
annat {
Serial.println ("ingen radio tillgängliga");
emergencyStop();
}
För att överföra använda TELEMETRICS detta:
radio.stopListening();
bool ok = radio.write (& telemetrics, sizeof(telemetrics));
radio.startListening();
ELLER den här: (måste avkommentera variabler previousTX & TXinterval
Om du använder detta alternativ)
osignerade långa currentMillis = millis();
//
om (currentMillis - previousTX > TXinterval) {
previousTX = currentMillis;
//
radio.stopListening();
bool ok = radio.write (& telemetrics, sizeof(telemetrics));
radio.startListening();
// }
} / / nära blocket "loop()"
Tillbehör funktioner
void emergencyStop()
{
Thrust.write(50);
Lift.write(50);
}
void armESC(Servo esc)
{
ESC.write(10);
Delay(2000);
ESC.write(50);
Delay(1000);
}