WOW !! MUCH LOVE ! SO WORLD PEACE !
Fond bitcoin pour l'amélioration du site: 1memzGeKS7CB3ECNkzSn2qHwxU6NZoJ8o
  Dogecoin (tips/pourboires): DCLoo9Dd4qECqpMLurdgGnaoqbftj16Nvp


Home | Publier un mémoire | Une page au hasard

 > 

Conception et réalisation d'un quadrotor UAV


par Abdelhak Amine Zitouni
University Of Science And Technology Houari Boumediene USTHB - Masters Degree 2018
  

précédent sommaire suivant

Bitcoin is a swarm of cyber hornets serving the goddess of wisdom, feeding on the fire of truth, exponentially growing ever smarter, faster, and stronger behind a wall of encrypted energy

III.5.2. Unité de mesure de l'inertie gyroscopique MPU-6050 :

Dans cette partie, je montre comment lire et traiter les données venant du Gyroscope. Plus précisément, nous allons extraire les données du Gyro afin que le contrôleur de vol puisse calculer les angles parcourus par le quadrotor pour les axes de mouvements (Pitch, Roll et Yaw) en utilisant des opérations mathématiques simples, puis les transformer en instructions algorithmiques adaptées à Arduino.

Le Gyro est un capteur de taux d'angle à trois axes (x, y et z), il mesure la vitesse angulaire en degrés par seconde de ces axes en même temps. Les données d'entrées du Gyro sont couplées linéairement avec sa sortie, signifie que la longueur de l'impulsion de sortie change proportionnellement lorsque le Gyro est tourné autour de ces axes. Pour connaître la valeur de sortie exacte de l'MPU-6050, nous devons jeter un coup d'oeil sur la fiche technique du Gyro MPU6050 mentionnée dans la page (12 of 52) de l'annexe de ce mémoire. La sortie sera de 65,5 en décimal lorsque la vitesse angulaire du Gyro est de 1°/sec, car nous utilisons 500°/sec comme vitesse angulaire maximale pour les trois axes du Gyro.

Chapitre III Conception et mise en oeuvre du fonctionnement

Par exemple si le Gyro fait tourner autour de son axe de lacet (Yaw) et que nous terminons le tour complet (360°) exactement à une minute (60 sec), la sortie du Gyro à n'importe quel moment de ce parcourt sera de 6°/sec × 65.5 = 393, car à chaque seconde le Gyro tourne 6°. Dans le programme Arduino il sera donc : Angle°/sec = sortie Gyro / 65,5. Le résultat « Angle°/sec » sera déclarée comme une variable flottante et la sortie du Gyro est une valeur signée de 16 bits (la sortie du gyroscope est une valeur de complément de 16 bits deux) qui est similaire à un entier « Int » dans l'Arduino. Cela signifie que la variable « sortie Gyro » doit être déclarée comme un entier car elle peut atteindre 32750 si la vitesse angulaire du Gyroscope atteint les 500°/sec (sortie Gyro = 500°/sec × 65.5 = 32750). La plupart des Gyro ont un petit décalage moyen (offset) qui provoque la dérive du quadrotor donc le Gyroscope doit être calibré avant d'utiliser ces données de sortie. Pour obtenir les meilleurs résultats, la sortie du Gyro doit être mise à zéro et ceci est simplement fait en prenant l'offset pour plusieurs lectures et en les soustrayant des plusieurs valeurs de la sortie du Gyro. Ceci est expliquer dans cet organigramme de boucle for (;;) qui paresse dans le void setup :

Variables entiers 16 bits : Int_cal = 0
Initialiser les Variables 8 bits : lowByte, highByte
Initialiser les Variables 64 bits : gyro_pitch,
gyro_roll, gyro_yaw, cal_axe_x, cal_axe_y,
cal axe z

Int_cal < 2000 ?

Pour exécuter Non

Le code 2000 fois Oui

L'axe Pitch

L'axe Roll

L'axe Yaw

Ajouter la valeur lue gyro_pitch
de l'axe x du Gyro à la variable
cal_axe_x

Ajouter la valeur lue gyro_roll
de l'axe y du Gyro à la variable
cal_axe_y

Ajouter la valeur lue gyro_yaw
de l'axe z du Gyro à la variable
cal_axe_z

Incrémenter par 1
Int cal + +

Sous-programme de lecture des
données du Gyro MPU-6050

Tarder 3 ms

49

Diviser la variable
cal_axe_x par 2000 pour
obtenir l'offset de l'axe x

Diviser la variable
cal_axe_y par 2000 pour
obtenir l'offset de l'axe y

Diviser la variable
cal_axe_z par 2000 pour
obtenir l'offset de l'axe z

Reste du programme.

Chapitre III Conception et mise en oeuvre du fonctionnement

50

Cet organigramme calcule l'offset moyenne de 2000 lectures de Gyro pour les 3 axes, puis il stocke chacune de ces valeurs d'offset dans les variables (cal_axe_x, cal_axe_y et cal_axe_z). Après cette étape l'offset est soustraite de chaque mesure du Gyro dans le reste de la boucle du programme.

