40
Institut supérieur de l'aéronautique et de l'espace STAGE DE FIN DE SCOLARITE Réalisé par : SAINT-JULIEN Jérôme Tuteurs Paul Sabatier : LEYMARIE Hélène VIALLON Christophe Tuteur ISAE : CALMETTES Vincent Année 2010-2011

STAGE DE FIN DE SCOLARITE - thierryperisse.free.frthierryperisse.free.fr/documents/projet_linel/projets2014/projet... · capteur d’altitude retenu ainsi que la gestion des différents

Embed Size (px)

Citation preview

Institut supérieur de l'aéronautique et de l'espace

STAGE DE FIN DE SCOLARITE

Réalisé par : SAINT-JULIEN Jérôme

Tuteurs Paul Sabatier : LEYMARIE Hélène

VIALLON Christophe

Tuteur ISAE : CALMETTES Vincent

Année 2010-2011

2

I – Description du projet _____________________________________________________ 3

II-1 Rappel du sujet ____________________________________________________________ 3

II-2 Détail et réalisation pratique du sujet __________________________________________ 3

II - Choix des matériels utilisés : _______________________________________________ 5

III – Le système Arduino : ____________________________________________________ 6

III-1 Introduction ______________________________________________________________ 6

III-2 La carte UNO _____________________________________________________________ 7 a) Synthèse des caractéristiques __________________________________________________________ 7 b) Brochage de la carte Uno : ___________________________________________________________ 8 c) Alimentation ______________________________________________________________________ 8 d) Mémoire _________________________________________________________________________ 9 e) Entrées et sorties numériques _________________________________________________________ 9 f) Broches analogiques _______________________________________________________________ 10 g) Autres broches ____________________________________________________________________ 10 h) Communication ___________________________________________________________________ 10

IV – Le ZigBee : ___________________________________________________________ 11

IV-1 Le protocole Zigbee: _______________________________________________________ 11 a) Introduction : qu’est-ce que le Zigbee . _________________________________________________ 11 b) Architecture protocolaire ____________________________________________________________ 11 c) Couche physique IEEE 802.15.4 ______________________________________________________ 12 d) Sous-couche MAC IEEE 802.15.4 ____________________________________________________ 14 e) Couche Zigbee ____________________________________________________________________ 16 f) Bilan ____________________________________________________________________________ 17

IV-2 Interface ZigBee : le module XBee ___________________________________________ 18 a) Introduction ______________________________________________________________________ 18 b) Brochage ________________________________________________________________________ 18 c) Communication avec le module Xbee __________________________________________________ 19

IV – Réalisation pratique : ___________________________________________________ 20

IV-1 Forme d’one à générer, protocole : ___________________________________________ 20 a) Observation initiale ________________________________________________________________ 20 b) Observation plus détaillée ___________________________________________________________ 21

IV-2 Installation des logiciels et gestionnaire de périphérique idoines : _________________ 23 a) Côté PC _________________________________________________________________________ 23 b) Coté drone _______________________________________________________________________ 26

V – Programmation de la carte Arduino : _______________________________________ 27

V-1 Structure du programme – Langage __________________________________________ 27

V-2 Programme _______________________________________________________________ 28 a) Présentation de la paquette __________________________________________________________ 28 b) Déclaration ____________________________________________________________________ 28 c) Fonction setup _________________________________________________________________ 29 d) Boucle _______________________________________________________________________ 31

VI – Guidage et tests ________________________________________________________ 35

Conclusion _______________________________________________________________ 38

Remerciements : ___________________________________________________________ 39

ANNEXE : schéma de l’adaptateur Xbee _______________________________________ 40

3

I – Description du projet

II-1 Rappel du sujet

Avec ce stage, il est proposé au candidat de concevoir une liaison sans fil entre un organe de

commande et un drone placé à distance sur lequel seront disposés plusieurs types de capteurs

(télémètre, caméra embarquée, etc...). Cette liaison devra être bi-directionnelle et à faible

consommation, d'où le choix de la technologie Zigbee fonctionnant dans la bande des

2,4 GHz.

Dans un premier temps, le candidat aura en charge la mise en œuvre de modules Zigbee. Il

sera amené à développer des routines de commande et de test en langage C. Il aura également

en charge la conception de cartes d'interfaçage des modules avec le reste du système.

Dans un second temps, des tests grandeur nature sont prévus pour, d'une part, caractériser les

