Avion RC arduino

Bonjour, je suis en train de concevoir et construire un avion RC en me basant sur une arduino nano (ou simili) comme controleur de vol, relier à un récepteur radio nRF24L01 l'arduino est égallement relier à 4 servomoteur ainsi qu'à l'esc qui permet a priori de controler le régime moteur du brushless comme un servo moteur, j'ai créer le programme et il fonctionne mais rapidement les servo arrète de fonctionner et je ne reçois plus d'info sur le moniteur série, j'ai essayer également en passant sur l'alimentation 5v donné par l'esc et rien y fait, avez vous une idée ?

Bonjour,
Pouvez-vous nous fournir un schéma, même rapide, du câblage ? De plus, étant donné que le problème vient peut-être du code, il serait également préférable que vous le postiez ici, dans son intégralité et entre les balises de code comme indiqué dans les règles. Sans ces informations, difficile de trouver :wink:

Beau projet cela dit, ce serait dommage de ne pas le finir à cause de ça!
Amitiés,
Pandaroux007

Bien sur voici ci-joint une capture d'écran du schéma électrique et le programme utilisé : à savoir qu'en guise de télécommande j'utilise une arduino uno avec 2 joystick et un nRF24L01 (schéma et programme ci-joint)

//Code pour télécommande
#include <SPI.h>
#include <RF24.h>

#define pinCE 7
#define pinCSN 8
#define tunnel "PIPE1"

// Pins for Joystick 1
#define joy1XPin A0
#define joy1YPin A1

// Pins for Joystick 2
#define joy2XPin A2
#define joy2YPin A3

RF24 radio(pinCE, pinCSN);
const byte adresse[6] = tunnel;

struct ServoData {
  int servo1XAngle;
  int servo1YAngle;
  int servo2XAngle;
  int servo2YAngle;
};

ServoData dataToSend;
unsigned long lastSendTime = 0;
const long sendInterval = 20;

void setup() {
  radio.begin();
  radio.openWritingPipe(adresse);
  radio.setPALevel(RF24_PA_MIN);
  radio.stopListening();
  Serial.begin(9600);
}

void loop() {
  unsigned long currentTime = millis();
  if (currentTime - lastSendTime >= sendInterval) {
    // Read Joystick 1 values
    int joy1XValue = analogRead(joy1XPin);
    int joy1YValue = analogRead(joy1YPin);

    // Read Joystick 2 values
    int joy2XValue = analogRead(joy2XPin);
    int joy2YValue = analogRead(joy2YPin);

    // Map Joystick 1 values to servo angles
    dataToSend.servo1XAngle = map(joy1XValue, 0, 1023, 1, 85);
    dataToSend.servo1YAngle = map(joy1YValue, 0, 1023, 1, 85);

    // Map Joystick 2 values to servo angles
    dataToSend.servo2XAngle = map(joy2XValue, 0, 1023, 1, 85);
    dataToSend.servo2YAngle = map(joy2YValue, 0, 1023, 1, 85);

    radio.write(&dataToSend, sizeof(ServoData));

    Serial.print("Sending - Joy1 X: ");
    Serial.print(dataToSend.servo1XAngle);
    Serial.print(" Y: ");
    Serial.print(dataToSend.servo1YAngle);
    Serial.print(" - Joy2 X: ");
    Serial.print(dataToSend.servo2XAngle);
    Serial.print(" Y: ");
    Serial.println(dataToSend.servo2YAngle);

    lastSendTime = currentTime;
  }
}
// Code pour l'avion
#include <SPI.h>
#include <RF24.h>
#include <Servo.h>

// RF24 Configuration
#define pinCE 7
#define pinCSN 8
#define tunnel "PIPE1"

// Define pins for the four servo motors
#define servo1XPin 9  // Pin for servo 1 (X-axis of Joystick 1)
#define servo1YPin 10 // Pin for servo 2 (Y-axis of Joystick 1)
#define servo2XPin 5 // Pin for servo 3 (X-axis of Joystick 2)
#define servo2YPin 6  // Pin for servo 4 (Y-axis of Joystick 2) - Ensure this pin is available and not conflicting

