1. Introduction

Ce projet a pour objectif de créer un dispositif permettant de maintenir un avion à une altitude définie. Ce dispositif doit être capable d'assimiler l'altitude ainsi que l'attitude de l'avion avant sa mise en marche. Cette capacité d'apprentissage en mode stand-by permet, une fois le mode actif enclenché, d'avoir toutes les données nécessaires pour être capable de maintenir l'altitude de l'avion.

2. Matériels et méthodes

2.1 Matériels

2.1.1 Arduino Uno

Arduino_Uno.jpg

L'Arduino est une plateforme libre d'accès, qui est majoritairement utilisé dans le cadre de petits projets pour programmer toute de sorte de choses, comme par exemple des capteurs ou de petits robots. L'Arduino Uno est un circuit imprimé qui permet d'accéder plus facilement à un microcontrôleur ATmega328, de cette manière ce dernier peut être facilement programmé pour analyser et produire des signaux électriques afin de remplir différentes tâches. L'Arduino uno possède aussi une connexion USB, une connexion pour une alimentation par batterie ainsi qu'un bouton de réinitialisation (bouton "reset").



2.1.2 Servomoteur

Un servomoteur est un moteur qui est capable de maintenir une position donnée. Dans le cadre de ce projet ce type de moteur est plus qu'utile car il faut que notre dispositif impose une position de gaz à l'avion et qu'il la maintienne. De plus certain de ces servomoteurs ont la capacité de renvoyer une information sur leurs positions ce qui pourrait éviter l'ajout d'un capteur pour connaitre la position des gaz.

Voici le servomoteur utilisé dans ce projet prototype : servomoteur.jpg



2.1.3 Potentiomètres

Dans ce projet, qui est pour l'heure à l'étape de prototype, j'utilise deux potentiomètres pour simuler les différentes informations que mon dispositif devra traiter et qui vont être, dans une version future, remplacée par des valeurs provenant de vrais capteurs. Les deux données que l’Arduino Uno doit recevoir sont l’altitude et l’attitude, qui est donnée par la position des gaz, de l’avion.

Voici le model de potentiomètre utilisé dans ce projet prototype : Potentiometre_.jpg

2.1.4 LED tricolore

La LED tricolore permet de signaler dans quel mode se trouve notre dispositif. Lorsque la LED est bleu cela signifie que le dispositif est en mode stand-by, lorsqu’elle est verte le module est en mode actif et pour finir lorsqu’elle est en rouge cela signifie qu’il y a une trop grande différence d’altitude et que le pilote doit reprendre le contrôle de l’appareil au plus vite.

Voici la LED tricolore utilisé dans ce projet prototype : LED_tricolore.jpg

2.1.5 Bouton poussoir

Pour ce projet un seul bouton permet d’avoir une utilisation simple et efficace du système. En effet ce bouton sert à passer avec un seul clique du mode stand-by au mode actif et réciproquement.

Voici le bouton poussoir utilisé dans ce projet prototype : bouton_poussoir.jpg

2.1.6 Buzzer

Le buzzer est utilisé comme deuxième alerte dans le cadre du mode détresse du dispositif. Lorsque l’avion a une trop grande différence d’altitude, la LED s’allume en rouge et le buzzer émet un son qui permet d’avertir d’autant mieux le pilote qui n’est pas censé regarder la LED continuellement.

Voici le buzzer utilisé dans ce projet prototype : buzzer.jpg

2.1.7 Relais et transistor

Un point important de ce projet est la mise sous tension du servomoteur. Effectivement on a vu que lorsqu’un servomoteur avait une position définie, il était fait pour la garder. Mais dans le cadre de ce projet, lorsque le dispositif n’est pas en mode actif le pilote doit pouvoir reprendre le contrôle de l’avion. C’est pour cette raison que le couple Relais transistor permet de mettre ou de ne pas mettre le servomoteur sous tension suivant le mode du système. De ce fait le servomoteur n’oppose aucune résistance lorsque le pilote vol en mode stand-by et lorsqu’il reprend le contrôle quand le système est en mode détresse. Le montage complet pour pouvoir utiliser un relais est décrit ici.

Voici le relais et le transistor utilisés dans ce projet prototype : relais_transistor.jpg

2.1.8 Résistance et diode

Ce projet nécessite deux résistances et une diode. Les deux résistances sont des 330ohm et sont utilisés pour augmenter la résistance dans le circuit de la LED tricolore et entre la pin 13 et le transistor. La diode est utilisée dans le circuit du Relay comme décrit dans le montage complet proposé par le SIK GUIDE de SparkFun.

Voici la résistance et la diode utilisées dans ce projet prototype : resistances_diode.jpg

2.2 Méthodes

2.2.1 Explication schématique du programme

Schemaprog.PNG