modules (vérifier les puissances d'émission, sensibilité, consommation, etc...) et vérifier

l'impact de différents paramétrages sur la portée, le débit et la robustesse de la transmission.

La liaison bidirectionnelle sera également évaluée.

Enfin, une dernière partie concernera la mise en place d'une gestion multi-nœud,

caractéristique propre à la technologie Zigbee et qui offre de nombreuses perspectives. Par

exemple, il serait possible d'interroger le même drone depuis différents endroits.

II-2 Détail et réalisation pratique du sujet

L’objet de ce stage a été précisé et modifié lors de réunions préliminaires avec les enseignants

concernés. Le but est de réaliser un système qui sera mis en place pour des travaux pratiques à

l’université Paul Sabatier afin que les étudiants se familiarisent avec la technologie Zigbee et

l’utilisation du circuit logique programmable qu’est le FPGA (Field-Programmable Gate

Array).

Ainsi, il a été décidé de remplacer émetteur et récepteur d’un drone quadri-rotor du commerce

(c’est-à-dire télécommande et récepteur) par côté émission, un FPGA associé à un module

Xbee et de l’autre un module Xbee en réception associé à un microcontrôleur pour générer les

formes des signaux requis.

Afin de rendre la liaison bidirectionnelle il sera également ajouté sur le drone un capteur

d’altitude qui retournera, sur demande, au FPGA, la hauteur atteinte par le drone.

4

Le drone utilisé est l’UFO #5 de Walkera :

Voici une vue de l’électronique côté récepteur :

Ce drone, utilisé en salle de TP, ne devra évidemment pas pouvoir se déplacer dans toutes les

directions. Un support devra permettre de le guider et ne lui laisser la possibilité que de

monter ou descendre.

Il y aura plusieurs binômes d’étudiants agissant sur un même drone. Il devra donc y avoir un

système permettant au drone de dialoguer avec chaque binôme individuellement.

Travail demandé :

La gestion du FPGA n’est pas du domaine de ce stage. Il sera remplacé, à mon niveau, par un

PC dialoguant avec le module Xbee à l’aide d’un terminal. La liste des taches à effectuer est

donc la suivante :

faire le choix, en relation avec le tuteur, des matériels utilisés,

programmer, côté récepteur, les signaux requis, les trimes de la télécommande, le

capteur d’altitude retenu ainsi que la gestion des différents réseaux,

utiliser un terminal pour l’envoi des commandes au drone,

réaliser le système de guidage du drone,

faire les tests.

5

II - Choix des matériels utilisés :

Afin de réaliser les opérations demandées, il a été décidé d’utiliser les matériels suivants :

2 modules Xbee professionnels série 1 (marque DIGI, référence XBP24-ACI-001)

Les modules professionnels ont été préférés pour leurs caractéristiques supérieures,

notamment en terme de portée. La série une a été retenue pour la topologie de réseau qu’elle

permet d’obtenir (point à multipoints). Qui plus est, les modules de la série 1 sont mieux

connus et les exemples à leur sujet sont très nombreux dans les bases de données sur internet.

Leur prise en main en est donc facilitée. Le module Xbee sera traité plus particulièrement

dans le paragraphe suivant. A posteriori, disposant de modules de chaque série, il est à noter

qu’il n’y a aucune différence pour l’utilisation que l’on en fait.

1 carte « Xbee explorer USB » (marque Sparkfun, référence WRL-08687) :

Ces cartes permettent d’avoir un accès direct à la liaison série du module xbee par

l’intermédiaire d’un mini câble USS et ainsi de paramétrer ce dernier.

1 carte Arduino Uno : le système est détaillé dans le paragraphe suivant.

6

1 XBee shield pour Arduino :

C’est une carte d’extension qui se branche directement sur la carte Arduino. Cette carte ajoute

des leds, un convertisseur 3.3 volts et des cavaliers de configuration permettant de conserver

la liaison USB-série pour le chargement du programme. Son utilisation est très simple : il faut

mettre les cavaliers vers l’intérieur (i.e. selon l’inscription « XBee/USB », se mettre en

position « XBee ») et désormais les pattes RX/TX de la carte Arduino son connectées au

Shield XBee.

III – Le système Arduino :

III-1 Introduction

Le système Arduino est un outil pour fabriquer de petits ordinateurs qui peuvent capter et

contrôler davantage de choses du monde matériel qu’un ordinateur de bureau. C'est une

plateforme open-source d'électronique programmée qui est basée sur une simple carte à

microcontrôleur (de la famille AVR), et un logiciel, véritable environnement de

développement intégré, pour écrire, compiler et transférer le programme vers la carte à

microcontrôleur.

Le système Arduino simplifie la façon de travailler avec les microcontrôleurs, tout en offrant

plusieurs avantages pour les enseignants, les étudiants et les amateurs intéressés :

Peu onéreux : les cartes Arduino sont relativement peu coûteuses comparativement

aux autres plateformes ; la moins chère des versions du module Arduino peut être

assemblée à la main. Les cartes Arduino pré-assemblées coûtent moins de 25 Euros

(microcontrôleur inclus...).

Multi-plateforme : le logiciel Arduino, écrit en Java, tourne sous les systèmes

d'exploitation Windows, Macintosh et Linux. La plupart des systèmes à

microcontrôleurs sont limités à Windows.

Un environnement de programmation clair et simple: l'environnement de

programmation Arduino est facile à utiliser, tout en étant assez flexible pour que les

utilisateurs avancés puissent en tirer profit également.

Logiciel Open Source et extensible : le logiciel Arduino et le langage Arduino sont

publiés sous licence open source, disponible pour être complété par des

programmateurs expérimentés. Le langage peut être aussi étendu à l'aide de librairies

C++.

Matériel Open source et extensible : les cartes Arduino sont basées sur les

microcontrôleurs Atmel ATMEGA8, ATMEGA168, ATMEGA 328, etc... Les

schémas des modules sont publiés sous une licence Creative Commons, et les

concepteurs de circuits expérimentés peuvent réaliser leur propre version des cartes

Arduino, en les complétant et en les améliorant.

7

III-2 La carte UNO

La carte Arduino Uno est une carte à microcontrôleur basée sur l'ATmega328. Elle dispose:

de 14 broches numériques d'entrées/sorties (dont 6 peuvent être utilisées en sorties

PWM (largeur d'impulsion modulée),

de 6 entrées analogiques (qui peuvent également être utilisées en broches

entrées/sorties numériques),

d'un quartz 16Mhz,

d'une connection USB,

d'un connecteur d'alimentation jack,

d'un connecteur ICSP (programmation "in-circuit"),

et d'un bouton de réinitialisation (reset).

Elle contient tout ce qui est nécessaire pour le fonctionnement du microcontrôleur. Pour

pouvoir l'utiliser, il suffit de la connecter à un ordinateur à l'aide d'un câble USB (ou de

l'alimenter avec un adaptateur secteur ou une pile, mais ceci n'est pas indispensable,

l'alimentation étant fournie par le port USB).

a) Synthèse des caractéristiques

Microcontrôleur ATmega328

Tension de fonctionnement 5V

Tension d'alimentation (recommandée) 7-12V

Tension d'alimentation (limites) 6-20V

Broches E/S numériques 14 (dont 6 disposent d'une sortie PWM)

Broches d'entrées analogiques 6 (utilisables en broches E/S numériques)

Intensité maxi disponible par broche E/S (5V) 40 mA (ATTENTION : 200mA cumulé pour

l'ensemble des broches E/S)

Intensité maxi disponible pour la sortie 3.3V 50 mA

Intensité maxi disponible pour la sortie 5V Fonction de l'alimentation utilisée - 500 mA max si

port USB utilisé seul

Mémoire Programme Flash 32 KB (ATmega328) dont 0.5 KB sont utilisés par le

bootloader

Mémoire SRAM (mémoire volatile) 2 KB (ATmega328)

Mémoire EEPROM (mémoire non volatile) 1 KB (ATmega328)

Vitesse d'horloge 16 MHz

8

b) Brochage de la carte Uno :

c) Alimentation

La carte Arduino Uno peut-être alimentée soit via la connexion USB (qui fournit 5V jusqu'à

500mA) ou à l'aide d'une alimentation externe. La source d'alimentation est sélectionnée

automatiquement par la carte.

L'alimentation externe (non-USB) peut être soit un adaptateur secteur (pouvant fournir

typiquement de 3V à 12V sous 500mA) ou des piles (ou accus). L'adaptateur secteur peut être

connecté en branchant une prise 2.1mm positif au centre dans le connecteur jack de la carte.

Les fils en provenance d'un bloc de piles ou d'accus peuvent être insérés dans les connecteurs

des broches de la carte appelées Gnd (masse ou 0V) et Vin (Tension positive en entrée) du

connecteur d'alimentation.

La carte peut fonctionner avec une alimentation externe de 6 à 20 volts. Cependant, si la carte

est alimentée avec moins de 7V, la broche 5V pourrait fournir moins de 5V et la carte pourrait

être instable. Si on utilise plus de 12V, le régulateur de tension de la carte pourrait chauffer et

endommager la carte. Aussi, la plage idéale recommandée pour alimenter la carte Uno est

entre 7V et 12V.

9

Les broches d'alimentation sont les suivantes :

VIN. C’est la tension d'entrée positive lorsque la carte est utilisée avec une source de

tension externe (à distinguer du 5V de la connexion USB ou autre source 5V régulée).

La carte peut être alimentée à l'aide de cette broche, ou, si l'alimentation est fournie

par le jack d'alimentation, accéder à la tension d'alimentation sur cette broche.

5V. C’est la tension régulée utilisée pour faire fonctionner le microcontrôleur et les

autres composants de la carte. Le 5V régulé fourni par cette broche peut donc provenir

soit de la tension d'alimentation VIN via le régulateur de la carte, ou bien de la

connexion USB (qui fournit du 5V régulé) ou de tout autre source d'alimentation

régulée.