RF24 radio(pinCE, pinCSN);
const byte adresse[6] = tunnel;

// Create Servo objects for four servos
Servo servo1X;
Servo servo1Y;
Servo servo2X;
Servo servo2Y;

// This structure must match the one in the sender program (envoie donnee.txt)
// The sender program uses: servo1XAngle, servo1YAngle, servo2XAngle, servo2YAngle [cite: 2]
struct ServoData {
  int servo1XAngle;
  int servo1YAngle;
  int servo2XAngle;
  int servo2YAngle;
};

ServoData receivedData;

void setup() {
  Serial.begin(9600);
  Serial.println("Receiver starting...");

  if (!radio.begin()) {
    Serial.println(F("Radio hardware not responding!"));
    while (1) {} // Hold in infinite loop
  }

  radio.openReadingPipe(0, adresse);
  radio.setPALevel(RF24_PA_MIN); // Or RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX depending on range needs
  radio.startListening();
  Serial.println("Radio listening...");

  // Attach the servos to their respective pins
  servo1X.attach(servo1XPin);
  servo1Y.attach(servo1YPin);
  servo2X.attach(servo2XPin);
  servo2Y.attach(servo2YPin);

  Serial.println("Servos attached.");
}

void loop() {
  if (radio.available()) {
    radio.read(&receivedData, sizeof(ServoData));

    // Control the four servos with the received data
    servo1X.write(receivedData.servo1XAngle);
    servo1Y.write(receivedData.servo1YAngle);
    servo2X.write(receivedData.servo2XAngle);
    servo2Y.write(receivedData.servo2YAngle);

    // Print the received data to the Serial Monitor for debugging
    Serial.print("Received - S1X: ");
    Serial.print(receivedData.servo1XAngle);
    Serial.print(" S1Y: ");
    Serial.print(receivedData.servo1YAngle);
    Serial.print(" S2X: ");
    Serial.print(receivedData.servo2XAngle);
    Serial.print(" S2Y: ");
    Serial.println(receivedData.servo2YAngle);
  }
  // A small delay can be useful, but ensure it doesn't interfere with timely servo updates
  // The original program had delay(15) [cite: 14]
  delay(20); // Match the send interval from envoie donnee.txt if appropriate [cite: 3]
}


Ne pas alimenter les servos d'Arduino. Utilisez une alimentation externe pour l'alimentation et une broche Arduino DIO pour le contrôle.

https://docs.arduino.cc/learn/electronics/servo-motors/

D'accord, mais c'est ce que je fais sur le schéma non ? la carte et les servos sont alimenté par le 5V fournit par la batterie à moint que je doive faire 2 circuit différent pour l'alimentation des servos ?

Bonjour 2l-devers

Tu as une petite erreur sur ton schéma de l'émetteur:


Tu mets +5V sur Vin alors que les valeurs Vin "extrêmes" sont de 7 à 12V.
Ton alimentation +5V doit se trouver sur la pin 5V de l'Arduino.

Tu peux alimenter l'Arduino et les servo avec une seule alimentation 5V. Il faudra, peut-être un condensateur de filtrage, les servo on tendance à générer pas mal de bruit sur l'alimentation.

A+
Cordialement
jpbbricole

Oui, mais votre schéma est incomplet, il n'y a pas la partie de l'alimentation.

On voit bien les label +5V et GND, mais il n'est pas indiqué a quoi ils sont reliés...

As-tu réussi à lever le doute sur la source du problème ?
Est-ce que cela semble venir de l'émetteur ou du récepteur?


Dans un premier temps, je séparerais l'alimentation de l'Arduino de l'alimentation des éléments de puissance. Ces éléments peuvent générer des perturbations assez importantes sur le rail d'alimentation.
Attention aussi aux boucles de masses. Privilégier un câblage des alimentations en étoile.