Drone Arduino

Bonjour à tous,

Je me suis penché sur la réalisation d'un petit drone quadcopter basé sur une arduino Uno (pour les tests, qui passera en arduino mini pro si je poursuis le projet), principalement pour comprendre les principes de fonctionnement et voir si le grand débutant que je suis arrivais à me débrouiller.

J'ai donc acheté le matériel minimal nécessaire pour faire des tests :

  • carton plume pour la structure (design en croix, un moteur au bout de chaque branche)
  • arduino uno / mini pro au centre
  • 1 module Bluetooth HC-06 (pas top mais ça fait l'affaire)
  • 2 moteurs miniatures avec pales, rotation horaire, branches du haut et du bas
  • 2 moteurs miniatures avec pales, rotation anti-horaire, branches gauche et droite
  • 4 transistors IRFZ44N
  • 1 batterie LiPo 7,4v 250mAh
    Le tout contrôlé par un smartphone Android, dans un premier temps pour transmettre la vitesse de rotation des moteurs.

La bonne nouvelle c'est que les moteurs tournent et que le drone décolle.

La mauvaise c'est qu'il part systématiquement d'un côté dès le départ -> un des moteurs tournent (beaucoup) plus vite que les autres alors qu'ils sont tous identiques, et qu'ils sont chacun contrôlés par une sortie PWM de l'arduino sur lesquelles j'envoie la même valeur (255 par exemple).

Si je comprends bien qu'il faille un IMU pour stabiliser son appareil en vol, je ne pensais pas qu'il serait nécessaire dès le décollage ...

Pourquoi l'appareil ne décolle pas à la verticale alors que la même vitesse de rotation est appliquée à chaque moteur ?

Je vous joins le schéma basique, et le code du programme ci-dessous, si besoin :

#include <Wire.h>
String s = "";
String p = "";
int bt_speed = 0;

void setup() {
  Serial.begin(9600); 
  Wire.begin();
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
  stop_motor();  
}

void loop() {    
  s = Serial.readString();  // 1255090  
  if (s==""){s=p;}
  if (s!=""){
    Serial.println(s);
    bt_speed = s.substring(1,4).toInt();    
    p = s.substring(0,7);
  } else{ 
    if (bt_speed>0){ 
      for(int i=bt_speed;i>=0;i--){bt_speed--;}
    }
    else{ bt_speed = 0; }
  }  
  if (bt_speed==0){stop_motor();} else{dc_motor(bt_speed);}  
  Serial.println(bt_speed);
}
void dc_motor(int vitesse){  
  analogWrite(5,vitesse);
  analogWrite(6,vitesse);
  analogWrite(10,vitesse);
  analogWrite(11,vitesse);
}
void stop_motor(){  
  analogWrite(5,0);
  analogWrite(6,0);
  analogWrite(10,0);
  analogWrite(11,0);
}

Tout simplement parce que même si tu as 4 fois les mêmes modèle de moteur, ils ne sont pas parfaitement identiques sur le point performances, ils tournent pas exactement à la même vitesse, ce qui crée un déséquilibre d'une part.

D'autre part, la structure n'est forcément pas parfaite (la perfection n'existe pas sur cette terre).

Il va donc falloir mettre en place une régulation de type PID pour stabiliser ton drone

Bon, moi qui espérais une erreur de ma part ... tant pis ! Je vais m'atteler au régulateur PID alors...
Merci pour ta réponse !

Si c'est juste pour le faire décoller droit, tu peux toujours tenter d'équilibrer tes valeurs à la main sur chaque moteur mais tu va devoir tâtonner pour trouver un correctif juste

Oui, ce sera beaucoup plus simple et sûr avec un régulateur PID.

Du coup, si j'ai bien compris, en utilisant la librairie PID (Arduino Playground - PIDLibrary), je vais devoir pour chaque moteur, utiliser une nouvelle entrée analogique pour lire la valeur de la sortie PWM correspondante et la réguler en fonction de la valeur reçue par bluetooth ..? Je suis à côté de la plaque ? Niveau câblage je ne suis pas bien sûr de moi là !

Je connais pas bien cette lib, mais tu n'as pas besoin de lire une valeur pwm, puisque c'est ton système qui l'a fourni, donc tu la connais déjà.

Par contre passage obligatoire par une centrale inertielle, un MPU-6050 fait l'affaire. C'est sur ces valeurs que la régulation PID se basera pour équilibrer.

Pourquoi tu n'utilise pas des moteurs brushless ? comme cela il te suffit de calibré les ESC pour avoir un rotation identique. Après je pense qu'un module MPU6050 et indispensable pour créée un drone.