3V3. C’est une alimentation de 3.3V fournie par le circuit intégré FTDI (circuit intégré

faisant l'adaptation du signal entre le port USB de l’ordinateur et le port série de

l'ATmega) de la carte. L'intensité maximale disponible sur cette broche est de 50mA

GND. Broche de masse (ou 0V).

d) Mémoire

L'ATmega 328 a 32Ko de mémoire FLASH pour stocker le programme (dont 0.5Ko

également utilisés par le bootloader*). L'ATmega 328 a également 2ko de mémoire SRAM

(volatile) et 1Ko d'EEPROM (non volatile - mémoire qui peut être lue à l'aide de la librairie

EEPROM).

*Le bootloader est un programme pré-saisi dans l'ATméga qui permet la communication entre

l'ATmega et le logiciel Arduino via le port USB, notamment lors de chaque programmation

de la carte.

e) Entrées et sorties numériques

Chacune des 14 broches numériques de la carte UNO (numérotées des 0 à 13) peut être

utilisée soit comme une entrée numérique, soit comme une sortie numérique, en utilisant les

instructions pinMode(), digitalWrite() et digitalRead() du langage Arduino. Ces broches

fonctionnent en 5V. Chaque broche peut fournir ou recevoir un maximum de 40mA

d'intensité et dispose d'une résistance interne de "rappel au plus" (pull-up) (déconnectée par

défaut) de 20-50 KOhms. Cette résistance interne s'active sur une broche en entrée à l'aide de

l'instruction digitalWrite(broche, HIGH).

De plus, certaines broches ont des fonctions spécialisées :

Communication série: broches 0 (RX) et 1 (TX). Utilisées pour recevoir (RX) et

transmettre (TX) les données séries de niveau TTL. Ces broches sont connectées aux

broches correspondantes du circuit intégré ATmega8U2 programmé en convertisseur

USB-vers-série de la carte, composant qui assure l'interface entre les niveaux TTL et

le port USB de l'ordinateur.

Interruptions externes: broches 2 et 3. Ces broches peuvent être configurées pour

déclencher une interruption sur une valeur basse, sur un front montant ou descendant,

ou sur un changement de valeur. Voir l'instruction attachInterrupt() pour plus de

détails.

Impulsion PWM (largeur d'impulsion modulée): Broches 3, 5, 6, 9, 10, et 11. Elles

fournissent une impulsion PWM 8-bits à l'aide de l'instruction analogWrite().

10

SPI (Interface Série Périphérique): broches 10 (SS), 11 (MOSI), 12 (MISO), 13

(SCK). Ces broches supportent la communication SPI (Interface Série Périphérique)

disponible avec la librairie pour communication SPI. Les broches SPI sont également

connectées sur le connecteur ICSP qui est mécaniquement compatible avec les cartes

Mega.

I2C: broches 4 (SDA) et 5 (SCL). Elles supportent les communications de protocole

I2C (ou interface TWI (Two Wire Interface - Interface "2 fils"), disponible en utilisant

la librairie Wire/I2C (ou TWI - Two-Wire interface - interface "2 fils") .

LED: broche 13. Il y a une LED incluse dans la carte connectée à la broche 13.

Lorsque la broche est au niveau HAUT, la LED est allumée, lorsque la broche est au

niveau BAS, la LED est éteinte.

f) Broches analogiques

La carte Uno dispose de 6 entrées analogiques (numérotées de 0 à 5), chacune pouvant fournir

une mesure d'une résolution de 10 bits (i.e sur 1024 niveaux soit de 0 à 1023) à l'aide de la

très utile fonction analogRead() du langage Arduino. Par défaut, ces broches mesurent entre

le 0V (valeur 0) et le 5V (valeur 1023), mais il est possible de modifier la référence supérieure

de la plage de mesure en utilisant la broche AREF et l'instruction analogReference() du

langage Arduino.

Remarque : les broches analogiques peuvent être utilisées en tant que broches numériques :

elles sont numérotées en tant que broches numériques de 14 à 19.

g) Autres broches

Il y a deux autres broches disponibles sur la carte :

AREF : tension de référence pour les entrées analogiques (si différent du 5V).

Reset : mettre cette broche au niveau BAS entraîne la réinitialisation c'est-à-dire le

redémarrage du microcontrôleur. Typiquement, cette broche est utilisée pour ajouter un

bouton de réinitialisation sur le circuit qui bloque celui présent sur la carte.

h) Communication

La carte Arduino Uno dispose de toute une série de facilités pour communiquer avec un

ordinateur, une autre carte Arduino, ou avec d'autres microcontrôleurs. L'ATmega 328

dispose d'une UART (Universal Asynchronous Receiver Transmitter ou émetteur-récepteur

asynchrone universel en français) pour les communications série de niveau TTL (5V) et qui

est disponible sur les broches 0 (RX) et 1 (TX). Un circuit intégré ATmega8U2 sur la carte

assure la connexion entre cette communication série vers le port USB de l'ordinateur et

apparaît comme un port COM virtuel pour les logiciels de l'ordinateur. Le code utilisé pour

programmer l'ATmega8U2 utilise le driver standard USB COM, et aucun autre driver externe

n'est nécessaire.

Le logiciel Arduino inclut une fenêtre terminal série (ou moniteur série) sur l'ordinateur et qui

permet d'envoyer des textes simples depuis et vers la carte Arduino. Les LEDs RX et TX sur

la carte clignotent lorsque les données sont transmises via le circuit intégré USB-vers-série et

la connexion USB vers l'ordinateur (mais pas pour les communications série sur les broches 0

et 1).

11

Une librairie Série Logicielle permet également la communication série sur n'importe quelle

broche numérique de la carte UNO.

IV – Le ZigBee :

IV-1 Le protocole Zigbee:

a) Introduction : qu’est-ce que le Zigbee .

ZigBee est un standard de communication sans fil à bas coût pour échanger des données

issues d’équipements sans fil simples et de faible consommation dans le milieu industriel.

Avec la convergence de l’informatique, de l’électronique et des télécommunications, il est

ainsi possible de mettre en place des réseaux de capteurs sans fil dans un contexte domotique

ou de contrôle industriel. Il existe un marché que ZigBee permet de combler : surveillance de

locaux pour la détection de départ de feu, surveillance de bâtiments contre les intrusions,

Gestion Technique de Bâtiment (GTB), aide à la personne, assistance aux personnes…

Ce standard est promu par l’alliance ZigBee qui regroupe un ensemble d’industriels

travaillant sur l’élaboration de spécifications afin de pouvoir développer des applications sans

fil bon marché, de faible consommation et sécurisées.

La norme ZigBee s’appuie sur la norme IEEE 202.15.4. Elle est librement téléchargeable sur

le site de l’Alliance ZigBee : http://www.zigbee.org/. Mais les grandes lignes seront détaillées

ici.

b) Architecture protocolaire

L’architecture protocolaire est donnée par la figure suivante. ZigBee s’appuie sur la norme

IEEE 802.15.4 pour les niveaux physique et MAC (Medium ACcess).

12

La norme IEEE 802.15.4 a les caractéristiques générales suivantes :

3 bandes de fréquence de fonctionnement : 868 MHz (1 canal), 915 MHz (10 canaux)

et 2,4 GHz (16 canaux).

Débit de 20 kb/s, 40 kb/s et 250 kb/s suivant la fréquence.

