Étape 6: Le récepteur
Donc, je conseille d’obtenir un Arduino (ou Conseil compatible) et une juste connecter les autres nRF24l01 + radio module il est respectifs nécessaire broches.
MOSI - broche numérique 11
MISO - axe numérique 12
SCK - broche numérique 13
En outre, vous aurez besoin de connecter les broches CE et CSN (à partir du module radio) à certaines chevilles libres de votre choix sur l’Arduino (ou compatible) Conseil d’administration. La valeur par défaut dans le code qui va suivre sont respectivement les bornes 9 et 10.
Puisque le module radio doit pouvoir vous aurez également besoin de connecter les broches GND et 3,3 volts.
Avertissement: il est très IMPORTANT que vous mettez le MODULE RADIO avec 3.3V sinon vous allez griller il.
Vous devez télécharger une version modifiée du code ci-dessous à l’office récepteur. Vous devrez simplement modifier l’affectation des broches si vous utilisiez des broches différentes, et plus important encore, vous aurez probablement sera besoin de modifier l’ESC armement code. Si vous n’avez pas de travail avec Arduino + ESC avant que je recommande fortement que vous testiez de standalone, armement procédures varient de l’ESC à l’ESC. Le code ci-dessous fonctionne bien pour deux mystère marque ESCs convenant au 30 a. Pour les autres ESCs vous devrez étudier à longuement sur la façon de les armer correctement.
#include < Servo.h >
#include < SPI.h >
#include « nRF24L01.h »
#include « RF24.h »
/ *---VOYAGEANT DES STRUCTURES DE DONNÉES---* /
commandes va à l’intérieur
typedef struct {}
int X ;
int Y ;
booléenne touches [4] ;
}
Charge utile ;
rétroaction va à l’intérieur
typedef struct {}
int rudderAng ;
int Z ;
int S ;
}
Vos commentaires ;
/ *---ANTIREBONDS VARIABLES---* /
long previousMillis = 0 ; minuterie pour servo
long previousButtonMillis = 0 ; minuterie pour boutons
long previousTX = 0 ; minuterie pour les transmissions
TXinterval long = 25 ; intervalle de transmettre la télémétrie
const int intervalle = 30 ; intervalle de mise à jour de servo
const int binterval = 70 ; intervalle pour debouncing
const int TX_timeout = 100 ; distance - artisanat lien timeout
/* ------------------------------------------------------------- */
Servo de Poussée ;
Ascenseur de servo ;
Paquet de charge utile ;
Vos commentaires telemetrics ;
Palonnier de servo ;
int oldAngle, newAngle = 0 ; postes de servo
int lift_ang ; soulever le moteur pseudo-« angulaire » Vitesse
vel int ; pseudo-« angulaire » vitesse de Poussée
Boolean exécuter = false ;
RF24 radio (9, 10) ;
const uint64_t pipes [2] = {}
0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL} ;
/* ----------------------------------------------------- */
/ * METTRE EN PLACE LE NŒUD RÉCEPTEUR * /
Sub setup(void)
{
Serial.Begin(57600) ;
radio.Begin() ;
radio.openWritingPipe(pipes[1]) ;
radio.openReadingPipe(1,pipes[0]) ;
radio.startListening() ;
Rudder.Attach(7) ;
Il est important de bras
CHAQUE ESC séquentiellement
Lift.Attach(5) ;
armESC(lift) ;
lift_ang = 50 ;
Delay(100) ;
Thrust.Attach(6) ;
armESC(thrust) ;
vel = 50 ;
}
Sub loop(void)
{
unsigned long started_waiting_at = millis() ;
timeout booléen = false ;
tandis que (! radio.available() & &! timeout)
Si (millis() - started_waiting_at > TX_timeout)
Timeout = true ;
Si {(timeout)
Serial.println ("Echec, réponse a expiré.") ;
courir = false ;
}
else {}
radio.Read (& package, sizeof(package)) ;
courir = true ;
}
Si le lien TX-RX est vivante () puis...
if(Run)
{
/ *---EXÉCUTION DES COMMANDES REÇUES---* /
int X = package. X ;
int Y = package. Y ;
CONTRÔLE DE LA GOUVERNE DE DIRECTION
// ------------------------------------------------------------
Si (X > 480 & & X 530 <) {}
newAngle = 90 ; 90 = servo en position centrale
}
Si (X < 480) {}
newAngle = ((X, 480, 155, 91 150) carte) ;
}
Si (X > 530) {}
newAngle = ((X, 30, 89, 815, 530) carte) ;
}
CONTRÔLE DE LA POUSSÉE VERS L’AVANT... VROOOOMMMMMMM
// ---------------------------------------------------------------------
Si (Y > 550 & & Y < 635) {}
Thrust.Write(50) ; position neutre--moteur ne tourne pas
telemetrics. S = 50 ;
}
Si (Y > = 635) {}
vel = (plan (Y, 635, 925, 60, 90)) ;
Thrust.Write(vel) ;
telemetrics. S = vel ;
}
unsigned long currentMillis = millis() ;
Délivrer le gouvernail repositionnement commande uniquement si vous le souhaitez
position de change et l’intervalle (antirebonds) est terminée
Si (oldAngle! = newAngle & & currentMillis - previousMillis > intervalle) {}
previousMillis = currentMillis ;
oldAngle = newAngle ;
Rudder.Write(newAngle) ; dire de servo pour aller à positionner dans la variable « pos »
} / / fermer si millis-terre (pour le servo de direction)
POIGNÉE BOUTON PRESSES
// ------------------------------------------------------------------
currentMillis = millis() ;
Si (currentMillis - previousButtonMillis > binterval) {}
sur une touche pour MIN instantanée (aucun) lever vitesse (aucun throtle)
Si (package.buttons[0] == 1) {}
lift_ang = 50 ;
}
sur une touche pour la vitesse de l’ascenseur incrément
Si (package.buttons[1] == 1) {}
Si (lift_ang < 120) {lift_ang += 5;}
}
touche appuyer pour l’instant (sorte de) « safe stationnaire » en vol stationnaire
Si (package.buttons[2] == 1) {}
lift_ang = 90 ;
}
sur une touche pour la vitesse de l’ascenseur décrémentation
Si (package.buttons[3] == 1) {}
Si (lift_ang > 50 & & lift_ang < = 115) {lift_ang-= 5;}
}
previousButtonMillis = currentMillis ;
Lift.Write(lift_ang) ;
} / / proche si "millis-land" (critère secondaire)--bouton millis debounce
/* ---------------------------------------------------------------------- */
Set télémétrie données à envoyer
telemetrics. Z = lift_ang ;
telemetrics.rudderAng = newAngle ;
} / / Déclaration de « if(run) » à proximité
else {}
Serial.println ("aucune radio disponible") ;
emergencyStop() ;
}
POUR transmettre les TELEMETRICS utiliser ceci :
radio.stopListening() ;
bool ok = radio.write (& telemetrics, sizeof(telemetrics)) ;
radio.startListening() ;
OU ceci: (besoin de décommenter les variables previousTX et TXinterval
Si vous utilisez cette option)
unsigned long currentMillis = millis() ;
//
Si (currentMillis - previousTX > TXinterval) {}
previousTX = currentMillis ;
//
radio.stopListening() ;
bool ok = radio.write (& telemetrics, sizeof(telemetrics)) ;
radio.startListening() ;
// }
} / / fermer le bloc « loop() »
Fonctions accessoires
Sub emergencyStop()
{
Thrust.Write(50) ;
Lift.Write(50) ;
}
Sub armESC(Servo esc)
{
ESC.Write(10) ;
Delay(2000) ;
ESC.Write(50) ;
Delay(1000) ;
}