Stap 6: De ontvanger
Dus, ik adviseren om een Arduino (of compatibel bestuur) en een gewoon verbinding maken met de andere nRF24l01 + radio module voor het respectieve nodig pinnen.
MOSI - Digital pin 11
MISO - Digital pin 12
SCK - Digital pin 13
Daarnaast moet u pinnen CE en CSN (van de radio module) aansluiten op sommige gratis pinnen van uw keuze op de Arduino (of compatibele) bestuur. De standaard in de code die zullen volgen zijn pin 9 en 10 respectievelijk.
Aangezien de radio module macht moet moet u ook aansluiten op de GND en 3,3 v volt pinnen.
Waarschuwing: het is zeer belangrijk dat u de RADIO MODULE met 3,3 v stroom anders zult u het ROOSTEREN.
U dient een gewijzigde versie van de onderstaande code uploaden naar het bestuur van de ontvanger. U moet alleen pin-toewijzingen wijzigen als u verschillende pinnen gebruikt, en wat nog belangrijker is waarschijnlijk zal moet u het ESC bewapenen van code wijzigen. Als u niet werken met Arduino + ESC voordat ik sterk adviseren dat u hen standalone testen, verschillen bedienen procedures van ESC op ESC. De onderstaande code werkt goed voor twee mysterie merk SER's gewaardeerd voor 30A. Voor andere SER's is het wellicht te onderzoeken op sommige lengte over hoe goed ze arm.
#include < Servo.h >
#include < SPI.h >
#include "nRF24L01.h"
#include "RF24.h"
/ *---REIZEN GEGEVENS STRUCTS---* /
opdrachten gaat binnen
typedef struct {}
int X;
int Y;
Booleaanse knoppen [4];
}
Lading;
feedback gaat binnen
typedef struct {}
int rudderAng;
int Z;
int S;
}
Feedback;
/ *---DEBOUNCING VARIABELEN---* /
lange previousMillis = 0; timer voor servo
lange previousButtonMillis = 0; timer voor knoppen
lange previousTX = 0; timer voor overbrengingen
lange TXinterval = 25; interval voor het verzenden van telemetrie
Const int interval = 30; Interval bijwerken servo
Const int binterval = 70; interval voor debouncing
Const int TX_timeout = 100; externe - ambachtelijke koppelen timeout
/* ------------------------------------------------------------- */
Servo stuwkracht;
Servo lift;
Pakket van de lading;
Feedback telemetrie;
Servo roer;
int oldAngle, newAngle = 0; Servo posities
int lift_ang; Til motor pseudo-'hoekig' snelheid
int vel; stuwkracht pseudo-'hoekig' snelheid
Boolean lopen = false;
RF24 radio (9, 10);
Const uint64_t pijpen [2] = {}
0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL};
/* ----------------------------------------------------- */
/ * INGESTELD VAN HET KNOOPPUNT VAN DE ONTVANGER * /
void setup(void)
{
Serial.begin(57600);
Radio.begin();
radio.openWritingPipe(pipes[1]);
radio.openReadingPipe(1,pipes[0]);
radio.startListening();
Rudder.attach(7);
Het is belangrijk om de arm
ELKE ESC sequentieel
Lift.attach(5);
armESC(lift);
lift_ang = 50;
delay(100);
thrust.attach(6);
armESC(thrust);
vel = 50;
}
void loop(void)
{
unsigned long started_waiting_at = millis();
time-out van Boole = vals;
terwijl (! radio.available() & &! timeout)
Als (millis() - started_waiting_at > TX_timeout)
timeout = true;
Als (time-out) {}
Serial.println ("Failed, reactie timed out.");
lopen = false;
}
else {}
Radio.Read (& pakket, sizeof(package));
lopen = true;
}
Als de verwijzing van de TX-RX leven () dan...
if(run)
{
/ *---ONTVANGEN OPDRACHTEN UITVOEREN---* /
int X = pakket. X;
int Y = pakket. Y;
ROERBESTURING
// ------------------------------------------------------------
Als (X > 480 & & X < 530) {}
newAngle = 90; 90 = servo in middenpositie
}
Als (X < 480) {}
newAngle = (kaart (X, 480, 155, 91, 150));
}
Als (X > 530) {}
newAngle = (kaart (X, 530, 815, 89, 30));
}
VOORWAARTSE KRACHT CONTROL... VROOOOMMMMMMM
// ---------------------------------------------------------------------
Als (Y > 550 & & Y < 635) {}
thrust.write(50); neutrale positie--motor niet spinnen
telemetrie. S = 50;
}
Als (Y > = 635) {}
vel = (kaart (Y, 635, 925, 60, 90));
thrust.write(vel);
telemetrie. S = vel;
}
unsigned long currentMillis = millis();
Afgifte van roer herpositionering opdracht alleen indien gewenst
wijzigingen van de positie en (debouncing) interval is voorbij
Als (oldAngle! = newAngle & & currentMillis - previousMillis > interval) {}
previousMillis = currentMillis;
oldAngle = newAngle;
Rudder.write(newAngle); servo naar positie in de variabele 'pos' vertellen
} / / sluit als millis-land (voor servo roer)
HANDVAT KNOOPPERSEN
// ------------------------------------------------------------------
currentMillis = millis();
Als (currentMillis - previousButtonMillis > binterval) {}
Druk op de knop voor instant MIN (geen) lift snelheid (geen throtle)
Als (package.buttons[0] == 1) {}
lift_ang = 50;
}
Druk op de knop voor de lift snelheid INCREMENT
Als (package.buttons[1] == 1) {}
Als (lift_ang < 120) {lift_ang += 5;}
}
pers voor instant (soort van) knop "stationaire safe" zweven
Als (package.buttons[2] == 1) {}
lift_ang = 90;
}
Druk op de knop voor de lift snelheid verlagen
Als (package.buttons[3] == 1) {}
Als (lift_ang > 50 & & lift_ang < = 115) {lift_ang-= 5;}
}
previousButtonMillis = currentMillis;
Lift.write(lift_ang);
} / / nauwe als "millis-land" (secundair test)--knoop millis debounce
/* ---------------------------------------------------------------------- */
Set telemetrie gegevens moeten worden verzonden
telemetrie. Z = lift_ang;
telemetrics.rudderAng = newAngle;
} / / sluiten van de verklaring van de "if(run)"
else {}
Serial.println ("geen radio beschikbaar");
emergencyStop();
}
VOOR het verzenden van telemetrie gebruik dit:
radio.stopListening();
BOOL ok = radio.write (& telemetrie, sizeof(telemetrics));
radio.startListening();
OF dit: (moet uncommenten variabelen previousTX & TXinterval
Als u deze optie gebruikt)
unsigned long currentMillis = millis();
//
Als (currentMillis - previousTX > TXinterval) {}
previousTX = currentMillis;
//
radio.stopListening();
BOOL ok = radio.write (& telemetrie, sizeof(telemetrics));
radio.startListening();
// }
} / / Sluit het "loop"-blok
Bijkomende functies
VOID emergencyStop()
{
thrust.write(50);
Lift.write(50);
}
VOID armESC(Servo esc)
{
ESC.write(10);
delay(2000);
ESC.write(50);
delay(1000);
}