Drone | Arduino #7: Comment varié la vitesse d’un moteur brushless en fonction de l’inclinaison du drone ?

Abonnez-vous à notre Chaîne YouTube "Devenir Ingénieur"  pour bénéficier de nouveaux projets et suivre l'actualité du blog

Objectifs de la vidéo

  1. Savoir varier la vitesse d’un moteur brushless avec Arduino
  2. Savoir le forme d’onde du signal de la commande
  3. Savoir la différence entre la commande d’un servomoteur et un moteur brushless
  4. Savoir varier la vitesse d’un moteur brushless en fonction de l’accélération
  5. Savoir lire les données du capteur MPU-6050
  6. Se familiariser avec les équations mathématiques avec Arduino
  7. Et plus encore.

Projet connexe

Forme d’onde du signal PWM

Commande servomoteur SG90

Le programme Arduino

Fonction de mise à jour de la vitesse du moteur

void SetSpeedMotor(double *PitchRollYaw, byte Vitesse_0, double Gain)
{
  // Calcul de  la partie variable de la vitesse 
  double P=PitchRollYaw[0];
  double R=PitchRollYaw[1];
  double Y=PitchRollYaw[2];
  
  double Vitesse=Vitesse_0+Gain*(P+R);  // Dépendance R&P: -180<R+P<180
  //double Vitesse=Vitesse_0+Gain*(R);  // Dépendance R: -90<R<90
  //double Vitesse=Vitesse_0+Gain*(P);  // Dépendance P: -90<P<90

  // Mise à jour de la vitesse du moteur 
  M1.write(Vitesse); // 0-180 
}

Fonction de lecture de données brutes du capteur

void ReadGY521_0( long *GyAccTempp)
{
  long  GATCorr_0[NumData]={0,0,0,0,0,0,0};
  ReadGY521(GyAccTemp,GATCorr_0);
}

Le programme complet

#include<Wire.h>
#include <math.h>
#include <Servo.h>

#define NumData     7
#define pi          3.1415926535897932384626433832795  
#define MPU         0x68
#define PinM1       9



// Pinout 
/*
  VCC -> 3.3 V / 5 V (préférable)
  GND -> GND
  SCL -> A5
  SDA -> A4
  
  XDA -> NC (non connecté)
  XCL -> NC 
  ADO -> NC
  INT -> NC
 */



Servo M1;
long  GyAccTemp[NumData];
long  GATCorr[NumData]={0,0,0,0,0,0,0};
double PitchRoll[3]; 

void setup()
{
  // Init module GY-512 
  Wire.begin();
  Wire.beginTransmission(MPU);
  Wire.write(0x6B);
  Wire.write(0);
  Wire.endTransmission(true);
  
  // Init port série 
  Serial.begin(19200);

  // Affectation du pin au servomoteur  
  M1.attach(PinM1);
}
void loop()
{  
  // Lecture des données: Acce + Temp + Gyro
   
  //ReadGY521(GyAccTemp,GATCorr); // Lecture avec correction 
  ReadGY521_0(GyAccTemp);       // Lecture des données bruts 
 
  // Calcul du Pitch / Roll / Yaw atan(x/sqt(y²+z²)
  ComputeAngle(GyAccTemp, PitchRoll); //+-90
  
  // Mise à jour de la vitesse du moteur  
  SetSpeedMotor(PitchRoll,90, 0.5); // 0(0%) - 180(100%) 
}


void SetSpeedMotor(double *PitchRollYaw, byte Vitesse_0, double Gain)
{
  // Calcul de  la partie variable de la vitesse 
  double P=PitchRollYaw[0];
  double R=PitchRollYaw[1];
  double Y=PitchRollYaw[2];
  
  double Vitesse=Vitesse_0+Gain*(P+R);  // Dépendance R&P: -180<R+P<180
  //double Vitesse=Vitesse_0+Gain*(R);  // Dépendance R: -90<R<90
  //double Vitesse=Vitesse_0+Gain*(P);  // Dépendance P: -90<P<90

  // Mise à jour de la vitesse du moteur 
  M1.write(Vitesse); // 0-180 
}




// Lecture des données des capteurs avec Corrections
void ReadGY521( long *GyAccTempp, long *GATCorrr)
{
  // Init du module GY-521
  Wire.beginTransmission(MPU);
  Wire.write(0x3B);
  Wire.endTransmission(false);
  Wire.requestFrom(MPU,14,true);

  // Lecture des données (3 axes accéléromètre + température + 3 axes gyroscope
  for  (long i=0;i<NumData;i++)
  {
    if(i!=3)
    {
      GyAccTempp[i]=(Wire.read()<<8|Wire.read()) - GATCorrr[i];
    }
    else
    {
      GyAccTempp[i]=(Wire.read()<<8|Wire.read()) - GATCorrr[i];
      GyAccTempp[i] = GyAccTempp[i]/340 + 36.53;
    }
  }
}

// Lecture des données des capteurs sans Corrections
void ReadGY521_0( long *GyAccTempp)
{
  long  GATCorr_0[NumData]={0,0,0,0,0,0,0};
  ReadGY521(GyAccTemp,GATCorr_0);
}

//Conversion des données accéléromètre en pitch/roll/yaw
void ComputeAngle(long *GyAccTempp,  double *PitchRol)
{  
  double x,y,z, X, Y, Z;
  x= (double)GyAccTempp[0];
  y= (double)GyAccTempp[1];
  z= (double)GyAccTempp[2];

  X=sqrt((y*y) + (z*z)); 
  Y=sqrt((x*x) + (z*z)); 
  Z=sqrt((x*x) + (y*y)); 
  
  PitchRol[0] = atan(x/X); //  pitch 
  PitchRol[1] = atan(y/Y); // roll
  PitchRol[2] = atan(z/Z); // yaw
  
  //Conversion Radian en degré
  PitchRol[0] = PitchRol[0] * (180.0/pi);
  PitchRol[1] = PitchRol[1] * (180.0/pi) ;
  PitchRol[2] = PitchRol[2] * (180.0/pi) ;
}

Accueil Drone avec Arduino

[Total : 1   Moyenne : 5/5]

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Anti-Robot *