Catégories
Algorithme Arduino capteur Commande des moteurs drone moteur Projets Arduino pwm

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

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

Laisser un commentaire