· Sous-programme de lecture des données du Gyro :

L'Arduino Uno du contrôleur de vol lit les données des angles parcouru par le Gyro à partir des registres de sortie d'adresses 0x69 et 0xA8 qui sont à 16 bits en utilisant le protocole de communication I2C. Par exemple pour lire l'axe « Yaw » on lit les 8 bits du poids fort du registre 16 bit à part, puis les 8 bits du poids faible et on fait un décalage pour avoir les 16 bit puis on affecte le résultat au variable « gyro_yaw ».

Toutes les autres parties intéressantes pour la communication I2C avec le Gyro sont gérées par la librairie "wire" qui nous facilitent la tâche.

L'organigramme qui explique le processus est situé dans la page suivante.

Chapitre III Conception et mise en oeuvre du fonctionnement

Commencer la communication I2C
avec le Gyro (registre d'adresse 0x69)

Commencer à lire du registre
d'adresse 0xA8

Fin de transmission

Demander 6 octets du
registre d'adresse 0x69

Attendre jusqu'à les 6 octets Soient reçus

Octets valables < 6 ?

Non

Oui

Réception du 1ier
Byte du poids
faible des données
angulaire lowByte

Compenser l'offset Après le calibrage Jusqu'à Int_cal = 2000

Int_cal = 2000?

Non

Oui

gyro_roll =
cal_axe_y -
gyro_roll

Int_cal = 2000?

Oui Non

gyro_pitch =
cal_axe_x -
gyro_pitch

Non

Oui

gyro_yaw =
cal_axe_z -
gyro_yaw

Fin du
sous-
programm

Int_cal = 2000?

Réception du 2nd
Byte du poids fort
des données
angulaire highByte

gyro_pitch =
(highByte X 256) +
lowByte

gyro_roll = (highByte X 256) + lowByte

Décalage de highByte

Par 8 positions

gyro_yaw = (highByte X 256) + lowByte

51

Après l'étape de calibrage, il est nécessaire de calculer l'angle total parcouru par le Gyro afin que le contrôleur de vol puisse reconnaître la position exacte du quadrotor dans l'espace. Pour cela il suffit simplement d'intégrer au fil de temps tous les valeurs de sortie Gyro (les données de la vitesse angulaire des axes Pitch, Roll et Yaw) par exemple pour l'axe Yaw :

Chapitre III Conception et mise en oeuvre du fonctionnement

52

Angle parcouruya11, =E sortie Gyroya11, x At.

Dans le cas de notre contrôleur de vol, la fréquence de rafraîchissement est de 250 Hz, on peut donc extraire les angles parcouru par le Gyro pour chaque axe toutes les 4 ms au lieu de 1s. Cela signifie également que nous devons diviser les données de sortie Gyro sur 65,5 et ensuite diviser à nouveau sur 250 pour obtenir l'angle parcouru par le quadrotor chaque 4 ms.

J contrôleur de vol = 250 Hz - At = 4 ms

Angle parcouruyau, = 1(sortie Gyroyau, /(250/65.5))

= E(sortie Gyroyau, x 0.0000611)

L'intégrale en mathématique signifie la sommation d'une fonction sur un intervalle donné, donc dans le code Arduino on fait la somme de toutes les données gyroscopiques de sortie pour chaque axe à part dans un intervalle de 4ms, par exemple pour l'axe z « Yaw » se traduire par cette instruction :

Angle parcouruyau, est : Angle_yaw_entrée += gyro_z * 0.0000611;

C.à.d. : Angle_yaw_entrée = Angle_yaw_entrée précédente + (gyro_z x 0.0000611) Vérifions la validité de cette relation avec le dernier exemple pour une rotation complète (360°) du Gyro autour de son axe (Yaw) dans 60s, on aura :

· La sortie du Gyro en décimal à n'importe quel moment pendant la rotation est : sortie Gyroyau, = 393.

· Pendant la rotation, les données du Gyro sont ajoutées 250 fois par seconde donnant un total de 15000 lectures : 250lecture P/s x 60s = 15000 lecture

· Pour une minute on aura donc :

Angle parcouruyau, = 15000 lecture x 393 x 0.0000611

= 360.18° 360°

Ce qui est assez proche pour un tour complet, d'où la formule est juste.

L'inconvénient du Gyro MPU6050 c'est que le signal de sortie est très bruyant Figure 3.27.

L'utilisation d'un simple filtre complémentaire permet de réduire le bruit qui accompagne le signal

de sortie du Gyro, alors l'instruction précédente devienne:

Angle_yaw_entrée = (Angle_yaw_entrée * 0.7) + (gyro_z * 0.0000611);

précédent sommaire suivant






Bitcoin is a swarm of cyber hornets serving the goddess of wisdom, feeding on the fire of truth, exponentially growing ever smarter, faster, and stronger behind a wall of encrypted energy








"Je ne pense pas qu'un écrivain puisse avoir de profondes assises s'il n'a pas ressenti avec amertume les injustices de la société ou il vit"   Thomas Lanier dit Tennessie Williams