pour ce que ca intéresse voici un code fonctionnelle pour contrôle 2 servo d'un support camera avec un joystick et nrf24l01 a distance , petit plus le bouton permet de bloquer la camera dans sa position et une simple pression le débloque
code TX
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
struct packet {
byte posx;
byte posy;
byte button; // Un seul bouton pour contrôler l'état
} State;
RF24 radio(9, 10); // Pins CE, CSN pour le NRF24L01
#define MY_RF24_PA_LEVEL RF24_PA_HIGH
const uint64_t pipe = 0xE8E8F0F0E1LL; // Adresse du canal de communication
unsigned long lastSend;
const unsigned int sendInterval = 50; // Intervalle d'envoi en millisecondes
const byte button1Pin = A2; // Un seul bouton utilisé pour le contrôle
void setup(void) {
Serial.begin(9600);
// Initialiser le bouton comme entrée avec résistance de pull-up
pinMode(button1Pin, INPUT_PULLUP); // Utilise la résistance interne de pull-up
// Initialiser la communication radio
radio.begin();
radio.setPALevel(MY_RF24_PA_LEVEL); // Définir le niveau de puissance
radio.openWritingPipe(pipe); // Ouvrir le pipe de communication pour l'envoi
}
void loop(void) {
// Vérifier si l'intervalle d'envoi est atteint
if (millis() - lastSend >= sendInterval) {
lastSend = millis();
// Lire la position du joystick
State.posx = map(analogRead(A0), 0, 1023, 0, 140); // Axe X du joystick
State.posy = map(analogRead(A1), 0, 1023, 20, 180); // Axe Y du joystick
// Lire l'état du bouton
State.button = digitalRead(button1Pin); // Lecture du bouton (état HIGH ou LOW)
// Afficher les valeurs dans le moniteur série pour débogage
Serial.print("X: ");
Serial.print(State.posx);
Serial.print(" Y: ");
Serial.print(State.posy);
Serial.print(" Button: ");
Serial.println(State.button);
// Envoyer les données via radio
radio.write(&State, sizeof(State));
}
}
code rx
#include <Servo.h>
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
struct packet {
byte posx;
byte posy;
byte button; // Un seul bouton pour contrôler l'état
} State;
#define MY_RF24_PA_LEVEL RF24_PA_LOW
RF24 radio(9, 10); // Pins CE, CSN pour le NRF24L01
const uint64_t pipe = 0xE8E8F0F0E1LL; // Adresse du canal de communication
Servo myservo;
Servo myservo2;
const byte buttonPin = 2; // Pin pour le bouton de contrôle (bloquer/débloquer les servos)
const byte LED1 = 6; // Pin pour LED1
const byte LED2 = 7; // Pin pour LED2
bool servosBlocked = false; // État du blocage des servos
unsigned long lastButtonPress = 0; // Variable pour éviter les appuis multiples du bouton
const unsigned long debounceDelay = 300; // Temps de débounçage pour le bouton
void setup(void) {
myservo.attach(4); // Pin pour servo 1
myservo2.attach(5); // Pin pour servo 2
Serial.begin(9600);
// Initialisation de la communication radio
radio.begin();
radio.openReadingPipe(1, pipe); // Ouvrir le pipe en lecture
radio.startListening(); // Commencer à écouter
// Initialisation du bouton et des LEDs
pinMode(buttonPin, INPUT_PULLUP); // Utilisation de la résistance de pull-up interne pour le bouton
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
}
void loop(void) {
// Vérifier si des données ont été reçues
if (radio.available()) {
// Lire les données reçues
radio.read(&State, sizeof(State));
// Affichage des données dans le moniteur série pour débogage
Serial.print(State.posx);
Serial.print(F(", "));
Serial.print(State.posy);
Serial.print(F(", "));
Serial.println(State.button);
// Vérifier l'état du bouton pour alterner entre bloqué et débloqué
if (State.button == LOW && millis() - lastButtonPress > debounceDelay) {
servosBlocked = !servosBlocked; // Inverser l'état des servos
lastButtonPress = millis(); // Enregistrer le temps de la dernière pression
}
// Si les servos sont débloqués, les contrôler avec les valeurs du joystick
if (!servosBlocked) {
int mappedPosX = map(State.posx, 0, 140, 0, 180); // Mapper l'axe X du joystick
int mappedPosY = map(State.posy, 20, 180, 0, 180); // Mapper l'axe Y du joystick
// Déplacer les servos
myservo.write(mappedPosX);
myservo2.write(mappedPosY);
} else {
// Si les servos sont bloqués, les maintenir dans leur position actuelle
myservo.write(myservo.read());
myservo2.write(myservo2.read());
}
// Gestion des LEDs : Allumer ou éteindre en fonction du bouton
if (State.button == LOW) {
digitalWrite(LED1, HIGH); // Allumer LED1 si le bouton est pressé
digitalWrite(LED2, HIGH); // Allumer LED2 si le bouton est pressé
} else {
digitalWrite(LED1, LOW); // Éteindre LED1 si le bouton est relâché
digitalWrite(LED2, LOW); // Éteindre LED2 si le bouton est relâché
}
}
}
comme je joystick a un retour au neutre ca me permet de bloquer la cam et utiliser la pince en FPV pour un meilleur visuelle et controle



