Académique Documents
Professionnel Documents
Culture Documents
https://www.electronique-mixte.fr/implementation-de-la-boucle-dasservissement-dun-drone-bicopter-avec-arduino/ 1/32
30/12/2023 10:03 Implémentation de la Boucle d’Asservissement d’un Drone Bicopter avec Arduino – Cours | Projets Divers
Drone | Arduino #17: Contrôleur Proportionnel (P) d’un Drone Bi-copter [TU…
[TU…
Objectifs
1. Savoir configurer les registres du module MPU-6050 GY-521
2. Savoir implémenter la boucle d’asservissement d’un drone Bicopter (voir la figure ci-dessous)
3. Savoir l’effet de l’action proportionnelle sur l’équilibre du drone
4. Savoir la différence entre l’asservissement d’angle avec l’accéléromètre ou bien le gyroscope
5. Savoir implémenter une intégration numérique avec Arduino
6. Voir le tuto pour plus de détails
ARDUINO
+ M1
Consigne
+
Angle Consigne
+ P, PI, PID Vitesse
(V0)
- -
+ M2
CAPTEUR
https://www.electronique-mixte.fr/implementation-de-la-boucle-dasservissement-dun-drone-bicopter-avec-arduino/ 2/32
30/12/2023 10:03 Implémentation de la Boucle d’Asservissement d’un Drone Bicopter avec Arduino – Cours | Projets Divers
Câblage
VCC -> 3.3 V / 5 V (préférable)
GND -> GND
SCL -> A5 (Uno, Nano, Mini) (Pin SCL pour le Mega)
SDA -> A4 (Uno, Nano, Mini) (Pin SCL pour le Mega)
XDA -> NC (non connecté)
XCL -> NC
ADO -> NC
INT -> NC
Wire.write(0); // Valeur
https://www.electronique-mixte.fr/implementation-de-la-boucle-dasservissement-dun-drone-bicopter-avec-arduino/ 3/32
30/12/2023 10:03 Implémentation de la Boucle d’Asservissement d’un Drone Bicopter avec Arduino – Cours | Projets Divers
1 Wire.beginTransmission(MPU);
2
3 Wire.write(0x1B);
4
5 Wire.write(0x08);
6
7 Wire.endTransmission();
8
9 delay(10);
1 Wire.beginTransmission(MPU);
2
3 Wire.write(0x1C);
4
5 Wire.write(0x10);
6
7 Wire.endTransmission();
8
9 delay(10);
1 Wire.beginTransmission(MPU);
2
3 Wire.write(0x1A);
4
https://www.electronique-mixte.fr/implementation-de-la-boucle-dasservissement-dun-drone-bicopter-avec-arduino/ 4/32
30/12/2023 10:03 Implémentation de la Boucle d’Asservissement d’un Drone Bicopter avec Arduino – Cours | Projets Divers
5 Wire.write(0x00);
6
7 Wire.endTransmission();
8
9 delay(10);
1 Serial.begin(250000);
1 M1.attach(PinM1);
2
3 M2.attach(PinM2);
L’obtention de l’angle peut être donc réaliser en utilisant l’intégration numérique de la vitesse
angulaire. Dans ce tuto on va utiliser la technique de Simpson pour intégrer une fonction. La
technique est analogue à la moyenne glissante d’une fonction sur 3 échantillons (voir la figure ci-
dessous).
https://www.electronique-mixte.fr/implementation-de-la-boucle-dasservissement-dun-drone-bicopter-avec-arduino/ 5/32
30/12/2023 10:03 Implémentation de la Boucle d’Asservissement d’un Drone Bicopter avec Arduino – Cours | Projets Divers
‘
h=b-a=2*Te, Te étant la période d’échantillonnage
‘ Voir le tuto « Comment intégrer une fonction avec Arduino » pour plus de
détails.
La fonction AngleGyro()
La fonction AngleGyro() permet de convertir les données bruts issues du gyroscope en angles
dans les trois axes. Elle est basée sur l’intégration de Simpson dans l’axe x, y et z. Ci-dessous les
étapes de la mesure des angles :
1 x= (double)GyAccTempp[4]/LSB_Gyro;
2
3 y= (double)GyAccTempp[5]/LSB_Gyro;
4
5
https://www.electronique-mixte.fr/implementation-de-la-boucle-dasservissement-dun-drone-bicopter-avec-arduino/ 6/32
30/12/2023 10:03 Implémentation de la Boucle d’Asservissement d’un Drone Bicopter avec Arduino – Cours | Projets Divers
z= (double)GyAccTempp[6]/LSB_Gyro;
Intégration – Simpson:
1 h=2.0*Te_s;
2 X= (xyz[0][1] + 4.0*xyz[0][0] + x); X=X*h/6.0;
3 Y= (xyz[1][1] + 4.0*xyz[1][0] + y); Y=Y*h/6.0;
4 Z= (xyz[2][1] + 4.0*xyz[2][0] + z); Z=Z*h/6.0;
1 xyz[0][1]=xyz[0][0];
2
3 xyz[0][0]=x;
4
5
6
7
8 xyz[1][1]=xyz[1][0];
9
10 xyz[1][0]=y;
11
12
13
14
15 xyz[2][1]=xyz[2][0];
16
17 xyz[2][0]=z;
https://www.electronique-mixte.fr/implementation-de-la-boucle-dasservissement-dun-drone-bicopter-avec-arduino/ 7/32
30/12/2023 10:03 Implémentation de la Boucle d’Asservissement d’un Drone Bicopter avec Arduino – Cours | Projets Divers
1 GyPitchRol[0] = X * (180.0/PI);
2
3 GyPitchRol[1] = Y * (180.0/PI) ;
4
5 GyPitchRol[2] = Z * (180.0/PI) ;
29 GyPitchRol[0] = X * (180.0/PI);
30 GyPitchRol[1] = Y * (180.0/PI) ;
31 GyPitchRol[2] = Z * (180.0/PI) ;
}
A retenir
L’action proportionnel est facile à mettre en pratique. Elle ne nécessite pas la connaissance
des paramètres physiques du système pour effectuer la commande (Wn, dépassement, etc.).
Elle est utilisée pour augmenter la rapidité du système et réduire un peu l’erreur statique
(k>1). En revanche elle a tendance à déstabiliser le système.
La mesure de l’ange basé sur l’accélération semble inefficace. Le capteur est très sensible
aux vibrations durant le décollage du drone. Les mesures sont inutiles face aux vibrations
des moteurs. En revanche, la mesure de l’angle par le gyroscope reste peu sensible aux bruits
des vibrations. On peut encore améliorer la stabilité des mesure en utilisant une moyenne
glissante (voir le tuto). On maintient la mesure par le Gyro dans les tutos à venir pour
l’asservissement de l’angle.
‘ Une intégration numérique d’ordre supérieur (plus de points) peut être utilisée
pour réduire naturellement l’effet du bruit !
L’action (P) n’améliore pas la stabilité du drone. On verra dans le tuto prochain l’action PI et
avance de phase.
Le programme complet
#include <math.h>
#include <Servo.h>
#include <Wire.h>
#define NumData 7
#define pi 3.1415926535897932384626433832795
#define MPU 0x68
#define LSB_Gyro 65.5 // +/- 500°/s sur 16 bits
#define PinM1 11
#define PinM2 12
https://www.electronique-mixte.fr/implementation-de-la-boucle-dasservissement-dun-drone-bicopter-avec-arduino/ 9/32
30/12/2023 10:03 Implémentation de la Boucle d’Asservissement d’un Drone Bicopter avec Arduino – Cours | Projets Divers
#define Fn 10.00
#define Zeta 0.05 //0.70710678118
#define K 1.0
#define T_ms 1
double Wn=2.0*PI*Fn;
double T_s=(double)T_ms/1000.0;
// Pinout
/*
VCC -> 3.3 V / 5 V (préférable)
GND -> GND
SCL -> A5 (Uno, Nano, Mini)
SDA -> A4 (Uno, Nano, Mini)
void setup()
{
https://www.electronique-mixte.fr/implementation-de-la-boucle-dasservissement-dun-drone-bicopter-avec-arduino/ 10/32
30/12/2023 10:03 Implémentation de la Boucle d’Asservissement d’un Drone Bicopter avec Arduino – Cours | Projets Divers
// 3. Accelo: +/- 8g
Wire.beginTransmission(MPU);
Wire.write(0x1C);
Wire.write(0x10);
Wire.endTransmission();
delay(10);
void loop()
{
// 1. Définition de la consigne: Angle d'équilibre (0°) :)
x_nn=0.0;
https://www.electronique-mixte.fr/implementation-de-la-boucle-dasservissement-dun-drone-bicopter-avec-arduino/ 11/32
30/12/2023 10:03 Implémentation de la Boucle d’Asservissement d’un Drone Bicopter avec Arduino – Cours | Projets Divers
https://www.electronique-mixte.fr/implementation-de-la-boucle-dasservissement-dun-drone-bicopter-avec-arduino/ 12/32
30/12/2023 10:03 Implémentation de la Boucle d’Asservissement d’un Drone Bicopter avec Arduino – Cours | Projets Divers
//Serial.print(PitchRoll[0]-1.0); Serial.print(",");
//Serial.print(PitchRoll[1]); Serial.print(",");
//Serial.println(y_capt);
// Période d'échantillonnage
delay(T_ms);
}
https://www.electronique-mixte.fr/implementation-de-la-boucle-dasservissement-dun-drone-bicopter-avec-arduino/ 13/32
30/12/2023 10:03 Implémentation de la Boucle d’Asservissement d’un Drone Bicopter avec Arduino – Cours | Projets Divers
}
else
{
GyAccTempp[i]=(Wire.read()<<8|Wire.read()) - GATCorrr[i];
GyAccTempp[i] = GyAccTempp[i]/340 + 36.53;
}
}
}
X=sqrt((y*y) + (z*z));
Y=sqrt((x*x) + (z*z));
Z=sqrt((x*x) + (y*y));
https://www.electronique-mixte.fr/implementation-de-la-boucle-dasservissement-dun-drone-bicopter-avec-arduino/ 14/32
30/12/2023 10:03 Implémentation de la Boucle d’Asservissement d’un Drone Bicopter avec Arduino – Cours | Projets Divers
h=2.0*Te_s;
X= (xyz[0][1] + 4.0*xyz[0][0] + x); X=X*h/6.0;
Y= (xyz[1][1] + 4.0*xyz[1][0] + y); Y=Y*h/6.0;
Z= (xyz[2][1] + 4.0*xyz[2][0] + z); Z=Z*h/6.0;
xyz[1][1]=xyz[1][0];
xyz[1][0]=y;
xyz[2][1]=xyz[2][0];
xyz[2][0]=z;
https://www.electronique-mixte.fr/implementation-de-la-boucle-dasservissement-dun-drone-bicopter-avec-arduino/ 15/32
30/12/2023 10:03 Implémentation de la Boucle d’Asservissement d’un Drone Bicopter avec Arduino – Cours | Projets Divers
}
xyz[0][0]=x;
xyz[1][0]=y;
xyz[2][0]=z;
double Sys2All(double x_nn, double *x, double *y, double zeta, double wn
{
// Paramètre du système
double a1=2.0*zeta/wn;
double a2=1.0/(wn*wn);
// Renvoie du résultat
return y_nn;
}
double CorrPI(double x_nn, double *xpi, double *ypi, double kp, double k
{
// Variables de l'entrée et la sortie
https://www.electronique-mixte.fr/implementation-de-la-boucle-dasservissement-dun-drone-bicopter-avec-arduino/ 16/32
30/12/2023 10:03 Implémentation de la Boucle d’Asservissement d’un Drone Bicopter avec Arduino – Cours | Projets Divers
double y_nn=0.0;
// Renvoie du résultat
return y_nn;
}
// Paramètres du correcteur
double alfa=a*t0;
double beta=t0;
https://www.electronique-mixte.fr/implementation-de-la-boucle-dasservissement-dun-drone-bicopter-avec-arduino/ 17/32
30/12/2023 10:03 Implémentation de la Boucle d’Asservissement d’un Drone Bicopter avec Arduino – Cours | Projets Divers
// Renvoie du résultat
return y_nn;
}
double PID(double x_nn, double *x_cc, double *y_cc, double N_fil, double
{
double t1=1.0/(w*(z+sqrt(z*z-1.0)));
double t2=1.0/(w*(z-sqrt(z*z-1.0)));
double td=t1+t2;
double ti=t1*t2/td;
/*
Serial.print(t1);
Serial.print("\t");
Serial.print(t2);
Serial.print("\t");
Serial.print(td);
Serial.print("\t");
Serial.println(ti);
*/
double a1=2.0*z/w;
double a2=1.0/(w*w);
double b1=ti;
double b2=ti*t2/N_fil;
double b[3];
b[0]= a1/(2*T)+a2/(T*T);
b[1]= 1.0-2.0*a2/(T*T);
b[2]=-a1/(2*T)+a2/(T*T);
double c[3];
c[0]= b1/(2*T)+b2/(T*T);
c[1]= -2.0*b2/(T*T);
c[2]= -b1/(2*T)+b2/(T*T);
https://www.electronique-mixte.fr/implementation-de-la-boucle-dasservissement-dun-drone-bicopter-avec-arduino/ 18/32
30/12/2023 10:03 Implémentation de la Boucle d’Asservissement d’un Drone Bicopter avec Arduino – Cours | Projets Divers
405
406
// Calcul de la nouvelle sortie
407
y_nn=k*(b[0]*x_nn + b[1]*x_cc[0] + b[2]*x_cc[1]);
408
y_nn=y_nn-(c[1]*y_cc[0] + c[2]*y_cc[1]);
409
y_nn=y_nn/c[0];
410
411
412
// Mise à jour de la sortie
413
y_cc[1]=y_cc[0];
414
y_cc[0]=y_nn;
415
416
// Mise à jour de l'entrée
x_cc[1]=x_cc[0];
x_cc[0]=x_nn;
// Renvoie du résultat
return y_nn;
}
[Total: 2 Average: 5]
‘
Nous Soutenir
https://www.electronique-mixte.fr/implementation-de-la-boucle-dasservissement-dun-drone-bicopter-avec-arduino/ 19/32
30/12/2023 10:03 Implémentation de la Boucle d’Asservissement d’un Drone Bicopter avec Arduino – Cours | Projets Divers
0 commentaire
Laisser un commentaire
Nom *
E-mail *
Site internet
Anti-Robot *
+ = seize
LAISSER UN COMMENTAIRE
https://www.electronique-mixte.fr/implementation-de-la-boucle-dasservissement-dun-drone-bicopter-avec-arduino/ 20/32
30/12/2023 10:03 Implémentation de la Boucle d’Asservissement d’un Drone Bicopter avec Arduino – Cours | Projets Divers
https://www.electronique-mixte.fr/implementation-de-la-boucle-dasservissement-dun-drone-bicopter-avec-arduino/ 21/32
30/12/2023 10:03 Implémentation de la Boucle d’Asservissement d’un Drone Bicopter avec Arduino – Cours | Projets Divers
https://www.electronique-mixte.fr/implementation-de-la-boucle-dasservissement-dun-drone-bicopter-avec-arduino/ 22/32
30/12/2023 10:03 Implémentation de la Boucle d’Asservissement d’un Drone Bicopter avec Arduino – Cours | Projets Divers
Série GRAFCET
https://www.electronique-mixte.fr/implementation-de-la-boucle-dasservissement-dun-drone-bicopter-avec-arduino/ 23/32
30/12/2023 10:03 Implémentation de la Boucle d’Asservissement d’un Drone Bicopter avec Arduino – Cours | Projets Divers
Projets électroniques
Projets Arduino
https://www.electronique-mixte.fr/implementation-de-la-boucle-dasservissement-dun-drone-bicopter-avec-arduino/ 24/32
30/12/2023 10:03 Implémentation de la Boucle d’Asservissement d’un Drone Bicopter avec Arduino – Cours | Projets Divers
Nos kITS
https://www.electronique-mixte.fr/implementation-de-la-boucle-dasservissement-dun-drone-bicopter-avec-arduino/ 25/32
30/12/2023 10:03 Implémentation de la Boucle d’Asservissement d’un Drone Bicopter avec Arduino – Cours | Projets Divers
Série Arduino
Série Proteus
Série Matlab
https://www.electronique-mixte.fr/implementation-de-la-boucle-dasservissement-dun-drone-bicopter-avec-arduino/ 26/32
30/12/2023 10:03 Implémentation de la Boucle d’Asservissement d’un Drone Bicopter avec Arduino – Cours | Projets Divers
Kits Arduino
Kits drone
Devenir Ingénieur
YouTube 25 k
Articles similaires
https://www.electronique-mixte.fr/implementation-de-la-boucle-dasservissement-dun-drone-bicopter-avec-arduino/ 27/32
30/12/2023 10:03 Implémentation de la Boucle d’Asservissement d’un Drone Bicopter avec Arduino – Cours | Projets Divers
ALGORITHME
https://www.electronique-mixte.fr/implementation-de-la-boucle-dasservissement-dun-drone-bicopter-avec-arduino/ 28/32
30/12/2023 10:03 Implémentation de la Boucle d’Asservissement d’un Drone Bicopter avec Arduino – Cours | Projets Divers
ALGORITHME
https://www.electronique-mixte.fr/implementation-de-la-boucle-dasservissement-dun-drone-bicopter-avec-arduino/ 29/32
30/12/2023 10:03 Implémentation de la Boucle d’Asservissement d’un Drone Bicopter avec Arduino – Cours | Projets Divers
ARDUINO
https://www.electronique-mixte.fr/implementation-de-la-boucle-dasservissement-dun-drone-bicopter-avec-arduino/ 30/32
30/12/2023 10:03 Implémentation de la Boucle d’Asservissement d’un Drone Bicopter avec Arduino – Cours | Projets Divers
Besoin d’Aide ?
https://www.electronique-mixte.fr/implementation-de-la-boucle-dasservissement-dun-drone-bicopter-avec-arduino/ 31/32
30/12/2023 10:03 Implémentation de la Boucle d’Asservissement d’un Drone Bicopter avec Arduino – Cours | Projets Divers
Rechercher
Rechercher…
https://www.electronique-mixte.fr/implementation-de-la-boucle-dasservissement-dun-drone-bicopter-avec-arduino/ 32/32