Méthode d’accès au support de type CSMA-CA (Carrier Sense Multiple Access –

Collision Avoidance).

Protocole fiable avec acquittement.

Faible consommation (alimentation sur pile de type AA).

La norme ZigBee apporte en plus les éléments suivants :

Au niveau réseau de la couche ZigBee, topologie de type point à point (direct), en

étoile, en cluster ou maillé (mesh).

Au niveau représentation de la couche ZigBee, la sécurité avec l’emploi optionnel

d’un chiffrement AES 128 des données.

Au niveau application, la définition de profils d’utilisation : exemple profil domotique

HA (Home Automation).

c) Couche physique IEEE 802.15.4

La norme IEEE 802.15.4 supporte les 3 bandes ISM (Industrial, Scientific, Medical) de

868 MHz, 915 MHz et 2,4 GHz.

13

Pour la bande 2,4 GHz, on a les caractéristiques générales suivantes :

Débit binaire de 250 kb/s.

4 bits par symbole soit un débit symbole de 62.5 kBaud.

Modulation orthogonale O-QPSK avec 16 symboles.

Correspondance à chaque symbole d’une séquence d’étalement « 32 chips » pour un

étalement DSSS, soit 2 Mchip/s.

Pour la bande 915 MHz, on a les caractéristiques générales suivantes :

Débit binaire de 40 kb/s.

1 bit par symbole, soit un débit symbole de 40 kBaud.

Modulation BPSK.

Correspondance à chaque symbole d’une séquence « 15 chips » pour un étalement

DSSS, soit 600 kchip/s.

Pour la bande 868 MHz, on a les caractéristiques générales suivantes :

Débit binaire de 20 kb/s.

1 bit par symbole, soit un débit symbole de 20 kBaud.

Modulation BPSK.

Correspondance à chaque symbole d’une séquence « 15 chips » pour un étalement

DSSS, soit 300 kchip/s.

14

La structure du « paquet » de données émis/reçu est donnée ci-dessous :

Le niveau physique gère les fonctionnalités suivantes :

Activation/désactivation de l’interface radio.

Détection de l’énergie dans le canal. Choix du canal radio.

Qualité du lien radio.

Évaluation du canal pour la mise en œuvre du protocole d’accès CSMA.

Émission/réception des paquets dans le canal radio.

d) Sous-couche MAC IEEE 802.15.4

La sous-couche MAC possède les caractéristiques suivantes :

Mise en œuvre de trames avec un adressage IEEE 64 bits ou un adressage court sur

16 bits, soit 65536 équipements adressables au plus dans ce dernier cas.

Structure de trame simple.

Mode de transmission fiable.

Gestion de l’association/dé association d’équipements.

3 niveaux de sécurité possibles sur les communications : aucun, liste ACL,

chiffrement AES 128 de la charge (payload) de la trame.

Mode de transfert de type half duplex.

Deux mécanismes d’accès au réseau sont possibles :

● Réseau en mode non beacon (balise) : on utilise des communications avec une politique

d’accès au médium de type CSMA-CA. Les trames de données reçues correctement sont

acquittées.

● Réseau en mode beacon : un coordinateur du réseau émet périodiquement des trames

beacon (de 15 ms jusqu’à 252 s) délimitant ainsi une supertrame. Le format de la supertrame

est fixé par le coordinateur. Elle se compose de 16 intervalles de temps. Cela permet ainsi de

synchroniser tous les équipements (nœuds) du réseau. Un équipement pourra émettre ses

données dans un intervalle de temps donné pendant la durée de l’intervalle de temps. L’accès

aux premiers intervalles de temps est non garanti donc soumis à contention (Contention

15

Access Period), alors que sur les derniers, il est garanti (Contention Free Period), ce qui

permet d’assurer un certain déterminisme et une certaine qualité de service.

4 trames sont définies :

Trame de données (Data Frame) : transfert de données.

Trame d’acquittement (Acknowledgment Frame) : confirmation de données bien

reçues.

Trame beacon (Beacon Frame) : émise par le coordinateur de réseau en mode beacon.

Trame de commande MAC (MAC Command Frame) : pour le contrôle des nœuds.

La structure de la trame de données est donnée ci-dessous :

Un échange d’une trame de données à l’initiative d’un nœud est donné dans la figure qui suit

dans le cas d’un réseau en mode beacon d’un réseau et en mode non beacon.

16

Enfin, la norme IEEE 802.1.5.4 définit 3 types d’équipements (nœuds du réseau) :

Le coordinateur du réseau.

L’équipement à fonctionnalités complètes FFD (Full Function Device).

L’équipement à fonctionnalités réduites RFD (Reduced Function Device).

L’équipement FFD peut être soit un coordinateur, soit un routeur, soit un équipement terminal

(capteur). L’équipement RFD est un équipement simplifié comme un équipement terminal

(End Device) muni de capteurs.

Pour communiquer au sein d’un même réseau, au moins un équipement FFD et des

équipements RFD utilisent de concert le même canal radio parmi ceux définis dans la norme.

Un équipement FFD peut dialoguer avec des équipements RFD ou FFD, mais un équipement

RFD ne peut dialoguer qu’avec un équipement FFD.

e) Couche Zigbee

Le niveau ZigBee précise les algorithmes de routage pouvant être mis en œuvre dans le

réseau. Il autorise aussi le chiffrement des données par AES-128. Le routage mis en œuvre

peut être soit direct, soit indirect.

Dans le cas du routage direct, l’équipement source connaît l’adresse de l’équipement

destinataire. L’adresse est celle définie au niveau de la trame MAC.

Dans le cas d’un routage indirect, l’équipement source ne connaît pas l’adresse de

l’équipement destinataire. Dans ce cas, un équipement routeur ou coordinateur fera la mise en

relation avec l’équipement destinataire en utilisant sa table de routage.

L’algorithme de routage préconisé dans la norme ZigBee pour les réseaux maillés est

l’algorithme AODV (Ad hoc On-Demand Vector Routing). C’est un algorithme de routage

réactif : une route est établie uniquement sur demande.

Si l’on regarde maintenant la topologie réseau et sa taille, le réseau ZigBee est un réseau PAN

(Personal Area Network). C’est un réseau de quelques dizaines de mètres permettant un

échange de données avec des équipements électroniques. On peut mettre dans la catégorie

PAN les normes suivantes : USB, Bluetooth, Infrarouge IR et ZigBee et éventuellement

Wifi…Les topologies mises en œuvre avec ZigBee dépendent de la complexité de

l’application utilisée. Voici quelques topologies possibles :

.

17

Des topologies plus complexes peuvent être mises en œuvre en utilisant des routeurs ZigBee :

La figure qui suit donne un exemple d’une telle topologie.

f) Bilan

ZigBee a toute sa place dans les réseaux de capteurs sans fil. C’est un concurrent sérieux à

Bluetooth. La figure suivante précise la place de ZigBee dans le panorama des réseaux sans

fil.

ZigBee a donc bien un marché ciblé dans la domotique dans le cadre des réseaux de capteurs

sans fil.

18

C’est d’ailleurs un choix judicieux pour ce type de réseau sans fil par rapport à Bluetooth

comme le montre le tableau suivant :

IV-2 Interface ZigBee : le module XBee

a) Introduction