Le schéma ci-dessus montre bien les différentes états que le système peut avoir mais néanmoins quelques explications sont nécessaires pour comprendre au mieux le programme. Tout d’abord le système est mis sous tension, ce qui implique le démarrage du programme et l’initialisation des différents éléments avant de se mettre en mode Stand-by. Lorsque le dispositif est en mode stand-by, les prises de mesures de l’altitude et de l’attitude sont faites et une fois moyenné, elles sont introduites dans deux variables distinctes. Une fois le bouton poussoir activé, le dispositif bascule en mode actif.
Tout d’abord il faut savoir que dès le mode actif enclenché les variables qui concerne l’altitude est l’attitude sont gardé. Ceci de telle sorte que l’altitude, défini en mode stand-by, sert d’altitude de référence ainsi que l’attitude de l’avion à cette dernière. Dès lors le programme peut commencer à faire la différence entre l’altitude réelle et l’altitude de référence. Pour ensuite introduire cette valeur dans une fonction pour qu’une correction adéquate soit opérée sur la manette des gaz. La fonction qui a été choisie est décrite sous la rubrique « 2.2.5 Fonction algébrique ». Le troisième mode, que l’on peut observer sur ce schéma, indique tout simplement que lorsque la différence entre l’altitude réelle et l’altitude est trop grande le système arrête toute activité et indique un cas d’alerte au moyen d’une lumière rouge et d’un son provenant du buzzer.
L’entièrté du code de ce projet ce trouve ici



2.2.1 Schéma du montage

Voici le schéma du montage final du projet : Projet_h_schema.jpg

On retrouve dans ce schéma toutes les connexions nécessaires au bon fonctionnement de notre système.

2.2.3 Utilisation de l’interruption

L’interruption (en anglais interrupt) est utilisé pour interrompre la fonction loop() durant quelques millisecondes, lorsque le bouton est appuyé, pour que le programme exécute une fonction spécial. Ici la fonction change l’état d’une variable entre LOW et HIGH. Les interruptions sont expliqués sur le site officiel d’Arduino.

void setup(){
    attachInterrupt(INTERRUPT, STATUT , FALLING);
}

Cet interrupt appel la fonction si dessous :

void STATUT(){
  ONOFF= !ONOFF;
}  

Cet interrupt est activé lorsque qu'il y a un FALLING, c'est-à-dire lorsque que l’arduino détecte un flanc descendant sur la pin 2. Le bouton a été câblé de sorte que lorsqu’il est appuyé le courant de la digital pin 2, qui est en INPUT_PULLUP, soit dérivé dans le ground ce qui active l’interruption et exécute la fonction ci-dessus.

2.2.4 Les moyennes mobiles

En ce qui concerne la prise de mesures des deux valeurs de référence, l'altitude fixée et l'attitude à cette altitude, elle doivent être relativement fiable au moment où l'on enclenche le dispositif. Pour ce faire il est possible d'utiliser un tableau circulaire, autrement dit Buffer circulaire, pour créer une moyenne mobile. En effet cette démarche consiste en la création d’un tableau avec un nombre défini de place ou l’on va inscrire nos valeurs de façon à ce que lorsque le tableau est plein la valeur suivante prenne la place de la première valeur du tableau. Voici ci-dessous le code qui permet cette manière de faire.

float MoyenneAttitude(float VALEURAT){
  static float attitudes[] = {0.0, 0.0, 0.0, 0.0, 0.0};
  static unsigned short Index = 0;

    attitudes[Index] = VALEURAT;
    Index = (Index + 1) % 5;

  return (attitudes[0] + attitudes[1] +  attitudes[2] + attitudes[3] +  attitudes[4]) / 5;

Ainsi le code qui se trouve dans la fonction void loop tient sur une seule ligne.

Void loop(){
AttitudeReferenceFinale = MoyenneAttitude(VALEURAT);
}

Cette méthode a été emprunté à Monsieur Iglesias dans son projet d’assistance au démarrage d’un moteur d’avion.

2.2.5 Fonction algébrique

Dans ce projet il faut non seulement que le dispositif compense lorsqu'il-y-a une différence d'altitude mais il doit aussi être capable de stabiliser l'avion à l'altitude voulu. C'est pourquoi il faut qu'il traite les données de façon à avoir un comportement qui tend vers une stabilisation et non vers un effet de sur-correction. En effet si l'on prend en compte que l'avion met un certain temps à réagir aux corrections apportées par notre système, il est fort possible que si la correction est proportionnelle à la différence d'altitude l'avion entrera dans un comportement sinusoïdal toujours plus grand autour de l'altitude fixé. Pour anticiper une réaction relativement lente de l'avion il est possible de chercher une fonction cubique qui aspire à une plus grande stabilité de notre appareil.

Voici la fonction intégré dans le programme :

Graphique_de_la_fonction.PNG

Cette fonction est définie pour accepter une différence d'altitude maximum de 300 (l'unité est arbitraire). En effet quand les valeurs de x valent plus et moins 300 les valeurs de y donnent respectivement plus et moins 180 et c'est cette différence qui est étalonné dans une fourchette de 0 à 180 qui sera ensuite appliqué au servomoteur.

3. Résultats

3.1 Photo du montage

Système en mode stand-by : mode_stand-by.jpg

Système en mode actif : mode_actif.jpg

