Beruflich Dokumente
Kultur Dokumente
N° du projet : 7220
Date : 08/06/2006
RAPPORT FINAL
Promo : 2007
CONCEPTION DE MINI-DRONES
AVIONS : QUADRICOPTERE
Sommaire
1. PRESENTATION DU PROJET
Elèves ingénieurs :
Mastère Technologie et
Management
Le projet DRONE 2006 est un projet complexe de R&D qui s’inscrit dans la continuité du
quadricoptère primé au concours « Drone, œil du fantassin » organisé par l’ONERA et la
DGA en septembre 2005. Malgré la première place obtenue le drone développé par
l’Ecole Centrale et l’Ecole de Mines n’a pas atteint l’ensemble des fonctionnalités de haut
niveau attendues lors du concours.
L’année 2006 a été une année de transition qui a consisté en un développement de
nouvelles fonctionnalités et à faire évoluer celles existantes pour améliorer le
comportement global du drone dans l’optique d’un nouveau concours ONERA en 2007 ou
en 2008.
6
Projet Quadricoptère 2005/2006
Le projet drone est issu du concours lancé en 2003par la DGA et l’ONERA pour la création
d’un drone « œil du fantassin ». Les minis drones, destinés aux fantassins du futur,
doivent être conçu comme une aide dans la progression en milieu hostile. L’aide attendue
est non agressive : le système drone doit permettre d’obtenir une vision déportée (au-
delà de son horizon naturel).
D’un point de vue organisation et gestion de groupe, l’objectif de l’année 2006 était de
continuer ce qui avait déjà été fait les années précédentes sur la répartition des taches et
le suivi pour éviter tout gâchis ou forme de redondance mais également de mettre en
place une méthode de suivi facile. En effet, dès les débuts du projets, nombreux furent
les élèves qui eurent du mal à s’approprier le projet et donc à être rapidement efficaces.
Notre objectif dans la cellule projet fût donc de mettre en place des fiches séances pour
permettre une meilleure prise en main du projet l’année prochaine.
D’un point de vue technique, l’objectif de l’année 2006 s’est inscrit dans ce cadre et a eu
pour but de rendre le drone autonome (fonctions algorithmiques avancées, suivi d’un
parcours GPS, autonomie de vol plus importantes, etc…).Malheureusement, tous les
objectifs n’ont pu être atteints bien que le drone présente aujourd’hui des fonctionnalités
nouvelles détaillées dans les parties des différents groupes de ce rapport.
L’objectif du projet était donc de faire un drone plus autonome avec des fonctionnalités
de haut niveau afin de pourvoir présenter un dossier technique complet pour l’appel à
candidature du prochain concours organisé par l’ONERA et la DGA.
Les fonctionnalités à développer ont donc été les suivantes :
Vol autonome GPS avec évitement d’obstacles (inachevé)
7
Projet Quadricoptère 2005/2006
Le projet Quadricoptère étant mené sur plusieurs années et impliquant tous les ans un
nombre important d’élève, l’organisation des ressources doit être tout particulièrement
soigné afin d’être exploitées au maximum.
Trois réunions avec tous les participants au projet ont été organisées dans l’année pour
choisir les grandes orientations, faire des comptes rendus d’avancement et être sur de
garder l’adhésion de tous. Les objectifs de chacun ont été définis lors de la première de
ces réunion.
Le détail du budget tel qu’il a été prévu initialement est exposé en annexe. Hors
dépenses de fonctionnement interne (encadrant, doctorant de l’école des mines et salle)
dont le financement est assuré, les dépenses en matériel prévu sur le projet s’élèvent à
16 400€ dont le financement est assuré à 70% par le budget non utilisé de la subvention
ONERA/DGA.
Le reste du financement a été effectué grâce à une subvention de l’école centrale suite à
une demande de 3 000€ et par des subventions externes pour 2 000€.
Le projet quadricoptère est composé d’une équipe nombreuse animée par un fort esprit
de groupe et par la volonté de réaliser le travail nécessaire pour parvenir à faire évoluer
les fonctionnalités du drone.
8
Projet Quadricoptère 2005/2006
2. PROPULSION
Le critère déterminant dans la choix du type de batteries utilisées est, pour une
application de type engin volant, la densité d’énergie. Le choix de l’utilisation de batteries
Lithium-Polymère (LiPo) a été fait il y a deux ans, et à ce jour, il s’agit encore de la
technologie offrant une densité d’énergie maximale : ce choix est toujours pertinent.
Voici à titre d’exemple quelques caractéristiques typiques des différentes technologies de
batteries :
Densité Tension
Auto Nombre Résistance
d’énergie nominale
Technologie décharge de interne
gravimétrique d’un
par mois cycles (mΩ)
(Wh/kg) élément
9
Projet Quadricoptère 2005/2006
Densité
Format Poids de la 11.1 V d’énergie Décharge
Type
(mmxmmxmm) cellule (3 cellules) (Wh/kg) maximale
Comme ces batteries contiennent du Lithium, en cas d’incendie il s’agirait d’un feu de
classe D qu’il n’est pas possible d’éteindre avec un extincteur classique.
Certaines règles de sécurité spécifiques sont à respecter :
• Ne jamais laisser la batterie dans un modèle.
• La tension de la batterie ne doit jamais descendre en dessous de 3V par élément,
soit 9V pour une batterie 3 éléments. Après une décharge, il est bon d’attendre
une heure et de recharger la batterie à 20%.
• Ne jamais dépasser le courant de décharge indiqué par le constructeur (le
formalisme est : un batterie 1500mAh de 15C est déchargée au maximum à
15*1,5=22,5A).
• Ne jamais dépasser le courant de charge (il est en général marqué sur la
batterie). Il est d’environ 1C.
• Ne jamais dépasser la tension de charge : le plus sûr est d’utiliser un chargeur du
commerce. Pour batterie de 3 éléments elle est de 12,6V.
• Ne jamais court-circuiter (évidemment).
• Ces batteries n’aiment ni les chocs ni la chaleur.
• Pas plus d’un cycle charge/décharge par jour.
• …
En cas de problème, ou de doute, le plus simple est d’appeler le service de sécurité
(poste 13 49) pour qu’ils évacuent la batterie endommagée. Le gonflement d’une batterie
est le symptôme caractéristique du fait qu’elle est endommagée : si vous observez un
gonflement, isolez la batterie tout en minimisant les manipulations (la placer
délicatement dans un lavabo, au milieu d’une zone dégagée…).
L’autonomie est calculée comme étant le rapport entre l’énergie utile embarquée sur la
puissance nécessaire pour manœuvrer l’engin. Le calcul de l’autonomie suppose donc la
connaissance de plusieurs éléments :
• La masse à vide de l’engin
• La masse d’un élément de batterie
• L’énergie utile par élément de batterie (on ne peut descendre en dessous de 3V
par élément, donc cette énergie est directement liée à la capacité de l’élément)
• Le nombre d’éléments utilisés
• La puissance nécessaire aux moteurs pour fournir une poussée donnée.
Pour avoir la relation puissance/poussée, nous avons utiliser la régression polynomiale
obtenue à partir des mesures effectuées en 2005 pour le couple {moteur,hélice} que
10
Projet Quadricoptère 2005/2006
nous utilisons (moteur MFLY 34L et hélices Todd’s 10x4,5"). Le résultat est :
y = 2,5358998E-04x² + 2,8024681E-02x + 3,2462112 avec un R² = 0,99967856, où y
est la puissance à fournir en Watts et x la poussée développée en grammes.
La masse à vide du quadricoptère est 620g, une batterie de 3 éléments pèse 160g. La
tension de batterie en charge est d’environ 12,3V, l’énergie utile embarquée vaut donc,
pour nos batteries 3 éléments de 2000 mAh, (12,3-3*3)*2000*3600/1000=23760J par
batterie. Pour calculer la puissance, on ne peut se contenter de considérer qu’il faille
juste équilibrer le poids du quadricoptère. On peut alors soit supposer que chaque
moteur doit développer une poussée égale à la moitié de la masse du quadricoptère (et
pas uniquement un quart comme pour du vol stationnaire sans vent), soit que les
moteurs travaillent en moyenne à 66% de leur maximum et développent donc 66% de
leur poussée maximale. Dans tous les cas, on appliquera un facteur de
surdimensionnement de 1,5 correspondant au décalage entre théorie et pratique. Ainsi
N batteries * Eutile / batterie
Autonomie =
1,5* Ptotale P = 4* Pmoteur ( mquadri / 2)
on a : avec totale dans le premier
P = 4* 66% * Pmoteur _ max
cas et totale dans le deuxième cas.
On obtient les résultats suivants :
11
Projet Quadricoptère 2005/2006
2.2. Disjoncteur
Nous avions également pensé utiliser des composants chimiques réalisant la fonction de
disjoncteur réarmable, les polyswitch. Ces composants présentent deux inconvénients
majeurs : le courant limite est non réglable et le temps de commutation est beaucoup
trop important. Nous avons donc abandonné cette solution.
12
Projet Quadricoptère 2005/2006
L’image du courant est donnée par la tension entre la source et le drain du transistor de
puissance NMOS, la résistance interne de celui-ci étant de l’ordre de 25 mOhms. Celle-ci
est amplifiée d’un rapport (1+R2/R1) par l’AO noté « AMPLIFICATEUR ». L’utilisation de
deux potentiomètres R1 et R2 permet de régler le rapport d’amplification suivant les
besoins.
L’image amplifiée du courant est ensuite comparée à une fraction de VCC (la référence)
par l’AO noté « COMPARATEUR ». Le réglage de la référence se fait à l’aide du
potentiomètre R3, dont la valeur élevée limite le courant qui le traverse (du point de vue
de la charge, c’est un courant de fuite).
La sortie du comparateur pilote le transistor (sortie du comparateur connectée au gate
du transistor). Tant que l’image du courant est inférieure à la référence, la sortie du
comparateur est en saturation basse c'est-à-dire proche de 0V, le transistor est passant.
Quand le courant augmente, le comparateur passe en saturation haute, la sortie passe à
environ VCC, ce qui ouvre le transistor NMOS (transistor commandé en tension positive)
et donc le circuit. Le transistor étant ouvert, la tension à ses bornes vaut environ VCC,
l’amplificateur est en saturation haute, donc le comparateur aussi, le circuit reste ouvert,
l’état ouvert est bien stable.
Lorsque le circuit est ouvert, pour armer le disjoncteur il suffit de presser le bouton
poussoir « REARMEMENT » : à cet instant, on amplifie la tension aux bornes d’un
interrupteur fermé, soit 0V, le comparateur est donc en saturation basse, le transistor
devient passant. Lorsque l’on relâche le bouton poussoir, on a rétabli le fonctionnement
normal.
13
Projet Quadricoptère 2005/2006
14
Projet Quadricoptère 2005/2006
2.2.4. Résultats
Voici deux régressions réalisées à partir de séries de mesures. Si on suppose qu’on peut
extrapoler la courbe jusqu’à des valeurs mesurée de 25A, on peut alors savoir comment
régler le disjoncteur.
Disjoncteur v1
48
46 y = 1,5203x + 1,7092
44 R2 = 0,9868
42
40
38
36
34
Valeur théorique
32
30
28
26 courbe disjoncteur
24
22 Régression linéaire
20
18
16
14
12
10
8
6
4
2
0
0 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30
Valeur mesurée
15
Projet Quadricoptère 2005/2006
Disjoncteur v2
28
26 y = 3,0625x 0,6221
24 R2 = 0,9947
22
20
Valeur théorique
18
16
Courbe disjoncteur
14 Régression puissance
12
10
8
6
4
2
0
0 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32
Valeur mesurée
Au cas où on ne trouve pas la cause des appels de courant et qu’il faille encore améliorer
les performances du disjoncteur, voici quelques pistes : pour s’affranchir des variations
de la résistance interne du transistor, utiliser un capteur de courant (dispositif délivrant
une tension proportionnelle au courant dans une plage de fonctionnement donnée) pour
construire l’image du courant ; pour améliorer la commutation du transistor, insérer une
petite résistance (typiquement 22 Ohms) entre la sortie du comparateur et le gate du
transistor. Voici deux références de capteurs de courant qui semblent convenir : capteur
Allegro ACS750xCA-050 et capteur LEM LAH 50-P. Vous pouvez aussi utiliser des
résistances de précision ou shunts pour faire la mesure du courant : attention à la
puissance que doit supporter le boîtier de la résistance. Pour un courant de 40A, il faut
un boîtier pouvant dissiper 1600*R watts. En prenant R = 0,01 Ω, il faut un boîtier 16W ;
cela correspond à des résistances dites film (à choisir parmi les modèles disponibles chez
Radiospares). Vous pourrez aussi travailler sur la miniaturisation du disjoncteur, en
dessinant un circuit imprimé par exemple, sachant que la partie puissance ne pourra pas
être réalisée sous forme de pistes car le matériel du LEE ne permet de faire des circuits
supportant des courants de 40A (il faudrait des pistes de 2cm de large…).
L’utilisation de la résistance interne du mosfet ou d’un shunt pour avoir la mesure du
courant présente cependant un inconvénient majeur : la puissance dissipée par effet
Joule est très importante (jusqu’à 25W avec le mosfet) du fait des courants mis en jeu.
Les capteurs de courant ne fonctionnant pas sur le même principe, la puissance perdue
devient négligeable.
16
Projet Quadricoptère 2005/2006
2.2.6.1. Disjoncteur v1
2.2.6.2. Disjoncteur v2
17
Projet Quadricoptère 2005/2006
Le quadricoptère est équipé de quatre moteurs brushless dits BLDC (Brushless Direct
Courant). Ce sont des moteurs de type synchrone sans balais ni collecteurs.
Pour nos moteurs la cage constitue le rotor (à aimants permanents) et le stator est formé
des bobinages (7 pôles). Le couple électromagnétique est dû à l'interaction de deux
champs magnétiques, le champ tournant créé par les courants qui circulent dans les
enroulements du stator et le champ tournant produit par les aimants du rotor. Le champ
magnétique des aimants « suit » le champ tournant créé par les courants statoriques, la
cage tourne à la fréquence du champ statorique d’où le nom de machine synchrone. Pour
une étude théorique complète, se reporter au rapport projet 2005 ou au cours de classes
préparatoires PSI.
Sur le quadricoptère, la seule source d’énergie disponible est la batterie qui délivre par
conséquent du courant continu, et se comporte en première approximation comme une
source de tension. Pour créer un champ magnétique tournant, il faut au moins trois
courants identiques et déphasés de 120° électriques. Il faut donc générer à partir d’une
tension fixe trois courants identiques et déphasés. C’est le rôle des variateurs de
puissance. Il faut un variateur par moteur (soit quatre variateurs complets pour le
quadricoptère) qui alimente les trois phases du moteur avec les courants déphasés de
120° électriques.
Un variateur de puissance est constitué de deux parties : une partie commande qui
génère les signaux commande pour l’étage de puissance, et l’étage de puissance qui
permet de générer les courants des trois phases moteur.
Vu les puissances mises en œuvre pour alimenter un moteur (jusqu’à 10A sous 12V), il
est indispensable d’avoir un rendement très élevé (de l’ordre de 90%), ce qui rend
impossible l’utilisation de filtres analogiques. L’étage est donc formé de trois ponts de
deux transistors, un pont par phase moteur. Dans notre cas, il s’agit de transistors
mosfet, utilisés comme des interrupteurs commandés en tension. Voici un exemple de
séquence de commutation sur chaque phase (à gauche) et le schéma du pont de
transistors (NMOS ici) :
18
Projet Quadricoptère 2005/2006
La vitesse de rotation du moteur est égale à la fréquence des courants des phases. Le
couple est déterminé pour sa part par la valeur efficace du courant. Il faut donc que le
variateur permette, d’une part de contrôler la fréquence des commutations des ponts, et
d’autre part de modifier la valeur efficace du signal.
Pour modifier cette valeur efficace, on se base sur le principe du hacheur. Cela revient à
multiplier un signal d’amplitude fixée par la batterie par un créneau de fréquence très
élevée par rapport à celle du signal et de rapport cyclique variable. Ce créneau est appelé
signal PWM (Pulse Width Modulation). Voici un exemple de signal PWM, où on nomme
rapport cyclique la fraction t/T :
En réalité la vitesse de rotation du moteur n’est pas égale à la fréquence du courant dans
les phases, mais elle est proportionnelle à celle-ci. Ce coefficient de proportionnalité
dépend de la structure du moteur. L’intérieur de nos moteurs MFly 290-05-34L est
constitué par :
• Un stator qui crée le champ magnétique tournant, il possède six enroulements
clairement visibles (6 pôles).
• Un rotor externe avec 14 aimants.
Le fonctionnement est le suivant. D’un certain point de vue, le champ tournant passe
d’un enroulement à l’autre. Ces enroulements sont disposés tous les 2π/6=7π/21 et les
aimants tous les 2π/14=3π/21. Initialement supposons le champ dans la direction d’un
enroulement à l’angle 0, et un aimant en face, donc à l’angle 0 lui aussi (les moments
magnétiques cherchent à maximiser le champ extérieur qui passent par eux). L’instant
d’après le champ, schématiquement, se trouve dans l’axe de l’autre enroulement en
π/3=7π/21 ; il voit à son voisinage deux aimants : 6π/21 en amont et 9π/21 en aval.
Celui en 6π/21 va donc se déplacer de π/21 pour s’aligner avec le bobinage créateur du
champ (qui se trouve en 7π/21), ce qui fait tourner le moteur.
Soit f la fréquence du triphasé entrant : le champ prend un temps 1/f pour faire 2π, donc
1/6f pour faire π/3. Sur ce temps, le moteur tourne de π/21, donc pour 2π, il faut
2*21*1/6f=7/f secondes, donc la fréquence de rotation du moteur est de f/7
tours/seconde.
19
Projet Quadricoptère 2005/2006
Sur nos variateurs, seuls les mosfets « du haut » (connectés à +VCC) des ponts ont une
commande modulée par le PWM :
Par exemple durant la séquence AB, le transistor A « haut » (A+) oscille entre les états
passant et bloqué à la fréquence du PWM, pendant que B- reste passant et A- et B+
sont bloqués.
Voici le schéma équivalent pour la séquence AB lorsque A+ est passant (PWM On) :
On constate que le courant circule au travers de la diode dite de roue libre du mosfet A-.
20
Projet Quadricoptère 2005/2006
Il existe un moyen autre que les capteurs pour détecter le passage à 30° du rotor : la
mesure de la force contre-électromotrice (Back EMF). Cette mesure se fait normalement
en mesurant la tension entre le point central N du moteur et la phase non utilisée de la
séquence en cours (phase « en l’air »). Si on n’a pas accès physiquement à ce point (ce
qui est le cas général, et le nôtre) on doit simuler ce point en créant un point au même
potentiel à l’aide de trois résistances en étoile (voir ci-dessous).
Cette solution avec un point neutre virtuel est celle actuellement utilisée sur le
quadricoptère avec les variateurs Toshiba.
Comme spécifié dans la thèse de Jianwen Shao « Direct Back EMF Detection Method for
Sensorless Brushless DC (BLDC) Motor Drives », on peut se passer de la mesure du
potentiel du point central. Cette méthode est détaillée clairement dans la thèse
(disponible dans les documents du projet 2006) qu’il est indispensable de lire.
21
Projet Quadricoptère 2005/2006
Les variateurs actuels sont constitués, pour la partie commande, de contrôleurs Toshiba
TB9060 et d’amplificateurs opérationnels rapides, et pour l’étage de puissance, de trois
NMOS pour les demi-ponts inférieurs et de trois PMOS pour les demi-ponts supérieurs.
Pour plus de détails, se référer au rapport projet 2005.
L´avantage du variateur Toshiba est qu´il est conçu spécialement pour la commande des
moteurs BLDC sensorless. Il suffit de lui envoyer le signal PWM (envoyé dans notre cas
par l´ATMEGA128) qui traduit le régime voulu et il se charge de mesurer la back EMF et
de la commutation (voir schéma électrique du variateur Toshiba en annexe).
Il faut donc faire les tests nécessaires pour voir si l´origine du problème est le moteur ou
le variateur.
Si le problème est dans le moteur (1er point), deux solutions se proposent à nous :
• Remplacer les moteurs brushless sensorless que nous avons par des moteurs
brushless avec les capteurs évoqués (problème de poids).
• Revenir aux moteurs DC à courant continu et chercher des modèles qui puissent
produire la puissance nécessaire (ceci n´était pas le cas l´année dernière mais il
faut voir si des évolutions sont apparues entre temps).
Dans tous les cas il faut revoir le schéma du circuit du variateur pour l´adapter au
nouveau moteur.
22
Projet Quadricoptère 2005/2006
Si par contre le problème est au niveau de l´algorithme (ce qui est souhaitable car ne
nécessitant pas de changements de composants et donc de carte !), il pourra être résolu
en revoyant les boucles d´algorithmes et modifier les valeurs limites envoyées aux
moteurs !
Une autre solution serait de commander les moteurs en fonction des courants qui leurs
sont nécessaires, c’est à dire de prendre leurs intensités en compte dans les boucles
d´automatique comme contrainte limitante. Pour ceci il faut pouvoir mesurer leurs
variations en temps réel et de manière très rapide pour que les boucles puissent réagir
avant que les valeurs limites soient atteintes ou dépassées. Ceci impose aussi que le
temps de traitement nécessaire dans les boucles soit beaucoup plus rapide que les
variations de courant elles mêmes.
Pour trancher, la construction d´un petit banc d´essai : carte portant juste le circuit du
variateur, avec seuls l´alimentation et le signal PWM comme entrés, s´avère
indispensable. Elle nous permettra en variant nous même le signal PWM de façon
brusque mais calculée de voir la réaction du moteur et aussi de mesurer en fonction des
sollicitations le courant consommé et sa variation. L´idée derrière ça est de simuler le
fonctionnement de Quadri en voyant pour quelles valeurs de PWM, parmi celles qui sont
dans l´intervalle utilisé par notre programme, les surintensités apparaissent. Si elles
apparaissent pour des variations brusques du PWM, une solution serait de lisser ces
variations en augmentant l´intervalle de temps entre valeur initiale et finale. Si par
contre elles apparaissent même en régime stationnaire ou pour des variations très lentes
du PWM, le problème vient sûrement du Toshiba qui se trompe peut être dans le calcul
de la position. On devra donc soit revenir aux solutions proposées plus haut ou envisager
un autre composant qui serait plus fiable lors des mesures de la Back EMF.
Sur le schéma complet de la carte de l´année dernière nous avons donc pris la partie
correspondante à un seul circuit de puissance pour un moteur et nous l´avons redessiné
sur EAGLE. On ne peut pas malheureusement juste le copier directement car la version
démonstrative de EAGLE dont on dispose génère plusieurs problèmes lorsqu´on veut
travailler sur le schéma (shematic) copié : refuse de faire des liaisons et de connecter les
nouveaux composants correctement sur les liaisons existantes etc…
23
Projet Quadricoptère 2005/2006
2.3.3.3. Réalisation :
Par un souci de compacité, les composants retenus pour les cartes sont tous de type
CMS, c´est á dire de très petites tailles (les résistances font 2 á 3 millimètres de
longueur). En plus, le Toshiba est d´une taille tellement réduite que ses pattes, très
proches les unes des autres sont presque impossibles á souder avec les fers á souder
classiques dont on dispose au Labo LEE, surtout que la plus petite tête disponible est
déjà plus grosse que quelques composants (condensateurs..)
Pour y arriver, on doit donc utiliser toute une autre technique que l´antique fer à souder.
Dans le Laboratoire LEE, on dispose d´un appareil qui est une sorte de plate forme sur
laquelle l´opération se fera dans l´ordre suivant :
La carte dénuée de tout composants est posée sur deux petits appuis.
Avec une sorte de seringue, on pose des gouttes de brasure (produit chimique peu
visqueux contenant des graines d´étain). On dispose d´une sorte de pédale en dessous
de la table qui en appuyant dessus permet d´envoyer des pulsations d´air compressé
dans la seringue pour faire sortie le gel.
Une fois qu´on a mis des gouttes de ce gel sur toutes les traces de pattes des
composants sur la carte, ces derniers sont pris un à un par une sorte d´aspirateur à vide
monté sur un bras articulé et placés sur ce gel à leurs endroits. Cette opération est très
facile car il suffit d´appuyer sur le composant pour l´aspirer et de même pour le relâcher
une fois qu´il est á sa place.
Ceci fait, la carte doit être prise avec beaucoup d´attention et placée sur des supports
dans un petit four programmable (voir son guide d´utilisation disponible dans la même
salle). La chaleur du four fait solidifie ce gel ce qui soude les pattes des composants à la
carte. Le résultat est impressionnant car même si on a l´impression qu´on en a mis un
24
Projet Quadricoptère 2005/2006
peu trop et qu´ainsi deux pattes voisines vont se touchaient, le gel a l´avantage de se
contracter lorsqu´il se solidifie et le risque d´un tel problème est très minime.
Un contrôle avec le microscope est toujours recommandable pour vérifier quand même
que toutes les pattes sont bel et bien soudées á leurs traces sur la carte.
2.3.3.4. Résultats :
Pour tester la carte après l´avoir réalisée, le banc d´essai suivant a été réalisé :
• En rouge : L´alimentation de 12V. Cella la est limitée en courant sur des paliers
de 0,1 à 2,5 A. Elle est donc très appropriée pour chercher la source du court-
circuit sans risquer d´abîmer les composants.
• En noir : La mesure est faite sur la grille du transistor Q4 (voir schéma
électrique).
• En vert : Le générateur du signal PWM, fixé á 16 KHz.
• En jaune : Sur l´oscilloscope, on voit le signal carré envoyé par le Toshiba et
amplifié par l´AmpliOp comparateur.
Il faut faire attention à tester les composants électriques séparément, surtout qu´il
s´agit ici d´une carte de puissance, où des tensions différentes sont à appliquer aux
différents composants et des courants assez élevés circulent dans le pont de transistors.
Un mauvais branchement peut facilement provoquer la mise hors fonctionnement d´un
des éléments.
Il Faut donc ouvrir le circuit reliant l´alimentation principale au pont (il suffit de gratter
la piste reliant les sources des P MOSFETS à l´alimentation), et vérifier que le Toshiba,
les comparateurs génèrent bien les bons signaux en appliquant le PWM (comparer à la
doc du Toshiba). Nous pouvons après remettre la liaison et tester avec le moteur.
25
Projet Quadricoptère 2005/2006
Malheureusement, lors du test d´ensemble, une tension de 1,3V est imposée par le
circuit de puissance aux bornes de l´alimentation et un courant allant jusqu´à 8A est
consommé par la carte.
2.3.3.5. Diagnostic
L´origine de ce problème est clairement un court-circuit causé par l´un des points
suivants :
• Les deux pistes +12V et GND se touchent á cause d´une mauvaise réalisation.
• Deux transistors d´une même branche ferment simultanément. Ceci peut avoir
deux origines possibles :
o Les transistors ont fondu de l´intérieur lors de la réalisation de la carte à
cause d´une longue exposition à la très haute chaleur dans le four.
o Les signaux de commutation envoyé par le Toshiba aux deux transistors
NMOS et PMOS d´une même branche (une même phase) ne présentent
pas le déphasage nécessaire ce qui implique que pour l´intervalle du
temps dans lequel ils se superposent, les deux transistors sont passants au
même temps et donc un court circuit est crée.
A l´aide de la fonction détection de contact avec signal sonore qu´on trouve sur chaque
multimètre, nous avons fait le tour de toutes les pistes sur la carte. Aucune liaison
directe n´existait entre les pistes d´alimentation. Le premier point est donc à oublier.
Les deux entrées de l´oscilloscope sont utilisées pour pouvoir regarder deux signaux sur
deux grilles de transistors P MOS de demi ponts différents et vérifier que le Toshiba
envoie bien les signaux de commutations avec le bon déphasage (Voir Datasheet du
Toshiba).
Les signaux affichés sont un peu parasités et non parfaitement stables, une mesure
précise du déphasage directement sur l´écran est difficile à réaliser mais on peut bien
voir qu´il existe. Cette hypothèse est aussi à laisser.
Pour voir si les transistors ont craqués, nous avons mesuré à vide la résistance entre
SOURCE et DRAIN (toujours avec le multimètre) sur chaque transistor. Cette résistance
doit théoriquement être infiniment grande.
Les mesures ont donné des valeurs suivantes :
Transistor Q1 Q2 Q3 Q4 Q5 Q6
Les valeurs entre 600KΩ et 1MΩ peuvent être pratiquement considérées comme très
grandes ou de l´ordre de l´infini. On remarque cependant que les valeurs de Q4 et Q6
sont de l´ordre de l´Ω !! Ces deux transistors ont donc lâchés.
En fait, lors des tous premiers tests, nous avons eu des problèmes de disfonctionnement
étranges de la carte. Après un certain temps nous nous sommes rendu compte que la
place ces deux transistors étaient inversés. Nous avons utilisés la pince chauffée à très
haute température pour les enlever et nous avons utilisés ensuite le gel de soudure que
nous avons chauffé avec le souffleur d´air chaud pour les fixer après les avoir mis dans
26
Projet Quadricoptère 2005/2006
les bons emplacements. Ce traitement à haute température qui en plus a duré assez
longtemps a du les détruire. Ceci explique le fait que les autres transistors sont restés
intacts…
Nous avons refait la même procédure mais cette fois pour les changer. En réessayant la
carte, le problème a disparu.
Les nouveaux variateurs se basent sur ceux utilisés dans le kit de développement
ATAVRMC100.
La partie commande des nouveaux variateurs est désormais constituée d’un
microcontrôleur par moteur qui communique d’une part avec trois drivers (un par phase)
et d’autre part avec le contrôleur central. Les drivers sont des composants chargés de
transformer les signaux de commande sortant du microcontrôleur en signaux capables de
faire commuter des transistors. Le contrôleur permet de générer un signal de commande
par mosfet, en fonction de la mesure de Back EMF qu’il reçoit et des consignes du
contrôleur central. Le microcontrôleur retenu est un AT90PMW3 qui offre, entre autres, la
possibilité de générer des signaux PWM sur au moins trois voies. De plus c’est un
composant Atmel, comme l’ATMEGA128, ce qui facilite le développement. Pour les
drivers, nous utilisons des IR2101S, conformément au schéma de l’ATAVRMC100.
L’étage de puissance est formé de 6 NMOS par boîtiers de 2. Le fait d’utiliser des mosfets
Dual N a pour objectif un gain de place.
27
Projet Quadricoptère 2005/2006
Les drivers requièrent une alimentation stabilisée : c’est le rôle de la diode D7 (en haut à
gauche) montée à l’envers. Ceci est indispensable lorsque l’alimentation Vbus est la
batterie mais inutile lors des tests où nous utilisons un générateur de tension.
Plusieurs points du circuit doivent être alimentés en 5V, à cette fin nous utilisons un
régulateur de tension 7805 non représenté ici.
La mesure du courant total se fait à l’aide d’une résistance de précision dite résistance
shunt (R18) suivie d’un filtre RC.
La partie en haut à droite correspond à un filtrage des signaux des capteurs avant de les
envoyer vers le microcontrôleur ; puisque nos moteurs n’ont pas de capteurs, cette
partie devrait disparaître. Cependant il se peut qu’il faille « adapter » (adaptation à
définir) les signaux de Back EMF avant de les envoyer vers le microcontrôleur.
Le kit ATAVRMC100 est un kit de développement qui comprend un moteur BLDC avec
capteurs à effet Hall et un variateur complet (microcontrôleur AT90PWM3, drivers et
étage de puissance avec les environnements respectifs). Il est livré avec un programme
flashé dans le contrôleur. Le contrôleur est évidemment reprogrammable, il faut pour
cela le connecter au STK500 avec le bus ISP (voir le Hardware User Guide
ATAVRMC100).
Le kit STK520 est un adaptateur qui permet de monter un contrôleur AT90PWM3 sur le
STK500. Voir les documentations respectives des STK.
Pour l’instant on utilise le compilateur C WinAVR. Lors de la compilation, on a besoin d’un
fichier makefile spécifique différent de celui utilisé par tous les autres groupes du projet :
nous sommes les seuls à utiliser un AT90PWM3, les autres travaillant avec un
ATMEGA128. Il faut en particulier prêter attention aux lignes concernant le type de
contrôleur (MCU name) et la fréquence d’horloge (Processor frequency).
Dans les exemples de code fournis par Atmel, les librairies sont celles utilisées par un
autre compilateur C, IAR. Ces librairies ne sont malheureusement pas toutes compatibles
avec WinAVR. IAR est disponible en version d’essai d’un mois.
Pour pouvoir communiquer avec le processeur monté sur le STK et le programmer, on
utilise AVR Studio (voir manuel utilisateur et le rapport des groupes Capteurs et
Transmission).
Pour l’instant, nous n’avons pas réussi à faire correctement fonctionner le kit
ATAVRMC100. Le programme d’usine du kit permet en théorie de contrôler la vitesse de
rotation du moteur à partir d’un PC. Pour cela, on doit dialoguer avec le microcontrôleur
à l’aide du logiciel terminal.exe ; il faut connecter les ports ISP de l’ATAVRMC100 et du
STK500 (bus ISP) ainsi que les ports Rx et Tx des deux kits. Ensuite il faut connecter le
PC au STK500 sur le port RS232 CTRL. Lorsqu’on a fait cela, le moteur tournait à vitesse
constante, indépendamment des commandes envoyées depuis le PC. Il semblerait que
dans le code flashé sur le kit, la partie correspondant aux instructions de commande soit
entourée de balises de commentaires. Nous n’avons pas pu flasher la version sans ces
balises car WinAVR n’a pas toutes les librairies.
Une des tâches pour l’an prochain est d’écrire un programme pour commander les
moteurs et de réaliser un étage de puissance. Il faut pouvoir valider séparément le
software et le hardware du variateur.
Il s’agit d’une part de valider l’ensemble drivers+ponts de transistors (voir paragraphe
suivant).
D’autre part, il faut valider un code, dans un premier temps en utilisant les capteurs à
effet Hall, puis avec la mesure de la Back EMF. Pour le code avec les capteurs, il suffit de
flasher le programme sur l’AT90PWM3 de l’ATAVRMC100 et d’utiliser ce kit. Pour le code
sans capteur, il faut utiliser hardware précédemment validé, connecté au STK520.
Enfin il faudra interfacer les 4 AT90PWM3 avec l’ATMEGA128.
28
Projet Quadricoptère 2005/2006
2.3.5. AT90PWM3
Le problème avec les anciens variateurs c´est qu´ils ne prenaient pas en compte les
courants consommés par les moteurs. Ce point s´est avéré très gênant puisqu´on avait
toujours affaire à des augmentation de ces courants pendant le vol qui enclenchaient le
disjoncteur et donc faisaient tomber le Quadricoptère. M. Philippe Martin nous a proposé
de travailler sur un nouvel variateur, l´AT90PWM3. A la différence du Toshiba ce
composant est en fait un petit microprocesseur non préprogrammé et qui possède des
fonctions très développées pour générer des signaux PWM spécifique aux applications de
commande des moteurs BLDC. Il possède aussi une entrée dédiée à la mesure de
courant utilisant les shunts (pour plus de détails voir le descriptif des variateurs plus
haut).
Le plus grand inconvénient est qu´il faut savoir mesurer la Back EMF et en déduire la
position du rotor (cette fonction est implantée dans le Toshiba) et d´inclure ça dans le
code pour générer la séquence de commutation adéquate.
L´At90PWM3 dispose de trois sources PWM PSC (Power Stage Control) PSC0, PSC1,
PSC 2
Qui présentent les caractéristiques suivantes :
• Chaque source est en fait composée de 2 sorties différentes, c’est.à.dire 2 pattes
différentes de microcontrôleur (PSC0 et PSC1, le PSC2 possède 4 sorties) mais
complémentaires de PWM. Elles sont bien sur programmables. Cette
implémentation nous donne le choix entre utiliser une seule sortie pour
commander un seul transistor, utiliser les deux sorties pour commander un demi
pont ou utiliser le PSC2 et es 4 sorties pour commander avec un seul PSC un pont
complet.
• Dead Time contrôlable (voir explication plus bas).
• Fréquence allant jusqu´à 64Mhz.
• Prise en compte des événements externes par les PSC inputs (notamment
sensibilité aux intensités de courant).
• Fonction de protection contre l´Overload.
• Fonction de protection contre les anormalités (entré d´urgence pour mettre tous
les outputs en impédance haute ou en mode inactif).
En plus les PSC peuvent être configurés et synchronisés pour commander 3 demi pont,
ce qui correspond exactement á notre application à savoir la commande de moteurs
BLDC.
29
Projet Quadricoptère 2005/2006
Les deux sorties de PSC seront nommées PSCn0 et PSCn1, avec n = 0,1.
A Chaque PSCni (i = 0,1) correspond un générateur PWM proprement dit. Appelant B le
générateur correspondant à PSCn1 par exemple. Ce générateur est relié á deux registres
OCRnRB (R comme Reset) et OCRnSB (S comme Set). Dans ces registres, on va
enregistrer des valeurs à 12 bits.
Registre OCRnB
.Un comparateur va comparer les valeurs de ces registres avec celles livrées par un
compteur (dont la fréquence est programmable). Lorsqu´il y a égalité un signal est
envoyé au générateur B : la pulsation envoyée pour l´égalité avec le registre OCRnSB
correspond au début du signal et celle avec le registre OCRnRB correspond à sa fin. Le
signal peut aussi être interrompu ou prolongé suivant les instructions envoyées par le
module du PSCn Input. La forme du signal (High Level ou Low Level peut être définie par
mettre 1 ou 0 le bit « PELEVnx » du registre de control « PFRCnB ».
Chaque PSCn possède en outre 5 registres supplémentaires à 8bits appelés registres de
contrôles : PCNFn, PFRCnB, PFRCnA, PSOCn, PCTLn (le PSC2 possède un registre
supplémentaire appelée POM2).
Ces registres permettent d´accéder aux plusieurs fonctionnalités qui sont implémentées
dans l´AT90PWM. Par exemple :
30
Projet Quadricoptère 2005/2006
Les possibilités offertes sont vraiment très diverses et permettent un contrôle très poussé
et des interventions à tout moment sur le signal PWM de sortie.
Modes de fonctionnement :
L´existence des 4 registres de comparaison (les OCRnXX) par PSC permettent 4 modes
de fonctionnement possibles (voir figure ci-dessous) :
• one ramp mode
• two ramp mode
• 4 ramp mode.
Le mode qui est recommandé pour la commande de moteur BLDC est par contre le 4ème
mode : le mode centré
Dans ce dernier cas, on a :
31
Projet Quadricoptère 2005/2006
La fréquence du signal PWM : Fclkpsc peut etre finement ajustée en utilisant le mode
avancée (Enhanced Mode), la fréquence mesurée est la fréquence moyenne calculée sur
16 cycles, lors de ces cycles deux fréquences voisines Fpll/n (la fréquence la plus proche
en dessous de la valeur souhaitée) et Fpll/n+1 (la valeur la plus proche en dessus) sont
permutées en fonction d´un paramètre d suivant la formule suivante :
Fpll est le signal d´horloge reçu d´une horloge interne PLL de 64 Mhz. On peut choisir
entre des fréquences de 64 ou 32 Mhz en configurant le pin PLLF (bit2) du registre
PLLCSR .
On peut aussi choisir l´entrée horloge I/O.
Le choix entre PLL ou I/O Horloge se fait en configurant le pin PCLKSELn du registre
PCNFn. On peut ensuite choisir entre 4 diviseurs de fréquence possibles en configurant
les bits PPREn1/0 du registre PCTLn (voir datasheet pages 159/160).
2.3.5.2. Programmation
L´un des avantages théoriques de l´AT90PWM3 est qu´il est un produit Atmel, tout
comme l´ATMEGA 128. La programmation de ce microcontrôleur devait etre donc assez
proche de l´autre. Le problème, lors de déroulement de la liste des composants Atmel
supportés par le compilateur WIN AVR, notre AT90PWM était bien présent, mais puisque
pour compiler il fallait utiliser un fichier MakeFile, dans lequel il n´y a pas la possibilités
de choisir le microcontrôleur. Alors nous n´ étions pas sur que même si on se contentait
de changer le nom du MCU dans le fichier MakeFile, qu´on pouvait compiler
correctement.
Il faut avouer que comme nous n´avons aucune idée sur la procédure de compilation, il
nous était impossible de trancher sur la validité du choix de WINAVR comme compilateur,
même en arrivant à compiler et faire marcher des programmes simples, car nous ne
savions pas exactement les différences d´architectures et donc de registres entre les
deux composants et si ceci pouvait affecter la compilation, puisque à priori le MakeFile
dont nous disposons est spécifique à l´ATMEGA128. Les programmes de tests que nous
avons et que nous étions capables de comprendre à ce stade sont pour allumer et
éteindre des diodes. Ils n´utilisent donc que les ports de l´At90pwm et pas ses registres
intrinsèques.
En plus de ça, les seuls exemples de codes qu´on peut retrouver sur le site Atmel, sont
des bouts de codes écrits pour le compilateur IAR, pour des raisons historiques de
coopérations et de proximité géographique entre les deux entreprises .
Nous avons envoyés des requêtes à Atmel et AVR pour leurs demander si leurs
composants est supporté par WINAVR en utilisant un MakeFile classique, ils se
contentaient de répondre qu´ils ne le savaient pas mais qu´il fonctionne très bien avec
le compilateur IAR. Nous n´avons pas par contre remarqué que WINAVR ET AVR étaient
deux entreprises complètement indépendantes. Nous avons estimé donc les réponses
reçues suffisantes pour se lancer dans le travail sur le compilateur IAR. Après que Mr.
Philippe Martin a attiré notre attention sur ce point, une autre requête envoyée à
AVRfreak (www.avrfreaks.net) a fini par nous informer sans pourtant confirmer
certainement, que les dernières versions de WINAVR, c’est à dire à partir du numéro
20060125.
32
Projet Quadricoptère 2005/2006
Mais le vrai plus dans cette réponse est qu´en incluant la librairie <avr/io.h>, qui
supporte l´at90pwm3 ce qui est le cas pour celle livrée avec la dernière version de
WINAVR, le compilateur va inclure le IO Header file correct pour notre composant en
lisant juste son nom á partir du MakeFile. Nous sommes surs maintenant que nous
pouvons utiliser le WINAVR pour la suite de notre travail.
Le travail investi sur les codes pour IAR n´était pas par contre en vain. Comme ils sont
développés spécialement pour l´AT90PWM3, ils nous permettaient de mieux comprendre
le fonctionnement de notre composant.
Mais le plus grand avantage de l´IAR, et sans lequel nous n´aurions pas pu écrire notre
code C pour le WINAVR, réside dans ces bibilotheques dont la plupart contiennent de très
nombreuses définitions, très bien commentées d´ailleurs, de fonctions qui réalisent les
différentes configurations nécessaires pour générer les signaux PWM pour chaque PSC (la
bibliothèque <psc-drv.h >) ou pour configurer la source PLL (< PLL-drv.h >)
Choisir l´horloge:
PLL ou I/O
L´affecter au PSC
choisi
Choisir la sortie
PSCn0/1
Choisir le type du
signal PWM
Choisir le mode
(1/2/4 rampes, ou
Enclencher le cycle
PWM
La traduction de cet algorithme en code se trouve en annexe. Ce code a été flashé sur le
microcontrôleur monté sur le KIT ST500+STK520. Le résultat était un signal PWM de la
fréquence 7.77 KHZ sur les sorties PC0 (PSCOUT10) et PB7 (PSCOUT11).
33
Projet Quadricoptère 2005/2006
Ce résultat n´est bien évidemment qu´une première étape dans le travail demandée. La
suite serait de mesurer la back EMF suivant la théorie proposée dans la thèse fournie par
Mr. Philippe Martin :
“Direct Back EMF Detection Method for Sensorless Brushless DC (BLDC) Motor Drives “
Réalisée par Jianwen Shao et présentée á la “Virginia Polytechnic Institute and the State
University “.
• En Bleu : L´AVR Studio4 est utilisé pour flasher le fichier « main.hex » crée par le
compilateur WinAVR à partir du code C.
• En Vert : le signal PWM mesuré sue le pin PC0. Pour les valeurs utilisées dans le
code source (voir annexe), on obtient une fréquence de 7.77KHZ.
Nous avons réalisé une carte de test destinée à la validation du hardware du variateur
(drivers+mosfets). Elle a été réalisée sous Eagle : voir schéma électronique, routage et
schéma d’implantation en annexe. Les fichiers sources (.sch et .brd) sont disponibles
dans les documents du projet 2006. Pour générer une tension de 5V, nous utilisons un
régulateur de tension 7805 monté avec une capacité de 1µF en parallèle sur l’entré et
une identique sur la sortie. Cela nous permet de supprimer les capacités de lissage C6 et
C15, en parallèle de la capacité en sortie du régulateur, et C5, C8 et C14, en parallèle de
celle d’entrée du régulateur.
Cette carte permet une utilisation avec ou sans capteurs à effet Hall, pour des courants
allant jusqu’à 4A. Le calcul de la largeur de piste pour un courant maximal donné se fait
à l’aide d’abaques (voir graphique en annexe). Les pistes des cartes réalisées au LEE font
35µm d’épaisseur, alors que celles de la carte présente sur le quadricoptère, sous-traitée
à l’extérieur, font 70µm d’épaisseur.
Voici la carte de test réalisée, avec le moteur du kit ATAVRMC100 :
34
Projet Quadricoptère 2005/2006
Les cinq fils rouges connectent la carte de test à une carte servant d’adaptateur pour
l’amplificateur opérationnel : nous n’avons pas reçu l’AO LMV7219M5 en boîtier SOT23-5,
nous l’avons remplacé provisoirement par un AD8051AR en boîtier SO-8.
Voici les deux faces de la carte :
35
Projet Quadricoptère 2005/2006
Lors d’un test optimiste, nous avons connecté toute la carte sans avoir validé les sous-
éléments, en utilisant le code d’usine de l’ATAVRMC100 : un mosfet a pris feu. D’où
l’importance de tester les sous-parties et d’utiliser un code opérationnel.
36
Projet Quadricoptère 2005/2006
3. CAPTEURS
GROUPE CAPTEUR
% NIVEAU TEMPS
OBJECTIFS - Liste des taches LIVRABLE
AVANCEMENT DIFFICULTE CONSACRE
MIDGII
37
Projet Quadricoptère 2005/2006
Capteurs Ultrasons
Détection d'obstacles:
38
Projet Quadricoptère 2005/2006
39
Projet Quadricoptère 2005/2006
Pendant l’année nous avons utilisé deux kit de développement : un stk 500 puis un stk
300.
La principale différence entre les deux kits est que le 300 ne contient qu’un port UART,
tandis que le stk 500 en contient deux. Comme cela est détaillé dans la partie centrale
inertielle, pour certains tests effectués avec la MIDGII, deux ports UART sont
nécessaires, il est donc nécessaire d’utiliser le stk 500. En revanche pour tout ce qui
concerne la partie sur les capteurs ultrason le stk 300 est tout à fait utilisable.
Les deux types de kit de développement n’utilisent pas les mêmes logiciels pour flasher
le microcontrôleur. Avec les stk 500 on utilise AVR Studio, tandis qu’avec les stk 300 on
utilise Pony Prog.
Attention ! Pour faire fonctionner le port parallèle d’un portable IBM / Lenovo avec
Ponyprog, il faut configurer ce port (imprimante / LPT) dans le bios du PC. Vérifier qu’il
est configuré en « ECP » ou « EPP » mais surtout pas en « bi-directional » ! Cette
remarque peut être valable pour d’autres PC.
40
Projet Quadricoptère 2005/2006
Nous nous sommes également aidé d’un TP trouvé sur Internet, appelé TP
microprocesseur ATMEL - Programme en C et dans lequel on nous apprend à réaliser des
programmes très simple. Ce TP peut être téléchargé à l’adresse suivante :
http://www.ac-orleans-tours.fr/sti-gel/MICROCONTROLEUR/AVR.HTM
Mais il sera également présent sur le cd dans la partie capteur.
41
Projet Quadricoptère 2005/2006
La centrale inertielle utilisée sur le quadricoptère est la MIDG II. La MIDG II est un
système de navigation à inertie (INS) incluant un GPS, le tout formant un ensemble
incroyablement compact. Elle est idéale pour toute application qui requiert une solution
de navigation à inertie.
L’antenne GPS permet d’avoir la position de la centrale au sol. C’est en dérivant cette
position que la centrale calcule le vecteur vitesse (c’est pour ça qu’il arrive qu’on ait une
dérive sur le vecteur vitesse). Dans le logiciel de configuration de la MIDG II (voir plus
bas), on peut configurer la façon dont la centrale va retourner les valeurs.
Actuellement, elle est configurée en mode ENU (East North Up). C’est donc les deux
premières coordonnées qui sont intéressantes. La centrale renvoie les données en
centimètres. Cette précision est absurde dans le sens où une antenne GPS n’arrivera
jamais à une précision plus fine qu’1 mètre. Retirer les 2 bits de poids les plus faibles
(voir plus bas) est donc tout à fait envisageable.
42
Projet Quadricoptère 2005/2006
La MIDG II est connectée à l’ATMega par un des ports UART. Le port UART est aussi
appelé port série. Le port UART est beaucoup plus simple à utiliser que le port I²C.
Quand un message (un octet) arrive sur le port UART, il arrive dans le registre UDR0
(pour le port UART 0, UDR1 pour le port UART1). De plus quand un octet est copié dans
ce registre, l’interruption SIG_UART0_RECV est appelée.
C’est tout ce qu’il faut savoir sur la réception d’un octet par le port UART. Pour ce qui est
de la transmission sur ce port, voir la partie « transmission ».
La MIDG II est configurée pour envoyer les données à la vitesse de 57600 bauds.
La MIDG II envoie à intervalles réguliers des messages (50Hz par défaut, configurable
dans le logiciel de configuration). Ces messages contiennent les mesures de la centrale
(vitesse, attitude, position etc.). Au total elle peut envoyer 13 messages différents.
Actuellement 3 messages sont envoyés au microcontrôleur (messages 2, 10 et 12). Pour
voir à quoi correspondent exactement ces messages il faut lire sur la page du
constructeur (http://microboticsinc.com/ins_gps.html) la partie MIDG II Message
Specification.
Sur le site du constructeur, le logiciel est dans la catégorie MIDG II INS/GPS Software.
Une fois installé, il faut configurer le bon port série et le bon débit (57600 bauds par
défaut). Dans le menu Options -> MIDG Config. Appuyer sur « Set » pour appliquer les
modifications puis « Save configuration » pour flasher la MIDG II (et donc pouvoir
rebooter la centrale sans perdre les modifications)
Ce logiciel permet aussi d’avoir les informations sortantes de la centrale. Ne pas oublier
qu’il faut être en extérieur pour faire fonctionner l’antenne GPS.
Nous avons voulu voir quelle était l’influence de la rotation des moteurs sur les
magnétomètres de la MIDG II. En effet, la MIDG II utilise les magnétomètres pour
trouver le cap et calculer l’attitude du quadricoptère et les moteurs gérèrent des champs
magnétiques qui se superposent au champ magnétique terrestre.
Le teste est relativement simple à mettre en œuvre :
On accède aux 3 valeurs du champ magnétique mesuré par le logiciel de la MIDG II
On alimente les moteurs par une alimentation externe (on ne peut pas utiliser le
quadricoptère normalement car la MIDG II est déconnectée de l’ATMega)
43
Projet Quadricoptère 2005/2006
Moteurs éteints
Moteurs allumés
44
Projet Quadricoptère 2005/2006
Les données de position GPS n’était pas utilisées par le code source actuel. Pour faire du
pilotage totalement automatique, nous allons avoir besoin de la position GPS délivrée par
la centrale.
Ces données sont contenues dans le message 12. Chaque coordonnée est codée sur 4
octets. La précision est du centimètre. Toutefois la précision de n’importe quel système
GPS n’est jamais meilleure que le mètre. On peut donc tout à fait envisager de ne garder
que 2 octets parmi les 4. On peut donc réduire la précision (en enlevant quelques bits de
poids faibles) et réduire la valeur max (pour ne garder qu’un maximum de quelques
kilomètres en enlevant des bits de poids forts).
Les tests ont été effectués en extérieur, ils étaient tout à fait satisfaisants. En fait, nous
nous sommes rendu compte que la centrale se sert de l’antenne GPS et de ses
accéléromètres pour calculer sa position. Entre 2 mesures GPS, la centrale arrive donc à
donner une valeur plus ou moins précise en permanence de sa position. Elle arrive en
particulier « deviner » sa position même lors d’un passage sous un arbre (antenne GPS
masquée).
Le système de coordonnées ENU permet d’avoir directement les valeurs East et North,
qu’on peut donc utiliser en valeurs X et Y.
Fonctionnement, documentation
3.3.1.1. Documentation
Les capteurs utilisé sur le quadricoptère est un capteur à ultrasons nommé SRF10 de la
marque robot-electronics. Nous avons choisi ce capteur car il était déjà utilisé sur le
quadricoptère existant en tant qu’altimètre. Il existait donc déjà un code source
fonctionnel et le capteur était réputé pour marcher correctement.
45
Projet Quadricoptère 2005/2006
3.3.1.2. Branchements
Pour faire une mesure avec ce capteur, il faut procéder en 2 étapes. Demander au
capteur de démarrer une mesure puis, une fois la mesure effectuée, demander au
capteur de renvoyer la mesure.
Lors du démarrage d’une mesure, le capteur envoie une impulsion ultrason. Pendant
l’envoie, il « n’écoute pas » pendant un court instant pour éviter d’entendre le son qu’il
vient de produire. Puis, il se met en mode « écoute » pour capteur le premier écho qui
reviendra sur le capteur.
Etant donné que plus l’écho met du temps à arriver, plus il est susceptible de venir de
loin, l’intensité sonore de l’écho sera donc de plus en plus faible au fur et à mesure que le
temps passe. Le capteur va donc automatiquement augmenter le gain de l’écoute pour
détecter l’écho qui sera plus faible.
C’est un point important car on peut régler le gain maximum du capteur (lors de son
initialisation, voir plus loin) pour éviter de capter des échos trop faibles qui sont
susceptibles d’être des échos parasites. De tels échos parasites peuvent provenir d’autres
capteurs ultrasons ou d’une réflexion sur plusieurs objets.
Le capteur ne verra que l’objet le plus proche : seul le premier écho est enregistré.
Régler le gain maximum permet de limiter la détection d’échos parasites
Le capteur SRF10 est fait pour fonctionner avec un microcontrôleur et ils communiquent
entre eux sur le bus I²C. Il faut donc comprendre comment marche ce bus.
Tous les périphériques sont branchés sur le même bus (i.e. : sur les même deux fils). On
peut donc brancher facilement les 6 capteurs ultrasons requis pour la détection
46
Projet Quadricoptère 2005/2006
d’obstacles (voir plus bas). Tous les périphériques ont une adresse (0xE0 par exemple).
Cette adresse permet au maître de définir à quel périphérique il parle.
Bien que ce tutorial soit un bon départ pour comprendre le protocole I²C, nous nous
sommes rendu compte que ce n’était pas suffisant. En effet, nous avons dû regarder le
code source des années passées, et faire de multiples essais sur le kit de développement.
La mesure est envoyée. Après un certain temps (60ms max), on peut demander au
capteur de renvoyer le résultat. C’est une deuxième manipulation expliquée dans le code
source.
TWDR : (Two-Wire Data Register) registre où se situe l’information (1 octet) que l’on
veut envoyer. On doit y copier l’information avant de l’envoyer.
TWCR : (Two-Wire Control Register) registre qui permet d’effectuer une action sur le bus
I²C. Les 8 bits correspondent à des actions différentes :
TWINT : autorise les interruptions
TWIE : active les interruptions
TWEN : active l’interface I²C
TWSTA : envoie un start
Voici le code source associé à cette manip. Il faut savoir que ce bout de code est inclus
dans une interruption dont le « case » s’incrémente à la fin de chaque appel de cette
interruption.
47
Projet Quadricoptère 2005/2006
{
case TW_MT_SLA_ACK: // OK, now send register number
TWCR = _BV(TWINT) | _BV(TWEN) | _BV(TWIE);
break;
default: // restart ranging
I2cState = 0;
TWCR = _BV(TWINT) | _BV(TWEN) | _BV(TWIE) | _BV(TWSTA);
break;
}
break ;
case 2:
switch (TW_STATUS)
{
case TW_MT_DATA_ACK: // OK, now send ranging command
TWDR = 0x51; // range in centimeters
TWCR = _BV(TWINT) | _BV(TWEN) | _BV(TWIE);
break;
default: // restart ranging
I2cState = 0;
TWCR = _BV(TWINT) | _BV(TWEN) | _BV(TWIE) | _BV(TWSTA);
break;
}
break ;
case 3:
switch (TW_STATUS)
{
case TW_MT_DATA_ACK: // OK, now start MT mode
TWCR = _BV(TWINT) | _BV(TWEN) | _BV(TWIE) | _BV(TWSTA);
break;
default: // restart get range, MT mode
I2cState = 3;
TWCR = _BV(TWINT) | _BV(TWEN) | _BV(TWIE) | _BV(TWSTA);
break;
}
if (premier_cycle_I2c == 1)
{
I2cState = 10;
premier_cycle_I2c = 0;
}
break ;
Le reste du code source est expliqué plus bas (notamment pour l’initialisation et pour la
boucle complète de dialogue avec les capteurs).
48
Projet Quadricoptère 2005/2006
SIGNAL(SIG_2WIRE_SERIAL)
{
static uint8_t led_controle;
volatile static uint16_t sonar_1;
switch (I2cState)
{
// -- START RANGING SRF10 --
case 0: // ranging
switch (TW_STATUS) // TW_STATUS = TWSR avec les bit 3 à 7 seulement.
Voir la librairie compat/twi.h et la doc de l'ATMega pour plus d'info
{
case TW_REP_START: // OK, now send SLA+W
TWDR = SRF10 | TW_WRITE;
TWCR = _BV(TWINT) | _BV(TWEN) | _BV(TWIE);
break;
default: // restart ranging
I2cState = 0;
TWCR = _BV(TWINT) | _BV(TWEN) | _BV(TWIE) | _BV(TWSTA);
break;
}
break ;
case 1:
switch (TW_STATUS)
{
case TW_MT_SLA_ACK: // OK, now send register number
TWCR = _BV(TWINT) | _BV(TWEN) | _BV(TWIE);
break;
default: // restart ranging
I2cState = 0;
TWCR = _BV(TWINT) | _BV(TWEN) | _BV(TWIE) | _BV(TWSTA);
break;
}
break ;
case 2:
switch (TW_STATUS)
{
case TW_MT_DATA_ACK: // OK, now send ranging command
TWDR = 0x51; // range in centimeters
TWCR = _BV(TWINT) | _BV(TWEN) | _BV(TWIE);
break;
default: // restart ranging
I2cState = 0;
TWCR = _BV(TWINT) | _BV(TWEN) | _BV(TWIE) | _BV(TWSTA);
break;
}
break ;
case 3:
switch (TW_STATUS)
{
case TW_MT_DATA_ACK: // OK, now start MT mode
TWCR = _BV(TWINT) | _BV(TWEN) | _BV(TWIE) | _BV(TWSTA);
break;
default: // restart get range, MT mode
I2cState = 3;
TWCR = _BV(TWINT) | _BV(TWEN) | _BV(TWIE) | _BV(TWSTA);
break;
}
break ;
// -- Lecture de la mesure de SRF10 --
49
Projet Quadricoptère 2005/2006
case 4:
switch (TW_STATUS)
{
case TW_REP_START: // OK, now send SLA+W
TWDR = SRF10 | TW_WRITE;
TWCR = _BV(TWINT) | _BV(TWEN) | _BV(TWIE);
break;
default: // restart get range, MT mode
I2cState = 3;
TWCR = _BV(TWINT) | _BV(TWEN) | _BV(TWIE) | _BV(TWSTA);
break;
}
break ;
case 5:
switch (TW_STATUS)
{
case TW_MT_SLA_ACK: // OK, now send register number
TWDR = 2;
TWCR = _BV(TWINT) | _BV(TWEN) | _BV(TWIE);
break;
default: // restart get range, MT mode
I2cState = 14; // SRF10_1 non pret. va essayer SRF10_2
TWCR = _BV(TWINT) | _BV(TWEN) | _BV(TWIE) | _BV(TWSTA);
break;
}
break ;
case 6:
switch (TW_STATUS)
{
case TW_MT_DATA_ACK: // OK, now send rep start
TWCR = _BV(TWINT) | _BV(TWEN) | _BV(TWIE) | _BV(TWSTA);
break;
default: // restart get range, MT mode
I2cState = 3;
TWCR = _BV(TWINT) | _BV(TWEN) | _BV(TWIE) | _BV(TWSTA);
break;
}
break ;
50
Projet Quadricoptère 2005/2006
if (led_controle++<64) LED0on;
else {LED0off; if (led_controle==128) led_controle=0;}
break ;
}
I2cState++;
return;
}
Ce code source peut sembler assez indigeste au premier abord. Il n’est pourtant pas
compliqué.
Il faut savoir qu’à chaque fois qu’il y a de l’activité sur le bus I²C, l’interruption
SIGNAL(SIG_2WIRE_SIGNAL) est activée. A ce moment, le programme va dans le
« case » correspondant à la valeur contenue dans I2cState. Au départ, cette valeur est à
0. Le programme ira donc dans le case 0 en premier. Il le traite, saute tout les autres,
incrémente I2cState (via le I2cState++) et sort de l’interruption.
Au prochain appel de l’interruption, il sautera le case 0, ira dans le case 1 et sautera tous
les autres, etc. …
Envoie ranging
Lecture mesure
51
Projet Quadricoptère 2005/2006
Dans cette partie, nous ne mettons pas le code entier (par soucis de clarté). Il n’y aura
que des bouts. Les codes sources entiers se trouvent en annexe.
Point important : pour des raisons qui nous échappent, certaines valeurs d’adresse pour
les capteurs US sont inutilisables avec les codes détaillés plus bas. Selon la doc du
constructeur, les adresses disponibles sont 0xE0, 0xE2 … 0xFE. C'est-à-dire toutes les
adresses paires entre E0 et FE. Les adresses inutilisables sont les E2, E6, EA etc. On doit
donc utiliser les adresses paires et en plus, une seule sur deux.
Typiquement, les adresses à utiliser sont les E0, E4, E8, EC, F0, F4, F8 et FC (ce qui est
suffisant pour brancher 6 capteurs)
3.3.3.3. Code 3 : faire fonctionner les capteurs les uns après les autres
La première idée pour faire fonctionner n capteurs sur le quadricoptère est de les faire
fonctionner les uns après les autres. On prend simplement le code précédent, et on
change l’adresse du capteur quand on veut passer au capteur suivant.
SIGNAL(SIG_2WIRE_SERIAL)
{
static uint8_t led_controle;
volatile static uint16_t sonar;
switch (I2cState)
{
52
Projet Quadricoptère 2005/2006
if (led_controle++<64) LED0on;
else {LED0off; if (led_controle==128) led_controle=0;}
k ++;
if (k == nombre_capteurs_us)
{
k = 0; //Retour au premier capteur quand on a fini le dernier
}
break ;
}
I2cState++;
return;
}
Les valeurs sont stockées dans la liste gsonar_new. On accède donc à l’altitude par
gsonar_new[0] par exemple.
Ce code a l’avantage d’être très flexible. Pour changer un capteur, il suffit de changer
l’adresse correspondante dans la liste adresse_capteur_us. Pour en rajouter un, on
change la valeur de nombre_capteurs_us et on rajoute l’adresse dans la liste des
adresses. Il n’y a donc qu’un ou deux paramètre à changer dans le début du code.
Avantage :
Aucune perturbations possible puisque les capteurs n’envoient jamais d’impulsion en
même temps
Inconvénient :
Code lent. Mettre 2 capteurs à la place d’1 rend des mesures qui se rafraîchissent deux
fois plus lentement. Cela peut causer des problèmes dans l’asservissement.
Ce code a pour but de lancer les mesures de tous les capteurs présents en même temps.
L’idée derrière ça est d’accélérer le rafraîchissement des données sans pour autant créer
de perturbations. En effet, si tous les capteurs lancent leurs mesures en même temps, ils
ne capteront pas le son produit directement par les autres capteurs. Ils peuvent
cependant capter des échos provenant des autres capteurs.
En pratique, bien que le code soit effectivement plus rapide, on a vite vu que les
perturbations étaient présentes et qu’il fallait y faire attention. Ceci est détaillé plus bas,
dans la partie sur la détection d’obstacles.
Le principe de ce code est de faire les cases 0 à 3 pour tous les capteurs, puis les cases 4
à 10 pour tous les capteurs, dans l’ordre.
SIGNAL(SIG_2WIRE_SERIAL)
{
static uint8_t led_controle;
volatile static uint16_t sonar;
switch (I2cState)
{
53
Projet Quadricoptère 2005/2006
case 3:
switch (TW_STATUS)
{
case TW_MT_DATA_ACK: // OK, now start MT mode
TWCR = _BV(TWINT) | _BV(TWEN) | _BV(TWIE) | _BV(TWSTA);
break;
default: // restart get range, MT mode
I2cState = 3;
TWCR = _BV(TWINT) | _BV(TWEN) | _BV(TWIE) | _BV(TWSTA);
break;
}
I2cState = -1;
k ++;
if (k == nombre_capteurs_us)
{
k = 0; //Retour au premier capteur quand on a fini le dernier
I2cState = 3; //On passe à la phase de lecture des mesures
uniquement lorsque l'on a lancé le ranging des k capteurs
}
break ;
54
Projet Quadricoptère 2005/2006
k ++;
if (k == nombre_capteurs_us)
{
k = 0; //Retour au premier capteur quand on a fini le dernier
I2cState= -1 ; //On relance le ranging de tous les capteurs
quand on a récupéré les mesures des k capteurs
}
break ;
}
I2cState++;
return;
}
Avantage :
Perturbations à priori moins probable (mais présentes selon nos tests)
Code assez rapide. Il sera ralenti par le capteur le plus long. Par exemple, si un capteur
pointe l’infini (il aurait mis 60ms pour renvoyer la valeur infinie), la fréquence de
rafraîchissement des données sera de 60ms.
Inconvénient :
Perturbations en pratique
3.3.3.5. Code 1 : lancer des ranging dès que possible pour chaque
capteur individuellement.
Dans ce code, on fait en sorte de gérer tous les capteurs individuellement. Le principe est
le suivant :
On lance tous les rangings de tous les capteurs en même temps (comme dans le code 2).
Cette étape est en fait uniquement faite au lancement du drône.
On regarde si le capteur 1 est prêt à nous renvoyer la mesure.
Si oui :
On lit la mesure du capteur 1
On lance un ranging du capteur 1
Si non, on passe à l’étape suivante
On regarde si le capteur 2 est prêt à nous renvoyer la mesure.
Si oui :
On lit la mesure du capteur 2
On lance un ranging du capteur 2
Si non, on passe à l’étape suivante
Etc.
Une fois arrivé au dernier capteur, on repasse à l’étape 2 et ainsi de suite.
SIGNAL(SIG_2WIRE_SERIAL)
{
static uint8_t led_controle;
volatile static uint16_t sonar;
switch (I2cState)
{
// -- START RANGING SRF10_k --
case 0: // ranging
//putc(TW_STATUS);
//putc(I2cState);
55
Projet Quadricoptère 2005/2006
56
Projet Quadricoptère 2005/2006
break ;
}
I2cState++;
return;
}
Avantage :
Code très rapide. Un capteur pointant l’infini ne ralentira pas les autres.
Inconvénient :
Perturbations à gérer.
Le code suivant permet l’initialisation des capteurs ultrasons. C’est un code qui marche
parfaitement.
L’ancien code d’initialisation des capteurs avait un défaut. Il envoyait des messages sans
attendre une quelconque confirmation provenant des capteurs. Même s’il pouvait
marcher dans certains cas, il peut ne pas marcher si on essaie d’initialiser les capteurs
trop tôt avant la mise sous tension de ceux-ci. Il inclut donc une simple pause (voir
_delay_ms(200); aux deux premières lignes).
void i2cInit(void)
{
_delay_ms(200);
_delay_ms(200); //pour laisser le temps aux capteurs US de
s'initialiser eux même
premier_cycle_I2c = 0;
TWBR = 152;// SCL 50khz avec horloge 16Mhz
// Initialize SRF10 (not required if default values)
57
Projet Quadricoptère 2005/2006
putc(TW_STATUS);
TWDR = 255; // écriture de 255 sur le registre 2 (le fait que
ce soit sur le registre 2 après le registre 1 est implicite)
TWCR = _BV(TWINT) | _BV(TWEN); // write range (default 255)
while ( (TWCR & _BV(TWINT)) == 0 ); // wait for transmission
putc(TW_STATUS);
}
//Initialisation terminée. Activation des interruptions
I2cState = 0;
k = 0; //pour commencer avec le premier capteur
TWCR = _BV(TWINT) | _BV(TWEN) | _BV(TWIE) | _BV(TWSTA); // start
transmission
}
/!\ Ce délais rajouté peut ne pas se retrouver dans tous les codes. Il est
assez récent.
Les capteurs ultrasons SRF10 sont livrés à la sortie d’usine avec l’adresse 0xE0. Pour la
changer, nous avons créé le code situé dans l’annexe 4.
Les deux seuls paramètres à régler dans ce code sont : l’ancienne adresse du capteur et
l’adresse que l’on veut lui donner.
Exemple :
58
Projet Quadricoptère 2005/2006
Un des objectifs de l’année pour le groupe capteur était d’étudier comment réaliser une
fonction de détection d’obstacles sur le quadricoptère.
Le groupe capteur avait pour but de trouver les capteurs qui rempliront cette fonction et
d’écrire le code qui pilotera les capteurs et récupèrera les données envoyées. La partie
programmation et écriture d’un algorithme d’évitement d’obstacles revenant au groupe
« Algorithme Programmation ».
La première étape a été de définir de manière précise le besoin par rapport à la détection
d’obstacle :
Etant donné la vitesse du quadricoptère et pour faire en sorte que la réaction ne soit pas
trop brutale, nous avons conclut que le drone devait repérer un objet de type arbre
(environ 20 cm de diamètre) à une distance d’environ 1,50 m.
Raisons de ce choix
Nous avons choisi ce type de capteur car il était déjà utilisé sur le quadricoptère existant
en tant qu’altimètre. De plus le code correspondant à l’altimètre permet de remplir une
fonction très proche de celle que l’on cherche à obtenir et le capteur était réputé pour
marcher correctement.
Une autre raison importante est que les capteurs ultrasons utilisent le protocole I²C. Pour
ce protocole tous les périphériques sont branchés sur le même bus (i.e. : sur les même
deux fils). Il est donc très simple au niveau des branchements de rajouter des capteurs
ultrasons à celui ou ceux existant.
Sur le quadricoptère
Nous avons envisagé de placer à terme 6 capteurs ultrasons dans les 6 directions
caractéristiques du quadricoptère. Dans un premier temps nous nous sommes donné
pour objectif de faire fonctionner une première fonction de détection d’obstacle pour une
direction caractéristique. Au terme de cette année le quadricoptère ne comporte donc
que deux capteurs ultrasons : l’altimètre et un autre dirigé vers l’avant. L’étape suivante
lorsque la détection dans une direction fonctionnera parfaitement (bon réglage des
capteurs, code d’évitement d’obstacles au point) sera donc pour le groupe capteur
d’intégrer d’autres capteurs ultrasons pour que la fonction d’évitement d’obstacles
fonctionne quelle que soit la direction.
Le but de cette phase expérimentale est de tester notre solution pour voir s’il est
envisageable de l’utiliser sur le quadricoptère.
59
Projet Quadricoptère 2005/2006
Pour tester les « performances » des capteurs ultrasons nous avons effectué un montage
de plusieurs capteurs sur une ancienne structure du drone. Nous avons placé dans un
premier temps 3 capteurs dans les trois directions caractéristiques x, y et z.
Nous avons ensuite branché ces trois capteurs sur le kit de développement STK 300 par
l’intermédiaire d’une plaque d’essai. Le kit de développement étant ensuite relié à un PC
par l’intermédiaire du port série.
Les branchements fait ainsi n’étaient pas toujours très bons, on a plusieurs problèmes de
faux contacts. De plus les soudures des capteurs étaient assez fragiles ; nous avons été
retardé pendant nos tests par des soudures qui cassaient. Pour effectuer des tests plus
poussés il pourrait être intéressant de fabriquer de beaux connecteurs, cela éviterait ce
type de désagréments.
Pour faire les tests de capteurs il est nécessaire de flasher sur l’ATMEGA un code
permettant de récupérer les données envoyés par les capteurs sur le port série. Pour cela
nous avons utilisés trois codes différents :
Code1 : Dès qu’un capteur a fini de faire une mesure on le relance pour qu’il puisse à
nouveau mesurer
Code2 : On relance les capteurs uniquement quand les trois capteurs ont fini de mesurer
Nous verrons par la suite quel est l’impact du choix d’un programme par rapport à un
autre dans les résultats des tests.
60
Projet Quadricoptère 2005/2006
Pour pouvoir visualiser nos mesures, on branche le STK300 sur le port série d’un PC par
l’intermédiaire de l’UART du kit de développement. Les mesures des trois capteurs
arrivent donc sur le port série du PC. Pour pouvoir visualiser les données arrivant sur le
port série du PC on utilise HyperTerminal, et PortMon. HyperTerminal permet d’ouvrir le
port en question mais affiche les données en code ASCII… ce qui n’est pas très lisible. On
utilisait donc PortMon, logiciel qui scrute le port une fois qu’il est ouvert (d’où l’obligation
d’ouvrir également HyperTerminal) et qui affiche les données directement en hexa.
Un autre logiciel intéressant pour visualiser les données est Terminal v1.9b, notamment
utilisé par le groupe transmission. Ce logiciel est très bien mais l’affichage des données
(en lignes) nous plaisait moins que celui de PortMon (en colonnes).
La première chose importante est de tester les performances d’un capteur ultrason en
fonction de son gain. Pour voir plus en détail le fonctionnement d’un capteur ultrason et
notamment le réglage du gain, voir partie fonctionnement des capteurs ultrasons.
Pour tester les performances d’un capteur, nous avons décidé de faire une mise en
situation. Nous avons effectué des tests pour trois types d’obstacles différents :
• Un mur de face
• Un arbre de face
• Un arbre décalé (voir schéma ci dessous)
Ces tests devaient nous permettre de voir quels gains sont acceptables en situation de
vol.
Pour tester un capteur, il n’y a pas de problème de choix de programme à flasher sur
l’ATMEGA, ils sont tous équivalents. On utilise donc le programme de récupération des
données pour un capteur.
Pour tous les tests on remarque que pour une distance grande le capteur ultrason capte
l’infini. Lorque l’on rapproche le capteur de l’obstacle il commence à voir l’obstacle tout
en continuant à donner souvent l’infini, puis à partir d’une certaine distance les mesure
deviennent stables. On a effectué ces tests des trois situations pour 4 valeurs de gain
différentes : 4, 8, 12 et 16.
61
Projet Quadricoptère 2005/2006
Remarque en passant :
Selon les capteurs, l’infini est donné par 0xFF ou 0x00… Cette différence semble être due
à une différence de génération des capteurs. En effet les capteurs sont identiques mais
n’ont pas été commandés en même temps. Ceci est à vérifier.
3.4.2.5. Résultats
On a regroupé les résultats de nos tests sur les performances d’un capteur dans un
tableau. Les résultats inscrits dans le tableau correspondent à la distance à partir de
laquelle les mesures relevées étaient devenues stables.
Passage à
Gain \ Mur de Valeur Arbre de Valeur Valeur en
côté d’un
Situation face en cm face en cm cm
arbre (*)
Ne voit pas
4 00 EE 238 00 4E 78 -
l’arbre
Voit des
trucs, mais
8 01 4A 330 00 77 119 -
rien de
stable
12 01 D6 470 00 AD 173 00 70 112
On observe bien que plus le gain est fort mieux l’obstacle est détecté, ou de plus loin.
A gain égal un mur de face est détecté de plus loin qu’un arbre.
On voit qu’un gain de 8 n’est pas suffisant pour détecter un arbre légèrement décalé.
Cela peut être gênant dans le cas où l’on n’utiliserait qu’un seul capteur devant.
On observe donc que si on avait comme unique objectif la performance d’un capteur, on
utiliserait sans hésiter un gain de 16. On verra par la suite les problèmes engendrés par
un gain trop fort.
On a observé au cours de nombreux essais des capteurs qu’il peut y avoir apparition
d’interférences lorsque l’on utilise plusieurs capteurs ultrasons en même temps. Ces
interférences ont deux conséquences principales : les mesures ne sont plus stables dans
des situations pour lesquelles avec un seul capteur elles étaient parfaitement stables, et
les capteurs ne détecte plus l’infini lorsqu’ils n’ont aucun obstacles face à eux.
Ces interférences ont été observé pour des essais avec trois capteurs : l’altimètre placé
sous le quadricoptère dans la direction z, et de capteurs sur les côtés en bout de
structure dans les directions x et y. Nous avons voulu dans un premier temps savoir
exactement quels capteurs interféraient parmi ces trois. Pour cela nous avons décidé de
nous intéresser au critère détection de l’infini. Nous avons donc dirigé les capteurs vers le
ciel (aucun obstacle détectable) et nous avons relevé les mesures pour voir si les
capteurs donnaient bien l’infini. On a effectué ces tests pour différentes positions
relatives des capteurs, pour les trois codes et pour différentes valeurs des gains.
62
Projet Quadricoptère 2005/2006
3.4.3.2. Résultats
En ce qui concerne les codes : les tests effectués avec le code 3, dans lequel les mesures
sont réalisés sur les capteurs les uns après les autres, nous ont confirmé qu’il n’y a pas
d’interférences avec ce code. Cela est rassurant car on a écrit ce code justement pour
avoir un code avec lequel aucune interférence n’est possible. En revanche il convient de
garder en tête que ce code est le plus lent. Si plusieurs capteurs sont placés à terme sur
le quadricoptère cela peut poser un problème de rafraîchissement des données.
En revanche nous allons voir par la suite qu’avec les codes 1 et 2 il y a apparition
d’interférences.
En ce qui concerne les positions relatives des capteurs, deux situations ont été testés :
un capteur situé en bout de structure + le capteur mesurant l’altitude et la situation avec
deux capteurs situés en bout de structure dans les directions x et y. Un résultat très
important de notre campagne de mesure est que dans la deuxième situation, on
n’obtient pas d’interférences, même pour un gain de 16 (le plus nuisible pour les
interférences comme on va le voir immédiatement après) (en considérant toujours le
critère détection de l’infini décrit dans le protocole).
En revanche la première situation avec un capteur dirigé vers le bas et un capteur sur le
côté fait apparaître des interférences (pour les codes 1 et 2): ces interférences
apparaissent pour un gain supérieur à 12. Dans ce cas on observe que les capteurs ne
donnent plus l’infini mais deviennent instables.
Cette phase de test concernant la mise en évidence des interférences par la détection de
l’infini permet de tirer plusieurs conclusions : il y a un problème d’interférences au sens
de détection de l’infini uniquement entre les capteurs de côtés et le capteur d’altitude et
dès que les gains sont assez élevés (supérieur à 12). En revanche, avec ce protocole les
capteurs situés dans les directions x et y n’interfèrent pas entre eux. Enfin, on constate
que nos tests effectués ne mettent pas en évidence de différences entre les codes 1 et
les codes 2.
En revanche nous n’avons pas eu le temps de tester une autre situation qui peut être
problématique : Si l’on considère le quadricoptère en train de longer un mur, le capteur
de côté va mesurer la distance au mur, et le capteur avant est censé mesurer l’infini.
Hors il y un risque que les ondes envoyées par le capteur de côté et réfléchies sur le mur
puissent engendrer des interférences sur le capteur avant. Comme cette situation, bien
d’autres peuvent poser des problèmes d’interférences et méritent d’être étudiées de plus
près.
On voit que dans ce problème de détection d’obstacle, une des difficultés majeure pour le
groupe capteur est que les tests sont tous des tests effectués en situation. Il n’est pas
possible de trouver un protocole expérimental qui nous donnerait exactement comment
se comportent les capteurs ultrasons vis-à-vis des interférences dans toutes les
situations.
Ainsi le réglage des gains devra également se faire par tests progressifs.
Ces tests ont été effectués sur une structure de tests, il n’est pas garanti que l’on ait
exactement les mêmes résultats si l’on effectue les tests sur le quadricoptère. Une chose
qui serait donc importante à faire est de monter trois capteurs dans les directions
caractéristiques sur le quadricoptère et d’effectuer les mêmes tests. Il faut également
prendre en compte que, étant donné que c’est le capteur d’altitude qui semble être à
l’origine des interférences, cela peut dépendre de l’altitude à laquelle se trouve le
quadricoptère : il y a peut être plus d’interférences au décollage qu’en situation de vol.
63
Projet Quadricoptère 2005/2006
Etant donné que l’on a vu que la phase de décollage est une phase critique, il convient de
s’en préoccuper particulièrement. C’est pour cette raison que nous avons effectué des
tests relatifs à cette phase importante.
Nous avons noté au cours de différents tests que les capteurs ultrasons, pour des gains
importants ne sont pas très directifs. Cela peut être un avantage en phase de vol puisque
cela permet de réduire les angles morts et permet avec des gains assez élevés de
détecter les obstacles même s’ils ne sont pas exactement dans l’axe du capteur. Nous
avons vu précédemment que cela permet notamment pour des gains supérieurs à 12 de
détecter un obstacle de type arbre même s’il est légèrement décalé. En revanche cette
non directivité des capteurs peut poser un problème lors de la phase de décollage. En
effet lorsque le quadricoptère est posé, pour certaines valeurs du gain, le capteur placé à
l’avant détecte le sol.
Nous avons réalisé deux expériences nous permettant de mieux quantifié le problème.
Protocole expérimental
Dans un premier temps, nous avons placé un seul capteur sur notre structure de test, et
pour chaque valeur du gain (entre 1 et 15), nous avons noté à partir de quelle hauteur le
capteur (pointant vers l’avant) donnait l’infini. Dans les cas où il ne capte pas l’infini, cela
signifie qu’il capte le sol puisqu’il n’y a aucun obstacle ni d’autres capteurs qui pourraient
faire des interférences. Nous avons également noté quelles valeurs donnait le capteur
juste avant de donner l’infini ; cela peut nous donner une certaine idée de l’ouverture
angulaire du capteur. Il faut toutefois se méfier de cette notion d’ouverture angulaire, car
elle est spécifique à une situation donnée. Elle sera différente selon le type d’obstacle
(forme, matériaux, orientation… etc.)
3.4.3.6. Résultats
Hauteur à Valeur
partir de mesurée « Ouverture
laquelle il Valeur en juste avant Valeur en angulaire »
Gain
mesure une cm qu’il ne cm (angle du demi
distance mesure cône)
infinie l’infini
1 < 5cm - Très faible
2 < 5cm - Faible
3 < 5cm - Faible
4 < 5cm - Faible
5 < 5cm - Faible
6 < 5cm - Faible
7 < 5cm - Faible
8 < 5cm - Faible
9 < 5cm - Faible
10 0x22 34 0x50 80 23°
11 0x29 41 0x60 96 23°
12 0x35 53 0x60 96 29°
13 0x38 56 0x70 112 27°
14 0x3B 59 0x80 128 25°
15 0x42 66 0x90 144 25°
64
Projet Quadricoptère 2005/2006
Remarque : Les valeurs placées dans la colonne 3 ne sont pas très précises car les
mesures de détection du sol ne l’étaient pas non plus.
On peut noter tout d’abord que jusqu’à un gain de 9 le capteur ne voit jamais le sol.
En revanche pour des gains supérieurs ou égaux à 10, l’ouverture angulaire du capteur
devient telle qu’il capte le sol au lieu de mesurer l’infini.
On voit que plus la valeur du gain augmente, plus longtemps il captera le sol (si on pense
à une éventuelle phase de décollage)
On peut noter que l’ouverture angulaire du capteur reste à peu près constante, autour de
25°, pour des valeurs de gain à partir de 10. On a également noté pendant l’expérience
que le capteur était extrèmement directif pour des gains faibles.
3.4.3.8. Conclusion
Avec cette expérience on ne s’est intéressé qu’à la détection du sol par un capteur. Si on
tirait des conclusions concernant la phase de décollage à partir de cette première phase
expérimentale, on pourrait dire, sachant que notre capteur avant sur le quadricoptère est
placé à environ 25 cm du sol, qu’il faut lors de la phase de décollage un gain strictement
inférieur à 10. Toutefois cette expérience ne tient pas compte d’un autre phénomène que
l’on a mis en évidence précédemment : les interférences dues à l’altimètre.
Nous avons donc réalisé une deuxième phase d’expérimentation directement sur le
quadricoptère, et avec les deux capteurs.
3.4.4.1. Protocole
65
Projet Quadricoptère 2005/2006
3.4.4.2. Résultats
Avec le code 1 :
Capteur avant
Capteur avant
(altimètre arrêté,
Gain (altimètre en Valeur en cm Valeur en cm
pas de possibilités
fonctionnement)
d’interférences)
16 0x20 32 0x20 32
12 0x48 72 0x4B 75
11 0x7A 122 Infini -
10 0x7C 124 Infini -
8 0x8A 138 Infini -
6 0x85 133 Infini -
5 Infini - Infini -
4 Infini - Infini -
3.4.4.5. Conclusion
La conclusion de ces tests est que l'on peut utiliser le capteur avant correctement en
phase de décollage avec un gain au maximum égal à 5.
La question qui se pose alors est de savoir si un gain de 5 est suffisant pour la détection
d'obstacle.
(Pour plus de précision voir ci-dessus dans la partie performances d’un capteur)
66
Projet Quadricoptère 2005/2006
Une autre conclusion de cette séance de test est que si on a uniquement 2 capteurs:
l'altitude et un vers l'avant, le code 2 n'apporte aucun avantage par rapport au code 1,
qui part ailleurs est plus rapide. On va donc continuer, à priori à travailler avec le code 1.
Si on n’avait pas de problèmes d'interférences, la séance de test nous a montré qu'une
valeur de 11 du gain serait acceptable lors de la phase de décollage.
Le code 3, plus lent, nous permet d'éviter ces problèmes d'interférences. Il faut donc voir
selon le nombre de capteurs utilisés au final si on peut se contenter de se code et avoir
alors une meilleure performance des capteurs ultrasons.
Le code 3 fonctionne de telle manière qu'il termine une mesure avec un capteur avant de
passer au suivant.
La durée max de mesure est de 60 ms. Si on a deux capteurs, sachant que l'altitude
n'est jamais très élevée et donc que cette mesure est réalisée très rapidement, on aurait
en général une mesure de l'altitude toute les 60 ms. La question a étudier est de savoir
s’il est suffisant d'avoir une mesure de l'altitude toute les 60 ms pour stabiliser le
quadricoptère?
3.4.6.1. Remarques
On n’a pas réfléchi de manière précise à l’orientation idéale à donner au capteur dirigé
vers l’avant. Serait-ce une bonne idée de l’orienter légèrement vers le haut pour
repousser la détection du sol ?
La conclusion de cette partie devrait être un paramétrage idéal pour les capteurs et un
choix de code source permettant de réaliser la fonction complète de détection d’obstacle.
Ce problème de la détection d’obstacle fait que l’on doit arbitrer entre la performance des
capteurs ultrasons et les problèmes parasites qui gênent leurs fonctionnements. En effet
si l’on veut que la solution mise en place détecte un objet à une distance raisonnable, il
faut un gain assez élevé pour le capteur. Mais si l’on règle le capteur avec un gain élevé
cela augmente les problèmes d’interférences.
La solution pour véritablement éviter tous les problèmes d’interférences est de choisir le
code3 (voir précédemment pour explication). Cette solution est-elle envisageable ? Pour
cela il faut réfléchir à quel doit être le rafraîchissement des données envoyées par les
capteurs pour que le quadricoptère fonctionne bien. Ce rafraîchissement nécessaire est
sans doute différent selon les capteurs : l’altimètre, directement utilisé dans la boucle
d’asservissement et dans la stabilisation du quadricoptère nécessite sans doute un
rafraîchissement plus rapide que les capteurs servant à la détection d’obstacles. Ce
problème sera totalement différent selon le nombre de capteurs que l’on veut installer
sur le quadricoptère.
67
Projet Quadricoptère 2005/2006
- Trouver un autre code qui permettent que chacun des capteurs ait le
rafraîchissement de données nécessaire tout en évitant les interférences (un code3
amélioré).
- Lancer les mesures des capteurs qui n’interfèrent pas entre eux en même temps
(Ce n’est pas facile car on ne sait pas exactement lesquels interfèrent selon les
situations)
On voit donc que pour ce qui est de la solution complète encore pas mal de problèmes
restent à résoudre.
On peut toutefois penser dans un premier temps à réaliser une détection d’obstacles
simplifiée. Cela consiste à placer sur le quadricoptère uniquement un seul capteur
ultrason en plus de l’altimètre. On peut également tenir compte du fait que pour le
moment le quadricoptère ne vole pas très haut, la mesure de l’altitude peut être
considérée comme quasi instantanée. Le rafraîchissement des données des capteurs sera
donc légèrement supérieur à 60 ms si l’on utilise le code 3. Cette valeur est semble-t-il
suffisante. On a donc dans ce cas une solution valable. La seule contrainte au niveau du
réglage des gains est en relation avec la phase de décollage. Nous avons vu dans nos
expériences précédentes que, s’il n’y a pas d’interférences le gain doit être au maximum
de 11 pour ne pas détecter le sol lorsqu’il est posé à terre. On peut donc pour prendre un
peu de marge régler les gains des capteurs à 8. Le groupe capteur est donc capable de
fournir la distance à un objet situé devant le quadricoptère à une distance d’environ 3m
pour un mur et 1m50 pour un arbre. Il ne reste alors au groupe algorithme qu’à écrire un
programme permettant d’empêcher le quadricoptère de rentrer dans l’obstacle.
Cette détection d’obstacle simplifiée permet d’avoir une première approche intéressante.
Une fois que cette solution simplifiée fonctionne parfaitement il sera plus facile d’intégrer
de nouveau capteur et de réaliser la fonction complète.
Remarque :
La donnée limitante pour le réglage du gain étant notamment la phase de décollage, on
pourra réfléchir à la possibilité de faire varier le gain des capteurs entre le décollage et la
situation de vol, simplement en réinitialisant les capteurs après le décollage avec des
réglages différents.
68
Projet Quadricoptère 2005/2006
Pour le moment, l’unique mesure de vitesse, utilisée dans l’algorithme du drone, est
donnée par la centrale inertielle par l’intermédiaire du GPS. Hors en intérieur le GPS ne
fonctionne plus ; le drone est donc totalement dépendant du GPS et ne fonctionne plus
dès que le GPS ne reçoit plus les signaux des satellites. Nous n’avons pas eu le temps
cette année de nous occuper de ce problème. Il faudra donc commencer à réfléchir à des
capteurs de vitesse alternatifs. Les premières pistes conduisent notamment à l’utilisation
du flux vidéo, aux capteurs doppler ou encore aux anémomètres. Toutes ces pistes
doivent être approfondies pour savoir si ces solutions ou d’autres solutions alternatives
sont envisageables. Des premières études ont été réalisées les années précédentes, il
peut donc être intéressant de partir de celles-ci pour essayer de trouver une solution à ce
problème.
Toutefois il convient avant d’étudier les solutions envisageables, de bien réfléchir sur le
besoin que l’on a et sur les caractéristiques du capteur de vitesse nécessaires au bon
fonctionnement du drone. Par exemple certains des capteurs envisagés sont
directionnels. Il faut donc se poser sérieusement la question de savoir si la mesure de la
vitesse dans une seule direction peut suffire, s’il faut alors mettre plusieurs capteurs dans
différentes directions, un peu à l’image des capteurs ultrasons pour la détection
d’obstacle ou si l’on doit obligatoirement trouver un autre capteur, qui comme le GPS ne
soit pas directionnel. De plus il faut se poser la question de la précision et de la fiabilité
nécessaire pour pouvoir être utilisé dans la boucle d’asservissement.
69
Projet Quadricoptère 2005/2006
4. TRANSMISSION
Cette année a été très intéressante pour nous même si nous avons mis beaucoup de
temps pour être efficaces. En effet, l’équipe précédente ne nous a laissé aucune piste de
travail. De plus il y avait très peu de documents donnant les connaissances de base de
l’utilisation des différents kits de développement.
De ce fait nous n’avons pas pu réaliser tout ce que nous avions prévu pendant cette
année. Voici le récapitulatif de nos objectifs avec leur avancement en cette fin d’année.
DEAD % TEMPS
OBJECTIFS
LINE AVANCEMENT CONSACRE
Travail préliminaire
22-nov.-
Capitalisation et présentation des objectifs 100% 10h
05
70
Projet Quadricoptère 2005/2006
A chaque fois que nous disposions d’une solution nous la testions seule (modems,
gamepad, station sol…), puis dans un second temps nous la mettions en place pour une
utilisation plus complexe. Tout cela en vue de ne pas cumuler les difficultés.
71
Projet Quadricoptère 2005/2006
Le modem Maxstream est utilisé sur le quadricoptère pour assurer la liaison descendante
qui permet de récolter des informations sur la position du drone par rapport à son
environnement.
En résumé, la centrale inertielle MIDG II reçoit des informations de la part de son capteur
GPS et de ses accéléromètres et les transmet au calculateur embarqué qui les analyse et
les envoie à la station sol (IHM) par l’intermédiaire du modem.
Ce modèle de modem a été choisi par l’équipe précédente parmi 3 autres modèles : le
TX1/RX1, SPM2 et Bim2.
Le choix a été effectué en fonction des données utiles annoncées par les constructeurs, à
savoir la portée, la fréquence d’utilisation et le poids. Après une étude expérimentale
comparative, le choix de l’équipe s’est porté sur le Maxstream 24XStream.
La première étape de l’utilisation de ce modem passe par la prise en main grâce au kit de
développement. Celui-ci est constitué d’un support sur lequel le modem vient s’implanter
pour relier le modem à un PC et un logiciel X-CTU qui permet de régler les différents
paramètres du 24XStream (et d’utiliser un test de communication entre 2 modems
« range test »).
Toutes ces informations arrivent sur la station sol et sont affichées grâce à l’IHM
(Interface Homme Machine) qui est un programme écrit en Visual Basic 6.0 et permet de
piloter le quadricoptère.
72
Projet Quadricoptère 2005/2006
La liaison vidéo est elle aussi reliée à l’IHM mais elle ne transite pas par les modems. Elle
consiste en une caméra avec émetteur intégré choisie par l’équipe de l’année précédente.
La vidéo n’a pas été un sujet de travail pour notre année bien que nous ayons vérifié ses
fonctionnalités.
Cette sous-tâche nous a permis de nous familiariser avec les modems et avec le code du
quadricoptère et de mieux comprendre l’étendue du travail à venir.
Pour étudier le réglage de cette option, nous avons fait communiquer les modems en
bidirectionnel avec le logiciel X-CTU et avec Matlab.
X-CTU possède un « range test » qui permet aux modems de communiquer entre eux.
On peut ainsi régler le message que l’on désire échanger, le nombre, voir quel est le
pourcentage de messages que l’on a correctement reçu…
Le même type d’expérience a été réalisé avec Matlab. Le programme utilisé est le
suivant :
function test(s,number,data)
% Fonction de test permettant d'envoyer et de recevoir alternativement des
% données sur le port com. Il faut d'abord déclarer le port et l'ouvrir.
% Attention il faut envoyer des données de 23 octets.
% s : variable associée au port série.
% number : nombre de messages envoyés.
% data : données envoyées. (par exemple data=1, data=[2,3]...)
k=0;
l=23;
tic
while k<=number
while s.BytesAvailable<l
end
fread(s,l);
fwrite(s,data)
k=k+1;
end
toc
73
Projet Quadricoptère 2005/2006
TTX = transmission
à 19200 bps
B= Bytes
0<B<64 T = 41,6 + (0,4*B) ms
B>63 T = 66,8 ms
Par contre, en cas de liaison bidirectionnelle alternée (ce que l'on veut mettre en place),
il faudrait que le canal soit réinitialisé à chaque fois.
74
Projet Quadricoptère 2005/2006
On peut cependant régler une option (SY (Time before Initialization) Command) qui
permet de ne réinitialiser que x secondes après le changement de mode. Il est ainsi
possible de ne jamais envoyer ce RF analyzer s’il y a une alternance continue de
messages montants et descendants.
Par exemple : on règle le SY à 300ms et le temps entre deux envois est de 100ms. Etant
donné que le compteur est remis à zéro à chaque envoi il n’atteint jamais 300ms et on
n’a jamais de RF analyzer.
Il faut aussi prendre en compte le temps de commutation entre les différents modes :
Transmit -> Receive : 20ms
Receive -> Transmit : 16,8ms
4.1.3.2. Théorie
Gain du SY = 70ms
sans SY = 175ms
avec SY = 110ms
75
Projet Quadricoptère 2005/2006
Nous nous sommes donc aperçu que le réglage du SY à une valeur supérieure à 200 ms
permet de faire passer le temps entre 2 messages envoyés de 175ms à 110ms pour des
paquets montants et descendants de 23 octets. Ces 110ms sont conformes à la
documentation fournie par le constructeur.
Ce débit peut être suffisant car on a un drone asservi qui, normalement, est stabilisé
sans consigne. Cette sous-tâche a permis de valider un débit correspondant à 23 octets
toutes les 110ms en bidirectionnel. Reste à savoir les conditions de réception des
modems.
Pour mesurer effectivement la portée des Maxstream, nous avons utilisé le « range test »
du X-CTU et nous sommes allés au Parc de Sceaux. Le réglage de SY ne modifie en rien
les résultats.
• En ligne droite sans aucun obstacle entre les 2 modems la portée peut atteindre
1400m (limite maximale qui représente la largeur du parc de Sceaux, nous
n’avons pas pu aller plus loin). A cette distance on reçoit 100% des messages.
• En revanche à cette distance si on met un obstacle devant un modem (par
exemple la main), la communication est rompue.
• A n’importe quelle distance si il y a des obstacles du type rangée d’arbre, la
communication est rompue. Il parait indispensable à un moment de réaliser des
tests prenant en compte l’occultation.
4.1.4.2. Conclusion
On a donc validé les modems (et eux seuls) pour une liaison bidirectionnelle. Il
faut maintenant mettre en place la liaison avec le quadricoptère pour affirmer que les
débits suffisent. Reste le problème de l’occultation, il faudra donc faire des tests
approfondis.
76
Projet Quadricoptère 2005/2006
Il s’agit dans notre cas de pouvoir envoyer des données au quadricoptère en vue
d’exécuter des vols en mode automatique et pour s’affranchir de la radiocommande de
modélisme.
77
Projet Quadricoptère 2005/2006
Au final nous avons choisi la troisième solution, la plus évoluée et celle dont on connaît
déjà les technologies.
Cette prise en main a été réalisée avec l’aide des groupes Capteurs et Algo/Calculateur
embarqué qui avaient déjà fait ce travail. Ainsi nous avons pu accélérer notre processus
d’apprentissage de l’utilisation du kit de développement et du langage C.
Nous avons fait des programmes simples d’allumage de LED en C pour comprendre les
« réactions » du système.
Pour introduire les sous-objectifs suivants, voici un schéma explicitant le transit des
informations dans l’ATMega au sol :
78
Projet Quadricoptère 2005/2006
Le premier test consistera en une vérification des capacités bidirectionnelles des entrées-
sorties de l’ATMega.
Ensuite nous nous occuperons de mettre en place et tester la liaison descendante à
travers l’ATMega.
Enfin nous nous chargerons d’interfacer un dispositif de commande manuelle sur le kit de
développement et de mettre au point le message montant.
Ensuite nous avons fait un programme qui renvoie ce qu’il reçoit sur le même port.
L’ATMega gère parfaitement le bidirectionnel via ports UART, la transition Envoi-
Reception est immédiate. Ces programmes sont très simples. Il n’est pas indispensable
de comprendre toutes les subtilités d’une interruption comme SIGNAL(
SIG_UART1_DATA ). Il suffit de savoir l’utiliser. Le programme correspondant est donné
en Annexe 1.
Il reste encore à coordonner précisément les flux alternatifs de données pour assurer une
liaison optimale.
79
Projet Quadricoptère 2005/2006
Cependant, nous avons réalisé que nous devrons mettre en place plusieurs fonctions de
type « putc ». Les fonctions « put » servent à envoyer des données sur un port UART.
Il faut également noter que nous procédons à une vérification supplémentaire des
headers et du checksum pour supprimer les erreurs de transmission.
Nous avons discuté de ce transfert avec l’équipe IHM et il nous a paru intéressant de
pouvoir afficher certaines informations sur les LED du kit de développement notamment
des informations indispensables au décollage du mini-drone comme l’activation du GPS.
Cette information est donnée par le mode de fusion des données de la MIDG II, l’INS.
Nous avons donc créé un programme que nous avons testé avec succès en vol avec le
quadricoptère. Ainsi si INS=1 alors on a une LED du kit allumée sur deux, si INS=0 alors
toutes les LED sont allumées. On peut bien sur changer ce réglage facilement pour
n’avoir l’information que sur une LED et afficher d’autres informations sur les autres LED
(détection d’obstacle…).
80
Projet Quadricoptère 2005/2006
L’interface retenue est le SPI (Serial Protocol Interface). On nous a fourni un rapport très
complet que nous laisserons à la future équipe quadricoptère. Le message provenant du
gamepad se présente comme ça :
Lors d'une requête de lecture, le gamepad renvoie l'état des boutons sur 2 octets (4e et
5e octet) la position des 2 sticks sur quatre octets (6e, 7e, 8e et 9e octet) ainsi que la
pression des 12 boutons (les boutons des stick droit et gauche ne sont pas équipés
de capteur de pression)
La pression des boutons est codée de 0 à 255 (0 = bouton relâché).
81
Projet Quadricoptère 2005/2006
byte data
b7 b6 b5 b4 b3 b2 b1 b0
1st byte 0xFF (255)
2nd byte 0xF3 (243)
3rd byte 0x5A (90)
4th byte gauche bas droite haut start * ** select
5th byte carré croix rond triangle R1 L1 R2 L2
6th byte Stick droit gauche<-> droite Gauche:00h,Centre:80h,Droite:FFh
7th byte Stick droit haut <-> bas Haut:00h,Centre:80h,Bas:FFh
8th byte Stick gauche gauche<-> droite Gauche:00h,Centre:80h,Droite:FFh
9th byte Stick gauche haut <-> bas Haut:00h,Centre:80h,Bas:FFh
10th byte pression : droite
11th byte pression : gauche
12th byte pression : haut
13th byte pression : bas
14th byte pression : triangle
15th byte pression : rond
16th byte pression : croix
17th byte pression : carré
18th byte pression : L1
19th byte pression : R1
20th byte pression : L2
21th byte pression : R2
* bouton stick droit (pression sur le stick).
** bouton stick gauche (idem).
82
Projet Quadricoptère 2005/2006
Remarque : nous avons eu un problème qui nous a bloqués pendant un bon moment.
Pour utiliser la manette nous devions être réglés en horloge interne alors que pour tous
les autres programmes nous étions en horloge externe avec un cristal 16MHz. Voici le
cavalier à changer et le cristal sur la gauche :
83
Projet Quadricoptère 2005/2006
Désirant ne se confronter qu’à un problème à la fois, nous avons décidé de séparer les
difficultés.
Test de la liaison bidirectionnelle seule en branchant la radiocommande de modélisme sur
l’ATmega au sol qui fait transiter l’info via les Maxstream.
Test du gamepad seul en utilisant comme liaison montante l’émetteur de la
radiocommande.
Si les deux tests sont concluants, rencontre des deux nouveautés : liaison
bidirectionnelle et gamepad.
La radiocommande délivre un signal PPM (Pulse Position Modulation). C’est une trame de
créneaux d’amplitude constante où l’information est contenue dans l’écart entre ces
créneaux. Le détail de cette trame PPM peut être trouvé dans les rapports des années
précédentes.
Il s’agit de pouvoir distinguer ces créneaux du bruit et d’enregistrer dans une liste ces
ppm_pulses.
On envoie une liste accompagnée de headers et d’un checksum sur l’UART1.
Le programme de décodage de la trame PPM peut être trouvé en Annexe 3.
84
Projet Quadricoptère 2005/2006
85
Projet Quadricoptère 2005/2006
débit trop élévé pour nos modems, même pour un message de 11 octets (2 headers, 2x4
octets, 1 checksum).
Il faut donc coordonner les envois et mettre en place une alternance tout en prévoyant
les pertes de transmission (timeout…).
Nous avons besoin de deux kits de développement STK500-501 pour tester cette liaison
au sol avant d’effectuer des tests sur le quadricoptère mais, en cette fin d’année, nous
avons eu du mal à obtenir tout le matériel nécessaire car tout le monde en a besoin…
Nous n’avons pas eu le temps de procéder à ces réglages mais nous mettons tout de
même nos idées et nos pistes pour permettre à l’équipe suivante de commencer plus vite
que ce que nous avons pu le faire. Nous fournirons les programmes que nous n’avons
pas pu tester avec nos réflexions sur leur amélioration.
Un test sur le quadricoptère permettra de déterminer si les modems sont suffisants pour
notre projet de liaison bidirectionnelle. Sinon, il faudra procéder au test de nouveaux
modems.
86
Projet Quadricoptère 2005/2006
Cet objectif ne pourra être entrevu que lorsque nous aurons une liaison bidirectionnelle
parfaite entre le quadricoptère et la station sol via les modems et l’ATMega au sol. C’est
donc un objectif primordial de nos successeurs.
Il faudra rajouter la liaison suivante (en vert) :
Cet objectif ne pourra être atteint qu’en collaborant avec les équipes IHM et Algorithme
qui ne sont pour l’instant pas encore prêtes à envisager la navigation par waypoints. A
priori l’équipe Transmission n’aura qu’à faire transiter l’information. Il faut tout de même
prendre en compte les problématiques de passage du mode automatique au mode
manuel et surtout le débit des modems qui peut encore une fois être insuffisant.
87
Projet Quadricoptère 2005/2006
4.6. Conclusion
Au final, nous n’avons pas réalisé tous nos objectifs pour l’année. Cependant nous
laissons une base importante de travail pour l’équipe qui prendra le relai. Nous tenons
réellement à éviter à cette équipe les difficultés que nous avons rencontrées en début
d’année.
Il est dommage que nous n’ayons pas eu plus de temps pour finaliser notre liaison
bidirectionnelle, le travail est devenu de plus en plus intéressant au long de l’année. Il
semble que cette liaison puisse être réalisée et qu’elle apportera beaucoup au
quadricoptère en proposant des envois montants de données.
88
Projet Quadricoptère 2005/2006
5. STRUCTURE
5.1. Introduction
Le sous groupe structure fut constitué par une personne cette année-ci comme l’année
précédente. A cause des difficultés rencontrées au début du projet pour définir les
priorités du projet et les tâches à accomplir, la répartition des membres dans les
différents sous-groupes a été difficile. Par conséquent, le sous-groupe structure a été
« dissous » pour pouvoir travailler avec le sous-groupe interface homme-machine (IHM)
sur du code. Nous pensions que l’enjeu principal était de gagner du poids en optimisant
la structure actuelle, mais nous nous sommes rendu compte que le groupe structure
avait bien plus de points à traiter (par exemple, les réparations suite aux nombreux
crashes,…)
En définitive, le sous-groupe structure est indispensable et doit être effectif durant toute
l’année. La structure nécessite sans cesse des améliorations, des réparations et la
fabrication de pièces nouvelles ou de rechange. L’ennemi principal est le poids. Mais la
résistance aux crashes du quadricoptère reste un impératif important à ne pas négliger
(par exemple : solidifier les assemblages, améliorer la rigidité, protéger les hélices,…)
89
Projet Quadricoptère 2005/2006
Les outils de base de la conception sont fournis de nos jours par la CAO (conception
assistée par ordinateur). Mais nous rencontrons un problème majeur : l’impossibilité de
construire les maquettes numériques dessinées sous Catia. Nous avons la possibilité de
sous-traiter la fabrication à une firme extérieure, mais le prix d’une telle fabrication et
nos connaissances limités dans la fabrication (basée principalement sur l’expérience) en
matériaux composites est un des freins principaux à cette option. De plus nous n’avons
pas la possibilité de réparer le drone en cas de casse.
Le point clé du sous-groupe structure reste la réalisation de la structure. Par conséquent,
la maîtrise des moyens de fabrication utilisés pour la structure du drone est
indispensable.
Nous pouvons dresser une liste des éléments formateurs intéressants à faire dès le début
de l’année :
• formation usinage (voir M. Le Gal, très compétent dans tous les domaines)
• formation Catia proposée par M. Pascal Morenton pour les projets de 2ième année
(attention, Catia est très complet mais aussi très complexe, la maîtrise de ce
logiciel peut prendre plus d’un an dans certains cas…)
• acheter les équipements nécessaires à la découpe du carbone (masques, outils au
diamant,…) et les matières premières (aller chez Weber Métaux, Paris 3ième)
• se familiariser avec les matériaux composites (shows,… par exemple
www.jeccomposites.org)
• bricoler et se familiariser avec les outils disponibles (voir dans les différents
labos : LEE-E=M6, labo de M. Le Gal,…).
5.3. Objectifs
Les objectifs du groupe structure autres que le gain de poids n’apparaissent que durant
l’utilisation au cours de l’année du drone et sont limités par les compétences acquises par
les membres du sous-groupe structure. Par conséquent, il est très difficile de fixer des
objectifs réalisables en début d’année. Par contre, la fabrication de pièces de rechange et
les améliorations qui en découleront doivent rester au programme (ce qui avait été un
peu négligé cette année-ci) dès le début du projet et guideront les évolutions de la
structure et objectifs de ce sous-groupe.
Par conséquent, nous ne listerons pas des objectifs, mais les objectifs et les tâches
effectués au cours de cette année :
• optimisation de la structure existante et gain de poids
• nouvelle fixation des moteurs
• établissement d’une méthode pour adapter les hélices à nos moteurs
• structure démontable
• autres évolutions
90
Projet Quadricoptère 2005/2006
91
Projet Quadricoptère 2005/2006
énantiomorphes deux à deux. Très peu de ces hélices sont disponibles sur le marché et
nous devons composer avec celles qui nous conviennent le mieux. Malheureusement,
elles ne se montent pas facilement sur les moteurs qui équipent le quadricoptère.
Jusqu’à présent, nous percions le moyeu des hélices au diamètre du filet de la cage
tournante du moteur et nous limions l’excédent de matière qui nous empêchait de serre
l’écrou. Cette manipulation était assez imprécise et peu reproductible (comme illustré
dans cette photo où deux hélices modifiées ne sont pas pareilles).
Nous avons mis au point un protocole beaucoup plus net et précis pour modifier les
hélices qui repose sur l’usinage des hélices sur un tour et sur la fixation des hélices au
moyen d’un adaptateur spécifique dans les mords de l’étau de la machine-outil. L’hélice
ainsi modifiée possède des surfaces de contact plates, parallèles et est percée dans son
axe de part en part et avec une encoche à sa base.
Toujours dans l’optique de supprimer les collages pour améliorer la solidité des
assemblages et le démontage de la structure, nous avons profité de l’usinage des
supports moteurs pour appliquer cette même méthode au centre de la structure. L’idée
est de séparer la structure en un moyeu central sur lequel vient se monter l’étagère,
quatre tubes constituant les bras de la croix, et les supports des moteurs. Ainsi, nous
bénéficions d’une structure démontable et nous explorons d’autres perspectives pour la
structure.
Les variantes sont nombreuses et il est difficile de prédire quelle structure donnera les
meilleurs résultats sans l’avoir construite au préalable. De même, il est difficile de définir
des cotations sans avoir réaliser une pièce à blanc : soit les contraintes appliquées à la
pièce peuvent être trop importante, soit nous ne pouvons pas l’usiner avec de petites
épaisseurs, ou alors nous pouvons utiliser un autre matériau.
Une des solutions envisagées est l’usinage d’un bloc central dans lequel viendraient se
loger les quatre tubes en carbone. Ils se solidariseraient par serrage au moyen d’une
petite vis. Différentes solutions sont proposées dans les modèles Catia ci-dessous :
- Ici, une plaque en PVC est usinée en un seul bloc pour réaliser le premier étage de
l’étagère et les fixations des bras.
92
Projet Quadricoptère 2005/2006
Nous aimerions ajouter quelques évolutions auxquelles nous avions pensées, mais que
nous n’avons pas réalisées par manque de temps, d’utilité, de matériel, ou simplement
parce qu’elles ne sont pas réalisables. Nous listerons ci-dessous certains de ces points
avec quelques commentaires :
5.4.5.1. Atterrisseur
Si le quadricoptère atterrit trop brusquement et avec une assiette qui n’est pas
horizontale, une des tiges en carbone qui lui sert d’atterrisseur peut s’enfoncer et une
des hélices peut heurter le sol.
Le problème pourrait disparaître si une balle de ping-pong est collée à l’extrémité du
tube. Une autre solution serait de changer les atterrisseurs, mais nous n’avons pas
encore trouvés de solutions mieux adaptées.
Les plateaux de l’étagère sont des carrés de 8x8cm. Ils ont été dimensionnés suivant la
disposition des éléments électroniques qu’ils accueillaient. Cependant, si nous désirons
augmenter le nombre de batteries, nous devrons peut-être envisager de passer à des
carrés de 10x10cm. La structure pourrait alors embarquer 4 packs d’accus LiPo (~20
minutes d’autonomie de vol). Ce choix est conditionné par la taille des accus qui évoluent
tous les mois en fonction des avancées technologiques et conditionne le
dimensionnement des nouvelles cartes électroniques. La prochaine équipe devra accorder
une importance particulière à la détermination de ce point. Un telle adaptation est assez
difficilement applicable à la structure actuelle, mais se réalise relativement rapidement
sur la structure démontable.
93
Projet Quadricoptère 2005/2006
leurs positions dans l’espace fixés ingénieusement et qu’un local équipé soit mis à la
disposition des élèves.
D’autres solutions telles que des « boudins » qui s’adapteraient sur la structure actuelle
et entoureraient les hélices peuvent être envisagées. Mais là encore, la réalisation de tels
dessins nécessite la mise en forme de matériaux composites qui ne nous est pas
autorisée et qui nécessitent une expérience pratique assez importante. L’usage de
mousse renforcée par des tubes ou tiges en carbone pourrait être envisagé, mais cette
réalisation doit être capable de résister aux chocs.
94
Projet Quadricoptère 2005/2006
Nous avons choisi de modéliser le quadricoptère sous Catia. Tous les éléments ont été
modélisés numériquement. Un matériau a été associé à chaque composant. Le tout a été
assemblé et nous tirons de cette maquette sa matrice d’inertie au centre de gravité, son
poids total,…
L’avantage est que nous pouvons changer tous les composants de la structure et les
remplacer par des alternatives. Nous pouvons ainsi calculer le gain de poids, vérifier si le
positionnement est possible, s’il n’y a pas de risque de collision,…
Nous pouvons appliquer la même démarche pour le matériel électronique embarqué.
Nous pouvons ainsi déterminer la disposition de chaque élément sur le quadricoptère afin
d’avoir l’architecture la plus simple, la plus légère, tout en conservant un centre de
gravité correcte.
En conclusion, cette méthode nous permet de valider une idée sur un objet qui
s’approche le plus de la réalité avant de la mettre en œuvre sur le drone. Cette opération
permet de mettre en évidence certains désavantages ou inconvénients de solutions
possibles qui ne seraient apparus que pendant la modification de la structure, évitant
ainsi une éventuelle manipulation inutile voire irréversible. Même dans les autres tâches,
Catia nous aura souvent permis de valider une solution avant de la mettre en application.
Toute la structure repose sur les propriétés des matériaux composites en carbone :
légèreté, rigidité,… L’inconvénient est que la colle ne tient pas très bien sur ces surfaces
et l’usinage et la mise en forme du carbone sont très difficiles. Tout perçage ou usinage
du carbone induit une faiblesse dans la structure et représente une amorce de fissure qui
peut se propager dans tout le tube et causer la destruction (en vol ou au sol) de toute la
structure. Nous avons donc fabriqué des pièces qui assurent la jonction entre les tubes
en carbone de la structure et les moteurs.
95
Projet Quadricoptère 2005/2006
Nous disposons ainsi d’un assemblage démontable. Les avantages sont multiples. Nous
citerons la modularité de la structure, le remplacement rapide des pièces cassées, les
possibilités d’avoir une structure démontable pour le transport et de changer facilement
de type/marque de moteur… La pièce usinée en PVC pèse 9gr avec la vis et l’écrou. Il est
possible de reprendre un peu de matière sur chaque face et de faire une entaille en
dessous de la tige filetée du moteur. Ces modifications nous permettraient d’arriver en
dessous des 7gr qui sont le poids actuel du support (plaque en carbone et écrou). Ces
nouveaux supports sont donc déjà plus légers que les anciens car le poids de la colle et
des fibres pour fixer la plaque excède largement 2gr.
L’usinage est assez simple mais requiert de la rigueur et donc du temps. Les pièces ont
été réalisées sur la fraiseuse de l’atelier du L.E.E. et nous disposons du matériel
nécessaire pour réaliser des pièces convenables (attention à ne pas laisser s’exprimer de
manière déraisonnable ses inspirations lors de la conception, les formes un peu
complexes nécessitent rapidement une machine-outil numérique…)
D’autre part, des variantes peuvent-être imaginées. Par exemple, le
moteur peut être légèrement surélevé pour laisser un accès direct au
tube en carbone et y glisser les fils électriques d’alimentation du moteur.
Nous pouvons également penser à adapter les atterrisseurs à ces
supports,…
Il ne fait aucun doute que l’utilisation de pièces usinées a sa place au sein de ce projet.
Les assemblages s’en trouvent largement facilité, la modularité est belle et bien
présente, la fabrication des pièces n’est pas nocive pour la santé (contrairement à la
poudre de carbone) et nous disposons d’un atelier équipé pour les usiner.
La structure du quadricoptère est basée sur la forme d’une croix. Lors des années
précédentes, nous avons utilisés des tubes en carbone de 8mm de diamètre que nous
emboitions ensemble après avoir effectué une encoche en leur centre et que nous
collions avec de l’époxy. Ce collage était renforcé par le bobinage de fibres de carbone et
de résine époxyde. Ce montage résiste assez bien, mais casse facilement en cas de
96
Projet Quadricoptère 2005/2006
crash. Nous avons donc renforcé la structure avec un cadre réalisé en tubes de carbone
également. Son rôle est bien assuré, mais seulement au détriment d’un alourdissement,
inutile tant que le drone ne tombe pas.
La seule façon de remédier ce problème est de concevoir de nouvelles architectures de
croix et de les tester en vol ou par des tests sur une structure achevée. Le caractère
démontable d’une nouvelle structure rend donc le remplacement de pièces cassées
possible. Par conséquent, nous avons adapté la solution des supports pour les moteurs
au centre de la croix, et nous avons remplacé le collage par un assemblage mécanique
un peu plus complexe, mais qui fournit de très bons résultats.
Les bras de la croix deviennent indépendants : ils se résument à de simples tubes en
carbone. Ils viennent s’emboiter dans la partie centrale qui est une « grosse plaque » de
l’étagère. Par conséquent l’étagère s’adapte
sans problème à notre nouvelle structure, et
de l’extérieure, rien ne laisse distinguer le
changement de structure. Cette pièce
centrale se compose de deux plaques en
carbone horizontale de la taille de l’étagère.
Entre celles-ci viennent se loger des
embouts, parallélépipèdes rectangles,
usinés en PVC, percés puis fissurés sur une
de leur face latérale pour permettre leur
déformation et ainsi serrer le tube. Ces
embouts sont maintenus en place par deux
vis et deux écrous qui traversent également
les deux plaques et assurent ainsi le
maintien et le serrage du bras de la croix.
Pour supprimer tout jeu résiduel, nous avons collés ces blocs aux plaques en carbone en
utilisant de la colle cyano. Nous obtenons ainsi un centre de croix rigide, peu déformable,
démontable et léger, sur laquelle est fixé rigidement l’étagère (plus de collage) et
présentant un système de fixation des tubes sure et efficace (le collage est remplacé par
un serrage périphérique mécanique).
97
Projet Quadricoptère 2005/2006
La modélisation sous Catia nous permet d’effectuer des modifications sur le drone
de manière virtuelle. Elle nous donne également des informations sur les propriétés
massiques du drone (poids, matrice d’inertie, centre de gravité,…) et ce même après
modifications. Ces données sont précieuses et ne peuvent se calculer facilement de
manière théorique.
Nous avons donc modélisé la structure actuelle du drone. Lorsque toute l’électronique
sera choisie par les autres sous-groupes, nous modéliserons ces éléments, et nous seront
en mesure de les implanter sur la maquette du drone. Nos pourrons ainsi déterminer les
positions optimales pour chaque composant afin de limiter le poids de la structure et de
comparer les différentes solutions structurales.
98
Projet Quadricoptère 2005/2006
Nous avons pour l’instant réalisé que quelques supports pour les
moteurs. Nous essayons à chaque fois d’y apporter une
différence. Par exemple, une géométrie différente, un gain de
poids par la réduction des épaisseurs,… L’objectif est d’obtenir
une pièce qui est rigide, légère, simple à produire, qui assure
une fixation efficace du moteur et qui est fonctionnelle
(possibilité de laisser passer les fils électrique dans le tube en
carbone).
La pièce illustrée ci-joint en est la première version. Elle est
légère et robuste. Nous avons essayé de la faire pivoter
lorsqu’elle était montée sur un tube en carbone. Même au moyen d’une clé anglaise,
nous n’avons pas pu la tourner. Cet exemple illustre l’efficacité d’un tel serrage et
explique donc notre engouement pour une telle solution.
Actuellement, deux des hélices qui équipent le quadricoptère ont été adaptée par
cette méthode et présentent un fonctionnement sans reproche.
Cette méthode nous permet d’effectuer un serrage sur deux surfaces planes parallèles et
nous garantit une précision de l’ordre de quelques centièmes de millimètres si l’usineur
est bon. De plus, la méthode de fixation et la pièce usinée à
cet effet garantit une fixation dans l’axe et donc un
reperçage des hélices centré, propre et reproductible.
Nous avons donc défini un protocole qui permet de
reproduire sur des machines-outils la démarche que nous
effectuions manuellement avec des limes et une perceuse
pour adapter sur le quadricoptère un des éléments les plus
essentiels que sont les hélices. Nul ne peut mettre en doute
que cette méthode est plus efficace.
Nous avons réalisé en cette fin d’année un centre de structure démontable. Par
manque de temps, nous n’avons pas pu achever la structure dans son entièreté et il
reste à déterminer quels atterrisseurs vont s’y adapter et comment. Cependant, avant de
traiter ces questions, nous devons d’abord observer la structure ainsi réaliser, s’assurer
qu’elle est assez solide et ensuite terminer l’assemblage et réaliser une structure
complète en y ajoutant les tubes, les supports moteurs et l’étagère.
Les essais actuels montrent que ce centre de croix permet un léger déplacement des
tubes des bras de la croix. Ces déplacements sont dus au jeu des vis qui assurent
l’assemblage dans les trous des différents
composants. Nous avons donc collé les
blocs en PVC aux plaques en carbone et
nous obtenons un résultat très
satisfaisant : tout le jeu a disparu. La
rigidité est très bonne car les efforts sont
repris par les plaques en carbone. Les
déformations angulaires dans toutes les
orientations sont réduites. Ces
améliorations mécaniques conduisent à
des solutions et ouvrent des voies
d’amélioration, par exemple, la rigidité de
l’ensemble nous permettrait de nous
passer du cadre de renfort installé sur la
99
Projet Quadricoptère 2005/2006
structure actuelle. De même, nous pourrions essayer de diminuer le diamètre des tubes
pour gagner du poids.
En conclusion, nous avons réalisé une structure alternative dont la différence de
poids par rapport à l’ancienne est négligeable (ancienne structure de croix sans cadre
rigidifiant ~95gr, nouvelle structure : centre 41gr, 4 tubes : 24gr, attache moteur : 9gr,
total : 101gr) et qui présente des solutions (cadre rigidifiant superflu) et de nombreux
avantages tels (rigidité, modularité, démontage, réparations,…). Si nous tenons comptes
de tous ses avantages, nous avons une croix de structure plus performante et plus légère
dans l’absolu (bien que des progrès puissent encore être faits pour alléger les nouvelles
pièces)
5.7. Conclusions
Cette année, la structure n’était pas au centre de nos préoccupations car nous
désirions évoluer en priorité dans les autres domaines. Mais nous nous sommes aperçu
que le drone nécessitait sans cesse de la maintenance et des réparations suite aux
crashes. Comme la structure actuelle n’est pas démontable, elle est destinée à mourir.
Par conséquent, nous nous sommes à nouveau pencher sur la question de la structure,
malheureusement trop tard pour fournir des solutions complètes.
Par contre, nous avons progressé dans nos méthodes de production. Nous avons des
contacts au près de plusieurs techniciens usineurs et nous maitrisons un minimum les
machines outils de l’atelier du LEE. Ce point est sans doute la première compétence que
doit acquérir les élèves du groupe structure. La réalisation est la base de la conception
des pièces et un minimum d’expérience est nécessaire pour arriver à des résultats
probants.
100
Projet Quadricoptère 2005/2006
La carte actuelle est bien fonctionnelle sur le plan électrique, mais lors des tests de vol,
plusieurs problèmes essentiellement de connectique sont apparus. Il fallait donc revoir la
carte en lui ajoutant certaines modifications
Les connecteurs étant tous bricolés de façon assez grossière n´assuraient pas une bonne
accroche et plusieurs fils se détachaient même soudainement lors des tests.
Ce problème affectait aussi les connecteurs de l´ATMEGA que ceux des moteurs.
On a donc procédé à la recherche de connecteurs adéquats pour chacune de ces
fonctions
Ces connecteurs doivent transmettre des courants assez puissants, des connecteurs du
type PIN HEADER qui sont utilisés sur la carte sont d´ailleurs pas conçus pour ce type
d´utilisation. Nous avons eu deux choix possibles : garder la même forme de connecteur
mais chercher un autre modèle qui tient mieux.
Exp. : les connecteurs de la marque JST (www.jst.com) sous Wire to Board /
Disconnectable/ VL connector.
Ou utiliser des connecteurs à vis, qui sont généralement retenus pour cette application.
Le choix s´est fait sur les derniers, car comme on ne touchait que très rarement aux fils
du moteur, ils garantissent un maintient absolu du contact. En plus des différents
modèles étaient disponibles dans le catalogue Radiospare ce qui facilite la commande:
des connecteurs phoenix (www.phoenixcontact.com) assez compacts…
Moteur Alim
Ce choix a été aussi fait pour l´alimentation de la carte. La seule contrainte était de
trouver un connecteur à vis assez compact et qui serait capable de transmettre jusqu´a
40A. L´inconvénient de cette solution c´est que ces connecteurs sont toujours plus
imposants que les connecteurs PIN Header. Il faut donc prendre leurs tailles en compte.
101
Projet Quadricoptère 2005/2006
Les Pin Header de type femelle utilisés ici maintenaient les fils d´une manière
quelconque et un décrochage survenait fréquemment lors des vols. L idée était d´utiliser
les mêmes pin header mais de type male pour pouvoir accrocher dessus des connecteurs
à câble plat. Ces derniers assurent une bonne accroche une fois montés et une facilité de
maniement (accroche/décroche) très pratique. L´inconvénient est qu´ils ont une cage
assez importante. On a donc décidé d´alterner la direction des connecteurs males de la
carte entre les deux faces (voir figure).
Ceci se faisait toujours en court-circuitant avec un bout de fil 2 entrées dans le bloc de
connecteurs de l atmega. L´idée était de rendre l ´opération plus pratique en ajoutant un
bouton poussoir sur la carte qui ne relie ces deux entrées que lorsqu´on appuie dessus.
Pour apporter toutes ces modifications, il fallait donc reprendre le Lay-out (Board) de
l´ancienne carte, tracer les pistes à la main, et changer la disposition des composants
pour créer de la place pour les nouveaux.
Une telle carte permet de communiquer directement avec n´importe quel composant
électronique supportant ce standard (c.a.d possède des entrées/sorties Tx, Rx) en
utilisant le port série de l´ordinateur et le logiciel « Terminal ». Nous avons décidé de
102
Projet Quadricoptère 2005/2006
construire une pour communiquer directement avec l´at90pwm sans devoir passer par le
Stk500 et donc écrire un code.
Le schéma d´une telle carte se retrouve facilement sur internet. L´alimentation est
fournie (5V) par le kit STK520.
103
Projet Quadricoptère 2005/2006
5.9.1. Objectif
104
Projet Quadricoptère 2005/2006
La plate-forme mobile nous fournit la possibilité de monter tous les types de moteurs. Et
si un moteur nécessite un montage particulier, toutes les pièces du banc d’essais sont
démontables. Nous pouvons donc les remplacer à notre guise.
105
Projet Quadricoptère 2005/2006
5.9.4. Conclusions
106
Projet Quadricoptère 2005/2006
L’interface homme- machine joue un rôle important pendant le pilotage du drone sur le
terrain militaire. Elle assure plusieurs fonctions de la communication de la machine avec
le pilote/ navigateur et vice-versa. Lors de l’opération, après avoir perdu le contact visuel
avec le drone, la station sol offre le seul moyen de communication avec le quadricoptère.
Ainsi, c’est d’une importance primordiale pour l’avertissement du drone que la station sol
ne tombe pas en panne ; ceci pourrait conduire à la perte totale du quadricoptère sur le
terrain militaire.
Les enjeux apportés par le groupe IHM de cette année consistent en la restructuration
globale de la station sol afin d’assurer son fonctionnement propre. Le danger principal est
l’ordinateur avec sa dépendance du système d’exploitation Windows qui constitue une
incertitude et donc un point faible.
La restructuration de la station sol consiste en l’intégration d’un microcontrôleur dans la
station sol qui assure le fonctionnement du quadricoptère même si l’ordinateur est déjà
planté. Donc, le microcontrôleur diminue la probabilité de perdre la connexion avec le
quadricoptère lors du vol.
Le développement de la station sol peut être subdivisé en deux parties : le côté hardware
et le côté software.
Le côté hardware est décrit dans la partie transmission, parce que le groupe transmission
a effectué l’étude du microcontrôleur et ses tests. Vu que le microcontrôleur est relié
avec le modem, c’est le groupe transmission qui a géré cette partie.
En ce qui concerne la partie software, la nouveauté est l’interface graphique sous le
logiciel Matlab.
Cette solution permet l’incrustation des données sur le flux vidéo afin d’améliorer le
pilotage et la navigation du drone. Pendant le concours de la DGA, le groupe du projet de
l’année 2004 à 2005 a constaté que la fenêtre vidéo était trop petite et que c’était
impossible de surveiller toutes les données affichées en même temps. Un pilotage facile
pour une personne inexpérimentée avec l’interface graphique était impossible. C’est la
raison pour laquelle l’incrustation des données sur le flux vidéo améliore énormément la
situation.
107
Projet Quadricoptère 2005/2006
Afin de suivre le développement du groupe IHM, nous avons créé un tableau. Celui-ci a
permis de retracer toutes les tâches effectuées et leurs avancements ainsi que les futurs
objectifs du sous-groupe.
GROUPE IHM
DEAD % TEMPS
OBJECTIFS AUTEUR
LINE AVANCEMENT CONSACRE
Commentaires
108
Projet Quadricoptère 2005/2006
• Evaluation de la faisabilité de
chaque info est-ce qu’il est possible
de récupérer les données pour
chaque info ? 25-avr.- Michael et
100%
Est-ce que les valeurs pour chaque 06 Pascal
info sont mesurables/ accessibles ?
Est-ce qu’on peut les transmettre
(débit maximal) ?
Michael et
Comment va-t-on les afficher? 100% 1 séance
Pascal
109
Projet Quadricoptère 2005/2006
Michael et
Programmation 30-mai-06 90% 5 séances
Pascal
Commentaires
Flux vidéo
Initialiser la caméra 9-mai-06 100% Michael 1/2 séance
Réglage des paramètres pour bien
9-mai-06 70% Michael 1/2 séance
afficher le flux vidéo
Commentaires Le flux vidéo n'est pas encore testé avec la caméra du quadricoptère, parce que la
batterie était vide.
Connexion sérielle
Ouvrir le port sériel 9-mai-06 100% Pascal 2h
GUI
Implémentation d'une interface sans Pascal et
26-mai-06 100% 3 séances
utilisation du modem Michael
Michael et
Intégrer le flux vidéo 9-mai-06 100% 1 séance
Pascal
Michael et
Incruster les éléments graphiques 30-mai-06 100% 1 séance
Pascal
Michael et
Intégrer les infos transmises 30-mai-06 100% 1 séance
Pascal
Commentaires
110
Projet Quadricoptère 2005/2006
Commentaires
Tests
11-avr.- Michael et
Tester l'enregistrement des données 100% 1 séance
06 Pascal
Tester la transmission des 25-avr.- Michael et
100% 2h
coordonnées GPS 06 Pascal
Tester le changement de VB à 25-avr.- Michael et
100% 3h
MatLab 06 Pascal
Tester la connexion de l'ordinateur 18-avr.- Michael et
100% 1h
avec l'ATMega de la station sol 06 Pascal
Commentaires
RAPPORTS
Commentaires
111
Projet Quadricoptère 2005/2006
Un des problèmes de l’interface graphique était que les données envoyées par le
quadricoptère étaient toutes perdues à la fin du vol.
Pour assurer et mieux tester le fonctionnement du quadricoptère en vol nous avons
ajouté du code source qui permet d’écrire toutes les données du quadricoptère dans un
fichier .txt. Chaque paquet de données transmis du quadricoptère à la station sol est
ainsi enregistré et sert à retracer le fonctionnement du quadricoptère lors du vol.
Pos. Pos.
Counter Vx Vy Vz Alt. GPS Batt.
Xr Yr
112
Projet Quadricoptère 2005/2006
Pour la suite du rapport de la partie IHM, nous allons vous montrer et commenter les
solutions possibles pour un problème précis. Ensuite, nous allons vous expliquer le choix
pour la meilleure solution (ou la moins mauvaise). Pour conclure chaque problème, nous
allons vous montrer la mise en application de cette solution.
Vidéo
PCTV
Manettes PC Modem
Interface
Pilote
Navigateur
113
Projet Quadricoptère 2005/2006
Avantages Inconvénients
Solution fonctionne Dépendance du PC
Pas d’interfaçage des manettes Trois dispositifs de transmission
Il faut deux utilisateurs
Pas d’infos pour le pilote (vidéo, vitesse,
carte,…)
Conclusion
Il faut constater que la solution actuelle fonctionne sans avoir de bugs. Un
développement de l’interface graphique serait possible, mais ne résout pas les objectifs
fixés. La dépendance de la station sol de l’ordinateur est l’inconvénient principal de la
situation actuelle qu’il faut abandonner.
Vidéo
ou AVR PC
Affichage
Infos
Manettes Interface
Pilote Navigateur
114
Projet Quadricoptère 2005/2006
Les avantages et inconvénients de cette solution sont décrits en détail dans le tableau
suivant :
Avantages Inconvénients
Seulement deux dispositifs de transmission Il faut deux utilisateurs
Indépendance (du pilotage) du PC Coûts élevés à cause du microcontrôleur
Pas de retard à cause du PC Redondance AVR-PC
Pilotage sans navigation/ PC Grande différence par rapport à la situation
actuelle
est basée sur l’ordinateur comme élément principal de la station sol. En diminuant le
nombre de connexion avec le quadricoptère, l’ordinateur est le cœur de cette solution.
Vidéo
PCTV
Manettes PC Modem
Interface
Pilote
Navigateur
115
Projet Quadricoptère 2005/2006
Avantages Inconvénients
Seulement deux dispositifs de transmission Dépendance du PC
Il faut deux utilisateurs
Le principal inconvénient de cette solution est que la station sol dépend fortement de
l’ordinateur, une solution qui n’est pas du tout envisageable.
Vidéo
PCTV
PC Modem
Interface
Pilote et
Navigateur
Avantages Inconvénients
Il faut une personne pour le pilotage et la Dépendance du PC
navigation
Seulement deux dispositifs de transmission
116
Projet Quadricoptère 2005/2006
Cette solution a les mêmes inconvénients comme la solution précédente ce qui mène à
l’abandonner.
Pour mieux comparer les quatre possibilités d’une nouvelle structure, on les regroupe
dans un tableau en évaluant chaque solution par les critères suivants :
Dépendance de l’ordinateur
Coûts
Nombre de dispositifs de transmission
Nombre de personnes (navigateur et pilote, navigateur- pilote)
Le choix final de la solution du microcontrôleur était pris après avoir fait une étude de
faisabilité. Donc, ensuite on va examiner la faisabilité technique de la solution.
L’intégration du flux vidéo sous VisualBasic était déjà réalisée par l’équipe 2004- 2005.
Donc, il reste à déterminer si c’est possible d’intégrer un flux vidéo sous le logiciel
Matlab. Après le conseil de M. Martin et des recherches sur le site web
www.mathworks.com du développeur de Matlab, on a trouvé l’« Image Acquisition
Toolbox » qui permet d’intégrer un flux vidéo sur un port série avec le protocole RS232.
D’après la documentation d’ATMEL AVR STK500, une connexion est établie avec le PC par
le protocole RS232 (http://www.atmel.com/dyn/resources/prod_documents/doc2591.pdf
(vue le 21/03/2006)). C’est-à-dire qu’il reste à déterminer si les deux logiciels Mathworks
Matlab et VisualBasic savent communiquer avec le protocole RS232. La documentation
de Matlab
(http://www.mathworks.com/access/helpdesk/help/toolbox/xpc/io_ref/index.html (vue le
21/03/2006)) montre qu’il est possible d’ouvrir un port série et communiquer avec le
protocole RS232.
117
Projet Quadricoptère 2005/2006
Comme conclusion, on peut constater que la solution envisagée ne pose pas de problème
de faisabilité technique.
118
Projet Quadricoptère 2005/2006
Les critères principaux pour le choix entre les logiciels Matlab et VisualBasic étaient,
grosso modo, le flux vidéo et l’incrustation des images sur le flux vidéo.
Comme il n’existait pas encore une documentation détaillée du code en Visual Basic,
nous avons commencé avec celle-ci pour bien comprendre le code qui était programmé
par l’équipe de l’année 2004/2005. Ceci était aussi important parce que tous les tests
n’étaient possibles qu’avec ce programme. Pour améliorer les tests nous avons après
intégré la possibilité d’enregistrer les données transmises.
Du côté Matlab, nous avons essayé d’intégrer des solutions du code en Visual Basic et
d’un programme de M. Martin, qu’il avait écrit pour tester l’intégration du flux vidéo et du
port sériel en Matlab. Le but principal du nouveau programme est d’améliorer l’utilité et
la clarté du GUI. Tous les programmes sont expliqués en détail dans l’annexe.
Bien que l’affichage du flux vidéo et la récupération simultanée des données par le port
sériel aient bien fonctionné lors des tests avec la vieille centrale inertielle, le programme
ne fonctionnait plus au dernier moment lorsque nous avons assemblé les deux parties du
code pour le flux vidéo. Ce problème, déjà rencontré en Visual Basic, est décrit dans le
rapport 2005. Malheureusement, nous n’avons pu trouver de solution à ce jour.
En outre la qualité du flux vidéo n’est pas toujours excellente. Bien que l’image soit très
bonne quand on l’affiche avec le logiciel PCTV, elle se dégrade fortement quand on
l’affiche avec Matlab.
119
Projet Quadricoptère 2005/2006
Nous pourrions imaginer une version du programme avec une petite carte (« minimap »)
du terrain pour afficher la position du drone et son environnement. Pour le moment nous
avons juste mis une image du terrain de rugby à la place de cette carte.
Comme le navigateur veut peut-être regarder quelques informations plus en détail
pendant le vol du drone, on pourrait imaginer qu’il pourrait agrandir quelques éléments
du GUI en posant la souris en dessus ou d’afficher plus d’informations si nécessaires.
120
Projet Quadricoptère 2005/2006
En une phrase, le but global de notre projet est le vol autonome du Quadricoptère.
Les tests Hardware-in-the-Loop (HIL) combinent dans une même boucle de simulation
des composants softwares et hardwares afin de tester des systèmes dans les conditions
du monde réel, sans pour autant devoir disposer du véhicule complet.
L’intérêt du HIL est de fournir une validation des contrôleurs hors véhicule.
L’objectif de notre groupe est de fournir un système Hardware-in-the-loop (HIL) aux
autres groupes. Ce système devant permettre la simulation du comportement du
Quadricoptère ainsi que le test et la validation de nouveaux algorithmes de contrôle.
Les données dont nous disposions étaient le résultat des travaux de développement des
années précédentes à l’Ecole Centrale Paris : structure physique, capteurs, et
implémentation hardware du contrôleur
Il existe différentes versions et types de contrôleurs, ces derniers ont été optimisés au
cours des essais en vol ou à l’aide d’outils d’optimisation fournis par MATLAB. Leur rôle
est d’assurer un comportement « stable » et « satisfaisant » en fonction des consignes et
références choisies. Avec le système HIL, il est facile de tester des paramètres modifiés
ou même de nouvelles lois de contrôle (par exemple la compensation de saturation).
La simulation offre beaucoup plus de possibilités que l’expérience réelle pour récupérer et
afficher les variables de vol. Ainsi, la modélisation du drone et l’intégration des
algorithmes existants apportent de nouvelles connaissances sur le contrôle en général.
GROUPE HIL
DEAD
OBJECTIFS % AVANCEMENT
LINE
Connaisances de base
21-mars-
S'initier au développement sur STK500 99%
06
Commentaires
Commentaires
121
Projet Quadricoptère 2005/2006
17-janv.-
Comprendre la communication via PWM dans le main.c 90%
06
17-janv.-
établir un lien ATMEGA-Target PC via PWM 100%
06
17-janv.-
connexion basique PCI-CTR05 100%
06
17-janv.-
affichage PWM sur xPC 100%
06
17-janv.-
créer 1 PWM avec l'Atmega 100%
06
17-janv.-
créer 4 PWM avec l'Atmega 100%
06
17-janv.-
filtrage des pertubations 80%
06
Commentaires
Bouclage xPC-Atmega
établir une communication o xPC (RS232) Atmel (PWM) 14-mars-
100%
xPC (Scope) 06
établir une communication o Atmel (PWM) xPC (RS232) 14-mars-
100%
Atmel (Leds) 06
établir un système simple de stabilisation en boucle 21-avr.-
100%
fermée (1 PWM-RS232) 06
établir un système simple de stabilisation en boucle
2-mai-06 100%
fermée (timer = RS232, 1 PWM)
établir un système proche de Quadri de stabilisation en
2-mai-06 100%
boucle fermée (timer = RS232, 1 PWM)
établir un système proche de Quadri de stabilisation en
2-mai-06 100%
boucle fermée (4 PWM-RS232)
établir un système proche de Quadri de stabilisation en
2-mai-06 100%
boucle fermée (I2C-RS232)
établir un système proche de Quadri de stabilisation en
2-mai-06 100%
boucle fermée (PWM-I2C&RS232)
simulation du Quadri sous xPC 16-mai-06 80%
Réaliser le bouclage (stable) ATmega-Target PC (avec le
16-mai-06 50%
main.c et le modèle de quadri)
Commentaires
122
Projet Quadricoptère 2005/2006
28-mars-
Rédiger un guide de démarrage pour HIL 100%
06
Plateformes de tests Vdef our les groupes 16-mai-06 0%
Synthèse méthode déf. pour rapport (2/3 pages) 16-mai-06 100%
Commentaires
RAPPORTS
14-mars-
Rédaction du rapport intermédiaire II - Vbeta 0%
06
28-mars-
Rédaction du rapport intermédiaire II - Vdef 0%
06
Rédaction du rapport final - Vbeta 16-mai-06 100%
Rédaction du rapport final - Vdef 30-mai-06 100%
Commentaires
The sciences automation and control engineering provide a wide range of algorithms for
the identification and control of systems. The keyphases for practical implementation of
process controls are the design of a controller and the tuning of the same.
This step includes the modeling and simulation of the process as well as the design of an
appropriate controller.
One possibility for the analysis and modeling of the system is to compare the behaviour
of the process (step response, nyquistplot) to general models. The parameters are
123
Projet Quadricoptère 2005/2006
Another way is the direct modeling of the system through physical assumptions and the
derivation of a model from the mathmatical equations. Practical experiences may still be
needed to obtain all relevant parameters.
Tools like Matlab/ Simulink can now be used to simulate the process and examine the
open-loop behaviour. These results, the linearization of the model and general
knowledges about the system may imply a certain type of controller for this process. The
toolbox Matlab/Sisotool gives a wide range of possibilities for the design of the
appropriate controller to stabilize the linearized system.
The controller obtained in the previous section has a priori several issues:
it does not consider the non-linearities of the model
it has been designed in a "perfect" environment without noise and delays due to the
interfaces
it does not consider the discretization in the "real" controller
All those issues could be included in the previous phase, exceeding a more complex
model. However, an efficient and reliable test is only possible with a closed loop test
including the hardware-interfaces and the implementation of the controller.
The Matlab/Simulink package xPC-Target has the purpose to create the Hardware-in-the-
Loop-environment using a personal computer for the Real-Time-Simulation of the
process. The setup is a Host-Target-combination of two individual PCs communicating via
the serial Port (RS232) or Ethernet (TCP/IP). The Host is any desktop PC able to run
Matlab, the forms of the target are ranging from Desctop PCs to Single-Board
computers.[2]
The Target loads a Real-Time-Kernel enabling it to communicate with the Host and to run
the compiled C-Code representing the model downloaded from the Target-PC.
Finally the controller is to believe to communicate with the sensors of a real process. A
wide range of PCI-cards is available to support the engineers work to integrate the
protocol of the sensors communication interfaces on the Target PC.
124
Projet Quadricoptère 2005/2006
hos targ
MT 9
RS232
télécommand
PWM
e
PPM
MIDG II
RS422
ATmega128
capteurs
I2C, etc.
PWM
125
Projet Quadricoptère 2005/2006
Nous allons spécifier ici les différentes tâches ainsi qu’une estimation du temps consacré
et des problèmes rencontrés. Le temps est souvent reparti sur toute l’année. Pour les
solutions veuillez regarder aussi la partie « Réalisation », surtout pour des précisions
techniques.
126
Projet Quadricoptère 2005/2006
127
Projet Quadricoptère 2005/2006
7.2. Réalisation
La qualité d’un système HIL dépend de la qualité du modèle utilisé pour simuler le
comportement du drone. Nous avons utilisé le modèle basé sur les équations du rapport
2003 et 2004. La réalisation peut être trouvée dans le fichier « simulation_x.mdl ».
Ce modèle a une approche « directe » du problème : les équations d’états sont basées
sur les équations dynamiques du système à un corps rigide et non sur les estimations à
partir des mesures. Les entrées sont les PWM consignes pour les moteurs, les sorties
toutes les paramètres de vol. La commande s’effectue en Psi, Vx, Vy et Z. Voir le rapport
2003 et 2004 pour des détails sur le découplage.
Les contrôleurs ont été obtenus à partir du système linéarisé en utilisant SISOtool. Ce
sont des cascades de contrôleurs Proportionnel et Dérivée. Pour les réaliser sur l’ATmega,
une discrétisation est nécessaire. Les commandes Matlab nécessaires et les résultats
pour l’ATmega peuvent être trouvés en Annexe.
Remarque : Il est utile de s’interroger sur l’éventuelle utilisation de contrôleurs PI pour
éliminer l’erreur finale. Cela a bien fonctionné avec nos systèmes simples qui utilisaient
déjà toutes les interfaces : on a tenu compte des effets du bruit.
Un modèle ne peut décrire le vrai système qu’à quelques approximations et hypothèses
près. Par exemple on peut se demander s’il est bien justifié de prendre les hypothèses
concernant la poussée et la trainée pour une meilleure performance du système. En effet
le Quadricoptère n’a pas toujours inclinaison faible.
128
Projet Quadricoptère 2005/2006
129
Projet Quadricoptère 2005/2006
http://fr.wikipedia.org/wiki/PWM
On a déjà une carte PCI compatible avec xPC Target pour la capture des PWMs. Il s'agit
de la carte CTR05 de Measurement Computing. Selon ses spécifications la carte est bien
adaptée à nos besoins. Elle contient 5 compteurs qui permettent de mesurer la période
et le temps passé en « 1 » du signal PWM. Le rapport de ces deux valeurs donne un
pourcentage qui correspond à la valeur transmise. On a donc besoin de 2 compteurs par
signal PWM. Cependant comme l'ATmega envoie tous les signaux avec la même période,
un seul compteur dédié à la mesure de la période de n'importe quel signal peut être
utilisé pour tous les autres signaux. Un bloc ne donnant que le temps passé à 1 n'est pas
inclus dans xPC Target mais a été créé par M. Martin.
L'ATmega envoie les PWMs à 30 kHz, on doit donc utiliser la « frequency base »
maximale de 5 Mhz pour disposer d’un nombre correct des niveaux distinguables.
Malheureusement les compteurs donnent souvent 0 et on a ainsi x/0 ou 0/0 qui donnent
respectivement « inf » ou « -nan ». Ces deux valeurs plantent la simulation du
Quadricoptère. On a donc saturé (subsystem « U anti-nan ») le signal entre 0 et 1, le
block « saturation » de Simulink ne marche pas pour les « -nan » et en conséquence on
utilise des « switch ».
Un passe-bas ou un autre filtre devrait améliorer les résultats.
Pour des premiers essais on a utilisé un générateur de signaux. Il faut respecter les
voltages maximaux. L’ATmega utilise les même plages de tensions que le CTR05 ce qui
permet un branchement direct (selon « Connexion Atmega.doc »).
La simulation du Quadricoptère et le programme en C utilisent des valeurs entre 0 et 255
au lieu des valeurs entre 0 et 1. Cela nécessite une simple multiplication.
En comparant la mesure à celle obtenue avec l'ATmega « 0 » et « 1 » sont échangés et
on doit donc prendre « 1-pwm_mesuré » pour avoir les mêmes valeurs.
« Sample time » impose au Target PC une fréquence de lecture des valeurs de la carte
CTR05. Les valeurs ne semblent pas être moyennées, même si le CTR05 a pris plusieurs
valeurs entre les requetés du target.
Le programme C utilise des compteurs dédiés aux PWMs et donne des noms aux
registres pour un accès plus facile.
Fichiers:
testCTR05ATmega.mdl avec main.c dans PWM
Quadri HIL Jens KOBER 24.06.05.doc
http://en.wikipedia.org/wiki/Rs422
http://stielec.ac-aix-marseille.fr/cours/abati/rs232.htm
La MIDG II envoie les données via le bus RS422. Il existe un adaptateur pour convertir
ce signal en RS232 afin de le brancher sur le port série d'un PC. De plus sur la carte du
Quadricoptère un tel convertisseur est implémenté et l'ATmega ne traite en fait pas du
RS422 mais du RS232. xPC Target permet d'utiliser des ports séries et notre Target PC
possède un port série RS232 intégré. Si on branche notre simulation sur un kit, il est
donc inutile de convertir le signal en RS422 puis en RS232, mais on peut brancher les
deux ports série RS232 directement.
On avait une simulation de la MT 9 comme exemple. Depuis sa réalisation les blocs de
RS232 de xPC Target ont évolué et il n’est plus nécessaire d'utiliser Stateflow pour le
décodage du message.
Les messages sont décrits dans 2Message1b.pdf. Le logiciel « MIDG II Display » permet
d’afficher les données sur un PC et de configurer la MIDG II. Le Quadricoptère n'utilise
pas tous les messages de la MIDG II, elle est configurée pour n’envoyer que les
messages utiles. Les messages 10 et 12 sont utilisés, le message 2 (alternative non-
filtrée du message 10) est aussi implémenté dans le main.c . On ne veut envoyer que les
130
Projet Quadricoptère 2005/2006
Le message complet est écrit dans le buffer du port série tous les « Fixed-step size
(fundamental sample time) » et ensuite envoyé avec le baud rate choisi. L’envoi s’arrête
si le buffer est vide et recommence s’il y a des nouvelles données. Si on écrit plus de
données par unité de temps dans le buffer que ce qui peut être envoyé à ce baud rate,
on obtient un « buffer overflow » une fois le buffer complètement rempli. Il faut donc soit
augmenter le baud rate, soit écrire le message moins souvent dans le buffer. On peut
soit augmenter le « Fixed-step size » (souvent impossible à cause du reste du modèle),
soit mettre un « Zero-Order Hold » à cette fin devant l’entrée du block RS232. Le « Zero-
Order Hold » fixe la période d’écriture dans le buffer et en conséquence aussi la période
d’envoi des messages via le port série.
131
Projet Quadricoptère 2005/2006
« Pack » permet de découper ces entrées en un vecteur avec des composants de 8 bit
(par exemple 16 bit deviennent deux fois 8 bit, le high-byte et low-byte). « Unpack » fait
l'inverse.
Les « Mux » permettent de combiner des vecteurs. Le checksum0 est réalisé par une
sommation simple, checksum1 par une multiplication matricielle. Le protocole de calcul
des checksums ne conserve que 8 bits et tronque tous les bits supérieurs après chaque
sommation. Comme on fait des calculs sur 8 bit MATLAB fait la même chose
automatiquement.
On a pris l'exemple de la MT9 pour créer un décodage des messages. Ensuite on a
branché la MIDG II « physique » sur le Target PC et vérifié qu'on arrive à décoder les
messages et on a comparé ces valeurs avec les valeurs données par « MIDG II Display ».
On a analysé les messages envoyés par notre simulation en regardant les octets envoyés
bruts avec MATLAB. Ensuite on a vérifié que notre simulation des messages est
correctement décodée par le décodage testé avant. Puis on a branché notre simulation
sur un PC et vérifier avec « MIDG II Display » que nos messages sont corrects. On a
modifié la partie MIDG II du main.c pour allumer des LEDs du kit si la routine arrive à
décoder nos messages et si les valeurs (recombinés des 8 bits) correspondent à celles
qu’on à mis comme entrée à notre simulation.
Fichiers : midg2neu2rs232_42.mdl et main.c dans le dossier MidgII.
On a profité du travail du groupe transmission. Ils nous ont montré les branchements et
nous ont donné le code C nécessaire.
ppm_pulses est en « int » et stocke les valeurs directement reçus via PPM. Les décalages
(pour centrer les valeurs et avoir aussi des valeurs négatives) dans le code n'étaient pas
assez précis pour nos besoins, car le système est instable si on ne commence pas avec
des références proches de zéro. On a donc affiché les valeurs reçues via les LEDs de deux
kits pour les combinaisons extrêmes de chaque réglage et manette. Les résultats se
trouvent en annexe. Il reste à vérifier si des typecast manquants posent aussi des
problèmes pour le Quadricoptère « physique ». cf. 060525.txt
Des divisions transforment les ranges reçues en ranges correspondants en unités
physiques.
La télécommande est utilisée pour donner des consignes en psi', le Quadricoptère est
commandé en psi. On a donc implémenté une intégration numérique (zero-order-hold).
Fichiers:
decodage.c dans session0523/telecom
CRT05_xPC_AVR_horiz_midg2x4_nonlin2c avec main.c dans session0523/v29
7.2.2.4. I²C
Le but était de remplacer les capteurs ultrasons « SRF10 », qui sont en boucle fermé
pour l’altitude z, par le Target PC. Sur le vrai Quadricoptère, ils communiquent via I²C
avec l’ATmega128 :
132
Projet Quadricoptère 2005/2006
Pour détails sur la liaison série (RS232), qui est fait avec la carte Quatech, voir la parti
précédente les liaisons RS232.
Le protocole I2C :
I²C est un protocole série développé par Philipps, qui n’utilise que deux fils (SDA, SCL)
sur lesquels on peut brancher jusqu’à 128 interlocuteurs. La communication est basée
sur des interruptions, c’est-à-dire que les objets peuvent faire d’autres calculs à coté.
Dans les AVR de Atmel, I²C est, pour des raisons de marques, appelé TWI (Two-wire-
serial-interface).
Principes de fonctionnement (voir les docs sur l’ATmega pour plus de détails) :
Sur le Port, il y des Master est des Slaves. Dans notre cas on a un Master (l’ATmega128)
et un Slave (le Mega16, qui remplace le SRF10). Tous les participants « écoutent » si
quelque chose se passe sur le port, c’est-à-dire les deux files. Il y a une quinzaine de
types de messages différents, qui on tous la même structure (une suite de 1 et 0).
Le Master peut commencer tout seul à faire quelque-chose, le Slave seulement réagir, si
on lui demande. (Notons qu’il y a une exception : le Slave peut « bloquer » le Port s’il est
occupé dans le mode d’interruption-TWI). Le message qui est arrivé détermine le
comportement après le interrupt, par exemple la préparation d’un nouveau message
avec des « mesures ».
La Tâche :
Il fallait simuler complètement le comportement des Ultrasons, c’est-à-dire avec les
délais éventuels.
133
Projet Quadricoptère 2005/2006
Le datasheet des SRF10 affirme, que pendant le ranging, le vrai SFR10 « découpe » le
SDA. (On lit toujours 0xFF=5V par le pull-up).
La durée de découpage T est variable :
T = 2d/Vson si 2d < Dmax ...
Tmax si 2d > Dmax ...
Avec :
Vson... vitesse du son
Tmax... temps de mesure maximale (=64µs ~ d=11,6m)
Dmax... Distance maximale où l’écho est encore reconnaissable, déterminé par le Gain,
normalement fixe pendant la simulation Æ ici on a pris 300 cm
Après chaque message sur le bus I²C, l’expéditeur (dans les pluparts le Master) attend
une réponse, un ACK (acknowledge). En termes imagés, c’est un bit qui dit « Oui, je suis
là » ou « Merci, j’ai bien reçu le dernier message ».
On peut réaliser cela avec le TWEA-flag, ce qui est probablement aussi fait en vrai. Cela
signifie qu’on envoie toujours un NACK (no-acknowledge) pendant le « ranging ». La
durée est calculée et est prise pour lancer un Timer, qui permet de reprendre les ACK
après cette durée.
Alimentation :
Le premier problème était l’alimentation. Avec toutes les informations des datasheets et
des forums d’Internet il semble nécessaire de mettre des pull-ups externes. Au moins, ça
n’a pas d’influence négative sur la communication. Pour la simulation externe avec xPC-
Target, l’utilisation des Pull-ups et incontournable.
134
Projet Quadricoptère 2005/2006
Sur le Slave le Port série UART0 est connecté avec le Target PC. Sur le Master sont aussi
alimenté les câbles pour les autres parties de la communication (PWM, RS232)
Programmation :
En annexe on trouve le fichier Simulink (xPC-Target) avec la carte Quatech pour envoyer
les données d’altitude via RS232, ainsi que les lignes de code essentiel pour la
communication I²C entre les deux AVR.
En parallèle :
• Comparaison de l’altitude à 300 cm, mise à l’infini si plus grand
calcul de « TimeToCount » pour le Timer (entre 3ms et 64 ms selon l’altitude)
• Après la réception du commande de range « 0x51 » envoyé par le Master
démarrage du Timer, TWEA = 0 pour envoyer des NACK.
• Le Master continue à essayer de lire les données de l’altitude, mais le slave
répond seulement NACK.
• Le Timer a fini et permet des TWEA=1. Le Slave envoie les données après le
prochain essai du Master.
• Recommence avec 6
Le Grand bug :
C’était le plus grand bug qu’on ait eu avec l’I²C. Il arrêtait la communication, lorsqu’on
voulait envoyer une valeur dans le Lowbyte, qui était égale à la commande 0x51.
Le problème était qu’il n’y avait qu’une seule variable ( TWI_buf[1] ) pour la réception et
l’envoi qui n’était pas mise à zéro après l’envoi. Le interrupt a pensé qu’il devait
recommencer à faire le ranging et a activé le Timer, tandis que le Master voulait toujours
lire le lowbyte sur le Bus I²C.
La raison pour laquelle la communication s’est complètement arrêtée n’est pas claire
(probablement le slave met un zéro sur le Port).
Avec la mise à zéro de cette variable, le problème n’existait plus.
Il y avait trois grandes étapes pour l’intégration des systèmes à stabiliser dans notre
système HIL (et beaucoup d’étapes intermédiaires).
La première stabilisation d’un système simple 1/(s-1) avec un P/ PI
La stabilisation du système Quadricoptère linéarisé
La stabilisation du système Quadricoptère non linéaire
Pourquoi stabiliser ?
On sait, que la stabilisation du drone est à priori possible, comme l’ont montré les
expériences et aussi la « simulation_x.mdl » qui a pris en compte les imperfections des
liaisons. C’est donc un test pour la simulation. Un bon système HIL donne sensiblement
135
Projet Quadricoptère 2005/2006
le même résultat que « simulation_x ». De plus un mauvais système n’a aucune chance
d’être stabilisé
Tous les systèmes ont été stabilisés avec nos propres contrôleurs.
SIGNAL( SIG_UART0_RECV )
{ IncomingData = UDR0;
e = (float) IncomingData;
//difference par rapport au reference
e = 60 - e;
//PI controller
u = u_old + 5.032*e - 4.968*e_old;
//sortie
m2 = (255-((u/10)+50));
if (m2>255) m2 = 255;
if (m2<0) m2 = 0;
moteur2 = (uint8_t) m2;
136
Projet Quadricoptère 2005/2006
//anciens valeurs
e_old=e;
u_old=u;
}
137
Projet Quadricoptère 2005/2006
On prend le système linéarisé qui était utilisé pour concevoir les contrôleurs dans
« simulation_x.mdl » Comme ça on obtient la plus grande robustesse possible.
A gauche on voit les 4 entrées PWM, après le décodage on voit 4 bloc qui correspondent
aux 4 systèmes SISO indépendants, crées dans les fichiers *.m pour les contrôleurs qui
peuvent être trouvés en annexe.
Le bloc de décodage opère un ajustement parce que les PWM n’ont qu’un range de
[0...255]. On a fait une transformation simple avec une addition et une multiplication
pour atteindre un range de valeurs plus grand avec des valeurs négatives.
sysp,sysq et sysr sont en boucle fermée via le protocole de MIDG II par le Port RS232.
sysaz est connecté via le Port série supplémentaire de la carte Quatech à l’ATmega16. On
a mis une saturation pour éviter toute valeur négative.
Les consignes sont envoyées de manière indirecte par des variables de MIDG II non-
utilisées. (C’était avant l’intégration de la télécommande). Un rate limiter doit éviter des
changements brutaux.
138
Projet Quadricoptère 2005/2006
u = ref - vy;
//P controller (vy)
u = 23*u;
//difference par rapport au phi
u= u - phi;
//P controller (phi)
u = 7*u;
//difference par rapport au p
e = u - p;
//controller (p)
u = .1353*u_old + .01146*e -
0.00886*e_old;
u = ref2 - vx;
//P controller (vx)
u = -23*u;
//difference par rapport au theta
u= u - theta;
//P controller (theta)
u = 7*u;
//difference par rapport au q
e = u - q;
//controller (q)
u = .1353*u_old2 + .01146*e -
0.00886*e_old2;
u = ref3 - z;
//P controller (z)
u = 2*u;
//difference par rapport au vz
u= u - vz;
//P controller (vz)
u = 20*u;
//difference par rapport au az
u= u - az;
//P controller (az)
u = -.28*u;
u = ref4 - psi;
//P controller (psi)
u = 2.62*u;
//difference par rapport au vz
u= u - r;
//P controller (r)
u = 0.0372337*u;
C’est le codage des quatre contrôleurs que l’on trouve dans « simulation_x »
Une fois que les interfaces de la partie précédente ont été intégrées sur le Target et
l’AVR, on a pu établir la stabilisation assez facilement. Le problème était plutôt d’avoir
oublié d’ajuster un paramètre ou d’avoir connecté les blocs en Simulink d’une façon
incorrecte.
Pour debugger on a successivement réalisé les quatre systèmes, l’un après l’autre.
139
Projet Quadricoptère 2005/2006
La version CRT05_xPC_AVR_horiz_midg2x4_nonlin_us.mdl
Trois variables sont envoyées via le protocole MIDG II, 1 via la carte Quatech au Mega16
qui le renvoie via I²C à l’ATMega128.
Il y a deux blocs MIDG II. Le bloc à droite est celui du système précédent, qui réalise le
protocole.
Le bloc MIDG II au milieu réalise la conversion des unités. Dans ce bloc il fallait enlever
aussi les « transport delays » pour atteindre une stabilisation. On a placé des délais de
transport dans « simulation_x.mdl » pour simuler le retard éventuel dû aux calculs dans
la vraie MIDG II.
Les contrôleurs sont les mêmes. En pratique il faut pourtant ajouter quelques paramètres
dans le main.c. On a ajouté G=1000 à la variable z.
L’ensemble obtenu est proche de l’objectif principal du groupe HIL Quelles sont les
différences par rapport au vrai main.c, la quatrième étape ?
• La transformation des variables vx et vy le dans repère « bis » du quadri et
toujours effectuée sur le Target. Normalement la MIDG II transmet les vitesses du
repère terrestre.
• La constante « Eqaz » qui fixe le point d’équilibre et toujours ajoutée dans le
Target.
• Les Wi reçus via PWM ne sont pas les vraies consignes des moteurs. Le
découplage est toujours effectué sur le Target PC et pas dans le contrôleur
• L’ordre des PWM peut être différent de celui dans notre version
• Le main.c (~main500_2.c) sur le quadri n’est pas programmé de manière très
claire. Il y a beaucoup de variables supplémentaires, peut-être superflues. A
priori, après corrections des quatre différences ci-dessus on devrait être capable
de stabiliser le système non-linéaire avec le main500_2.c
A part cela le système correspond bien au système Quadricoptère du point de vue du
contrôleur. Voila trois versions avec des communications différentes qui utilisent le
140
Projet Quadricoptère 2005/2006
système non linéaire et sont stables. Les « V_i » sont des classeurs qui comprennent les
main.c à mettre sur l’ATmega.
Ici, on peut modifier les consignes avec la télécommande, z, vx, vz de manière directe,
Psi indirectement car la télécommande donne la consigne dPSI/dt. Sur l’image on voit un
programme de vol pour (de gauche en haut à droite en bas) : Psi, Z, Vx, Vy
Une source d’erreurs était la connexion des angles entre les blocs Quadricoptère et
MIDG : On a [phi, thêta, psi] correspond à [y(aw), p(itch), r(oll)]
Une autre source d’erreurs était la « connexion » dans le code de l’ATmega, c’est-à-dire
l’utilisation des variables correctes.
http://www.flightgear.org/
Cette partie rappelle la démarche suivie par le groupe HIL dans le but de visualiser
l’évolution du Quadricoptère simulé ainsi que les étapes suffisantes à la mise en œuvre
de la communication MATLAB – FlightGear.
141
Projet Quadricoptère 2005/2006
Justification
Même si les « Scopes » fournis par xPC Target nous ont permis de contrôler la stabilité
de nos modèles, l’efficacité des contrôleurs... ils ne rendent pas vraiment possible une
représentation mentale de l’évolution du drone simulé. C’est pour cela que FG nous est
utile. Il pourra permettre de détecter des anomalies du modèle, d’identifier les
« consignes à risque »… La représentation graphique est en résumé le dernier élément de
la démarche HIL rappelée ci-après.
Démarche
Installation des logiciels nécessaires
Vérification au moyen d’une démonstration MATLAB
Intégration du module d’envoi de données vers FG à un modèle simple
Simulink - FlighGear
Définition de consignes à partir d’une manette de jeu
Pilotage du modèle Simulink du Quadricoptère avec la manette (affichage Scope)
Réalisation des interfaces : Manette // Modèle // FlightGear
Pilotage de l’aéronef FlightGear avec la manette de jeu
Pilotage du Quadricoptère réel avec la manette de jeu ?
xPC Target - FlightGear
Définition de consignes à partir de la radiocommande (ppm_pulses)
Pilotage du Quadricoptère du Target PC avec la radiocommande (affichage xPC Scope)
Réalisation de l’interface Target PC // PC avec FlightGear (via RS232)
Pilotage de l’aéronef FlightGear avec la radiocommande
142
Projet Quadricoptère 2005/2006
Avec FG installé dans C:\Program Files\FlightGear, il est plus délicat de le lancer à partir
d’un script MS-DOS. Son installation dans un dossier à adresse courte et sans caractère
spécial, par exemple C:\FlightGear, simplifiera son initialisation par fichier .bat.
Ouvrir le bloc « Generate Run Script » et mettre à jour le dossier de base de FlightGear
(C:\FlightGear) Les différents paramètres placent le modèle HL20 en dans l’axe (Offset
Azimuth = 0°) de la piste 10L (Runway ID ; cap 100, piste de gauche) de l’aéroport
KSFO à une altitude, cap et distance fixés respectivement à 7224ft, 113° et 4.72miles.
Nous verrons par la suite comment simplifier le fichier runfg.bat généré.
143
Projet Quadricoptère 2005/2006
C:
cd C:\FlightGear
SET FG_ROOT=C:\FlightGear\\data.\\bin\\win32\\fgfs --aircraft=HL20 --
fdm=network,localhost,5501,5502,5503 --fog-fastest --disable-clouds --
start-date-lat=2004:06:01:09:00:00 --disable-sound --in-air --enable-freeze
--airport-id=KSFO --runway=10L --altitude=7224 --heading=113 --offset-
distance=4.72 --offset-azimuth=0
Corriger les Signal Data Types des Source Block : num_engines, num_tanks,
num_wheels en uint32 au lieu de int32.
144
Projet Quadricoptère 2005/2006
Lorsqu’on démarre la simulation, une nouvelle erreur de Data Type intervient : elle
concerne le bloc unixtime_sec. On applique la même correction (Output data type mode
int32 devient uint32)
Lorsqu’on démarre la simulation une erreur concernant le aramètre wow apparaît… Celui-
ci, issu du Bus (PlantData.LGData.WOW) est une variable booléenne liée à la sortie du
train d’atterrissage… Il est acceptable de ne pas en tenir compte et de déconnecter
l’entrée wow du bloc d’envoi.
145
Projet Quadricoptère 2005/2006
Le modèle
UsingPreconfiguredBlock_v4.mdl
permet d’initialiser FG. L’aéronef
est en approche de la piste 10L
comme défini dans le bloc qui
génère le script. En démarrant la
simulation, on peut lui imposer
translations et rotations.
On pourra par la suite utiliser la
librairie
UsingPreconfiguredBlock_v5_library.mdl
construite à partir de ce modèle pour
envoyer à FlightGear position relative à
l’origine de la piste et attitude. Cette version
5 attend en entrée des angles exprimés en
degrés pour faciliter l’interprétation.
Pour réaliser ce modèle d’envoi à FlightGear
réduit au strict nécessaire, on a isolé les
éléments essentiels de la démonstration
fournie par MATLAB :
146
Projet Quadricoptère 2005/2006
147
Projet Quadricoptère 2005/2006
Nous disposons d’une manette de jeu Logitech Wingman Precision (voir photo). Dans le
modèle ManetteWingMan_v7_consignes_VxVyVz_PQR.mdl on utilise le bloc Pilot Joystick.
On pourra par la suite utiliser la librairie ManetteWingMan_v7_library.mdl construite à
partir de ce modèle.
Définition de consignes
Le Quadricoptère simulé est asservi en Vitesse selon X, Y (axes de roulis et de tangage)
et Altitude ainsi qu’en vitesse de rotation autour de l’axe de lacet (vitesse angulaire R).
On réalise l’association suivante, assez intuitive :
Bas/Haut Æ Ax = -1/+1
Gauche/Droite Æ Ay = -1/+1
A/X Æ Az = -1/+1
L/R Æ R’ (= psi’’) = -1/+1
A la différence d’un joystick, une manette de jeu ne fournit que des informations
binaires : chaque bouton est pressé ou non (état 1 ou 0). La présence de switchs assure
que les valeurs de sortie appartiennent à {-1, 0, 1}. En effet l’action sur la croix
directionnelle ne correspond pas à -1/1 mais à environ -0.9/0.9… Les switchs
transforment donc un x>0 en 1 et un x<0 en -1.
Enfin, un intégrateur permet d’obtenir des consignes de vitesse.
148
Projet Quadricoptère 2005/2006
149
Projet Quadricoptère 2005/2006
150
Projet Quadricoptère 2005/2006
151
Projet Quadricoptère 2005/2006
Il est facile d’envoyer sur un autre port série les messages de la midg2 grâce à la carte
Quatech Target PC. A l’aide du module de décodage de messages 10 et 12, on sera en
mesure de fournir à FlightGear les paramètres nécessaires. Cependant nous n’avons pas
encore trouvé de bloc dans Simulink prévu pour la réception des paquets du port série.
On note que groupe Interface Homme-Machine est déjà capable d’exploiter le flux
montant vers la station sol. Voir fonctions Data_processing.m et serial_Callback.m.
Il serait utile de réinitialiser les consignes de vitesse. En effet cela permettrait de rétablir
le vol stationnaire. Le plus simple serait néanmoins de disposer d’un joystick.
Idéalement, il même faudrait un double joystick, comme sur la radiocommande. En
conservant la manette, une boucle d’automatique devrait permettre de ramener la
consigne intégrée à 0.
Utiliser GoogleEarth pour obtenir des images précises de l’Ecole Centrale par exemple et
améliorer la texture de la zone fournie dans le package de base. On se reportera à la
documentation en ligne de FlighGear pour plus d’informations.
152
Projet Quadricoptère 2005/2006
8. CALCULATEUR EMBARQUE
8.1. Introduction
Pour être membre de ce sous-groupe il est préférable d’avoir des connaissances de base
sur la programmation en C pour pouvoir programmer le microcontrôleur, sur
l’électronique pour pouvoir effectuer des mesures de grandeurs électriques sur la carte
électronique principale contenant le microprocesseur, et enfin sur l’automatique, les
boucles d’asservissement et les différents contrôleurs pour pouvoir comprendre
rapidement la partie boucle automatique du programme principal et les simulations
Simulink/Matlab correspondantes afin de pouvoir les élargir.
Notre microcontrôleur principal pour cette année est l’ATMEGA128L. Ce dernier est un
microcontrôleur de basse alimentation 8-bit contenant 128 Ko de mémoire Flash basé sur
l’architecture AVR enhanced RISC (Reduced Instruction SET Computer).
153
Projet Quadricoptère 2005/2006
Le deuxième kit le STK500/501 est un kit plus développé qui contient en plus du STK300
deux ports séries permettant au même temps la lecture et la programmation de
l’ATmega. Ce kit fonctionne exactement pareil comme le STK300 sauf qu’il communique
avec le pc via un autre logiciel qui est AVRstudio (il est indispensable d’avoir toujours la
dernière version de ce logiciels pour éviter toute sorte de bug, vous trouverez cela sur
http://www.atmel.com/dyn/products/tools_card.asp?tool_id=2725)
Kit STK500
154
Projet Quadricoptère 2005/2006
Sur la partie encadrée en vert sera fixé le STK501 qui contiendra l’ATmega128 :
Kit STK501
On dispose d’un autre microcontrôleur plus sophistiqué, contenant 8Mo de mémoire Flash
(64 fois plus que l’ATmega128) et beaucoup plus facile à programmer. La question qui
vient à l’esprit toute de suite est, pourquoi on ne l’utilise pas au lieu de l’ATmega128
puisqu’il est plus performant. Une réponse détaillée à cette question sera donnée à la
partie 4 « Travail supplémentaire/Activité expérimentale » de ce travail.
155
Projet Quadricoptère 2005/2006
Détection d’obstacles :
• Arrêter le drone / vol stationnaire
• Propositions de possibilités
o Conduite manuelle
o Atterrissage automatique
o Nouvelles coordonnées
o Manœuvre d’esquive automatique
• Rentrer et transmettre le choix
156
Projet Quadricoptère 2005/2006
On souhaite que le drone se déplace suivant un circuit bien défini d’une manière
automatique. Il faut disposer de la trajectoire à suivre avec des mesures précises. La
façon qu’on propose de modéliser le chemin est la suivante.
L3
L2 1
L5 L1
Drone
157
Projet Quadricoptère 2005/2006
Ce travail a été l’interface des travaux de quatre sous-groupes : les calculateurs qui
devaient avoir une information sur la position pour pouvoir programmer l’asservissement
en position, la transmission car ces positions devraient être transmises pendant le vol via
le modem, la station sol car la récupération de ces données s’effectue sur cette interface
et évidemment les capteurs car la MIDGII fait partie des capteurs du drone.
8.3.2.1. problématique
Notre équipe avait pour ambition de s’approcher aux maximum des objectifs de ce
concours même si lui n’existe plus pour cette année 2006, dans l’espoir qu’il sera relancé
par l’ONERA l’année prochaine. Cette tâche, de voler en automatique, n’était pas du tout
facile à réaliser vu sa dépendance très forte de la première tâche « rentrer les
waypoints » et de la quatrième tâche « mode de passage du manuel en automatique ».
Des règles de sécurité devraient impérativement être respectées afin de pourvoir
récupérer le contrôle du drone au cas où il commence à faire des déplacements
imprévus.
158
Projet Quadricoptère 2005/2006
8.3.2.3. Réalisation
Pour réaliser le vol rectangulaire on a choisi d’adopter la première solution, bien qu’elle
ne corresponde pas directement aux conditions du concours. Par contre cette solution
présente une simplicité de réalisation et son succès nous permettra de passer à la
deuxième alternative et puis même à la troisième si la bande passante de transmission le
permet. En effet un éventuel succès d’une telle manipulation représente un grand pas
vers l’automatique, puisque cela prouverait que le drone est bien asservi en position et
que le régulateur de position est bien dimensionné.
159
Projet Quadricoptère 2005/2006
Le Régulateur PID est théoriquement idéal, mais son application en pratique présente des
problèmes techniques de dimensionnement de ses paramètres. Selon le critère de Zigler-
Nichols les paramètres du contrôleur peuvent être dimensionnés ainsi :
Type Kp Ti Td
P 0.5 Kpc - -
PI 0.45 Kpc 0.83Tc -
PID 0.6 Kpc 0.5Tc 0.125Tc
Ici Kpc et Tc représentent les valeurs critiquent de la limite de stabilité, qui peuvent être
déterminées soit empiriquement soit analytiquement par le critère de stabilité de Nyquist
ou celui de Routh-Hurwitz (voir cours d’automatique de deuxième année).
Dans notre cas on a adopté le cas simple du régulateur proportionnel pour les trois
régulateurs Kxd entre x (pour y c’est pareil) et Vx, Kvxd entre Vx et Phi (roulis) et Kphid
entre Phi et p (vitesse angulaire en roulis). Bien sûr il est toujours mieux d’adopter un
PID mais le terme intégrateur est défavorable aux erreurs de mesure, car il servira à les
amplifier et le terme différentiel peut conduire à des instabilités en dérivant le bruit. Tous
ces facteurs rendent le dimensionnement des paramètres d’un tel régulateur
extrêmement difficile. Des tests sur les paramètres d’un éventuel régulateur PID sont
effectués par M. martin et Erwan.
Pour le régulateur Kpd un filtre passe-bas a été mis pour réduire l’effet dérivateur de ce
régulateur PD.
160
Projet Quadricoptère 2005/2006
La courbe du haut est évidemment celle de la position x et celle de bas est de y. On voit
bien que la simulation est tout à fait acceptable avec les contrôleurs proportionnels.
La détection des obstacles se fait grâce au capteur ultrason qui fonctionne avec le même
principe que le radar. Ce capteur émet une onde acoustique dont la fréquence est trop
élevée pour être audible par l’être humain. En cas d’obstacle le capteur pourra calculer la
distance qui les sépare en recevant les échos des ondes réfléchies á partir du temps que
l’onde a effectuée pour faire l’allée retour.
8.3.3.1. problématique
Une étude détaillée d’une manœuvre de détection d’obstacles a été faite par nos
prédécesseurs dans l’annexe IX « détection d’obstacle ». Cette étude semble être
parfaite théoriquement mais aucun essai expérimental n’a été fait. Nos objectifs sont de
programmer une manœuvre d’évitement d’obstacle pour éviter le choc frontal. Cela nous
permettra de nous approcher mieux du drone intelligent capable de détecter des objets
et de les éviter conçu par le concours de l’ONERA.
Le télémètre (capter ultrason) mesure la distance la plus courte parcourue par l’onde
réfléchie et n’a donc aucune information sur la géométrie de l’obstacle. Aussi on n’a
aucune garantie que le capteur ne capte pas le sol pendant son vol horizontal vu que le
drone se penche en roulis ou en tangage pour bouger dans cette direction. Une étude
plus détaillée de cette problématique est faite par le groupe capteurs.
Détection :
Le quadri animé d’une vitesse v détecte un obstacle à une distance Xm. On appelle
Xevit(v) la distance de freinage du quadri à la vitesse initiale v. On utilise un facteur de
sécurité fs par exemple égal à 5 %.
Evitement :
Le but de l’algorithme est de ne pas tenir compte du cas où l’obstacle détecté est le sol.
Il faut de plus que l’algorithme marche dans des situations instationnaires, par exemple
quand le quadri se met en mouvement ou freine.
En fait, une méthode consiste à comparer la valeur mesurée à celle qu’on mesurerait si
161
Projet Quadricoptère 2005/2006
Am ≈ Xm sin (θ + β)
Soit ε = 1 - Xm sin (θ + β) / Am
• On calcule ε = 1 - Xm sin (θ + β) / Am
• Si ε < 5 % è On se donne une vitesse de consigne inférieure (de 5 % par ex.) au
seuil de sécurité
• Sinon vitesse de consigne = 0
• Ensuite il s’agit pour le pilote de rediriger manuellement le quadri pour pouvoir
éviter l’obstacle.
• Lancer une manœuvre qui consiste à augmenter l’altitude du drone tant que le
capteur ultrason indique encore l’existence de l’obstacle, et dès que l’obstacle
disparaît en altitude le drone s’élève de quelques centimètres de sécurité et puis
continue sa trajectoire. Au cas où l’obstacle persiste comme dans le cas d’un
poteau par exemple, on peut déclencher une manœuvre d’esquive latérale.
• Brancher une caméra et faire l’interfaçage entre l’image de l’obstacle et le
programme principal.
8.3.3.3. Réalisation
162
Projet Quadricoptère 2005/2006
Pour tester la capacité de freinage du drone, on a conçu une modélisation Simulink qui
est encadrée en bleue dans la planche suivante :
Cette modélisation est basée sur un travail effectué par le groupe capteurs qui on spécifié
empiriquement la portée du capteur ultrason qu’on possède qui est d’environ 100 cm.
Notre capteur rend en fait une valeur infinie lorsqu’il ne capte rien et la distance le
séparant de l’obstacle s’il capte quelque chose.
La fonction d’entrée d_obstacle_y (simulation avec y dans ce cas, pour x c’est
exactement pareil) a une valeur très grande de 65535 cm (FFFF en hexadécimal) puis à
partir d’un certain instant (souvent simulé à partir de la sixième seconde) elle descend à
une valeur de 100 cm, en effet c’est l’instant virtuel de détection d’obstacle. Un test de
comparaison est effectué juste après par rapport à une valeur qui est égale à 200 cm.
Cette valeur est choisie arbitrairement, cependant elle doit impérativement être comprise
entre 100 et 65535 cm. La comparaison nous donne un booléen qui est 1 le signal
d’entrée est supérieur ou égal à 200cm, cela veut dire concrètement qu’il n’y a pas
d’obstacle et 0 s’il y a un obstacle. Juste après il y a une conversion en type Double car
la variable de sortie du Block « Compare to constant » est seulement de 8 bits ce qui
n’est pas compatible le type de variable de la consigne de vitesse. Cette valeur
booléenne converti en Double sera multipliée grâce au Block « Product » avec la consigne
de vitesse. S’il n’y a pas d’obstacle il ne se passe rien et sinon la consigne de vitesse sera
immédiatement annulée.
Le Rate Limiter juste après est un block de sécurité qui sert à amortir les changements
brusques de consigne. En effet il est réglé de telle façon que le changement de consigne
ne doit dépasser en aucun cas la valeur de 300 cm/s en valeur absolue.
163
Projet Quadricoptère 2005/2006
On voit bien ici que la vitesse Vx reste négligeable et que Vy obéit à la consigne jusqu’à
l’instant de détection d’obstacle, et puis s’annule au bout d’une seconde comme on a
souhaité. Cela signifie concrètement que le drone s’est arrêté après avoir fait la
détection. La question qui se pose maintenant est, est-ce qu’il s’est arrêté au bon
moment ? Une réponse à cette question se trouve dans la courbe suivante :
164
Projet Quadricoptère 2005/2006
Mais dès qu’on augmente la vitesse de consigne et par la suite la vitesse réelle du drone,
ce dernier freine moins vite et sa distance de freinage devient de plus en plus grande.
D’après les simulations effectuées, il ne faut jamais dépasser la vitesse de 180 cm/s pour
éviter le choc frontal avec l’obstacle.
Cette problématique nous a occupé pendant pas mal de temps surtout avant d’effectuer
l’essai de vol en automatique. En fait il s’agissait de définir une manière sécurisée qui
nous permet de reprendre le contrôle sur le drone au cas où il commence à faire des
déplacements imprévus.
L’idéal est de posséder une radiocommande ou un joystick contenant un bouton qui nous
permet de passer d’un mode à l’autre, mais cela n’était pas malheureusement le cas.
Alors on a pensé à effectuer un mode de passage qui consistait à déclencher le mode
automatique dès qu’on atteigne une certaine altitude, dans l’attente d’avoir une
commande plus sophistiquée. Pour plus de détails sur cette problématique, consultez la
partie Transmission de ce rapport.
165
Projet Quadricoptère 2005/2006
8.3.5.1. Problématique
Notre but est de définir une stratégie en cas d’une perte de liaison avec la station au sol.
Un autre problème peut surgir est la perte de liaison GPS qui peut avoir lieu en endroit
fermé. Pour l’instant, on ne peut s’affranchir de la midg2 car elle fournit des informations
importantes et on ne dispose pas d’autres capteurs qui peuvent le substituer. C’est pour
cela que le 2ème problème n’a pas été vraiment abordé.
Une autre solution envisagée consiste à définir un tableau qui contient les coordonnées
de points de stationnement sécurisés. Dans ce cas, la station au sol doit fournir 2
tableaux. Le premier trace le chemin à suivre par le drone en mode automatique : Le
chemin est codé par une série de points par lesquels le drone doit passer. Il prend une
trajectoire rectiligne entre 2 points. Le 2ème tableau contient plutôt une série de points
de stationnement. Quand la liaison se rompt en cours de route, le drone s’arrête,
compare sa position courante aux valeurs dans le 2ème tableau et détermine ainsi le
point de stationnement le plus proche, et après une durée prédéfini (de 30 secondes par
exemple) il se dirige vers ce point et atterrit automatiquement.
Une autre idée consiste à revenir en arrière en cas de rupture de liaison en suivant
exactement le même chemin parcouru. Pour ce faire, on met un tableau dans le quel on
stocke le chemin parcouru et ainsi, le drone peut revenir en arrière jusqu’à ce que la
liaison se rétablisse.
8.3.5.3. Réalisation
Nous avons prévu des points d’atterrissage sécurisés à quoi l’engin peut avoir recourt en
cas de perte de liaison. Ces points sont communiqués au microcontrôleur et l’algorithme
de codage est le même que celui du circuit.
En cas de rupture de la liaison, le mini drone s’arrête et attend trente secondes son
rétablissement. Si rien ne se produit, le drone se dirige vers le point d’atterrissage le plus
proche à moins que la liaison restaure entre-temps.
L’idée qu’on a envisagée, était définir un tableau qui contient les coordonnées de points
de stationnement sécurisés.
En effet, le drone reçoit les valeurs référence des paramètres de position par
communication UART et ensuite un contrôleur assure l’asservissement et permet
d’atteindre le plus rapidement possible l’état final avec des performances statiques et
dynamiques satisfaisantes.
Ce contrôleur a été préalablement construit sur Matlab, puis introduit dans le
programme embarqué. Le drone récolte des données issus des capteurs et notamment
du midg2 :Le capteur de son fournit par exemple l’altitude courante de l’engin et la
midg2 mesure surtout les angles d’euler. Se fait ensuite la comparaison avec les valeurs
souhaités et puis on envoie l’ordre aux moteurs pour ajuster leurs vitesses.
166
Projet Quadricoptère 2005/2006
Le drone renvoie par ailleurs des données pour déclarer sa position, l’état de la batterie
et ainsi que d’autres paramètres décrivant son état pour permettre à la station au sol de
statuer sur la suite de son chemin.
Message Midg2 :
On fait une interruption qui s'active quand un byte du message de la midg II arrive sur
l'uart 0
On vérifie la bonne réception du message en examinant les 2 premiers octets : Il faut
que le 1er et le 2ème octets soient respectivement égaux à 129 et 161 en décimal.
Quand on est à la fin du message, on effectue une opération arithmétique de
vérification.
Data Gx Gy Gz Mx My Mz Vx Vy Vz Px Py Pz
167
Projet Quadricoptère 2005/2006
Manipulations effectuées :
Après avoir modifié le code source de telle sorte qu’il envoie les positions X et Y à la
station sol, On a effectué un premier test qui a échoué puisqu’on a récupérer que des
zéros au lieu des X et Y. Alors un test à l’aide de l’équipe capteur a été effectué
directement sur la MIDGII avec le logiciel de communication livré avec. Bien que ça a été
pénible de maintenir la liaison avec câble MIDGII fixée sur le drone et le PC, on est
parvenu à récupérer des données plausibles dans les deux formats ECEF (de l’ordre de
10e9 Cm )et ENU (de l’ordre de 10e2 cm). Plus de détails sur ces formats de coordonnées
est donnée dans la partie capteurs de ce rapport ou dans la documentation de la MIDGII.
Alors on a constaté que c’est soit un problème de code puisque la transmission par
modem a été testé et elle marchait parfaitement.
Pour résoudre ce problème une réflexion a été faite sur les bits signifiants des 32 bits
contenant la position. En effet en format ENU on n’est pas obligé d’envoyer tous les bits
des 32 puisque ceux de gauches ne seraient pas très intéressant puisqu’ils contiennent
que le signe (1 pour une coordonnée négative et 0 pour une positive). Alors on a choisi
d’envoyer à l’aide de la fonction put_unit16 du programme principal que les 16 premiers
bits intéressants de droite et ainsi ça a fonctionné parfaitement.
Un problème peut se poser au cas ou on choisit d’utiliser les coordonnées ECEF pour ne
plus dépendre du point de référence arbitraire (ce cas est plus proche des modalités de
déroulement du concours). Dans ce cas on aura besoin des 32 bits ou bien des 4 octets
complets des coordonnées ce qui pose un problème car la bande passante de la
transmission est limitée à 30 octets au maximum (dans ce cas on doit envoyer 4 octets
pour chacune des coordonnées ce qui nous fait 8 octets au total ce qui est beaucoup)
Un autre problème très gênant auquel on n’a pas de solution géniale pour le résoudre est
que la MIDGII ne marche qu’en plein air. En effet dès qu’il y a un toit ou un mur à
proximité d’elle, elle ne capte plus rien en position et vitesse. Cela rend les tests de vol à
l’intérieur d’un bâtiment impossibles, et bien sûr aussi dehors si les condition climatiques
sont défavorables.
Manipulations effectuées :
Faute de temps aucune manipulation n’a été effectuée pour tester l’asservissement en
vitesse. On compte sur l’équipe prochaine pour faire ce test avec le programme
main502_0 détaillé dans l’annexe « code source »
168
Projet Quadricoptère 2005/2006
Manipulations effectuées :
première manipulation :
Une première manipulation a été faite le mardi 25 avril 2005. Le résultat de cette
manipulation n’était pas optimal, bien qu’elle ait prouvé que la détection d’obstacles était
bien fonctionnelle.
Déroulement :
Interprétation :
Le drone a bien détecté l’obstacle et a essayé par conséquent de freiner afin de l’éviter
comme prévu. Le bon coté de cette expérience est que le choc n’a pas eu lieu. Pour
savoir pourquoi le drone perd le contrôle et tombe, on a analysé le code flashé avec M.
Martin. Il s’est avéré que la consigne d’annulation de vitesse n’était pas suivie d’un Rate
Limiter ce qui provoque des variations importantes et aléatoires d’angles de roulis et de
tangage allant jusqu’à 50°, ce qui fait un appel de courant excessif des moteurs pour
pouvoirs se redresser ce qui entraîne en finale la disjonction. Cette expérience nous a
prouvé l’importance du rôle du Rate Limiter et heureusement elle n’avait pas causé de
dégâts.
deuxième manipulation :
La deuxième manipulation a eu lieu fin mai 2006. Beaucoup de vent nous a empêché de
d’éviter la détection du sol. Plusieurs tests ont été faits sans aboutir à un résultat
satisfaisant à cause de ces conditions climatiques. Mais ce qui est sûr, est que le capteur
Ultrason en amont du drone capte les obstacles et le drone y réagit.
169
Projet Quadricoptère 2005/2006
170
Projet Quadricoptère 2005/2006
Pour améliorer les performances du drone il faut améliorer les contrôleurs implémentés
dans l’ATmega. Or il est difficile de programmer un contrôleur sur l’ATmega, ceci pour
deux raisons décrites ci-dessous : la discrétisation et les calculs sur entiers
Un fois les contrôleurs calculés, il faut pouvoir les implémenter dans l’ATmega. Les
contrôleurs que l’on calcule grâce à la modélisation du quadri sont des contrôleurs
continus. L’ATmega, quand il tourne, ne fait les calculs qu’à une certaine fréquence. Il
faut donc discrétiser les contrôleurs. Ceci n’est pas évident et demande certaines
précautions.
Mais il faut savoir que l’ATmega est un microcontrôleur 8 bits et à virgule fixes : c'est-à-
dire qu’il n’est pas très puissant (8 bits), et surtout il n’est pas assez puissant pour faire
des calculs à résultas flottants. Or, les contrôleurs nécessaires sur le quadri n’ont aucune
raison d’être à coefficients entiers.
Pour mieux connaître les limites de l’ATmega dans le calcul avec des flottants une
manipulation expérimentale a été effectuée afin comparer la vitesse de calcul de
l’ATmega entre deux opérations à résultat entier et flottant.
Protocole expérimental :
171
Projet Quadricoptère 2005/2006
Résultats obtenus :
Pour être sur d’avoir une durée d’exécution crédible deux méthodes ont été utilisée pour
calculer le temps d’exécution de l’opération de multiplication :
• une méthode approchée à l’aide d’un chronomètre (en fait le programme a été
conçu de telle sorte qu’il allume les quatre LEDS à droite du PORT B pendant la
durée du calcul)
• une méthode exacte en utilisant le TIMER 16 bits TCCR3B et son registre TCNT3H
Le temps d’exécution étant très court, on a choisit de refaire la boucle 128 000 fois, pour
pouvoir avoir un temps mesurable à notre échelle.
Interprétation et conclusion :
On remarque d’après les deux approches que le temps d’exécution d’une opération
flottante prends environ 10 fois plus de temps qu’une opération entière. Cela veut dire
que si le programme principale utilisait une ou plusieurs valeurs flottante, il sera 10 fois
plus lent que celui qui existe aujourd’hui.
Pour cela nos boucles automatiques sont faites de telle manière de convertir tous les
flottant en entiers puis de les shifter à droite pour ramener l’opération au résultat entier
le plus proche que celui d’une opération flottante. Ceci complexifie grandement le travail
de programmation et nous empêche de modifier les paramètres des contrôleurs
172
Projet Quadricoptère 2005/2006
rapidement. Tout cela explique la difficulté rencontrée pour comprendre le rapport entre
les paramètres des planches Simulink et ceux du programme principal.
Le problème est le SC520 n’a presque pas d’entrées/sorties excepté 4 ports série et un
bus. Il ne peut en aucun cas lire les données de la radiocommande ni des capteurs
ultrasons et surtout commander les moteurs.
173
Projet Quadricoptère 2005/2006
Le SC520 sort sur des connecteurs molex (180 petites pattes) plein de connexions. Par
exemple on y retrouve les ports COM etc.…
Quand il est sur son kit de développement, la plupart de ses connexions ressortent des
formes plus ou moins standard. Par exemple les 4 ports COM ressortent : le premier en
prise DB 9 (port série) les autres un peu différemment.
Mais entre les sorties du module et les sorties du kit, il y a des circuits. Ces circuits
peuvent changer la nature même de la connexion : en embarqué, un port COM peut être
TTL, et en sortie du Kit, il peut être RS 232 V24.
Pour cela il faut bien lire les documentations respectives du module et du kit de
développement. Le problème est que la documentation du kit, n’est pas très précise car il
existe plusieurs versions de kit et en fonction de ce qu’on a demandé, certains circuits
sont présents ou non.
174
Projet Quadricoptère 2005/2006
En sortie du kit
COM 1, 2 et 3 en RS232 V24 (on peut voir un max 232 sur le kit avant la sortie de
COM3)
COM 4 : je ne me souviens plus trop. Apparemment il n’y a pas de circuit, donc je dirais
que c’est comme sur le module, mais avec le multimètre j’avais l’impression que ce
n’était pas connecté. Il faudra trouver ce que c’est.
Au final, il faut faire très attention pour chaque connexion avec les ports que tout est
compatible. Par exemple on utilisait COM3 pour la liaison ATMEGA SC520. L’ATmega sort
en brut du TTL mais sur la carte électronique il est suivi d’un max232 et passe en RS232
V24. D’où, quand on faisait les tests avec SC520 sur kit de développement, on connectait
le SC520 à la sortie du max de la carte électronique. Mais, quand on faisait les tests avec
le SC520 embarqué, (com3 est alors en TTL), il fallait le connecter en amont du max 232
pour « parler » directement à l’ATmega en TTL.
Au final, faites attention à chaque connexion et lisez bien les documentations du SC520.
Il y en a trois : L-555e.pdf pour le kit de développement, L-554e.pdf pour le module
(SC520), et 1183-3-001.pdf pour tous les schéma de connexion du kit.
Des fois il faut compléter les informations de ces documentations avec des tests au
multimètre.
Midg
2 RS 422
à N’ont pas
vérifier convertisseur encore été faits
COM 2
SC 520
COM 3
AT
MEGA TTL
COM0
175
Projet Quadricoptère 2005/2006
Rouge :
Décodage ATMEGA :
Quand on ouvre le subsystem rouge on trouve :
Les gains sont juste des coefficients de sensibilité. Le 48 est sur la manette des gaz.
Avant le gaz, les données qui arrivent appartiennent à [0 1], et on multiplie par 48 pour
être entre 0 et 48 Volts car cela représente la somme des 4 moteurs, et que tout à été
fait pour des contrôleurs en unité S.I..
Quand on rentre dans le deuxième Subsystem on trouve :
176
Projet Quadricoptère 2005/2006
Au départ, on utilise deux blocks, dont un stateflow pour décoder les données : cf. aide
Matlab. Attention, cela ne peut pas marcher sans le block « RS232 setup » de la planche
générale. Si l’ATmega envoie des données différentes, il faut modifier le block stateflow
en conséquence.
Remarque : il existe une autre possibilité pour décoder une liaison série plus simplement
mais nous sommes obligés d’utiliser celle là pour des raisons décrites en annexe.
Suit, deux blocks « unpack » et « byte reversal » qui permettent de regrouper les octets
par deux (puisque les données sont en uint16) et intervertissent les octets de poids fort
et faible car l’ATmega envoie les octets de poids fort en premier (little endian) et le
SC520 travaille en big endian.
On convertit le tout en double (c’est tout l’intérêt du SC 520).
On retranche les valeurs des PPM lorsque les manches sont à zéro.
Puis on met des gains pour ramener les commandes entre -1 et 1 sauf les gaz (ppm3)
entre 0 et 1.
Remarque pour retrouver les coefficients, on a, avec le tream des gaz tout en bas :
PPM1 (roulis) : appartient à 3030 plus ou moins 850.
Et respectivement voir planche pour les autres
Remarque tout est fait en Nord East down (contrôleur, capteurs)
Or les ppm sont comme suit :
Ppm3 Ppm2
Ppm4 Ppm1
177
Projet Quadricoptère 2005/2006
D’où les coefficients négatifs en roll et pitch dans le décodage des ppm.
Jaune :
Le premier block est relié à un autre de la planche principale et permet de décoder très
facilement les données de la midg2. cf. annexe.
On transforme le tout en uint8 car « FIFO bin binary » sort des uint16.
La partie du milieu permet de vérifier le cheksum (à regarder soi même), ce n’est pas
compliqué)
Idem que pour l’ATmega pour « unpack » et byte reversal.
Les gains permettent de passer de centième de degré en radian car les contrôleurs sont
en unité SI.
Marron :
178
Projet Quadricoptère 2005/2006
Bleu foncé:
Ce block permet de gérer le démarrage des moteurs. Le switch permet de switcher entre
le cas du haut, et celui du bas. Sa condition de switch est basée sur la donnée des gazs
comparé à un chiffre (10).
En haut, on me
Pour la mannette des gaz au dessous de 10 volts (sur 48), on rentre dans les moteurs les
mêmes commandes, qui correspondent juste à la manette des gaz.
Pour la mannette des gaz au dessus de 10 volts, on rentre dans les moteurs les
commandes calculées par les contrôleurs.
Remarque : lorsque l’on utilise le block « uint8 », il faut impérativement cocher
« saturate on integer overflow » dans les options pour éviter tout bug.
Tout d’abord j’ai pu réalisé cette partie du travail grâce au rapport et à l’aide de Pierre de
l’équipe quadri 2004-2005 qui a toujours répondu à mes mails et même à mes appels
téléphoniques. Je tiens à le remercier beaucoup avant de commencer.
Pour effectuer cette expérience il faut utiliser la version 7.0.4 de Matlab. Pour pouvoir
programmer le SC520 avec xPC target, il fallait lire un nombre de documentations :
• La documentation de XPC Target surtout le Getting started, le Basic Tutorial et le
paragraphe Embedded Options (voir le Help de Matlab)
• La documentation du SC520 et de son kit de développement (surtout la partie
Bios) se trouvant soit dans le CD en version pdf soit en version imprimée avec le
SC520.
179
Projet Quadricoptère 2005/2006
Protocole expérimental :
180
Projet Quadricoptère 2005/2006
Le pc de droite est le pc Host sur lequel une application XPC Target marche. Le Target
dans notre cas ici est le SC520 lui-même. Sa réponse sera visualisée sur l’écran de
gauche. Voici une photo générale de l’ensemble :
Pour commencer il fallait tout d’abord configurer le Bios pour permettre le SC520 de
booter sur la le lecteur disquette. Pour ce faire on a suivi la démarche suivante :
• Pour lancer le bios, appuyer sur CTRL-C (du clavier branché au SC520 bien sûr)
au lancement du SC520.
• Une liste apparaît : choisir « configuration CMOS »
• choisir Floppy 0 comme premier Boot Device et Flash 7340 K qui correspond à la
taille de flash du SC520 actuel grâce aux touches claviers décrites sur écran.
Choisir tout d’abord A : pour le lecteur disquette et B: pour la flash
• Boot order : choisir ce qu’on veut.
• Appuyer sur Echap
• Sélectionner “write to CMOS and exit”.
181
Projet Quadricoptère 2005/2006
On a téléchargé alors sur le kit le programme qui peut ensuite tourner quand on choisit le
mode « external » dans le menu « Simulation » et on clique sur « connect to Target »
puis sur lecture de la planche Simulink.
Pour plus de détails sur ce mode, consultez l’annexe HIL de ce rapport. Une démarche
détaillée y est expliquée.
Ici seulement le cas du SC520 de mémoire 8Mo est traité, puisque c’est lui le
microprocesseur dont on dispose actuellement.
Avant tout il fallait faire une disquette DOS. Pour cela, (car DOS n’est pas logiciel libre)
un fichier boot622.exe est disponible dans un CD contenant les archives du Groupe
Calculateurs (Surtout ne pas le chercher sur Internet, il y a d’autres fichiers qui ont le
même nom mais qui non rien à voir avec !!). Après il suffit de mettre une disquette
formatée dans le lecteur disquette du Host et cliquer sur le fichier boot622.exe. Il crée
alors une disquette DOS.
182
Projet Quadricoptère 2005/2006
Sinon il existe déjà une disquette Dos qui s’appelle « Dos compatible SC520
Boot622.exe » écrit avec le crayon. On peut l’utiliser directement pour configurer la Falsh
du SC520.
La flash est alors configurée, il fallait maintenant créer l’application sur un fichier séparé
et le copier dessus.
• Une fois nomfichier.rtb sur la flash, si celle-ci est bien configurée, il suffit alors de
rebouter le SC520, d’avoir reconfiguré le BIOS de sorte que le Premier Boot
Device soit la Flash 7340 K (qui est le SC520).
• Rebouter, l’application xPC Target se lance automatiquement
La manipulation déjà décrite a marché sans problème dans le mode Boot Floppy, mais
était un peu plus problématique pour le mode Standalone. Faute de temps la réalisation
d’un essai de vol en mode Standalone n’a pas été réalisée mais cella a déjà été faite par
nos prédécesseurs (cf. Rapport SC520enforme de Pierre). En Fait il reste juste de
brancher le SC520 avec les capteurs et l’ATmega selon le schéma de branchement du
SC520 embarqué en le fixant sur sa carte fabriquée par Pierre.
Un premier problème critique en mode standalone. Il faut savoir tout d’abord que dans
xPC target en mode boot floppy, il existe une connexion host/target qui permet de
télécharger les programmes etc…
Cette connexion host.target peut se faire soit par liaison série ou par éthernet. Lorsque
l’on fait sa floppy (à partir de xpcexplr, on peut choisir quoi choisir : RS 232 ou TCP/IP).
Nous choisissons pour le SC520 une liaison série car la carte ethernet n’est pas
compatible avec xPC target. Evidemment, dans ce cas, on pers une liaison série (COM 1).
Mais on peut se débrouiller sans.
183
Projet Quadricoptère 2005/2006
Le problème est qu’en mode standalone, cette communication Host/target (inutile alors)
existe encore et monopolise encore COM 1. Si on veut utiliser un block envoyant des
données sur COM 1, le programme bug.
Ensuite, il faut également savoir qu’il existe deux block pour lire les liaisons séries (cf.
Philippe Martin). L’un doit être suivi d’un block stateflow et pas l’autre. Le deuxième est
beaucoup plus évolué car il cherche lui-même les headers etc. du point de vu historique il
est apparu après d’où l’utilisation du compliqué). Cependant, dans la pratique un autre
point important les différencie.
Le deuxième (facile d’utilisation) « relie » COM 1 et COM 3 (tout comme COM 2 et COM
4), car ils fonctionnent sur la même interruption. Il faut d’ailleurs n’utiliser qu’un seul
block qui s’occupe des deux ports en même temps. Ce qui pose problème, c’est qu’une
liaison host/target ne peut pas partager son interruption. Donc si la liaison Host/target
est sur COM 1, on ne peut pas utiliser COM 3.
Le premier block (compliqué à utiliser) a en revanche l’avantage de quand même
marcher (bien qu’indiqué le contraire dans la documentation). C'est-à-dire que malgré
une communication Host/target sur COM 1, on peut utiliser COM 3 !
Le premier block est donc utilisé pour la liaison avec l’ATmega (un seul header à lire donc
décodage encore faisable à la main) et sur COM 3. Le deuxième block qui peut lire
facilement plusieurs headers (pour la midg2 par exemple), est alors utilisé pour lire la
midg2 sur COM 2. Pour plus de détail sur ce problème, consultez M. Martin qui a déjà
contacté Mathworks à ce propos.
Un deuxième problème important a provoqué l’arrêt des essais de vol avec le SC520 de
nos prédécesseurs avant le concours 2005. En fait en faisant un essai de vol, l’ancien
SC520 de mémoire Flash 1Mo a été grillé. Alors on a commandé un deuxième. Ce
deuxième a pour mémoire 8Mo, ce qui est mieux théoriquement, mais ce SC520
présentait un gros désavantage : son BIOS se déconfigure dès qu’il n’est plus alimenté.
Or, le BIOS par défaut est préconfiguré pour se lancer sur une flash de 1 Mo. Avec le
premier SC520 (celui qui ne fonctionne plus), aucun problème n’est donc apparu. Mais
pour celui avec une flash de 8 Mo (donc le nouveau), cela rend impossible le mode
Standalone. En effet le SC520 n’arrive plus dans ce cas à booter sur sa propre Flash car il
fallait l’enlever de son kit (alors il n’est plus alimenté) pour le brancher sur le drone.
Ainsi, même si l’on a configuré la Flash pour que le SC520 boot sur la flash de 8 Mo, le
BIOS se reconfigure et quand on alimente la carte électronique du quadricoptère, le
SC520 essaye de booter sur un flash de 1 Mo, qui n’existe pas.
184
Projet Quadricoptère 2005/2006
Pour résoudre ce problème on a contacté Phytec on Allemagne qui nous ont dit qu’il faut
brancher une batterie 3V entre le pin 6C Vbat et la masse. Ainsi la BIOS pourra être
sauvegardée. Une batterie bouton Litium a été soudée sur le module SC520 et ceci a
résolu définitivement le problème.
La flèche bleue indique le Molex utilisé pour le branchement avec la carte réalisée par
Pierre (à gauche). A droite de ce Molex il y a la rangée C et à gauche la rangée D dont
les pins sont indicés du haut vers le bas selon cette photo. Pour ne pas se tromper la pile
couverte avec le scotch jaune est branché au pin 6C (fil rouge) et à la masse (fil jaune).
Ces fils sont très fragiles !
Ainsi on dispose d’un système opérationnel prêt à voler. Ceci est très utile pour
dimensionner rapidement les paramètres des contrôleurs à partir des essais de vol ciblés.
Néanmoins à cause de son poids non négligeable (environ 50g), on ne peut pas
envisager une solution finale avec le SC520 embarqué. C’est pour cela on l’utilisera juste
comme outil d’ajustement des paramètres des contrôleurs (surtout si on y rajoute des
termes intégrateurs et dérivateurs aux régulateurs) et une fois on a trouvé les
paramètres idéaux on les programme sur l’ATmega une fois pour toute.
185
Projet Quadricoptère 2005/2006
9. ANNEXES PROPULSION
186
Projet Quadricoptère 2005/2006
187
Projet Quadricoptère 2005/2006
188
Projet Quadricoptère 2005/2006
189
Projet Quadricoptère 2005/2006
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <inttypes.h>
// choisit le PLL à 64MHz
Start_pll_64_mega()
{PLLCSR = 0x06;}
// vérifie que l´horloge PLL est verrouillée
Wait_pll_ready()
{While (! (PLLCSR & (1<<PLOCK)));} //!Retourne 1 si le PLL est verrouillé
//! Connecte le signal PLL au PSC1
Psc1_use_pll_clock()
{ PCNF1 |= (1<<PCLKSEL0); }
//! Active les deux sorties A et B de PSC1
Enable_both_psc1_outputs()
{PSOC1 |= ((1<<POEN1A) | (1<<POEN1B));}
//!< PSC1 outputs sont active High
Psc1_outputs_active_high()
{PCNF1 |= (1<<POP1) ;}
//! Enclencher le PLL à 64MHz et le connecter au PSC1
Psc1_use_64_mega_pll_clock()
{Start_pll_64_mega();
Wait_pll_ready();
Psc1_use_pll_clock();
}
//! Configurer PSC1 en mode centré
Psc1_in_centered_aligned_mode()
{PCNF1 |= ( (1<<PMODE11) | (1<<PMODE10) ) ;}
//!< Enclencher le cycle pwm de PSC1
Start_psc1()
{ PCTL1 |= (1<<PRUN1); }
main()
{
// PSC est sur 12 BITS de 0X0000 à 0x0FFF
//remplir les registres de comparaison
OCR1SAH = 0x04; OCR1SAL = 0X00;
OCR1SBH = 0X07; OCR1SBL = 0X00;
OCR1RBH = 0X0F; OCR1RBL = 0Xff;
Psc1_use_64_mega_pll_clock();
Enable_both_psc1_outputs();
Psc1_outputs_active_high();
Psc1_in_centered_aligned_mode();
Start_psc1();
while (1);
}
190
Projet Quadricoptère 2005/2006
191
Projet Quadricoptère 2005/2006
// +6 et +7 et << : processus
d'assemblage de deux octets en un seul octet double
data[y+3] =
(int16_t)((rx_buf_MIDG2[y+y+18] << 8)|(rx_buf_MIDG2[y+y+19]>>0));//les
angles : Yaw, Pitch, Roll
//+18 parce qu'on a enregistré
dans le buffer l'ID (1 byte), le count (1 byte), le timestamp (4 bytes),
les 3 gyros (6 bytes) et les 3 acceleros (6 bytes) (1+1+4+6+6=18)
// Remarque: est-il nécessaire de
mettre dans le buffer toutes ces données qui ne servent pas, possibilité de
gagner du temps?
//+18 et +19 car à chaque fois une
valeur intéressante est codée sur 2 octets consécutifs
}
INS=(rx_buf_MIDG2[40]); //cf doc midg2,
le 38ème octet du payload
data[AZ] = (int16_t)((rx_buf_MIDG2[16]
<< 8)|(rx_buf_MIDG2[17]>>0));//rajout az, Z Axis Acceleration
LEDon;
LED1on;
imu=1;//important: imu=1 toutes les
20ms
envoi=!envoi;
if (envoi)
{
put_uint8_t(0xFA);
put_uint8_t(0xFF);
put_uint8_t(moteur1);
put_uint8_t(moteur2);
put_uint8_t(moteur3);
put_uint8_t(moteur4);
put_uint16_t(data[MX]);//roll
put_uint16_t(data[MY]);//pitch
put_uint16_t(data[MZ]);//yaw
put_uint16_t(data[VX]);//VX
put_uint16_t(data[VY]);//VY
put_uint16_t(data[VZ]);//VZ
// put_uint16_t(gsonar);//altitude
put_uint16_t(zf);//altitude
put_uint8_t(INS);//INS
Vbat = (ADCH << 6)|(ADCL>>2);
put_uint8_t(Vbat);//batterie
// put_uint16_t(data[AZ]);//VZ
put_uint16_t(gsonar);//VZ
put_uint8_t(moteur1+moteur2+moteur3+moteur4+(data[MX]>>8)+data[MX]
+(data[MY]>>8)+data[MY]+(data[MZ]>>8)+data[MZ]+(data[VX]>>8)
+data[VX]+(data[VY]>>8)+data[VY]+(data[VZ]>>8)+data[VZ]
+(gsonar>>8)+gsonar+INS
// +(gsonar>>8)+gsonar+Vbat);
+(zf>>8)+zf+Vbat);
}
break;
}
case(2): // message ID = 2
{
for (y=0;y<3;y++)
192
Projet Quadricoptère 2005/2006
{
data[y] =
(int16_t)((rx_buf_MIDG2[y+y+6] << 8)|(rx_buf_MIDG2[y+y+7]>>0));//je ne
prends que les gyros (X,Y et Z Axis Angular Rate)
}
data[AZ] = (int16_t)((rx_buf_MIDG2[16]
<< 8)|(rx_buf_MIDG2[17]>>0));//rajout az, Z Axis Acceleration
break;
}
case(12): // message ID = 12
{
for (y=0;y<3;y++)
{
data[y+6]=(((uint32_t)
rx_buf_MIDG2[4*y+18]) << 24)
|(((uint32_t)
rx_buf_MIDG2[4*y+19])<< 16)
|(((uint32_t)
rx_buf_MIDG2[4*y+20]) << 8)
|(rx_buf_MIDG2[4*y+21]);
//on place les vitesses (X,Y,Z
Axis velocity) dans data aux positions 6,7,8
//les vitesses sont codées sur
quatre bytes, on les regroupe sur un byte quadruple
data[y+10]=(((uint32_t)
rx_buf_MIDG2[4*y+6]) << 24)
|(((uint32_t)
rx_buf_MIDG2[4*y+7])<< 16)
|(((uint32_t) rx_buf_MIDG2[4*y+8])
<< 8)
|(rx_buf_MIDG2[4*y+9]);
//on place les positions (X,Y,Z
Axis Position) dans data aux positions 10,11,12
//les positions sont codées sur
quatre bytes, on les regroupe sur un byte quadruple
}
break;
}
default: //message valide, mais autre que
2,10,12
{
//cbi( PORTE, LED_RED);
LEDoff;//inutile???
break;
}
}
}
else {LEDoff;} // si le message n'est pas valide, on ne
tient pas compte du message et on remet tout à zéro
bytecounter_MIDG2=0;CHECKSUM0_MIDG2=0;CHECKSUM1_MIDG2=0;
return;
}
193
Projet Quadricoptère 2005/2006
194
Projet Quadricoptère 2005/2006
SIGNAL(SIG_2WIRE_SERIAL)
{
static uint8_t led_controle;
volatile static uint16_t sonar;
switch (I2cState)
{
// -- START RANGING SRF10_k --
case 0: // ranging
//putc(TW_STATUS);
//putc(I2cState);
switch (TW_STATUS) // TW_STATUS = TWSR avec les bit 3 à 7 seulement.
Voir la librairie compat/twi.h et la doc de l'ATMega pour plus d'info
{
case TW_REP_START: // OK, now send SLA+W
TWDR = adresse_capteur_us[k] | TW_WRITE;
TWCR = _BV(TWINT) | _BV(TWEN) | _BV(TWIE);
break;
default: // restart ranging
I2cState = 0;
TWCR = _BV(TWINT) | _BV(TWEN) | _BV(TWIE) | _BV(TWSTA);
break;
}
break ;
case 1:
//putc(TW_STATUS);
//putc(I2cState);
switch (TW_STATUS)
{
case TW_MT_SLA_ACK: // OK, now send register number
TWCR = _BV(TWINT) | _BV(TWEN) | _BV(TWIE);
break;
default: // restart ranging
I2cState = 0;
TWCR = _BV(TWINT) | _BV(TWEN) | _BV(TWIE) | _BV(TWSTA);
break;
}
break ;
case 2:
//putc(TW_STATUS);
//putc(I2cState);
switch (TW_STATUS)
{
case TW_MT_DATA_ACK: // OK, now send ranging command
TWDR = 0x51; // Pour que le capteur nous retourne la valeur
mesurée en centimètres
TWCR = _BV(TWINT) | _BV(TWEN) | _BV(TWIE);
break;
default: // restart ranging
I2cState = 0;
TWCR = _BV(TWINT) | _BV(TWEN) | _BV(TWIE) | _BV(TWSTA);
break;
}
break ;
case 3:
//putc(TW_STATUS);
//putc(I2cState);
switch (TW_STATUS)
195
Projet Quadricoptère 2005/2006
{
case TW_MT_DATA_ACK: // OK, now start MT mode
TWCR = _BV(TWINT) | _BV(TWEN) | _BV(TWIE) | _BV(TWSTA);
break;
default: // restart get range, MT mode
I2cState = 3;
TWCR = _BV(TWINT) | _BV(TWEN) | _BV(TWIE) | _BV(TWSTA);
break;
}
if (premier_cycle_I2c != nombre_capteurs_us - 1)
{
I2cState = -1;
premier_cycle_I2c ++;
}
k ++;
if (k == nombre_capteurs_us)
{
k = 0; //Retour au premier capteur quand on a fini le dernier
}
break ;
// -- Lecture de la mesure de SRF10_k --
case 4:
//putc(TW_STATUS);
//putc(I2cState);
switch (TW_STATUS)
{
case TW_REP_START: // OK, now send SLA+W
TWDR = adresse_capteur_us[k] | TW_WRITE;
TWCR = _BV(TWINT) | _BV(TWEN) | _BV(TWIE);
break;
default: // restart get range, MT mode
I2cState = 3;
TWCR = _BV(TWINT) | _BV(TWEN) | _BV(TWIE) | _BV(TWSTA);
break;
}
break ;
case 5:
//putc(TW_STATUS);
//putc(I2cState);
switch (TW_STATUS)
{
case TW_MT_SLA_ACK: // OK, now send register number
TWDR = 2;
TWCR = _BV(TWINT) | _BV(TWEN) | _BV(TWIE);
break;
default: // restart get range, MT mode
I2cState = 3; // SRF10_k non pret. va essayer SRF10_k+1
k ++;
if (k == nombre_capteurs_us)
{
k = 0; //Retour au premier capteur quand on a fini le
dernier
}
TWCR = _BV(TWINT) | _BV(TWEN) | _BV(TWIE) | _BV(TWSTA);
break;
}
break ;
case 6:
//putc(TW_STATUS);
//putc(I2cState);
switch (TW_STATUS)
{
196
Projet Quadricoptère 2005/2006
197
Projet Quadricoptère 2005/2006
SIGNAL(SIG_2WIRE_SERIAL)
{
static uint8_t led_controle;
volatile static uint16_t sonar;
switch (I2cState)
{
// -- START RANGING SRF10_k --
case 0: // ranging
//putc(TW_STATUS);
//putc(I2cState);
switch (TW_STATUS) // TW_STATUS = TWSR avec les bit 3 à 7 seulement.
Voir la librairie compat/twi.h et la doc de l'ATMega pour plus d'info
{
case TW_REP_START: // OK, now send SLA+W
TWDR = adresse_capteur_us[k] | TW_WRITE;
TWCR = _BV(TWINT) | _BV(TWEN) | _BV(TWIE);
break;
default: // restart ranging
I2cState = 0;
TWCR = _BV(TWINT) | _BV(TWEN) | _BV(TWIE) | _BV(TWSTA);
break;
}
break ;
case 1:
//putc(TW_STATUS);
//putc(I2cState);
switch (TW_STATUS)
{
case TW_MT_SLA_ACK: // OK, now send register number
TWCR = _BV(TWINT) | _BV(TWEN) | _BV(TWIE);
break;
default: // restart ranging
I2cState = 0;
TWCR = _BV(TWINT) | _BV(TWEN) | _BV(TWIE) | _BV(TWSTA);
break;
}
break ;
case 2:
//putc(TW_STATUS);
//putc(I2cState);
switch (TW_STATUS)
{
case TW_MT_DATA_ACK: // OK, now send ranging command
TWDR = 0x51; // Pour que le capteur nous retourne la valeur
mesurée en centimètres
TWCR = _BV(TWINT) | _BV(TWEN) | _BV(TWIE);
break;
default: // restart ranging
I2cState = 0;
TWCR = _BV(TWINT) | _BV(TWEN) | _BV(TWIE) | _BV(TWSTA);
break;
}
break ;
case 3:
//putc(TW_STATUS);
//putc(I2cState);
switch (TW_STATUS)
198
Projet Quadricoptère 2005/2006
{
case TW_MT_DATA_ACK: // OK, now start MT mode
TWCR = _BV(TWINT) | _BV(TWEN) | _BV(TWIE) | _BV(TWSTA);
break;
default: // restart get range, MT mode
I2cState = 3;
TWCR = _BV(TWINT) | _BV(TWEN) | _BV(TWIE) | _BV(TWSTA);
break;
}
I2cState = -1;
k ++;
if (k == nombre_capteurs_us)
{
k = 0; //Retour au premier capteur quand on a fini le dernier
I2cState = 3; //On passe à la phase de lecture des mesures
uniquement lorsque l'on a lancé le ranging des k capteurs
}
break ;
case 6:
//putc(TW_STATUS);
//putc(I2cState);
switch (TW_STATUS)
{
case TW_MT_DATA_ACK: // OK, now send rep start
TWCR = _BV(TWINT) | _BV(TWEN) | _BV(TWIE) | _BV(TWSTA);
break;
default: // restart get range, MT mode
I2cState = 3;
TWCR = _BV(TWINT) | _BV(TWEN) | _BV(TWIE) | _BV(TWSTA);
break;
}
199
Projet Quadricoptère 2005/2006
break ;
case 7: // get range, MR mode
//putc(TW_STATUS);
//putc(I2cState);
switch (TW_STATUS)
{
case TW_REP_START: // OK, now send SLA+R
TWDR = adresse_capteur_us[k] | TW_READ;
TWCR = _BV(TWINT) | _BV(TWEN) | _BV(TWIE);
break;
default: // restart get range, MR mode
I2cState = 7;
TWCR = _BV(TWINT) | _BV(TWEN) | _BV(TWIE) | _BV(TWSTA);
break;
}
break ;
case 8:
//putc(TW_STATUS);
//putc(I2cState);
TWCR = _BV(TWINT) | _BV(TWEN) | _BV(TWIE) | _BV(TWEA);
break ;
case 9:
//Read high Byte
//putc(TW_STATUS);
//putc(I2cState);
sonar = TWDR;
if (sonar==0xFF) {LED2on;} else LED2off;
TWCR = _BV(TWINT) | _BV(TWEN) | _BV(TWIE);// | _BV(TWEA); //pas de TWEA
pour dernier octet
break ;
case 10:
//Read low Byte
//putc(I2cState);
//putc(TW_STATUS);
//I2cState= -1 ;
I2cState= 3 ;
sonar = (sonar<<8) + TWDR;
gsonar_new[k] = sonar;
TWCR = _BV(TWINT) | _BV(TWEN) | _BV(TWIE) | _BV(TWSTA);
if (led_controle++<64) LED0on;
else {LED0off; if (led_controle==128) led_controle=0;}
k ++;
if (k == nombre_capteurs_us)
{
k = 0; //Retour au premier capteur quand on a fini le dernier
I2cState= -1 ; //On relance le ranging de tous les capteurs
quand on a récupéré les mesures des k capteurs
compteur_0 ++;
}
break ;
}
I2cState++;
return;
}
200
Projet Quadricoptère 2005/2006
SIGNAL(SIG_2WIRE_SERIAL)
{
static uint8_t led_controle;
volatile static uint16_t sonar;
switch (I2cState)
{
// -- START RANGING SRF10_k --
case 0: // ranging
//putc(TW_STATUS);
//putc(I2cState);
switch (TW_STATUS) // TW_STATUS = TWSR avec les bit 3 à 7 seulement.
Voir la librairie compat/twi.h et la doc de l'ATMega pour plus d'info
{
case TW_REP_START: // OK, now send SLA+W
TWDR = adresse_capteur_us[k] | TW_WRITE;
TWCR = _BV(TWINT) | _BV(TWEN) | _BV(TWIE);
break;
default: // restart ranging
I2cState = 0;
TWCR = _BV(TWINT) | _BV(TWEN) | _BV(TWIE) | _BV(TWSTA);
break;
}
break ;
case 1:
//putc(TW_STATUS);
//putc(I2cState);
switch (TW_STATUS)
{
case TW_MT_SLA_ACK: // OK, now send register number
TWCR = _BV(TWINT) | _BV(TWEN) | _BV(TWIE);
break;
default: // restart ranging
I2cState = 0;
TWCR = _BV(TWINT) | _BV(TWEN) | _BV(TWIE) | _BV(TWSTA);
break;
}
break ;
case 2:
//putc(TW_STATUS);
//putc(I2cState);
switch (TW_STATUS)
{
case TW_MT_DATA_ACK: // OK, now send ranging command
TWDR = 0x51; // Pour que le capteur nous retourne la valeur
mesurée en centimètres
TWCR = _BV(TWINT) | _BV(TWEN) | _BV(TWIE);
break;
default: // restart ranging
I2cState = 0;
TWCR = _BV(TWINT) | _BV(TWEN) | _BV(TWIE) | _BV(TWSTA);
break;
}
break ;
case 3:
//putc(TW_STATUS);
//putc(I2cState);
switch (TW_STATUS)
201
Projet Quadricoptère 2005/2006
{
case TW_MT_DATA_ACK: // OK, now start MT mode
TWCR = _BV(TWINT) | _BV(TWEN) | _BV(TWIE) | _BV(TWSTA);
break;
default: // restart get range, MT mode
I2cState = 3;
TWCR = _BV(TWINT) | _BV(TWEN) | _BV(TWIE) | _BV(TWSTA);
break;
}
/* if (premier_cycle_I2c != nombre_capteurs_us - 1)
{
I2cState = -1;
premier_cycle_I2c ++;
}
*/
// k ++;
/* if (k == nombre_capteurs_us)
{
k = 0; //Retour au premier capteur quand on a fini le dernier
}
break ;
*/
// -- Lecture de la mesure de SRF10_k --
case 4:
//putc(TW_STATUS);
//putc(I2cState);
switch (TW_STATUS)
{
case TW_REP_START: // OK, now send SLA+W
TWDR = adresse_capteur_us[k] | TW_WRITE;
TWCR = _BV(TWINT) | _BV(TWEN) | _BV(TWIE);
break;
default: // restart get range, MT mode
I2cState = 3;
TWCR = _BV(TWINT) | _BV(TWEN) | _BV(TWIE) | _BV(TWSTA);
break;
}
break ;
case 5:
//putc(TW_STATUS);
//putc(I2cState);
switch (TW_STATUS)
{
case TW_MT_SLA_ACK: // OK, now send register number
TWDR = 2;
TWCR = _BV(TWINT) | _BV(TWEN) | _BV(TWIE);
break;
default: // restart get range, MT mode
I2cState = 3; // SRF10_k non pret. va essayer SRF10_k+1
TWCR = _BV(TWINT) | _BV(TWEN) | _BV(TWIE) | _BV(TWSTA);
break;
}
break ;
case 6:
//putc(TW_STATUS);
//putc(I2cState);
switch (TW_STATUS)
{
case TW_MT_DATA_ACK: // OK, now send rep start
TWCR = _BV(TWINT) | _BV(TWEN) | _BV(TWIE) | _BV(TWSTA);
break;
default: // restart get range, MT mode
I2cState = 3;
202
Projet Quadricoptère 2005/2006
case 9:
//Read high Byte
//putc(TW_STATUS);
//putc(I2cState);
sonar = TWDR;
if (sonar==0xFF) {LED2on;} else LED2off;
TWCR = _BV(TWINT) | _BV(TWEN) | _BV(TWIE);// | _BV(TWEA); //pas de TWEA
pour dernier octet
break ;
case 10:
//Read low Byte
//putc(I2cState);
//putc(TW_STATUS);
I2cState= -1 ;
sonar = (sonar<<8) + TWDR;
gsonar_new[k] = sonar;
TWCR = _BV(TWINT) | _BV(TWEN) | _BV(TWIE) | _BV(TWSTA);
if (led_controle++<64) LED0on;
else {LED0off; if (led_controle==128) led_controle=0;}
k ++;
if (k == nombre_capteurs_us)
{
k = 0; //Retour au premier capteur quand on a fini le dernier
compteur_0 ++;
}
break ;
}
I2cState++;
return;
}
203
Projet Quadricoptère 2005/2006
void i2cInit(void)
{
TWBR = 152;// SCL 50khz avec horloge 16Mhz
I2cState = 0;
TWCR = _BV(TWINT) | _BV(TWEN) | _BV(TWIE) | _BV(TWSTA); // start
transmission
}
SIGNAL(SIG_2WIRE_SERIAL)
{
switch (I2cState)
{
case 0: // ranging
//putc(TW_STATUS);
putc(I2cState);
switch (TW_STATUS)
{
case TW_REP_START: // OK, now send SLA+W
TWDR = ancienne_adresse | TW_WRITE;
TWCR = _BV(TWINT) | _BV(TWEN) | _BV(TWIE);
break;
default: // restart ranging
I2cState = -1;
TWCR = _BV(TWINT) | _BV(TWEN) | _BV(TWIE) | _BV(TWSTA);
break;
}
break ;
case 1:
//putc(TW_STATUS);
putc(I2cState);
switch (TW_STATUS)
{
case TW_MT_SLA_ACK: // OK, now send register number
TWDR = 0x00;
TWCR = _BV(TWINT) | _BV(TWEN) | _BV(TWIE);
204
Projet Quadricoptère 2005/2006
break;
default: // restart ranging
I2cState = -1;
TWCR = _BV(TWINT) | _BV(TWEN) | _BV(TWIE) | _BV(TWSTA);
break;
}
break ;
case 2:
//putc(TW_STATUS);
putc(I2cState);
switch (TW_STATUS)
{
case TW_MT_DATA_ACK: // OK, now send ranging command
TWDR = 0xA0; // premier élément de la séquence
TWCR = _BV(TWINT) | _BV(TWEN) | _BV(TWIE);
break;
default: // restart ranging
I2cState = -1;
TWCR = _BV(TWINT) | _BV(TWEN) | _BV(TWIE) | _BV(TWSTA);
break;
}
break ;
case 3: // ranging
//putc(TW_STATUS);
putc(I2cState);
switch (TW_STATUS)
{
case TW_REP_START: // OK, now send SLA+W
TWDR = ancienne_adresse | TW_WRITE;
TWCR = _BV(TWINT) | _BV(TWEN) | _BV(TWIE);
break;
default: // restart ranging
I2cState = 2;
TWCR = _BV(TWINT) | _BV(TWEN) | _BV(TWIE) | _BV(TWSTA);
break;
}
break ;
case 4:
//putc(TW_STATUS);
putc(I2cState);
switch (TW_STATUS)
{
case TW_MT_SLA_ACK: // OK, now send register number
TWDR = 0x00;
TWCR = _BV(TWINT) | _BV(TWEN) | _BV(TWIE);
break;
default: // restart ranging
I2cState = 2;
TWCR = _BV(TWINT) | _BV(TWEN) | _BV(TWIE) | _BV(TWSTA);
break;
}
break ;
case 5:
//putc(TW_STATUS);
putc(I2cState);
switch (TW_STATUS)
{
case TW_MT_DATA_ACK: // OK, now send ranging command
TWDR = 0xAA; // premier élément de la séquence
TWCR = _BV(TWINT) | _BV(TWEN) | _BV(TWIE);
break;
default: // restart ranging
I2cState = 2;
TWCR = _BV(TWINT) | _BV(TWEN) | _BV(TWIE) | _BV(TWSTA);
break;
}
205
Projet Quadricoptère 2005/2006
break ;
case 6: // ranging
//putc(TW_STATUS);
putc(I2cState);
switch (TW_STATUS)
{
case TW_REP_START: // OK, now send SLA+W
TWDR = ancienne_adresse | TW_WRITE;
TWCR = _BV(TWINT) | _BV(TWEN) | _BV(TWIE);
break;
default: // restart ranging
I2cState = 5;
TWCR = _BV(TWINT) | _BV(TWEN) | _BV(TWIE) | _BV(TWSTA);
break;
}
break ;
case 7:
//putc(TW_STATUS);
putc(I2cState);
switch (TW_STATUS)
{
case TW_MT_SLA_ACK: // OK, now send register number
TWDR = 0x00;
TWCR = _BV(TWINT) | _BV(TWEN) | _BV(TWIE);
break;
default: // restart ranging
I2cState = 5;
TWCR = _BV(TWINT) | _BV(TWEN) | _BV(TWIE) | _BV(TWSTA);
break;
}
break ;
case 8:
//putc(TW_STATUS);
putc(I2cState);
switch (TW_STATUS)
{
case TW_MT_DATA_ACK: // OK, now send ranging command
TWDR = 0xA5; // premier élément de la séquence
TWCR = _BV(TWINT) | _BV(TWEN) | _BV(TWIE);
break;
default: // restart ranging
I2cState = 5;
TWCR = _BV(TWINT) | _BV(TWEN) | _BV(TWIE) | _BV(TWSTA);
break;
}
break ;
case 9: // ranging
//putc(TW_STATUS);
putc(I2cState);
switch (TW_STATUS)
{
case TW_REP_START: // OK, now send SLA+W
TWDR = ancienne_adresse | TW_WRITE;
TWCR = _BV(TWINT) | _BV(TWEN) | _BV(TWIE);
break;
default: // restart ranging
I2cState = 8;
TWCR = _BV(TWINT) | _BV(TWEN) | _BV(TWIE) | _BV(TWSTA);
break;
}
break ;
case 10:
//putc(TW_STATUS);
putc(I2cState);
switch (TW_STATUS)
206
Projet Quadricoptère 2005/2006
{
case TW_MT_SLA_ACK: // OK, now send register number
TWDR = 0x00;
TWCR = _BV(TWINT) | _BV(TWEN) | _BV(TWIE);
break;
default: // restart ranging
I2cState = 8;
TWCR = _BV(TWINT) | _BV(TWEN) | _BV(TWIE) | _BV(TWSTA);
break;
}
break ;
case 11:
//putc(TW_STATUS);
putc(I2cState);
switch (TW_STATUS)
{
case TW_MT_DATA_ACK: // OK, now send ranging command
TWDR = nouvelle_adresse; // premier élément de la séquence
TWCR = _BV(TWINT) | _BV(TWEN) | _BV(TWIE);
break;
default: // restart ranging
I2cState = 8;
TWCR = _BV(TWINT) | _BV(TWEN) | _BV(TWIE) | _BV(TWSTA);
break;
}
break ;
}
I2cState++;
return;
}
void main()
{
PORTD = _BV(1) | _BV(0); //activation des résistances de pull-up sur les
ports D0 et D1
i2cInit();
sei(); //autorise toutes les interruptions
}
207
Projet Quadricoptère 2005/2006
#include <avr/io.h>
#include <avr/delay.h>
#include <avr/signal.h>
#include <avr/interrupt.h>
#define TX_BUF_SIZE 23
#define RX_BUF_SIZE 23
volatile uint8_t tx_head;
volatile uint8_t tx_tail;
volatile uint8_t tx_buf[ TX_BUF_SIZE ];
volatile uint8_t data[ RX_BUF_SIZE];
volatile uint8_t bytecounter;
// Programme de test
// Lorsque l'UART1 a reçu 23 bits, l'ATMega renvoie le message sur l'UART1
void USART1_Transmission_Reception_Init(void)
{
UCSR1B |= _BV(TXEN) | _BV(RXCIE) | _BV(RXEN);
UBRR1L = 103;
}
void putc(uint8_t c)
{
uint8_t tmp_head;
tmp_head = tx_head + 1;
if( tmp_head >= TX_BUF_SIZE )
tmp_head = 0;
if( tmp_head == tx_tail )
return;
tx_buf[ tx_head = tmp_head ] = c;
UCSR1B |= _BV(UDRIE1); //autorise l'interruption SIG_UART1_DATA
}
SIGNAL( SIG_UART1_DATA ) //s'active quand le buffer UDR1 est vide
{
uint8_t tmp_tail;
if( tx_head == tx_tail )
{
UCSR1B &= ~_BV(UDRIE1); //désactive l'interruption
SIG_UART1_DATA (message envoyé)
return;
}
tmp_tail = tx_tail + 1;
if( tmp_tail >= TX_BUF_SIZE )
tmp_tail = 0;
tx_tail = tmp_tail;
UDR1 = tx_buf[tmp_tail];
}
208
Projet Quadricoptère 2005/2006
209
Projet Quadricoptère 2005/2006
#include <avr/io.h>
#include <avr/delay.h>
#include <avr/signal.h>
#include <avr/interrupt.h>
#define TX_BUF_SIZE 64
#define RX_BUF_SIZE 64
#define taille 29
volatile uint8_t tx_head;
volatile uint8_t tx_tail;
volatile uint8_t tx_buf[ TX_BUF_SIZE ];
volatile uint8_t data[ RX_BUF_SIZE ];
volatile uint8_t CHECKSUM, bytecounter;
// Programme partiel de l'ATMega au sol : Liaison descendante.
void USART0_Reception_Init(void)
{
UCSR0B |= _BV(RXCIE) | _BV(RXEN);
UBRR0L = 103;
}
void USART1_Transmission_Init(void)
{
UCSR1B |= _BV(TXEN);
UBRR1L = 103;
}
void putc(uint8_t c)
{
uint8_t tmp_head;
tmp_head = tx_head + 1;
if( tmp_head >= TX_BUF_SIZE )
tmp_head = 0;
if( tmp_head == tx_tail )
return;
tx_buf[ tx_head = tmp_head ] = c;
UCSR1B |= _BV(UDRIE1); //autorise l'interruption SIG_UART1_DATA
}
SIGNAL( SIG_UART1_DATA ) //s'active quand le buffer UDR1 est vide
{
uint8_t tmp_tail;
if( tx_head == tx_tail )
{
UCSR1B &= ~_BV(UDRIE1); //désactive l'interruption
SIG_UART1_DATA (message envoyé)
return;
}
tmp_tail = tx_tail + 1;
if( tmp_tail >= TX_BUF_SIZE )
tmp_tail = 0;
tx_tail = tmp_tail;
UDR1 = tx_buf[tmp_tail];
}
210
Projet Quadricoptère 2005/2006
211
Projet Quadricoptère 2005/2006
#include <avr/io.h>
#include <avr/delay.h>
#include <avr/signal.h>
#include <avr/interrupt.h>
// Programme de test
// Decodage des trames ppm, envoi des données sur l'UART1
void USART1_Transmission_Init(void)
{
UCSR1B |= _BV(TXEN);
UBRR1L = 103;
}
void putc(uint8_t c)
{
uint8_t tmp_head;
tmp_head = tx_head + 1;
if( tmp_head >= TX_BUF_SIZE )
tmp_head = 0;
if( tmp_head == tx_tail )
return;
tx_buf[ tx_head = tmp_head ] = c;
UCSR1B |= _BV(UDRIE1); //autorise l'interruption SIG_UART1_DATA
}
void put_uint8_t(uint8_t i)
{
putc(i);
}
void put_uint16_t(uint16_t i)
{
put_uint8_t( (i >> 8) & 0xFF );
put_uint8_t( (i >> 0) & 0xFF );
}
212
Projet Quadricoptère 2005/2006
tmp_tail = tx_tail + 1;
if( tmp_tail >= TX_BUF_SIZE )
tmp_tail = 0;
tx_tail = tmp_tail;
UDR1 = tx_buf[tmp_tail];
}
putc(CHECKSUM);
ppm_valid = 1;
TCNT3 = 0;
last = 0;
state = 0;
CHECKSUM = 0;
}
213
Projet Quadricoptère 2005/2006
void main(void)
{
//PPM init (TC3)
ppm_valid=0;
// TCCR3A = 0 (default)
// Normal port operation
// WGM33:0=0 (TC3 normal mode of operation)
TCCR3B = _BV(ICNC3) | _BV(ICES3) | _BV(CS31);
// Input Capture Noise Canceler: enabled
// Input Capture Edge Select: rising
// CS = b010: prescaler/8
ETIMSK |= _BV(TICIE3) | _BV(TOIE3);
USART1_Transmission_Init();
DDRB=0xFF ; //leds en sortie
sei(); //autorise toutes les interruptions
while(1)
{
PORTB=0x55;
}
214
Projet Quadricoptère 2005/2006
Les hélices telles qu’elles nous arrivent de chez le vendeur Todd’s Models ne se fixent pas
sur le moteur. Le filet du moteur est trop grand pour le trou de l’hélice et le moyeu de
l’hélice ne permet pas de serre l’écrou sur le filet. Nous devons donc limer et repercer les
hélices. Nous avons mis au point une méthode pour les usiner sur la fraiseuse de l’atelier
du LEE. Il est essentiel de suivre la méthode point par point pour effectuer avec succès la
modification :
215
Projet Quadricoptère 2005/2006
Au début nous avons essayé de convertir le code en MS Visual Basic 2005, mais on a
rencontré plusieurs problèmes qui étaient dus à des changements du mode « run-time ».
Certains éléments ne pouvaient plus être utilisés en run-time. C’est la raison pour
laquelle nous avons alors travaillé en Visual Basic 6.0.
Comme nous n’avions pas encore travaillé en Visual Basic avant, en particulier avec des
GUIs (Graphical User Interface), nous avons d’abord suivi quelques tutoriaux. Pour
apprendre les bases de la programmation d’un GUI, on conseille de regarder le film
« BEGIN01_04 - Creating a User Interface.wmv » qui est accessible par le portail du
projet.
Dans la forme en bas à droite il y a un élément « MSComm » qui est utilisé pour établir
la liaison sérielle avec le modem pour recevoir les données envoyées par le drone. Cet
élément est aussi représenté graphiquement dans la forme, parce que comme ça il sera
initialisé chaque fois que la forme est créée. On va encore détailler les propriétés de cet
élément dans les explications du corps du code.
216
Projet Quadricoptère 2005/2006
Le corps du code commence avec la sub-fonction Form_Load() qui est appelée chaque
fois que la forme graphique est créée, c'est-à-dire directement après le lancement du
programme. Dans cette fonction on initialise tous les éléments, les variables et la liaison
sérielle. Le plus important dans cette partie est la liaison sérielle qui est initialisée au
début. Le code pour ça est le suivant :
With MSComm1
.CommPort = 6 'on utilise le port COM6
.Handshaking = 2
.RThreshold = 1
.RTSEnable = True
.Settings = "9600,n,8,1"
.SThreshold = 1
.PortOpen = True
.InputMode = 1
End With
Bytecounter = 0
Checksum = 0
217
Projet Quadricoptère 2005/2006
Dans le reste de cette première fonction on initialise juste toutes les variables qui sont
nécessaires dans la suite.
Après les fonctions pour la réception des données et leurs traitements viennent. Chaque
fois que l’événement OnComm de l’élément MSComm déclenche, c’est-à-dire quand il a reçu
un certain nombre de caractères, la sub-fonction MSComm1_OnComm() est appelée. Dedans
les données reçues et stockées dans le buffer de l’élément MSComm sont copiées dans la
variable Tampon de type non précisé (Dim Tampon As Variant). Pour pouvoir facilement
vérifier que des informations sont reçues on les visualise sans traitement dans la case
text1 du GUI.
218
Projet Quadricoptère 2005/2006
Comme les données sont transmises comme une suite de chiffres de zéro à 256, il faut
les encore interpréter. Ceci veut dire que l’on calcule les grandeurs qui ont été
transmises en deux bytes et celles qui peuvent atteindre des valeurs négatives. Par
exemple, l’altitude est stockée sur les bytes 16 et 17 du message. Le byte numéro 16 est
appelé le « most significant byte », le byte numéro 17 le « least significant byte ». La
valeur de l’altitude est alors calculer de la façon suivante :
Par contre la vitesse en direction x, par exemple, peut aussi atteindre des valeurs
négatives. Ses valeurs sont alors stockées de la façon suivante :
256 -1 65536 -1
- -
-127 -32767
128 32768
+ +
0 0 0 0
Une fois qu’on a interprété le message et qu’on a stocké les informations dans les
variables correspondantes il faut juste attribuer ces variables aux éléments du GUI.
Comme ce sont des calculs plutôt mathématiques et faciles on ne va pas détailler chaque
attribution.
Dans la version 1.01 nous avons intégré la possibilité de sauvegarder toutes les données
transmises dans un fichier « .txt ». Ceci a été fait en particulier pour trouver la cause de
la disjonction que nous ne pouvions toujours pas expliquer. Mais on peut bien sûr
l’utiliser aussi pour d’autres fins comme par exemple pour récupérer des positions
comme dans la version 1.02.
Pour sauvegarder les données il faut d’abord créer un fichier .txt. Pour ceci on récupère
un numéro de fichier libre par la commande freefile et on assemble le nom du fichier
pour que l’on n’écrase pas les fichiers créés précédemment. Enfin on ouvre le fichier par
la commande open.
219
Projet Quadricoptère 2005/2006
file_nr = FreeFile
file_name = "data " & Format(Date, "dd-mm-yy") & " " & Hour(Time) & "h" &
Minute(Time) & ".txt"
Open file_name For Output As #file_nr
Les données sont alors ajoutées dans le fichier dans la fonction save_data en utilisant la
commande print (#file_nr, valeur).
Dans la version 1.02 « GPS coordinates added » on a ajouté les coordonnées x et y sur
deux fois deux bytes. Elles sont traitées comme toutes les autres données et sont enfin
affichées dans deux nouvelles cases sur le GUI. Dans la version 1.03 « Détection
obstacle » ces quatre derniers bytes peuvent être utilisés pour observer des données
quelconques. Les quatre bytes sont affichés dans quatre cases sur le GUI. Dans cette
version nous avons par exemple observé les informations des capteurs de détection
obstacle pour vérifier leurs fonctionnements.
Généralement le code en Matlab a la même structure qu’en Visual Basic. Les différences
sont l’intégration du flux vidéo, la visualisation de quelques grandeurs en utilisant des
graphes et la répartition des fonctions en différents fichiers.
13.2.1. Le GUI
Dans la première version de l’interface graphique sous Matlab, nous avons fait les
changements principaux suivants (ce qui ne dit pas qu’il peut y avoir des changements
lors des futures versions) :
220
Projet Quadricoptère 2005/2006
Dans cette fonction on vide d’abord la fenêtre des commandes. Après on définit deux
structures globales myvis et mydata, qui sont utilisées pour stocker les données
transmises. Pour accéder ces structures dans les sub-fonctions il faut juste les définir au
début de chaque sub-fonction.
Dans la suite le flux vidéo est intégré. Pour cela, on crée un « video input object » qui est
sauvegardé dans la structure handles. « winvideo » est le nom d’un « adoptor » qui
permet l’accès à l’« image acquisition device » connecté à l’ordinateur.
handles.vid = videoinput(‘winvideo’) ;
On crée l’« image object » pour qu’on puisse afficher le « video preview data ». Après, on
calcule la taille de l’image et l’on ajuste les dimensions de la fenêtre de la vidéo.
Après le flux vidéo on initialise le port sériel. Comme en Visual Basic le port sériel est un
objet qu’il faut initialiser au début mais cette fois-ci on n’a pas d’élément prédéfini
comme l’élément MSComm en Visual Basic. C’est pour ça que l’on le sauvegarde dans la
221
Projet Quadricoptère 2005/2006
structure handles. Voilà les commandes pour créer l’objet du port sériel et pour le
sauvegarder dans la structure handles:
s = serial('com6','Baudrate',115200,'InputBufferSize',128);
handles.s = s;
s.BytesAvailableFcnMode = 'byte';
s.BytesAvailableFcnCount = mydata.N;
s.BytesAvailableFcn = {@serial_callback, handles};
La première commande fixe le mode de la liaison sérielle come ‘byte’ pour que
l’événement « BytesAvailable » déclenche après un certain nombre de bytes et pas après
un caractère déterminé. Le nombre de bytes qui sont nécessaires pour déclencher
l’événement est défini par la commande suivante. La troisième ligne fixe quelle fonction
va être appelée en cas de déclenchement et quelles variables supplémentaires sont
transmises. Pour finalement ouvrir le port on utilise la commande suivante :
fopen(s)
Maintenant que l’on a initialisé nos structures globales, le flux vidéo et le port sériel il
faut encore définir les éléments du GUI que l’on ne veut pas redéfinir à chaque itération.
C’est par exemple la ligne du vecteur de vitesse qui est créée par la commande
suivante :
Ceci signifie que l’on crée une ligne du point P1 au point P2 en rouge avec une épaisseur
de 2. Les coordonnées des points sont stockées dans la matrice myvis.vel_vect.
Enfin il faut encore sauvegarder les changements de la structure handles. Ceci est fait
par la commande :
guidata(hObject, handles);
Par cette commande on sauvegarde la copie de la structure handles, que nous avons
modifiée, dans la structure handles associe au handle hObject de notre GUI.
A la fin, c’est-à-dire quand on ferme la fenêtre du GUI, il faut bien sûr refermer et
supprimer les liaisons que l’on a créées au début. Ceci est nécessaire pour que ces
liaisons soient libérées et puissent être réutilisées après. Pour cela on utilise les
commandes suivantes :
fclose(handles.s)
delete(handles.s)
delete(handles.vid)
222
Projet Quadricoptère 2005/2006
D’abord on définit les variables. On utilise les structures globales myvis et mydata que
nous avons déjà définies dans la fonction d’ouverture. En plus on a besoin d’une variable
persistante frame pour stocker les bytes transmis. Par ailleurs on définit encore les trois
variables h1, h2 et N qui signifient les deux bytes de start et la longueur -1 du message.
Après on lit les bytes reçus et on les ajoute à la fin du vecteur frame en utilisant la
commande suivante :
Maintenant on a obtenu une chaîne de bytes dans laquelle il faut trouver les paquets
transmis. Pour cela on cherche d’abord tous les bytes de la valeur h1. Après on vérifie
qu’ils sont suivis d’au moins N bytes et que les bytes directement après les h1 ont la
valeur h2. Alors on a trouvé tous les paquets complets et on stocke ces indices dans le
vecteur ind.
ind = find(frame==h1);
ind = ind(find(ind<=length(frame)-N));
ind = ind(find(frame(ind+1)==h2));
Bien sûr on veut maintenant traiter le paquet le plus récent. C’est pour ça que l’on
renverse le vecteur ind et on copie les bytes utiles du dernier paquet dans le vecteur
msg. Si la checksum (la somme sur les bytes 1 à N-1 du paquet modulo 256) est la bonne
on appelle les sub-fonctions data_processing et visualization et on sort de la boucle
par la commande break. Sinon on prend le paquet précédent et on répète les actions.
Une fois que l’on sort de la boucle on supprime encore les paquets inutiles dans le
vecteur frame.
Cette fonction interprète la chaîne des bytes utiles comme nous l’avons fait en Visual
Basic et reconstruit les données transmises. Comme ce sont les mêmes calculs pour
générer la structure mydata qu’en Visual Basic on ne va pas répéter les explications et on
renvoie le lecteur au chapitre correspondant de la présentation du code en Visual Basic.
Par contre à la fin de cette fonction on actualise la structure myvis qui n’existe pas en
Visual Basic. On utilise cette structure pour visualiser les évolutions de quelques
grandeurs comme par exemple l’altitude ou la batterie. C’est pour ça qu’il faut
sauvegarder une suite des valeurs les plus récentes. Dans notre cas on a pris cent
dernières valeurs. Dans la fonction data_processing il faut alors actualiser la structure
myvis en virant pour chaque grandeur la plus vieille valeur et en ajoutant la nouvelle
valeur à la fin.
Dans cette fonction on dessine juste les valeurs de la structure myvis dans les différents
graphes en utilisant la commande plot. En outre on écrit les valeurs que l’on veut voir
comme chiffres, comme par exemple la position ou l’altitude, dans les cases
correspondantes en utilisant la commande
La construction du vecteur de vitesse est un peu plus compliquée. D’abord il faut calculer
les coordonnées du point P2 (le bout du vecteur partant de l’origine du graphe) en
utilisant les variables vx, vy et yaw. Après on récupère le handle de la ligne que nous
avons créée dans la fonction d’ouverture et on l’actualise :
223
Projet Quadricoptère 2005/2006
14.1.1. PWM
224
Projet Quadricoptère 2005/2006
14.1.2. RS232
225
Projet Quadricoptère 2005/2006
{USART0_Reception_Init();
DDRB = 0xFF;
sei();
Donnees_Recues = 0x00;}
et pour envoyer des données
#define TX_BUF_SIZE 128
volatile uint8_t tx_head;
volatile uint8_t tx_tail;
volatile uint8_t tx_buf[ TX_BUF_SIZE ];
void USART0_Transmition_Init( unsigned int baud )
{ UBRR0H = (unsigned char)(baud>>8);
UBRR0L = (unsigned char)baud;
UCSR0B |= _BV(TXEN); //Enable transmitter }
void putc(uint8_t c)
{ uint8_t tmp_head;
tmp_head = tx_head + 1;
if( tmp_head >= TX_BUF_SIZE ) tmp_head = 0;
if( tmp_head == tx_tail ) return;
tx_buf[ tx_head = tmp_head ] = c;
UCSR0B |= _BV(UDRIE0); } //autorise SIG_UART0_DATA
SIGNAL( SIG_UART0_DATA ) //buffer UDR0 est vide
{ uint8_t tmp_tail;
if( tx_head == tx_tail )
{UCSR0B &= ~_BV(UDRIE0); //désactive SIG_UART0_DATA
return; }
tmp_tail = tx_tail + 1;
if( tmp_tail >= TX_BUF_SIZE ) tmp_tail = 0;
tx_tail = tmp_tail;
UDR0 = tx_buf[tmp_tail]; }
SIGNAL( SIG_UART0_RECV )
{ Donnees_Recues = UDR0; }
void main()
{USART0_Transmition_Init(103);
sei();
int b[5]; b[0]=52; b[1]=100; b[2]=114; b[3]=105; b[4]=32;
int i;
while(1){
for(i=0;i<5;i++){
_delay_ms(200);
putc(b[i]); }
}
}
rs232.mdl, QSC100.mdl
Code C: tous les dossiers avec uart dans avr_exemples
226
Projet Quadricoptère 2005/2006
14.1.3. MIDG II
On a utilisé le code du main.c actuel. On a juste désactivé la liaison via la station sol.
Les variables importantes sont :
c = UDR0; dernier octet arrivé par RS232
bytecounter_MIDG2++; initialisé à 0, incrémenté à chaque boucle en accord avec la
structure d’un message, remise à 0 en fin de message
SYNC 0 | SYNC 1 | ID | COUNT | …
1 |2 |3 |4 |…
rx_buf_MIDG2[bytecounter_MIDG2-3]=c; mettre ID à rx_buf_MIDG2[0] et ensuite
data[y+6]=
(((uint32_t) rx_buf_MIDG2[4*y+18]) << 24)
|(((uint32_t)rx_buf_MIDG2[4*y+19])<< 16)
|(((uint32_t) rx_buf_MIDG2[4*y+20]) << 8)
|(rx_buf_MIDG2[4*y+21]);
Pour y=0,1,2 (~X,Y,Z) on assemble 4 octets consécutifs, pour former un uint32 : une
mesure de MIDG2
pour simplifier l’accès aux variables de mesure on établit une correspondance (~index)
en ligne 130
le main.c prévoit l’utilisation des messages 2 comme 10 Æ problèmes si la MIDG2 envoie
les 2 messages : actualisation des G* et du AZ avec ceux des messages 2 puis 10
G* : 2, 10 ; AZ : 2, 10 ; P* : 12 ; M* : 10 ; V* : 12
imu est très important, car utilisé comme horloge pour les contrôleurs
tous les midg2neu*.mdl pour la simulation et midg2reel*.mdl pour le décodage
main.c dans le dossier MidgII
227
Projet Quadricoptère 2005/2006
Ca donne p.ex.
34.15 z - 33.17
---------------
z - 0.6703
34.15 z − 33.17
e est la différence à la référence, u le sortie : u = e
z − 0.6703
u = 0.6703uz −1 + 34.15e − 33.17ez −1
une multiplication avec z-1 correspond à un décalage temporel de « sampling time » vers
le passé, du coup on programme en C :
u = .6703*u_old + 34.15*e - 33.17*e_old;
e_old=e;
u_old=u;
et on fait répéter cela tous les « sampling time »
228
Projet Quadricoptère 2005/2006
s1=serial('COM1','baudrate',57600);
definir le port série COM1 avec baudrate=57600
fopen(s1)
ouvrir port défini par s1
buf=fread(s1,512)
lire 512*1 octet du port dans le vecteur « buf » [1x512], attention ses valeurs sont lues
d’un buffer (de taille 512) qu’il faut d’abord vider pour avoir des valeurs actuelles (par
exemple on lit des valeurs à t=5, on attend jusqu’à t=50, on lit les valeurs à t=50 et on
obtient les valeurs de t=5, pour avoir les valeurs de t=50 il faut lire très rapidement une
deuxième fois à t=50), répéter
fwrite(s1,92)
émettre le nombre 92 sur le port, répéter
fclose(s1)
fermer le port
MY = vy = roll = ppm_pulses[0] :
ca. 3042±820, min à droite
MX MZ
RX RZ
MZ = z = gaz = ppm_pulses[2] :
ca. 3040±690, min en bas
MY MP
MP = psi' = yaw = ppm_pulses[3] :
RY ca. 3020±840, min à gauche
RP
229
Projet Quadricoptère 2005/2006
Pour tout notre travail on a utilisé MATLAB R14SP2 (7.0.4). Il y a un petit problème avec
xPC Target (on ne peut même pas ouvrir xPC Target Explorer) qui est facilement résolu
avec un patch (http://www.mathworks.com/support/solutions/data/1-13B6EL.html).
Comme compilateur on a utilisé Microsoft Visual C v7.1 (Microsoft Visual Studio .NET
2003 disponible chez VIA, .NET 2005 ne marche pas).
On a essayé R14SP3 qui ne permet pas de faire un « build » pour le xPC Target avec le
modèle d’Erwan.
R2006a permet d’utiliser le compilateur Open Watcom (uniquement la version indiquée
dans la documentation de xPC Target) au lieu de Visual C. Ce compilateur est Open
Source est prend beaucoup moins d’espace sur le disque dur. Si on utilise la carte
QSC100 le « build » prend énormément de temps avec Visual C, mais est rapide avec
Open Watcom. En revanche le port série de la carte mère ne semble pas fonctionner avec
Open Watcom : on ne mesure rien à l’oscilloscope. Le comportement de la simulation
avec xPC Target a changé en comparaison avec R14SP2 : une fois connecté avec le
Target PC, si on utilise le bouton « stop », puis qu’on change ensuite quelques valeurs
des constantes et enfin qu’on clique sur le bouton « start » le Target PC utilise les
anciennes valeurs, celles qu’il avait juste avant le « stop ». R14SP2 réinitialise les
simulations avec les valeurs changées « hors connexion ». Il faut donc un peut de
débogage pour faire marcher notre travail avec une autre version de MATLAB.
Pour la visualisation on a dû utiliser R2006a car les blocs d’Aerospace Blockset, qu’on
souhaitait utiliser, ont été introduits après R14SP2.
Si on essaie de faire un « build » d’une planche avec un block « pack » on a des fois
l’erreur « backward propagation not supported » pour le block « pack ». Un « demux » et
un « mux » constituent une solution que nous avons trouvée par hasard (subsytem
« anti bprop »). On a demandé à Mathworks qui nous ont donnés les détails :
230
Projet Quadricoptère 2005/2006
'Simulink:
Necessity to use a Demux/Mux before a Pack Block'
Reproduction steps: - First Test : Run the simulation with the anti-bprop block
- Second Test : Run the simulation without the anti-bprop block
Whats wrong: - First test : it runs
Second Test : it does not run
Réponse:
The source of the issue is the final MUX block of your model and its input port
specifications. The final MUX block has input parameter [4 , 1], which implies that it
expects vector-type signals of length 1x4 and 1x1.
Your workaround of the issue using a MUX and DEMUX block with input/output port
parameters [1,1] creates two 1x1 vector signals which are then combined back into a
1x2 signal of 1x1 vector signals. Therefore there is no datatype mismatch at the final
MUX.
However, without the MUX and DEMUX blocks in place, the input to the GAIN block is 4
scalar signals combined and thus gives a scalar signal output which rather than a 1x1
vector signal.
Because there is a UDP byte-packing block in place, it cannot back-propagate the signal
type. The UDP PACK block is completely dependent on the input and thus cannot force or
back-propagate the datatype of the input to match what is expected of its output.
Another workaround of this issue is to omit the 'anti-bprop' subsystem and change the
Number of Inputs parameter of the last MUX block to 2 instead of [4 1]. This will create 2
input ports expecting 2 scalar signals of any size. Therefore, the 1x4 vector of scalar
signals and a scalar signal are acceptable.
Beaucoup de nos planches Simulink utilisent des constantes qui sont fixées dans des
fichiers externes. checksum1.m est nécessaire pour notre implémentation du protocole
de la MIDG II (et aussi quelques autres planches utilisent « trun »), simu_erwan.m pour
le modèle du Quadri (les autres .m sont lancés automatiquement avec). Un double-clic
les ouvre et il faut ensuite cliquer sur le bouton « run ».
Si le Target PC plante MATLAB indique souvent une erreur TCP/IP. Un reboot du Target
PC est nécessaire. Si on a d’autres problèmes bizarres, un reboot du Target PC est
parfois une solution.
14.5.5. Rebuild
Il arrive qu’on obtienne un message d’erreur bizarre lors d’un « build ». Il vaut toujours
mieux essayer à nouveau le « build ». En cas de problèmes inexplicables (p.ex. instabilité
de la simulation) on peut essayer de nettoyer le « working directory » de tous les
vestiges d’un ancien « build » (c’est à dire effacer les dossiers « slprj » et
« NomDuFichier_xpc_rtw », et effacer les documents « NomDuFichier.dlm »,
« NomDuFichier.xml », « NomDuFichierbio.m » et « NomDuFichierpt.m »).
Ne fonctionnent pas s’ils sont directement connectés à des constantes, il faut mettre par
exemple un gain de 1 entre les deux.
231
Projet Quadricoptère 2005/2006
Il est arrivé, que sans aucun changement dans le système et selon la même façon de
faire le démarrage, le système HIL devienne instable. Même les modèles plus simples
chargés sur le système étaient tout d’un coup instable (ou sont devenus instables après
quelques secondes). Quelques essais plus tard, le phénomène avait disparu et le système
restait stable pendant des heures.
Il est clair, qu’il faut relancer l’Atmel (les Atmel dans le cas de l’I²C) avant un nouvel
essai, parce qu’il a sauvegardé les anciennes variables. Apparemment cela marchait aussi
mieux quand on attendait 5 secondes après l’avoir éteint (pour décharger tous les états
internes). Finalement ça a aussi aidé parfois de relancer le Target PC, Matlab ou bien
nettoyer les dossiers de simulation de Matlab (voir l’autre point de la Top Ten Buglist)
Il est utile de vérifier systématiquement que l’on a branché tous les câbles nécessaires.
Surtout pour les PWM il ne faut pas mélanger les Pins, une mesure avec l’oscilloscope est
utile.
232
Projet Quadricoptère 2005/2006
Control_altitude.m
%%%%%%%%%%%%%%%%%%%%%%%%%
%%% Bouclages Vz - Az %%%
%%%%%%%%%%%%%%%%%%%%%%%%%
233
Projet Quadricoptère 2005/2006
Control_horizontal.m
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%% Bouclages Vy - Phi - P %%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
K1p=a*l*2*wb/c;
K2p=(Ki*Kw/R+2*wb*b)/Jm;
K3p=Ki/(Jm*R);
%% Création du système linéarisé tangent
%% état : Vy, Phi, P, Wp (pas de correspondance physique)
%% sortie : Vy(cm), Phi(.01deg), P(0.01deg/s)
Ap=[0 g 0 0;0 0 1 0;0 0 0 K1p;0 0 0 -K2p];
Bp=[0;0;0;K3p]*12/255;
Cp=[100 0 0 0;0 180*100/pi 0 0;0 0 180*100/pi 0];
sysp=ss(Ap,Bp,Cp,0);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%% Bouclages Vx - Theta - Q %%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
234
Projet Quadricoptère 2005/2006
K1q=a*l*2*wb/d;
K2q=(Ki*Kw/R+2*wb*b)/Jm;
K3q=Ki/(Jm*R);
%% Création du système linéarisé tangent
%% état : Vx, Theta, Q, Wq (pas de correspondance physique)
%% sortie : Vx(cm), Theta(.01deg), Q(0.01deg/s)
Aq=[0 -g 0 0;0 0 1 0;0 0 0 K1q;0 0 0 -K2q];
Bq=[0;0;0;K3q]*12/255;
Cq=[100 0 0 0;0 180*100/pi 0 0;0 0 180*100/pi 0];
sysq=ss(Aq,Bq,Cq,0); %% Création du système linéarisé tangent
%sisotool(sysq(3,1),1,filter) Ajustement d'un correcteur PID pour la
% boucle sur Q
Kq=0.8*0.00376*tf([0.075 1],[0.01 1]); % Correcteur pour Q
Kqd=c2d(Kq,20e-3,'foh'); % Correcteur discrétisé
235
Projet Quadricoptère 2005/2006
%%%%%%%%%%%%%%%%%%%%%%%%%
%%% Bouclages Psi - R %%%
%%%%%%%%%%%%%%%%%%%%%%%%%
K1r=b*2*wb/e;
K2r=(Ki*Kw/R+2*wb*b)/Jm;
K3r=Ki/(Jm*R);
%% Création du système linéarisé tangent
%% état : Psi, R, Wr (pas de correspondance physique)
%% sortie : Psi(.01deg), R(.01deg/s)
Ar=[0 1 0;0 0 K1r;0 0 -K2r];
Br=[0;0;K3r]*12/255;
Cr=[180*100/pi 0 0;0 180*100/pi 0];
236
Projet Quadricoptère 2005/2006
Générale :
Definir des variable globales dans un projet avec plusieurs fichiers c :
En plus des fichiers .c, il faut aussi des fichier .h (comme les .c à éditer par exemple
dans WinAVR)
-file2.h:
extern volatile uint8_t a,b;
Maintenant on peut utiliser et modifier les variables a et b partout (dans toutes les
fonctions Matlab)
SIGNAL( SIG_UART_RECV ){
IncomingData = UDR;
//PORTB=0x77;
// Protocol UART1 to receive range by Target PC: 3 Bytes
// Byte1 - 0xFF (command for new message), Byte2 - Range-
highbyte, Byte3 - Range-Lowbyte
// Byte2 must be different from Byte3, Byte2 and Byte3 must
be different from 0xFF
switch (uart_next){
case 0:
if (IncomingData == 0xDD) {uart_next = 1; break;} //
continue after start condition
uart_next = 0;
// wait until start condition
break;
case 1:
if (IncomingData == 0xDD) {uart_next = 1; break;} // new
start condition
237
Projet Quadricoptère 2005/2006
uart_next = 2;
// continue after high_byte of Data
range_high_temp = IncomingData;
break;
case 2:
if (IncomingData == 0xDD) {uart_next = 1; break;} // new
start condition
uart_next = 0;
// wait for start condition after low_byte of Data
range16 = IncomingData;
// range_low + range_high -> range16
temp16 = range_high_temp;
range16 |= (temp16<<8);
// no object is in range
if (range16>MAXRANGE16) { // test if no object in
range
range_high=0xFF ; // send range 0xFFFF
if no object detectable
range_low=0xFF ;
TimeToCount = 29491; // count 64 ms
if no object detectable
break;
}
// object is in range
range_high = range_high_temp; // write the two bytes at
once
range_low = IncomingData;
SIGNAL( SIG_2WIRE_SERIAL )
{ // SendString(" Slave-INT: ");
static uint8_t TWI_bufPtr;
switch (TWSR) {
case TWI_STX_ADR_ACK: //SendString(" ST-ownAdr-rec-ACK-transm ");
// Own SLA+R has been received; ACK has been returned
// case TWI_STX_ADR_ACK_M_ARB_LOST: // Arbitration lost in SLA+R/W
as Master; own SLA+R has been received; ACK has been returned
TWI_bufPtr = 0; // Set buffer
pointer to first data location
if (I2cGlobal == 0x02){
TWI_buf[0]=range_high;
//if(range_low==0x51) range_low++;
//Assurer que i2c continue toujours (conflict avec command 0x51! )
238
Projet Quadricoptère 2005/2006
TWI_buf[1]=range_low;
} // if asked, send 2-byte-range
else {TWI_buf[0]=0x33; TWI_buf[1]=0x44;} // Error, Read
without Register command
I2cGlobal=0; // after transmission clear command
case TWI_STX_DATA_ACK: //SendString(" ST-Data-transm-ACK-rec ");
// Data byte in TWDR has been transmitted; ACK has been received
TWDR = TWI_buf[TWI_bufPtr++];
TWCR = (1<<TWEN)| // TWI Interface
enabled
(1<<TWIE)|(1<<TWINT)| // Enable TWI
Interupt and clear the flag to send byte
(1<<TWEA)|(0<<TWSTA)|(0<<TWSTO)| //
(0<<TWWC); //
if (RangeFlag==1) TWCR &= 0xBF; // TWEA = 0 while ranging
break;
case TWI_STX_DATA_NACK: //SendString(" ST-Data-transm-NACK-rec ");
// Data byte in TWDR has been transmitted; NACK has been received.
// I.e. this could be the end of the transmission.
PORTB=RangeCounter++;
if (TWI_bufPtr == TWI_msgSize) // Have we transceived all expected
data?
{ TWI_statusReg.lastTransOK = TRUE; // Set status
bits to completed successfully.
}else // Master has sent a NACK before all
data where sent.
{ TWI_state = TWSR; // Store TWI
State as errormessage.
}
TWI_buf[1]=0; //reset car conflit avec commande 0x51
// Put TWI
Transceiver in passive mode.
TWCR = (1<<TWEN)| // Enable TWI-
interface and release TWI pins (NO!)
(1<<TWIE)|(1<<TWINT)| // Disable
Interupt(NO!)
(1<<TWEA)|(0<<TWSTA)|(0<<TWSTO)| // Do not
acknowledge on any new requests.(NO!)
(0<<TWWC); //
if (RangeFlag==1) TWCR &= 0xBF; // TWEA = 0 while ranging
break;
case TWI_SRX_GEN_ACK: //SendString(" SR-GC-rec-ACK-transm ");
// General call address has been received; ACK has been returned
TWI_statusReg.genAddressCall = TRUE;
case TWI_SRX_ADR_ACK: //SendString(" SR-ownAdr-rec-ACK-transm ");
// Own SLA+W has been received ACK has been returned
TWI_statusReg.RxDataInBuf = TRUE;
TWI_bufPtr = 0; // Set buffer
pointer to first data location
// Reset the TWI
Interupt to wait for a new event.
TWCR = (1<<TWEN)| // TWI Interface
enabled
(1<<TWIE)|(1<<TWINT)| // Enable TWI
Interupt and clear the flag to send byte
(1<<TWEA)|(0<<TWSTA)|(0<<TWSTO)| // Expect ACK on
this transmission
(0<<TWWC); //
if (RangeFlag==1) TWCR &= 0xBF; // TWEA = 0 while ranging
break;
case TWI_SRX_ADR_DATA_ACK: //SendString(" SR-ownAdr-Data-rec-ACK-transm ");
// Previously addressed with own SLA+W; data has been received; ACK has
been returned
case TWI_SRX_GEN_DATA_ACK: //SendString(" SR-GC-Data-rec-ACK-transm ");
// Previously addressed with general call; data has been received; ACK has
been returned
TWI_buf[TWI_bufPtr++] = TWDR;
TWI_statusReg.lastTransOK = TRUE; // Set flag
transmission successful.
239
Projet Quadricoptère 2005/2006
240
Projet Quadricoptère 2005/2006
(basé sur l’aide de Matlab/Help/xPC Target/ Getting Started, pour plus d’informations le
consulter à l’adresse suivante :
http://www.mathworks.com/access/helpdesk_r13/help/pdf_doc/xpc/xpc_target_gs.pdf–
pour tout détails voir cette tutorial)
14.7.1. Objectif
Le but est de faire tourner un modèle Matlab en regime temps réel sur un « PC cible »
(Target PC). En pratique, cela pemettrapermettra d’utiliser la simulation pour remplacer
des objets réels, comme des capteurs ou même le quadricoptère physique. Pour gérer
(charger et lancer la simulation, changer des paramètres) le Target PC on le branche
avecrelie à un Host PC.
241
Projet Quadricoptère 2005/2006
Créer la Bootdisk
242
Projet Quadricoptère 2005/2006
Avec le Target Boot Mode « Boot Floppy », appuy cliquer sur « Create Bootdisk »
Inserer la disquette dans le Target PC, lancer le PC (BIOS configuration « boot from
floppy »)
243
Projet Quadricoptère 2005/2006
Image après les tests dans lLe Command Window de MATLAB sur le Host-PC, après les
tests
244
Projet Quadricoptère 2005/2006
245
Projet Quadricoptère 2005/2006
Créer un modèle avec des sources continues et des scopes Simulink ainsi que des xPC-
Target Scopes (celles-cis derniers peuvent être trouvés dans la « library browser » sous
xPC-Target)
246
Projet Quadricoptère 2005/2006
247
Projet Quadricoptère 2005/2006
Dans les deux PC un Network adapter carde carte réseau, Celle du pour le Target PC,
c’est une carte spéciale doit être compatible avec xPC-Target
A la place du cable Nullmodem il faut un « cable croisé » (Ethernet UTP : (Unshielded
Twisted Pair cable)
248
Projet Quadricoptère 2005/2006
249
Projet Quadricoptère 2005/2006
250
Projet Quadricoptère 2005/2006
Les commentaires de cette partie ne sont en aucun cas complets ou précis mais ils vous
donnent le nécessaire à comprendre pour élargir l’automatique du code. Pour plus de
détails il faut s’adresser à M. Martin.
Pour comprendre cette boucle du programme principale, il faut avoir observé les
planches Simulink d’Erwan, en particulier le Subsystem « Contrôle Altitude ». Le schéma
suivant détaille l’asservissement de cette boucle et établit un rapport logique entre les
variables du programme principal et celles des planches de simulation :
Les filtres sont conçus en continu, mais pour les intégrer dans le programme principal il
faut les discrétiser grâce à la fonction c2d de Matlab (voir help Matlab). Par exemple le
filtre ultrason est discrétisé à l’aide de Matlab ainsi :
filson=tf([1],[.2 1]); % filtre passe-bas
filsond = c2d(filson,20e-3,'foh'); % filtre discrétisé
On tapant filsond sur la fenêtre de commande Matlab avec avoir exécuté le programme
.m contenant ce filtre on obtient la fonction de transfert suivante :
0.04837 z + 0.04679
-------------------
z - 0.9048
251
Projet Quadricoptère 2005/2006
k est ici l’instant discret et gsonarfix est la variable d’altitude donnée par le capteur
ultrason fixé au bas du drone.
La boucle d’altitude dans le programme principale (souvent appelé boucle gaz) est la
suivante :
state_zf = (14825l*(state_zf+gsonarfix))>>14;
(attention cette ligne est tout en bas de la boucle automatique)
//ici 14825 = 0,9048 * 2^14
prezr = ( ( -209715l*(my_pulses[2]+380) )>>20) +21;
// variable de commande après le préfiltre (discrétisation pareille que le
filtre untrason)
prezr = prezr + max( -1 , min(1,my_pulses[0]-prezr) );
Vzr = 2*(zr+zf);
// Correcteur sur Z, il y a un plus car la valeur zr mesurée par rapport au
sol est déjà néagtive (repère oz dirigé vers le bas)
dazr = 20*(Vzr+data[VZ]);
// Correcteur sur Vz
daz = data[AZ]+1000;
// accélération mesurée plus la gravité
252
Projet Quadricoptère 2005/2006
253
Projet Quadricoptère 2005/2006
1 - 14167/2^14 = 0,1353
Pour avoir le même ordre de grandeur et assurer une valeur ni trop grande
ni trop petite des paramètres entiers, M. Martin utilise un autre modèle de
système d’état. Pour plus de détails demandez lui.
if (zf<=-50)
// condition de passage de manuel en automatique
{
xr = xr + max( -2 , min(2,0-xr) );
//rate limiter 20e-3*100 très lent pour un premier test, ici la consigne de
position est de 0 (rester sur place)
xf = (KV_Cpsi*data[PY]-KV_Spsi*data[PX])>>14;
// Rotation exactement pareille que celle en vitesse mais avec valeurs
KV_Spsi et KV_Cpsi ajusté au correcteur de x qui vaut 1,5
254
Projet Quadricoptère 2005/2006
255