Réaliser un transmetteur RF ZigBee est hors de portée d’un électronicien amateur. Il faut donc

se tourner vers une solution intégrée.

La société Maxstream (rachetée par Digi) propose des modules intégrés ZigBee prêts à

l’emploi : le module XBee. Ce module permet grossièrement une conversion de données série

TTL vers le réseau ZigBee.

Pouvant être utilisés sans aucun paramétrage, ils ont différents modes de fonctionnement

programmables par la liaison série en utilisant des commandes AT. Ce point est important

pour la programmabilité, car il suffira d’écrire des programmes simples capables de générer

ces commandes AT.

b) Brochage

Le tableau suivant présente le brochage du module XBee.

Broche Nom Direction Description

1 VCC - Alimentation

2 DOUT Out Sortie UART

3 DIN/CONFIG In Entrée UART

4 DO8 Out Sortie digitale 8

5 RESET - Reset (au moins 200 ns)

6 PWM0/RSSI Out Sortie PWM0/Indication puissance Rx

19

7 PWM1 Out Sortie PWM1

8 Réservé - -

9 DTR*/SLEEP_RQ/DI8 In Contrôle Sleep/Entrée digitale 8

10 GND - Ground

11 AD4/DIO4 Inout Entrée analogique 4 ou E/S digitale 4

12 CTS/DIO7 Inout Clear To Send/ E/S digitale 7

13 ON/SLEEP Out Indicateur état

14 VREF - Tension de référence pour conversion

15 Associate/AD5/DIO5 Inout

Indication association/Entrée analogique 5

ou E/S digitale 5

16 RTS/AD6/DIO6 Inout

Reday To Send/Entrée analogique 6 ou E/S

digitale 6

17 AD3/DIO3 Inout Entrée analogique 3 ou E/S digitale 3

18 AD2/DIO2 Inout Entrée analogique 2 ou E/S digitale 2

19 AD1/DIO1 Inout Entrée analogique 1 ou E/S digitale 1

20 AD0/DIO0 Inout Entrée analogique 0 ou E/S digitale 0

Au minimum, le module XBee nécessite de câbler les broches d’alimentation (VCC et GND)

et les signaux DIN et DOUT pour respectivement les données entrantes et sortantes de

l’interface UART. Les autres broches utilisées servent à configurer le module…

Il est à noter qu’il existe différentes versions de modules XBee :

● Version avec antenne chip intégrée (XBee1).

● Version avec connecteur U.FL (MMCX) pour antenne externe (XBee2).

● Version avec antenne filaire intégrée (XBee3).

c) Communication avec le module Xbee

Le module XBee peut être connecté à n’importe processeur possédant une interface série

UART comme indiqué sur cette figure :

20

Le processeur envoie ses données (caractères) sur le port DI en mode série asynchrone.

Chaque caractère est composé d’un bit de start (niveau logique 0), suivi de 8 bits de données

avec le bit de poids faible en premier et enfin un bit de stop.

La figure qui suit présente le mode de fonctionnement interne du module XBee.

Il existe un buffer à l’émission (DI buffer) et un buffer en réception (DO buffer). Un contrôle

de flux matériel peut être mis en place en utilisant le traditionnel couple CTS/RTS pour gérer

le flux à l’émission et à la réception des données suivant le taux de remplissage des buffers

(comme dans un circuit UART classique).

IV – Réalisation pratique :

IV-1 Forme d’one à générer, protocole :

Afin de pouvoir reproduire les ondes générées par le récepteur du drone, nous avons observé

et mesuré ces dernières à l’oscilloscope. Il nous faut pouvoir reproduire les signaux des quatre

voies :

avant, arrière ;

rotation gauche droite ;

roulis gauche droite ;

puissance des moteurs, c'est-à-dire montée et descente.

a) Observation initiale

Les trois premières voies ne seront reproduites qu’en position repos, avec la possibilité d’un

réglage de la trime remplacée par un potentiomètre. Sur ces trois voies, le récepteur,

télécommande en position neutre, génère 3 ondes identiques : une onde PWM (Pulse Width

Modulation) d’une période de 15,5 ms et une largeur d’impulsion de 1,5 ms.

Pour la puissance des moteurs, le récepteur génère également une onde PWM de même

période et dont la largeur d’impulsion varie de 1 ms (télécommande en position repos, c'est-à-

21

dire moteur à l’arrêt) à 2ms (moteur à pleine puissance). De même, la trime de la

télécommande sera reproduite.

Résumé : notre carte Arduino devra donc générer 4 ondes PWM de 15,5 ms. Trois d’entre

elles auront une largeur d’impulsion fixe (en dehors des réglages de trime) de 1,5 ms. Celle de

puissance aura une largeur d’impulsion qui devra varier entre 1ms et 2 ms en fonction des

commandes envoyées par les étudiants.

Commandes : j’ai retenu des commandes simples. Il faut envoyer au drone, en hexadécimal,

le pourcentage de la puissance que l’on veut avoir sur les moteurs. Ainsi, les étudiants

enverront des chiffres compris entre 0 et 100.

Pour demander au drone son altitude, il faudra envoyer FF.

Toute commande d’un octet différente de FF et non comprise entre 0 et 100 renverra un

message d’erreur.

Toute commande d’une longueur supérieure à 1 octet ne sera pas prise en compte.

b) Observation plus détaillée

Lors de la première observation nous avions utilisé un oscilloscope en n’utilisant qu’une seule

voie de ce dernier. Ainsi nous n’avions pas observé la synchronisation des signaux. Cette

erreur a impliqué un programme plus difficile à réaliser et de grosses surprises lors des tests

(d’autant plus que le récepteur initial avait été débranché de manière quasiment irréversible).

Après de longs tests infructueux (ou l’on s’est tout de même rendu compte que le drone

recevait les informations et que la place d’un signal par rapport aux autres avait son

importance), il a été décidé d’observer plus finement la synchronisation des signaux. Voici ci-

dessous les images obtenues à l’oscilloscope.

Les 4 voies ont un ordre précis :

1) la voie « gauche/droite »,

2) la voie « puissance »,

3) la voie « avant/arrière »,

4) la voie « rotation ».

22

Si l’on modifie la puissance, on obtient alors l’image suivante :

On constate bien un élargissement de la modulation PWM (jaune ici). La voie suivante attend

que la puissance soit passée à 0 avant de passer à 1. Ceci est vrai pour toutes les voies, et que

la largeur soit modifiée par une trime ou une commande.

23

Voici les formes d’ondes qu’envoyait le premier programme :

Avec cette configuration, seule la voie de la puissance était systématiquement reconnue. En

fonction de la position de montée de cette voie de puissance (lors du passage à 1 il y a un

léger décalage de quelques microsecondes, non visible ici sans zoom) une ou deux trimes

parvenaient à fonctionner.

IV-2 Installation des logiciels et gestionnaire de périphérique idoines :

a) Côté PC

Côté ordinateur, il faut installer le « configurateur » XCTU, disponible sur le site digi.com.

Il faut d’abord commencer par télécharger les pilotes à l’adresse suivante :

http://www.digi.com/support/productdetl.jsp?pid=3352&osvid=0&s=316&tp=1

Puis lancer l’application CDM20600.exe.

