Table des matières

Définitions et terminologie

Nous avons souhaité développer cette partie pour donner des pistes à tout droniste débutant, pour s'informer sur les principales sources d'incompréhension, de problèmes mais aussi de solutions.

Asservissement d'un drone : Régulation PID

Nous développons un asservissement qui utilise des régulateurs PID (Proportionnelle Intégrale Dérivée) pour déterminer la puissance à fournir aux moteurs via les ESC et essayons de le perfectionner au maximum. Nous avons donc utilisé les cours de M. Bovo, notre professeur, pour comprendre et mettre en oeuvre les débuts de notre asservissement.

A partir de la différence entre l'angle actuel (obtenu via les capteurs) et l'angle souhaité (via la commande), on définit l'erreur :

On obtient la formule de la correction pour chaque angle (yaw/pitch/roll) est alors :

Petit plus : Nous avons pu réutiliser l'idée d'un filtre passe-haut (qui filtre les variations/aberrations) du projet AQ32PlusF3 :

Yaw, Pitch, Roll

Il est important de bien comprendre les termes de Yaw, Pitch et Roll, car ceux-ci désignent des valeurs permettant de représenter le drone dans l’espace. - Yaw : en français lacet - Pitch : en français tangage - Roll : en français roulis Pour concevoir l’asservissement de notre drone, nous commençons par essayer de stabiliser le drone dans toutes ses caractéristiques. Grâce aux données de l’accéléromètre et du gyroscope, nous pouvons contre-balancer un décrochage du drone selon un axe, en modifiant la vitesse des moteurs.

Filtre de Kalman

Le filtre de Kalman est un filtre à réponse impulsionnelle infinie qui estime les états d'un système dynamique à partir d'une série de mesures incomplètes ou bruitées. Le développement d'un filtre de Kalman, très complexe, nécessite un bagage mathématique (manipulation de matrices notamment). A la fin, ceci permet d'obtenir des valeurs de yaw, pitch et roll cohérentes avec la réalité, en s'affranchissant des aberrations ponctuelles des capteurs.

Nous obtenons ainsi une fonction Kalman : void Kalman(t_kalman* k, float angle_m, float rate_m, float dt) comportant toute une série de calculs, notamment matriciels. Nous avons créé le type t_kalman, qui est utilisé pour chaque angle à “filtrer” (yaw, pitch et roll).

Sens de rotation des moteurs

Sur un drone, il est important de bien avoir en tête que pour que l'appareil décolle, celui-ci doit brasser de l'air. Les hélices, tournant à haute vitesse, créent une surpression, ce qui crée une force soulevant le drone. Pour éviter les effets toupie, il est nécessaire de croiser les sens des hélices, ainsi que de croiser les sens de rotation des hélices. On mettra alors 1 paire d’hélices CW (clockwise – tournant dans le sens des aiguilles d’une montre) et 1 paire d’hélices CCW (counter-clockwise – tournant dans le sens inverse). Les deux paires se croisent en formant un X. Le sens de rotation des moteurs doit également suivre le sens de rotation pour lequel les hélices sont données.

Chargement des batteries

Pour notre drone, nous utilisons une batterie 3S. Ceci permet une tension forte (autour de 11,1V) couplée à une intensité élevée.

La batterie doit être chargée avec une intensité limitée (cela se règle sur le chargeur). Pour charger une batterie Li-Po de 4000mAh de 1C (valeur courante du coefficient de charge), cela signifie que le chargement devra se faire à 4 ampères maximum.

Le nombre important à retenir pour les batteries est 1,141. Ce nombre aide à réaliser les ajustements des tensions minimales et maximales pour la décharge et la charge (respectivement).

Type de batterie Tension de charge max. (V) Tension de décharge max. (V)
2S (2x 3.7V) 7.4 x 1.141 = 8.44 7.4 / 1.141 = 6.5
3S (3x 3.7V) 11.1 x 1.141 = 12.6 11.1 / 1.141 = 9.7
4S (4x 3.7V) 14.8 x 1.141 = 16.9 14.8 / 1.141 = 12.9

Le système doit arrêter de fonctionner lorsque l'on atteint 3,2V, ou même 3,4V par cellule. Certains ESC proposent un arrêt automatique, sinon, vous devrez le réaliser et l'intégrer dans votre programme de contrôleur de vol.

Le Protocole I²C

Nous avons également mis en place la liaison I²C entre Arduino et STM32F3Discovery. Cela se fait via les pins SDA et SCL de chacun des deux composants. Du côté de l’Arduino, la librairie Wire fournie est très simple d’utilisation. Du côté de la STM32, la programmation se fait comme un classique microcontrôleur : on active le protocole I²C sur les pins SDA et SCL, on configure la vitesse du port, on désactive la résistance de pull-up interne et on configure tous les registres de l’I²C.

Nous avons trouvé un récapitulatif simple sur www.stackoverflow.com/questions/24078696/ qui a permis de faciliter notre débuggage :

  1. Enable i2c and GPIOs clocks.
  2. Configure the desired AF of the ports. (AF4 for i2c in stm32).
  3. Configure GPIOs:
  4. set GPIOs as AF.
  5. set port speed.
  6. set port type (open-drain).
  7. set to no pull-up/pull-down.
  8. Configure i2c. (registers CR2, CCR, CR1, OAR1, …).

Il faut veiller à utiliser une résistance de pull-up externe sur chacun des pins SDA et SCL. En effet, cela va permettre la liaison entre un périphérique sortant du 3,3V (la STM32F3Discovery, qui est néanmoins 5V-compatible) et un périphérique sortant du 5V, sur l’I²C. La résistance va permettre de mettre les deux lignes SDA et SCL par défaut (lorsqu’aucun signal n’est sorti) à 5V. Lorsqu’un signal est émis par l’un des deux composants, le signal prend 0V. La succession de 5V et de 0V permet de coder un signal en différents bits.