Système en mode détresse : mode_detresse.jpg




3.2 Explicitation des résultats

Pour l'heure ce projet reste un prototype qui n'a pas pu être testé en condition réel mais les résultats obtenus par la simulation sont concluants. En effet le système fonctionne et affiche un comportement relativement prometteur. Lorsque le module est mis sous tension il se met bien en mode stand-by tout en assimilant les deux données primordiales qui sont l'altitude et l'attitude de l'avion. Ces valeurs sont correctement moyennés et enregistrés dans deux variables distincte, ce qui est parfait car il serait très problématique d'avoir une altitude ou une attitude fausse lorsque l'on enclenche l’autopilote. Effectivement si ces valeurs sont fausse lors de la mise en marche cela induira que premièrement le système aura une autre valeur d'altitude que celle que l'on veut maintenir mais aussi qu'il opérera une violente correction dès sa mise en marche.

En ce qui concerne le bouton poussoir et l'interruption qui lui est rattaché on peut mettre en évidence que dans le cas présent il ne marche que partiellement. En effet lorsque l'on clique rapidement ou que l’on ne presse pas au milieu du bouton, l’interruption ne se fait pas correctement et induit des changements de mode aléatoires. Ce problème peut provenir d'un dysfonctionnement d'ordre mécanique. En effet tout le système est pour l'instant relié sur une plaque d'essais ce qui rend les branchements relativement délicat. De plus le bouton poussoir s'introduit relativement mal dans cette plaque d'essais ce qui induit des coupures de connexion.

Une fois le mode actif enclenché le système marche remarquablement bien avec une correction rapide et précise du servomoteur. Cette correction est appliquée jusqu'à ce que le servomoteur ne puisse plus compenser la différence d'altitude et que le mode détresse s’enclenche. Dans ce dernier mode le signal d'alerte est claire et le servomoteur est mis or tension comme prévu par le programme.

4. Discussion

En ce qui concerne l'analyse des résultats, plusieurs éléments peuvent être mis en perspective. Tout d’abord il est important de relever que l’objectif du projet a été atteint. L’arduino reçoit correctement les informations simulées tout en corrigeant intelligemment la position d’un servomoteur. Bien évidemment le résultat de ce projet reste une preuve du concept et il faudrait investir plus de temps pour voir naître un vrais prototype prêt à être testé dans des conditions réels.
La difficulté d’un tel projet réside dans l’étude du comportement d’un avion. En effet ce qui est avant tout dur c’est de prévoir le comportement de ce dernier lors des corrections du dispositif. Pour l’heure il est impossible de savoir si le dispositif élaboré est capable de stabiliser un avion en vol. Mais dans la théorie ce dispositif est prévu pour être adapté en fonction de l’appareil et devrait, après différents ajustements, être capable de remplir sa mission sans problème.
Ce projet m’a permis d’apprendre à résoudre un problème, d’abord physique, par un programme simple mais efficace. En effet ce projet m’a permis de découvrir de nouvelles possibilités que peut offrir un microcontrôleur sous arduino, en plus de m’avoir appris à utiliser intelligemment des notions mathématiques pour résoudre différents problèmes.

5. Conclusion

Pour conclure, il est intéressant de voir les différentes possibilités d’amélioration que pourrait percevoir un tel dispositif. Ce dispositif pourrait tout d’abord voir son servomoteur être remplacé par un plus puissant et qui offrirait un retour d’information pour éliminer un détecteur inutile. De plus, un altimètre pourrait être implémenté pour avoir une meilleure idée des possibilités et des restrictions qu’un tel capteur pourrait avoir.
Pour voir encore plus grand, il est possible d’imaginer de donner à cet autopilote la possibilité de garder un cap ainsi que le comportement de l’avion dans certaines situations délicates. Pour ce faire, on peut imaginer ajouter un module GPS avec par exemple un accéléromètre qui permettrait d’avoir toutes les informations nécessaires à la réalisation de cette amélioration.
Ce projet est un projet de petite envergure mais qui est néanmoins très complet et qui a été très enrichissant. Au terme de ce projet, il est à présent possible d’affirmer que le but a été atteint et que le projet à un réel intérêt surtout si il est repris pour être amélioré.




6. Ressources

Sources
Programme : Fritzing (http://fritzing.org/home/)
Image : Arduino uno: http://www.conrad.fr/medias/global/ce/1000_1999/1900/1910/1917/191789_LB_01_FB.EPS_1000.jpg
Livre : SIK GUIDE de SparkFun (site : https://www.sparkfun.com/)
Site :
https://oci.gyp.ch/blog/?post/2014/01/08/Aide-au-d%C3%A9marrage2 http://fr.wikipedia.org/wiki/Loi_d%27Ohm http://fr.wikipedia.org/wiki/Buffer_circulaire http://fr.wikipedia.org/wiki/Moyenne_glissante http://arduino.cc/ http://arduino.cc/en/Reference/HomePage http://arduino.cc/en/Reference/AttachInterrupt http://fr.wikipedia.org/wiki/Servomoteur