Puis télécharger le logiciel XCTU à l’adresse suivante :

http://www.digi.com/support/productdetl.jsp?pid=3352&osvid=57&s=316&tp=5&tp2=0

Puis lancer l’application XSCTU 40002637.exe.

Il faut également installer les pilotes de « l’USB serial port » dans le gestionnaire de

périphérique. Cette opération doit être effectuée souvent deux fois, que ce soit sous windows

XP ou sous Vista.

Remarque : il est important d’obtenir la dernière version du logiciel XCTU, au risque de ne

pas voir reconnaître un module Xbee récent. Ainsi, il faut immédiatement accepter les mises à

jours (et vérifier lors de l’achat d’un nouveau module). C’est une opération assez longue.

24

Un guide d’utilisation de ce logiciel (assez sommaire) est disponible à l’adresse suivante :

http://www.digi.com/support/productdetl.jsp?pid=3352&osvid=57&s=316&tp=3&tp2=0

Je vais détailler dans ce rapport uniquement les étapes qui nous intéressent.

Au lancement du logiciel, l’écran suivant doit apparaître si la plaquette sparkfun ainsi que le

module Xbee sont bien connectés au PC et les périphériques bien installés :

Les paramètres (Baud, Flow Control, Data Bits, Parity et Stop Bits) sont renseignés par défaut

et ne seront pas modifiés pour l’objectif à atteindre.

Un clic sur la touche « Test/Query » permet de voir que le bon port a été sélectionné (USB

Serial Port), que le module est bien connecté et qu’il est reconnu.

25

L’écran suivant doit alors être visible :

Si ce n’est pas le cas il faut tout d’abord vérifier le port, débrancher et rebrancher si

nécessaire. Si ce n’est pas suffisant, vérifier une nouvelle fois les mises à jour.

Ensuite, l’onglet « Modem Configuration » permet de lire les paramètres par défaut du

module Xbee et également de les modifier. En cliquant sur le bouton « Read » on obtient alors

l’écran suivant :

26

On peut constater, en branchant plusieurs modules xbee, qu’ils ont tous les mêmes paramètres

par défaut. Ainsi, ils sont tous sur le même canal, le même réseau…Ils communiquent donc

tous entre eux sans aucun réglage.

Dans le travail pratique, j’ai fait le choix de modifier l’ « Identifiant Réseau ». Du côté du

configurateur, il suffit de modifier ce paramètre au clavier et de cliquer sur le bouton

« Write » pour l’inscrire dans la mémoire non volatile. Un clic sur le bouton « Restore »

restaure les paramètres par défaut.

Pour communiquer avec le drone, le choix du format hexadécimal a été retenu. Il faut donc

utiliser le configurateur conformément à ce choix en cliquant sur l’onglet « Terminal » puis

« Assemble Packet » et sélectionner « Hex ».

Pour le TP, les données à envoyer auront une taille d’un octet. Après avoir inscrit la

commande, il faut faire « Send Data ».

b) Coté drone

Les pilotes de la carte Arduino Uno ainsi que l’environnement de développement sont

disponibles à cette adresse :http://arduino.cc/en/Main/Software. Pour installer les pilotes, il

faut, bien évidemment passer par le gestionnaire de périphérique. Ensuite, la carte peut être

branchée el le logiciel arduino.exe lancé. Voici ce que l’on doit alors avoir à l’écran :

27

Voici les icônes à connaître au minimum :

: Cet icône sert à compiler le programme en cours.

: Celui-ci permet de charger le programme sur la carte branchée au PC. Pour que la carte

puisse accepter le programme, il faut que les deux cavaliers soient enlevés (et remis en mode

fonctionnement).

: Celui-ci permet d’avoir accès au terminal, et donc voir ce qui est inscrit sur la liaison

série du module xbee du drone.

Si le port n’est pas reconnu automatiquement, il faut débrancher le carte et rebrancher. Le cas

échéant, un choix manuel peut être utile en procédant comme suit :

Le programme à ouvrir s’appelle « drone ».

Une explication détaillée, en français, et apparemment bien faite (je ne m’en suis pas servie,

donc ce n’est pas indispensable) est disponible à cette adresse :

http://arduino.cc/fr/Main/DebuterPresentationLogiciel.

V – Programmation de la carte Arduino :

V-1 Structure du programme – Langage

Les différentes fonctions utilisées dans le programme qui va suivre sont toutes disponibles à

l’adresse suivante : http://www.arduino.cc/en/Reference/HomePage. Le langage utilisé est un

dérivé du langage C.

La structure d’un programme contient toujours d’abord une zone de déclaration de variables,

suivie de la création de fonctions auxiliaires. Ensuite, un appel à la fonction setup() assigne le

28

sens (entré ou sortie) aux pins de Arduino qui sont connectés à des capteurs ou actuateurs.

Finalement la fonction principale loop() exécute en boucle le programme. Des fonctions

peuvent être appelées. Elles sont détaillées en fin de programme à l’extérieur de la boucle.

Une fois sauvegardé et compilé, le programme peut être exporté vers le microprocesseur de la

carte.

V-2 Programme

a) Présentation de la paquette

Au matériel déjà présenté s’ajoute 4 potentiomètres pour remplir le rôle des trimes, un capteur

d’altitude SRF05 (module ultrason fabriqué par Devantech) et quelques composants dont les

rôles seront détaillés plus loin.

b) Déclaration

Pour cette première partie, les commentaires du programme sont suffisants pour la

compréhension, le langage Arduino étant très proche du C.

//utile pour la fonction principale

float hauteur = 0; //variable pour stocker l'altitude du drone

int identifiant_reseau; //variable pour stocker le numéro de l'ID réseau;

nécessaire pour passer d'un groupe à l'autre.

int i; //compteur

unsigned long commande=0; //variable pour stocker la commande envoyée par

les étudiants; comprise entre 0 et 100 en héxa elle

correspond à la puissance en %. Si la commande

est FF, c'est pour demander l'altitude.

int lecture=300; //variable pour stocker ce qui arrive sur la liaison

29

série.

int trime[4]={0,511,511,511}; //tableau pour stocker la position des trimes

initialisé en position "neutre" ou "repos" pour la

première trame.

int exedent_PWM[4]={1000,1500,1500,1500}; //tableau pour stocker la largeur des

impulsions

//utile pour la fonction mesure de hauteur

int broche_echo = 2 ; // broche "echo" du SRF05 (digital 2)

int broche_trigger = 3; // broche "trigger" du SRF05 (digital 3)

//utile pour la gestion de l'ID via l’interrupteur

const int nb_interrupteur = 4; // définit le nombre d'interrupteur nécessaire pour différencier l'ID réseau, ici 4 (donc 16

réseaux possibles)

int interupteur[nb_interrupteur]={4,5,6,7}; //définit les broches de branchement des interrupteurs

c) Fonction setup

Les instructions suivantes sont nécessaires pour cette partie :

pinMode : configure la broche spécifiée pour qu'elle se comporte soit en entrée, soit

en sortie.

Serialbegin : fixe le débit de communication en bits par secondes (l'unité est le baud)

pour la communication série (et l’initialise).

delay : réalise une pause dans l'exécution du programme pour la durée (en

millisecondes) indiquée en paramètre.

Serialprint : affiche les données sous le port série sous forme lisible.

analogread : lit la valeur de la tension présente sur la broche spécifiée. La carte

Arduino comporte 6 voies connectées à un convertisseur analogique-numérique 10

bits. Cela signifie qu'il est possible de transformer la tension d'entrée entre 0 et 5V en

une valeur numérique entière comprise entre 0 et 1023.

De plus, pour que chaque groupe d’étudiants puisse communiquer indépendamment avec le

drone, j’ai choisi de modifier « l’identifiant réseau » comme indiqué précédemment. Du côté

du configurateur, la manipulation est simple (expliqué au paragraphe IV-2, a). Du côté de la

carte, il a été retenu de modifier l’identifiant réseau automatiquement en fonction de la

position de 4 interrupteurs. L’étudiant, souhaitant dialoguer avec le drone, devra positionner

les interrupteurs en fonction du numéro de son identifiant réseau (4 interrupteurs à « 0 »

correspondent au numéro 0, les 4 en position « 1 » correspondant à l’identifiant 15…).

Chaque modification de la position d’un interrupteur devra être suivie d’un appui sur le

bouton RESET de la carte (la lecture de l’identifiant se faisant dans la partie initialisation et

non dans la boucle car trop couteux en temps).

La démarche pour modifier ce registre est la suivante. Il faut tout d'abord passer dans le mode

"commande" en envoyant 3 fois le caractère "+" en moins de 1 seconde. Il faut également

30

respecter un temps de garde (de 1 seconde) avant et après l'envoi de ces 3 caractères. Le

module répond par "OK" + "CR" (retour à la ligne ; « chariot return »).

Les commandes AT sont alors possibles. Il nous faut ici utiliser la commande ATID. ATID +

paramètre ( ) : modifie ou lit l'adresse du Pan ID.

Il faut que cette valeur soit la même pour que les modules puissent communiquer entre eux.

La fonction ATCN permet de sortir du mode commande.

Remarque : la valeur de l’identifiant réseau est stockée dans la mémoire volatile du module.

En effet, il faudrait sinon utiliser la commande ATWR (write), mais cette commande génère

un dysfonctionnement du programme. Donc, si le module est débranché, il récupère

l’identifiant par défaut. Mais dès le lancement du programme, il se reconfigure avec

l’identifiant associé aux interrupteurs.

La fonction fct_retourne_ID () permet de récupérer simplement la valeur du numéro de

l’identifiant en fonction du positionnement des interrupteurs. Pour cette fonction, les

instructions suivantes sont nécessaires :

digitalWrite : si la broche est configurée en ENTREE, écrire un niveau HAUT sur

cette broche a pour effet d'activer la résistance interne de 20K de "rappel au plus"

(pullup) sur cette broche.

digitalRead : lit l’état (le niveau logique) d'une broche précise en entrée numérique, et

renvoie la valeur HIGH ou LOW.

void setup()

{

pinMode(11, OUTPUT); //déclaration de la sortie 11, PWM voie 2

(avant arrière)

pinMode(12, OUTPUT) ; //déclaration de la sortie 12, PWM voie 3

(rotation gauche, droite)

pinMode(10, OUTPUT); //déclaration de la sortie 10, PWM voie 1

(puissance ie montée ou descente)

pinMode(13, OUTPUT); //déclaration de la sortie 13, PWM voie 4

(Roulis gauche, droite)

pinMode(broche_echo, INPUT); // déclaration de la broche écho (2) en tant

qu'entrée

pinMode(broche_trigger, OUTPUT); // déclaration de la broche trigger (3) en tant

que sortie

for (i=0; i<4; i++)

{

pinMode(interupteur[i], INPUT); // déclaration des 4 broches de l'interrupteur en

entrée

}

Serial.begin(9600); // initialisation de la liaison série (à 9600 bauds)

identifiant_reseau = fct_retourne_ID (); //récupération de 'ID réseau en fonction des

positions de l'interrupteur (cf fonction).

Une modification des positions de

l'interrupteur doit être suivi d'un reset de la

carte.

delay(2000); //initialisation de l'ID réseau

Serial.print ("+++"); //initialisation de l'ID réseau (passage en mode

31

commande de l'xbee)

delay(2000); //initialisation de l'ID réseau (temps de

garde obligatoire)

Serial.print ("ATID"); //initialisation de l'ID réseau (commande AT

pour le changement de réseau)

Serial.print (identifiant_reseau, DEC); //initialisation de l'ID réseau (valeur de l'ID

que l'on a récupérée)

Serial.print ("\r"); //initialisation de l'ID réseau (retour chariot

obligatoire)

Serial.print ("ATCN\r"); //initialisation de l'ID réseau (sortie du mode

commande)

// lecture des valeurs des 4 trimes

trime[0] = analogRead(A0);

trime[1] = analogRead(A1);

trime[2] = analogRead(A2);

trime[3] = analogRead(A3);

}

En fin de programme :

int fct_retourne_ID () {

int valeur_interupteur[nb_interrupteur]={0,0,0,0}; //pour stocker la position de chaque

interrupteur

int poids_binaire[nb_interrupteur]={1,2,4,8}; //pour passer en décimal le numéro de l'ID

int ID=0; //pour stocker l'ID réseau correspondant

au positionnement des interrupteurs.

for (i=0; i<nb_interrupteur; i++)

{

digitalWrite(interupteur[i], HIGH) ; //activation de la résistance pull up pour

chaque entrée où est branché un

interrupteur

valeur_interupteur[i] = digitalRead(interupteur[i]); //lecture de la valeur de chaque

interrupteur (1 ou 0)

ID = ID + valeur_interupteur[i]*poids_binaire[i];

}

return ID; // fonction qui retourne l'ID

}

d) Boucle

Génération PWM

Dans cette boucle sont générées les 4 PWM dans l’ordre idoine. Pour cela, l’instruction

digitalWrite est de nouveau utilisée, mais cette fois-ci avec les broches configurées en

sorties. Donc cette action active un niveau logique HIGH ou LOW sur une broche

numérique. Sa tension est mise à la valeur correspondante : 5V pour le niveau HAUT, 0V

pour le niveau BAS.

Remarque : on ne peut utiliser la génération de fonction PWM automatique de la carte car la

période ne correspond pas au besoin.

32

Le drone ne réclame qu’une tension de 3.3V. Celle-ci est obtenue à l’aide de diodes zener et

de résistances (une diode et une résistance par voie). Ne connaissant pas exactement le

courant demandé par le drone, la résistance a été calculée avec un courant faible et ajustée

avec l’expérience.

Mesure de l’altitude du drone à l’aide du SRF05

Pour utiliser le SRF-05, il faut lui envoyer une demande de mesure (Trigger). C’est un signal

carré de 5V dont la période est de 10 µs minimum. Dès qu’il reçoit ce signal, le SRF-05

envoie 8 bursts d’ultrasons de 40 kHz. Dès l’envoi du dernier ultrason, le capteur envoie un

signal sur la pin Echo qu’il maintient à 5V jusqu’il reçoive un retour des ultrasons. A ce

moment là, il redescend le signal Echo à la masse.

Nous avons donc un signal Echo qui est proportionnel à la distance entre le SRF-05 et l’objet.

Pour le programme, l’instruction PulseIn qui lit la durée d'une impulsion appliquée sur une

broche (configurée en ENTREE) est nécessaire.

Enfin, la fréquence d’utilisation du SRF-05 est tous les 50 ms. C’est un temps de sécurité

recommandé par le constructeur, pour s’assurer qu’un signal envoyé par une mesure

précédente ne vienne pas fausser la nouvelle.

33

Commandes

Sont également gérées ici les commandes envoyées par les étudiants à l’aide des instructions :

- Serial.available : donne le nombre d'octets disponible à la lecture dans la file

d'attente du port série.

- Serial.print : affiche les données sur le port série

- Serial.read : lit les données entrantes sur le port Série.

void loop()

{

for (i=1; i<4; i++) //réglage des trois trimes autre que puissances

{

exedent_PWM[i] =1500+(trime[i]-511)/2; //le point milieu est à 511 (le convertisseur

analogigue numérique renvoie un nombre compris entre 1 et 1023)

}

exedent_PWM[0] = 1000+commande*10+trime[0]/5; //ajout de la trime de puissance à la

commande

// passage de toutes les voies à "1" puis à "0" successivement.

digitalWrite(11, HIGH);

delayMicroseconds(exedent_PWM[1]);

digitalWrite(11, LOW);

digitalWrite(10, HIGH);

delayMicroseconds(exedent_PWM[0]);

digitalWrite(10, LOW);

digitalWrite(12, HIGH);

delayMicroseconds(exedent_PWM[2]);

digitalWrite(12, LOW);

digitalWrite(13, HIGH);

delayMicroseconds(exedent_PWM[3]);

digitalWrite(13, LOW);

delayMicroseconds(14860-exedent_PWM[0]- exedent_PWM[1]- exedent_PWM[2]-

exedent_PWM[3]); //la période de tous les signaux est de 15500

microssecondes; ici le chiffre de 14860 a été

retenu (après lecture sur l'oscillo) car les fonctions

analogRead prennent un peu de temps.

// lecture des valeurs des 4 trimes

trime[0] = analogRead(A0);

trime[1] = analogRead(A1);

trime[2] = analogRead(A2);

trime[3] = analogRead(A3);

34

if(Serial.available() == 1) //lecture de la commande, s'il y a une donnée

disponible sur la liaison série

{

lecture = Serial.read(); //la donnée disponible est stockée dans la variable

lecture

if (lecture == 0xFF) //si l'étudiant envoie OxFF,

{

hauteur = fct_mesure_hauteur(); //alors le drone mesure sa hauteur,

Serial.println(hauteur, DEC); //et l'imprime sur la liaison série, l'étudiant

la recevra sur son terminal

Serial.flush(); //remise a 0 des données en attente sur la liaison

}

else

{

if (0<=lecture && lecture<=100) //si la variable est un nombre (en hexa) compris

entre 0 et 100,

{commande = lecture;} //alors ça correspond à une commande;

else

{

Serial.println("mauvaise commande"); //le cas échéant, la commande ne correspond pas à

l'attendue

Serial.flush();

}

}

}

Serial.flush(); //remise a 0 des données en attente sur la liaison

}

float fct_mesure_hauteur() {

unsigned long largeur_impulsion = 0; // variable pour socker la largeur de la pulsation en

micro secondes

float distance = 0; // variable pour stocker la distance en cm

digitalWrite(broche_trigger, HIGH); // envoie d'une pulsation (mise à l'état haut de la

sortie, delayMicroseconds(10); // attente de 10 micro seconde,

digitalWrite(broche_trigger, LOW); // puis passage à l'état bas.

largeur_impulsion = pulseIn(broche_echo, HIGH); // lit la durée de l'impulsion retournée par le

capteur distance = largeur_impulsion/58.0; // conversion d'un temps en microseconde en

distance en cm. La valeur du dénominateur est issue des mesures et de la datasheet return (distance); // fonction qui retourne la distance

}

35

VI – Guidage et tests

Le système de guidage a été réalisé à partir de bois et de fils de pêche. Une mousse placée en

bas protège le drone des atterrissages non maîtrisés et des plombs l’empêchent de frapper la

planche supérieure. Le système est démontable en détendant les fils et en faisant passer les

petites boucles dans « train d’atterrissage » du drone.

Ce système simple a, me semble t-il, l’avantage de ne pas modifier la structure du drone.

36

Une vérification à l’oscilloscope des signaux émis par la carte Arduino nous indique un

fonctionnement normal du programme :

Position neutre :

Modification de la trime de puissance :

Envoie de la commande 100%

vérification des tensions :

37

Modification d’une autre trime :

Les tests réalisés sont concluants. La difficulté réside dans le fait que le drone ne semble pas

conserver dans le temps ses réglages initiaux. Ou bien, le fil de pêche le déséquilibre un peu.

Quoiqu’il en soit, il me semble, que le guidage ne puisse être plus doux. Le drone est

vraiment très léger et très sensible. Pour l’utilisation que l’on en fait, il ne me semble pas

possible de faire mieux (ou bien je n’ai pas d’idée). Quoiqu’il en soit, ça me paraît très

satisfaisant tel que.

38

Conclusion

Les fils de commande du drone sont gênants pour la réalisation du TP. En effet, comme écrit

précédemment, le drone est très sensible au moindre frottement. Ces fils sont pour l’instant

nécessaires car la plaquette est trop volumineuse pour être supportée par les hélices. La suite

pourrait donc être la miniaturisation de cette plaquette. En effet, il existe une carte Arduino

plus petite et proposant les mêmes fonctions : la carte nano. De même, si l’adaptateur xbee

pour cette carte n’est pas disponible sur le site Arduino il existe chez d’autres revendeurs.

Voici une image de l’ensemble que l’on peut obtenir :

De plus, si cet adaptateur est encore trop volumineux, les plans des cartes Arduino sont tous

disponibles. Il est donc réalisable dans un laboratoire disposant du matériel nécessaire (cf

annexe pour le schéma).

Il reste les potentiomètres choisis un peu volumineux, mais surtout le capteur d’altitude.

Celui-ci pourrait être géré par une autre carte et être fixé en haut ou en bas du support.

Quoiqu’il en soit, le programme fonctionnera de même avec cette autre carte.

Le contenu du stage m’a semblé très complet. J’ai découvert le Zigbee, ainsi que le système

Arduino. J’ai progressé dans la connaissance des microcontrôleurs et ai manipulé quelques

composants électroniques. J’ai fait le lien entre électronique et informatique, matière qui

jusqu’à présent, était assez cloisonnée à mes yeux.

J’ai pris beaucoup de plaisir dans la réalisation de ce projet.

39

Remerciements :

- Merci à monsieur Calmettes quant à sa souplesse pour la date de soutenance.

- Merci à madame Leymarie, monsieur Viallon ainsi que monsieur Nohlier pour

ce sujet passionnant. Merci pareillement pour cette ambiance de travail très

sereine et agréable (le retour au sein de l’armée va piquer les yeux). Merci

également pour la confiance (enfin je crois) accordée.

- Merci à Nicolas Monnereau pour son aide patiente et précieuse à mes débuts

sur le système Arduino et pour son conseil final qui m’a bien débloqué.

40

ANNEXE : schéma de l’adaptateur Xbee