RapportProjetGSE-Hochart Renault
RapportProjetGSE-Hochart Renault
RapportProjetGSE-Hochart Renault
Alexandre Hochart
Mickaël Renault
Page | 1
Hochart – Renault Projet GSE 2015 – 2016
Sommaire
INTRODUCTION .................................................................................................................................................. 4
Page | 2
Hochart – Renault Projet GSE 2015 – 2016
ANNEXES .......................................................................................................................................................... 52
Page | 3
Hochart – Renault Projet GSE 2015 – 2016
Introduction
Nous allons mettre en perspective les différents domaines d’étude qui composent notre cursus en
Génie des Systèmes Embarqués par l’intermédiaire d’un projet à la fois riche et concret, découpé en
plusieurs étapes de développement. Ce projet est proposé et encadré par M. Dekneuvel, enseignant-
chercheur au sein de l’Ecole Polytechnique de l’Université de Nice, et s’étale sur toute la durée du
semestre 9. Le système à concevoir est un radar de recul à capteur ultrason, dont le détail est précisé
dans le cahier des charges de la partie suivante.
Nous développerons dans ce rapport les phases de spécification du système, de validation du modèle
fonctionnel, de modélisation du système de communication interne, des interfaces, et enfin de
prototypage.
Chaque étape donne lieu à un rapport intermédiaire témoignant du travail réalisé, des choix opérés
et leur justification. Ces conditions, de même que l’environnement de travail, sont pour nous
l’occasion de renforcer nos qualités organisationnelles, d’adaptation, de gestion du temps, de travail
en équipe, de constance et d’assiduité. La dimension de ce projet nous donne donc les moyens de
travailler tout autant l’électronique technique, que la gestion de projet.
Page | 4
Hochart – Renault Projet GSE 2015 – 2016
Le radar : situé à l’arrière du véhicule, il peut être multiple (généralement au nombre de 4) mais
il sera considéré comme unique dans le cadre du projet.
Les interfaces : situées à l’avant du véhicule (au niveau du poste de conduite), elles seront dans
le cadre du projet au nombre de 2 :
1. Une interface d’affichage de la valeur de la mesure sur écran de type LCD.
2. Une interface sonore de type mini sirène dont le nombre de bips sonore sera ajusté en
fonction de la proximité de l’obstacle.
La technologie utilisée pour la détection d’obstacle est celle des ultrasons dont la fréquence
caractéristique de fonctionnement se situe au voisinage des 40Khz (donc dans une plage de
fréquence non audible par l’oreille humaine). Le principe de la mesure de distance est celui de la
mesure du temps de vol. Comme le montre la Figure 2, l’entité émetteur/récepteur US se comporte
comme un système convoluant le signal en entrée (burst) par sa fonction de transfert. On peut noter
ainsi des oscillations résiduelles lors de l’arrêt de l’émission.
Page | 5
Hochart – Renault Projet GSE 2015 – 2016
Les figures ci-dessous montrent un exemple de scénario. On peut y voir que la mise en position
marche arrière du levier de vitesse (pos) commande l’émission du signal à ultrasons sur un durée qui
doit permettre d’observer un écho avec suffi une d’énergie. La période de rafraichissement de la
mesure est fixée à 50 ms. Le déclenchement de l’émission du signal s’accompagne alors d’une
mesure du temps de vol et d’une acquisition de l’écho éventuel.
Page | 6
Hochart – Renault Projet GSE 2015 – 2016
Dans le scénario proposé, la première émission ne fournit pas d’écho mesuré avec une amplitude
suffisante. On peut alors observer l’impression d’un message indiquant que la mesure est hors limite
(en réalité l’affichage sera effacé). On peut ensuite s’apercevoir qu’un écho est observé, avec une
amplitude croissante et avec un temps d’apparition plus faible par rapport à l’instant d’émission du
burst. L’émission cesse lorsque le levier quitte la position de la marche arrière.
Pour la conception, les précisions suivantes sur l’application seront à prendre en compte :
Page | 7
Hochart – Renault Projet GSE 2015 – 2016
4. L’implémentation se fera sur une technologie de type microcontrôleur ST. On souhaite une
consommation énergétique inférieure à 300 mA et une température de fonctionnement allant
de -20 à 60 °C.
Page | 8
Hochart – Renault Projet GSE 2015 – 2016
Nom du
Entité Type, Sens Définition fonctionnelle
lien
Radar Emetteur burst Data, In [boolean] Signal logique de 0 à 5V, Fréquence 40kHz.
A.3.1 Radar
Page | 9
Hochart – Renault Projet GSE 2015 – 2016
a. Onde burst
On suppose 2 types d’ondes 𝑏𝑢𝑟𝑠𝑡 possibles : sinusoïdale ou carrée, comprises entre 0 et 5V. La
fréquence du signal est de 40kHz.
Le comportement de l’émetteur ultrason peut être modélisé par une fonction de transfert du second
ordre du type :
𝑋(𝑠) 𝐾
𝐻(𝑠) = = 2
𝑌(𝑠) 𝑠 + 2𝜔0 𝜁𝑠 + 𝜔0 2
2 1−𝑧 −1
On applique une transformation en z par la méthode de Tustin, où 𝑠 = .
𝑇 1+𝑧 −1
𝐾 + 2𝐾.𝑧 −1 + 𝐾.𝑧 −2
Ainsi, 𝐻(𝑧) = 4 4𝜔 𝜁 8 4 4𝜔 𝜁 il est alors possible d’utiliser la fonction
( 2+ 𝑧0 +𝜔02 )+𝑧 −1 .(2𝜔02 − 2)+𝑧 −2 .( 2+𝜔0 − 𝑇0 )
𝑇 𝑇 𝑇
filter et de l’appliquer au signal d’entrée 𝑏𝑢𝑟𝑠𝑡.
On considère pour la simulation une fréquence d’échantillonnage de 800kHz afin d’étudier les ondes
émises et reçues avec plus de précision, mais il conviendra de revoir cette fréquence à la baisse pour
le système réel.
Nous utilisons la formule de Friis pour les télécommunications afin d’évaluer l’atténuation du signal
reçu par le récepteur :
𝑐 2 340 2
𝑃𝑟 𝜆2 ( ) ( ) −9
= 𝐺𝑡 𝐺𝑟 =
𝑓
= 𝐺 𝐺 40. 103 = 𝐺 𝐺 114. 10
𝑡 𝑟 𝑡 𝑟
𝑃𝑡 (4𝜋𝑅)2 (4𝜋𝑅)2 (4𝜋. 2𝑑)2 𝑑2
Page | 10
Hochart – Renault Projet GSE 2015 – 2016
Figure 1 - Cette série de courbes montre les variations de l’atténuation du son dans l’air en fonction de l’humidité, pour des
fréquences comprises entre 40kHz et 200 kHz
Sur cette courbe, on remarque qu’à une fréquence de 40kHz, l’atténuation est inférieure à 0.5dB/ft,
soit 1.65dB/m. Nous pourrons arrondir à une valeur de 1.5dB/m dans les conditions normales
d’utilisation. Ainsi, si l’obstacle est placé à 2m du radar (valeur maximum), l’atténuation répartie sur
−6
5
4m atteint 6dB : 𝑃𝑑𝐵 𝑟𝑒ç𝑢𝑒 = 𝑃𝑑𝐵 é𝑚𝑖𝑠𝑒 − 6𝑑𝐵 ⇒ 𝑉𝑟 = 𝑉𝑒 . 10 20 = = 2,5𝑉
2
d. Modélisation Matlab
Page | 11
Hochart – Renault Projet GSE 2015 – 2016
La simulation de l’entité sous Matlab donne une onde émise et réfléchie globalement similaire pour
un signal burst sinusoïdal ou carré. Nous pourrons donc opter pour un signal burst carré évitant
l’utilisation du convertisseur numérique-analogique du contrôleur.
Page | 12
Hochart – Renault Projet GSE 2015 – 2016
B. Spécifications
Attente
𝑝𝑜𝑠
𝑇=0
𝑝𝑜𝑠 Emission
Réception
Nous utilisons une approche par les entrées : nous déterminons, à partir d’un état initial, les valeurs
des sorties 𝑏𝑢𝑟𝑠𝑡 et 𝑑𝑖𝑠𝑡𝑎𝑛𝑐𝑒, suite au changement d’état des entrées 𝑝𝑜𝑠 et 𝑒𝑐ℎ𝑜.
contactUser radar
Emetteur/
Récepteur
Conducteu
r distanc data echo
e
data Information Envoi d'un événement signifiant qu’une distance est disponible.
Page | 13
Hochart – Renault Projet GSE 2015 – 2016
𝐶.𝑇
𝐷 : Distance calculée par le radar : 𝐷 = avec C=344 m/s
2
- Buzzer pouvant émettre jusqu’à 80dB. Durée du 𝑏𝑢𝑟𝑠𝑡 à définir suivant l'énergie nécessaire et de la
zone aveugle. Intervalle entre les 𝑏𝑢𝑟𝑠𝑡 de 50ms.
- Afficheur LCD
- Micro-contrôleur ST
Conclusion de la partie 1
L’environnement et les spécifications ainsi précisées, nous devons maintenant trouver une solution
d’implémentation du modèle en le modélisant et le simulant progressivement sous Cofluent afin de
le faire valider.
Page | 14
Hochart – Renault Projet GSE 2015 – 2016
A. Modélisation de l’émetteur/récepteur
L’émetteur/Récepteur peut être modélisé de manière indépendante en supposant un message
d’entrée de type 𝑏𝑢𝑟𝑠𝑡 : signal carré sur 5 périodes puis reste à 0.
B. Données de modélisation
Fonction de transfert
𝐾 +2𝐾. 𝑧 −1 + 𝐾. 𝑧 −2
𝐻(𝑧) =
4 4𝜔0 𝜁 8 4 4𝜔 𝜁
( 2+ + 𝜔02 ) + 𝑧 −1 . (2𝜔02 − 2 ) + 𝑧 −2 . ( 2 + 𝜔0 − 0 )
𝑇 𝑧 𝑇 𝑇 𝑇
On considère pour la simulation une fréquence d’échantillonnage de 800kHz afin d’étudier les ondes
reçues avec plus de précision, mais il conviendra de revoir cette fréquence à la baisse pour le
système réel.
Equation de récurrence
1
𝑠(𝑛) = [𝐾. 𝑒(𝑛) + 2𝐾. 𝑒(𝑛 − 1) + 𝐾. 𝑒(𝑛 − 2) − 𝑏. 𝑠(𝑛 − 1) − 𝑐. 𝑠(𝑛 − 2)]
𝑎
Avec :
4 𝜁
𝑎= + 4. 𝜔 ∗ + 𝜔2 = 2.6312.1012
Te2 Te
8
𝑏 = 2. 𝜔2 − = −4.9937.1012
Te2
4 𝜁
𝑐= + 𝜔 − 4. 𝜔 ∗ = 2.6151.1012
Te2 Te
𝐾 = 5.106
{ 𝜁 = 0.1
Page | 15
Hochart – Renault Projet GSE 2015 – 2016
Retard
Le retard est modélisé par une FIFO initialisée à 0 dont la taille est proportionnelle à la distance.
Ainsi, le signal echo en sortie sera à 0 le temps que la fifo se « remplisse » des valeurs obtenues par la
fonction de transfert, et cela pour une durée équivalente à 𝑡𝑟𝑒𝑡𝑎𝑟𝑑 , soit en terme
d’échantillons : 𝑡𝑟𝑒𝑡𝑎𝑟𝑑 ∗ 𝐹𝑒 .
On a donc :
2 ∗ 𝑑𝑖𝑠𝑡
𝑡𝑎𝑖𝑙𝑙𝑒𝐹𝐼𝐹𝑂 = ∗ 𝐹𝑒
34000
Atténuation
Les différentes formules donnant l’atténuation d’un signal ultrason dans l’air à courte distance
n’étant pas suffisamment réalistes dans notre cas, nous avons choisi de considérer une atténuation
de 50% à 1m, puis 75% à 2m, etc. La formule utilisée est la suivante :
𝑑𝑖𝑠𝑡
𝑎𝑡𝑡 = 0.5( 100 )
Page | 16
Hochart – Renault Projet GSE 2015 – 2016
B.2. Simulation
La simulation affiche en bleu le signal 𝑏𝑢𝑟𝑠𝑡 généré en entrée, puis l’on observe un silence en sortie
𝑡𝑟𝑒𝑡𝑎𝑟𝑑∗𝑣𝑠𝑜𝑛
pour une durée d’environ 11.8 ms, correspondant à une distance de = 2.006 mètres,
2
avant d’afficher l’echo du signal 𝑏𝑢𝑟𝑠𝑡.
La machine à état est réalisée dans un bloc fonctionnel « Sampled » avec une période de 𝑇𝑝𝑎𝑠 soit
12.5 µs. Cette période correspond au plus petit temps utilisé dans le système.
De plus, le bloc comprend une étape d’initialisation. Les variables 𝑒𝑐ℎ𝑜, 𝑝𝑜𝑠 et 𝑏𝑢𝑟𝑠𝑡 seront
actualisées à chaque passage dans la machine à état. Seule la variable 𝑑𝑖𝑠𝑡𝑎𝑛𝑐𝑒 sera écrite
uniquement en fin de réception.
Page | 17
Hochart – Renault Projet GSE 2015 – 2016
1
𝐷=0, 𝑇=0
Attente
𝑇>50ms et 𝑝𝑜𝑠
𝑇=0
𝑇 ≥ 𝑇𝑏𝑢𝑟𝑠𝑡
𝑏𝑢𝑟𝑠𝑡 = 0
Attente : Le système reste dans cet état tant que le véhicule est en marche avant, ou en
attendant la prochaine occurrence d’envoi du signal 𝑏𝑢𝑟𝑠𝑡 (50ms).
Emission : Cet état génère le signal 𝑏𝑢𝑟𝑠𝑡 durant 𝑇𝑏𝑢𝑟𝑠𝑡 (125 µs) . Ce signal est un signal carré de
période 2*𝑇𝑝𝑎𝑠 (2*12.5 µs = 25 µs).
Réception : L’état de réception attend que le signal 𝑒𝑐ℎ𝑜 soit supérieur au seuil pour calculer la
distance en fonction de temps écoulé depuis le début d’émission. Dans le cas où ce temps dépasse
50 ms, nous passons à l’état suivant en indiquant une distance de 1 pour indiquer que la distance est
hors limite.
Page | 18
Hochart – Renault Projet GSE 2015 – 2016
Nous regroupons maintenant notre machine à état avec l’émetteur/récepteur afin de simuler le
fonctionnement de la machine à état.
Le levier de vitesse qui va simuler une mise en marche arrière puis un retour en marche avant.
L’environnement qui va fournir une distance variable à l’émetteur/récepteur.
Page | 19
Hochart – Renault Projet GSE 2015 – 2016
Voici une simulation pour une distance variant de 230 cm à 30 cm par pas de 25 cm.
Levier de vitesse : Nous constatons, que le système réalise des mesures uniquement lors d’une
marche arrière.
Burst : Les 𝑏𝑢𝑟𝑠𝑡 sont bien envoyés à intervalle régulier de 50 ms. De plus, la séquence de 𝑏𝑢𝑟𝑠𝑡
envoie comme souhaité 5 𝑏𝑢𝑟𝑠𝑡 de 12,5 µs.
Echo : Le signal 𝑒𝑐ℎ𝑜 correspond aux simulations de l’émetteur/récepteur seul.
Distance : Notre machine à état calcule bien pour chaque mesure la distance envoyée par le
producteur avec une erreur inférieure à 1 cm. L’erreur est due à la fréquence d’échantillonnage.
Soit une erreur de distance maximum de C*Tpas soit 0.425 cm.
Après avoir validé le fonctionnement de notre machine à état, nous allons ajouter la communication
stop and wait vue l’année précédente.
Ici, le producteur du message est compris dans le radar de recul, le consommateur est un bloc à part,
et la fonction de transmission stop&wait constitue un bloc bien défini.
Nous avons donc dû adapter le radar de recul pour fonctionner en mode producteur : il émet la
distance non-plus sous forme d’un float ou d’un entier, mais sous forme de caractères formant une
chaine : MessS. Il s’occupe également de recevoir la confirmation de réception (signal CR) pour
laquelle nous devons encore préciser notre stratégie d’action en cas d’erreur : soit nous tenons
compte des 3 échecs successifs et nous tentons de relancer l’envoi, soit nous ignorons l’erreur et
avançons dans la machine à état.
Page | 20
Hochart – Renault Projet GSE 2015 – 2016
Sur cet aperçu, on retrouve à gauche le levier de vitesse et le radar de recul contenant la machine à
états, puis à sa droite le bloc modélisant l’émetteur/récepteur ainsi que le bloc modélisant
l’environnement (distance de l’obstacle), et en dessous le bloc de transmission stop&wait.
E.3. Simulation
La simulation de notre système nous permet de visualiser la position du levier de vitesse, les
variations des signaux 𝑏𝑢𝑟𝑠𝑡 et 𝑒𝑐ℎ𝑜, l’état de la FIFO 𝑑𝑖𝑠𝑡𝑎𝑛𝑐𝑒, et l’état de la confirmation de
réception 𝐶𝑅, lorsque la voiture s’approche d’un obstacle.
Page | 21
Hochart – Renault Projet GSE 2015 – 2016
Analyse du graphe :
La première observation évidente est l’augmentation de la puissance de l’écho reçu (signal rouge
continu): le signal émis étant supposé de 3,3V nous obtenons bien un écho atténué de 50% lorsque
l’obstacle est proche de 1m (dernier écho reçu sur la simulation).
Lorsqu’un écho est reçu, la FIFO distance (croix rouges) reçoit la distance mesurée et se place
donc dans un état « plein » à 1.
En fin de transmission, on observe la présence d’une confirmation de réception 𝐶𝑅 (croix
violettes).
Le signal 𝑏𝑢𝑟𝑠𝑡 est bien envoyé toutes les 50ms
Aucun signal n’est manipulé en dehors de la position « marche arrière ».
Nous vérifions le protocole de transmission grâce à la fonction cf_trace_report placé à chaque étape,
ici en envoyant la valeur ‘‘120’’ ==> [STX][49][50][48][CS][ETX] :
De même, nous obtenons un rapport d’envoi successif des distances mesurées (de 160cm à 100cm)
grâce à la fonction cf_trace_report placée à plusieurs positions stratégiques :
Page | 22
Hochart – Renault Projet GSE 2015 – 2016
De même, un signal 𝐶𝑅=success est bien retourné au producteur à la fin de chaque transmission, et
le consommateur peut effectivement disposer des valeurs de distance toutes les 50ms.
Conclusion de la partie 2
Cette étape de modélisation et de simulation permet de raffiner notre modèle et d’y apporter les
précisions nécessaires à son bon fonctionnement. Nous obtenons des résultats cohérents lors des
simulations et bien que tous les cas de figure ne soient pas présentés dans ce rapport, nous nous
attachons à tester un maximum de cas limites et à vérifier que le système répond de façon non-
bloquante.
Page | 23
Hochart – Renault Projet GSE 2015 – 2016
Partie 3 : Communication, et
interfaces : modélisation
Objectif : L’objet de cette troisième partie du projet est notamment de préciser la méthode de
communication interne au système et la gestion des interfaces. Nous allons donc étudier le protocole
de communication orienté caractère, et prendre en compte les interfaces en modélisant notamment
leur fonctionnement et leur gestion.
Nous nous appuyons sur l’interface de communication Stop&Wait modélisée l’année dernière sur
Cofluent, que nous allons corriger, sécuriser, et adapter à notre système.
Page | 24
Hochart – Renault Projet GSE 2015 – 2016
Au niveau encore inférieur nous trouvons le canal, dans lequel du bruit peut survenir.
Dans notre système, le message provient de notre fonction « RadarDeRecul » qui devient alors le
producteur. L’information est transmise sous forme de chaîne de caractères au gestionnaire
d’interfaces qui se charge de la gestion du Buzzer et de l’écran.
Cependant, nous pouvons noter qu’une difficulté peut se présenter sur ce modèle de
communication : elle est unilatérale et ne permet pas au gestionnaire d’interface de communiquer
des informations au radar de recul. Les messages d’acquittement et de non-acquittement sont
générés automatiquement par la couche Liaison de la structure Stop&Wait et cela ne permet pas au
consommateur de prendre la main. Nous choisissons donc de conserver la connexion du signal 𝑝𝑜𝑠
du levier de vitesse à la fonction RadarDeRecul afin de ne pas nécessiter de modification du
protocole.
Une seconde observation que nous pouvons faire est que le cahier des charges ne précise pas la
réponse du système en cas d’échecs successifs de transmission des données, c’est pourquoi nous
avons choisi d’intercepter cette information d’échec (𝐶𝑅=echec) comme condition de sortie de la
boucle principale de la fonction RadarDeRecul, entrainant l’arrêt des séquences de mesure sur le
capteur de distance. Cela permet d’éviter une consommation de la plateforme dans une situation de
disfonctionnement, mais impose un redémarrage pour reprendre un fonctionnement normal. Nous
faisons donc le choix de la maintenance manuelle afin de favoriser l’économie d’énergie.
Page | 25
Hochart – Renault Projet GSE 2015 – 2016
Page | 26
Hochart – Renault Projet GSE 2015 – 2016
A.2.1 EmissionLiaison
Page | 27
Hochart – Renault Projet GSE 2015 – 2016
Nous utilisons une condition sur l’état pour définir les opérations à effectuer. Si l’état courant est
𝑖𝑑𝑙𝑒, le système suivra la branche de gauche, si l’état courant est 𝑎𝑡𝑡𝐴𝑐𝑘, le système suivra la
branche de droite. Dans ce dernier cas, le premier signal qui arrive détermine une nouvelle fois
l’opération à effectuer : si 𝑡𝑖𝑚𝑒𝑜𝑢𝑡 arrive avant 𝑟𝑒𝑝𝑜𝑛𝑠𝑒𝐸, on renouvelle l’envoi du message, sinon
on accuse réception (si le message reçu est ACK) ou on renouvelle l’envoi (si le message reçu est
NACK). Voici les algorithmes utilisés :
Page | 28
Hochart – Renault Projet GSE 2015 – 2016
Nous utilisons une fonction permettant d’indiquer l’avancement du temps passé à partir du dernier
envoi. Cela permet de générer un évènement 𝑇𝑖𝑚𝑒𝑜𝑢𝑡 lorsque la réponse attendue ne nous parvient
pas à temps (ici, 𝑇𝑖𝑚𝑒𝑜𝑢𝑡=100ms).
Page | 29
Hochart – Renault Projet GSE 2015 – 2016
A chaque front d’horloge, T est incrémenté, et lorsqu’il dépasse une valeur 𝑇𝑚𝑎𝑥 , un événement
𝑡𝑖𝑚𝑒𝑜𝑢𝑡 est envoyé. Voici l’algorithme utilisé :
Page | 30
Hochart – Renault Projet GSE 2015 – 2016
Nous utilisons une condition sur l’état pour définir les opérations à effectuer. Si l’état courant est
𝑖𝑑𝑙𝑒, le système suivra la branche de gauche, si l’état courant est 𝑎𝑡𝑡𝑚𝑒𝑠, le système suivra la
branche de droite. Dans le premier cas, un évènement 𝑑𝑒𝑚𝑎𝑛𝑑𝑒 permet un passage à l’état suivant,
et dans le second, selon si le message est valide ou non, une réponse ACK ou NACK est émise de
même que le message au consommateur. Voici les algorithmes utilisés :
A.3.1 Framing
Page | 31
Hochart – Renault Projet GSE 2015 – 2016
A.3.2 Deframing
Page | 32
Hochart – Renault Projet GSE 2015 – 2016
Le message n’est envoyé que si l’on arrive sur un caractère ETX et que le Checksum est correct (envoi
conditionnel).
Le Buzzer consiste en une membrane dont la position dépend de la tension donnée en entrée. Ainsi,
pour émettre un son, il convient d’envoyer en entrée un signal dont la fréquence correspond à la
fréquence sonore voulue. Dans cette partie nous supposerons un signal carré et non sinusoïdal, dont
l’amplitude sera à valeurs fixes à 0V ou 3,3V.
La durée d’un bip sera constante (Tbuzz=40ms), seul le temps de silence entre chaque bip sera
modifié en fonction de la distance de l’obstacle de la manière suivante :
Page | 33
Hochart – Renault Projet GSE 2015 – 2016
Temps de silence
Bornes Bip(s) par seconde 1
− (𝐷𝑢𝑟é𝑒 𝑑 ′ 𝑢𝑛 𝑏𝑖𝑝)
𝑛𝑏 𝐵𝑖𝑝/𝑠
0 < d < 25 5 b/s 0,16s
25 < d < 50 4 b/s 0,21s
50 < d < 100 3 b/s 0,29s
100 < d < 150 2 b/s 0,46s
150 < d < 200 1 b/s 0,96s
200 < d 0 b/s ∞
B.2. Modélisation
B.2.1 Fonctionnement
Nous optons pour la machine à états suivante, où le passage de l’état 𝑈𝑝 à 𝐷𝑜𝑤𝑛 permet
l’oscillation de la membrane créant le bip, et où l’état 𝑆𝑖𝑙𝑒𝑛𝑡 correspond à l’état d’attente du bip
suivant.
t=0
i=0
Buzz=1
i>=50
t=0
Page | 34
Hochart – Renault Projet GSE 2015 – 2016
Nous utilisons une fonction échantillonnée à 400µs dont la boucle principale reçoit la distance au
format Integer, calcule la valeur de 𝑇𝑠𝑖𝑙𝑒𝑛𝑐𝑒 et entre dans le switch..case de la machine à état décrite
précédemment. En sortie nous obtenons le signal 𝐵𝑢𝑧𝑧 permettant de piloter la membrane du
buzzer.
Nous effectuons une simulation sur 6 secondes en considérant que la distance de l’obstacle est
décroissante entre 231 cm et 32 cm.
[...]
<REPORT>:0 us : RadarDeRecul/init> Init_RadarDeRecul
<REPORT>:1 us : LevierDeVitesse/MarcheArriere> posFalse
<REPORT>:8002 us : LevierDeVitesse/RemarcheAvant> posTrue
<REPORT>:21629 us : CtrlEmission/envoi> Nouveau message emis : 231
<REPORT>:23840 us : Recuperation/StringToInt> Distance decode 231
<REPORT>:524292 us : CtrlEmission/envoi> Nouveau message emis : 208
<REPORT>:526501 us : Recuperation/StringToInt> Distance decode 208
<REPORT>:1027004 us : CtrlEmission/envoi> Nouveau message emis : 186
<REPORT>:1029217 us : Recuperation/StringToInt> Distance decode 186
<REPORT>:1029222 us : Buzzer/state> BUZZ !!!
<REPORT>:1529729 us : CtrlEmission/envoi> Nouveau message emis : 164
<REPORT>:1531941 us : Recuperation/StringToInt> Distance decode 164
<REPORT>:2029222 us : Buzzer/state> BUZZ !!!
<REPORT>:2032442 us : CtrlEmission/envoi> Nouveau message emis : 142
<REPORT>:2034653 us : Recuperation/StringToInt> Distance decode 142
<REPORT>:2529222 us : Buzzer/state> BUZZ !!!
<REPORT>:2535167 us : CtrlEmission/envoi> Nouveau message emis : 120
<REPORT>:2537377 us : Recuperation/StringToInt> Distance decode 120
<REPORT>:3029222 us : Buzzer/state> BUZZ !!!
<REPORT>:3037879 us : CtrlEmission/envoi> Nouveau message emis : 098
<REPORT>:3040089 us : Recuperation/StringToInt> Distance decode 98
<REPORT>:3362222 us : Buzzer/state> BUZZ !!!
<REPORT>:3540604 us : CtrlEmission/envoi> Nouveau message emis : 076
<REPORT>:3542817 us : Recuperation/StringToInt> Distance decode 76
<REPORT>:3695222 us : Buzzer/state> BUZZ !!!
<REPORT>:4028222 us : Buzzer/state> BUZZ !!!
<REPORT>:4043317 us : CtrlEmission/envoi> Nouveau message emis : 054
<REPORT>:4045529 us : Recuperation/StringToInt> Distance decode 54
<REPORT>:4361222 us : Buzzer/state> BUZZ !!!
<REPORT>:4546042 us : CtrlEmission/envoi> Nouveau message emis : 032
<REPORT>:4548253 us : Recuperation/StringToInt> Distance decode 32
<REPORT>:4611222 us : Buzzer/state> BUZZ !!!
<REPORT>:4861222 us : Buzzer/state> BUZZ !!!
Page | 35
Hochart – Renault Projet GSE 2015 – 2016
Distance reçue : 32 cm
⇒ 25 < distance < 50
⇒ Tsilence = 210 ms (4 bips/s)
⇒ buzz à t=4 361 ms, puis à t+Tbuzz+Tsilence = 4 611 ms, 4 861 ms, 5 111 ms, 5 361 ms…
Page | 36
Hochart – Renault Projet GSE 2015 – 2016
C. Gestionnaire d’interfaces
La gestion du Buzzer est intégrée à un Gestionnaire d’Interfaces (GI), permettant le contrôle des
périphériques en fonction de la distance reçue par la transmission orientée caractères.
Une opération capitale effectuée par le GI est la conversion des données de distance en format
entier, afin d’être utilisable par l’ensemble des fonctions. Le Buzzer par exemple, en a besoin pour la
manipulation de la membrane sonore. L’écran en fera également usage afin d’adapter l’interface
graphique en intégrant un indicateur proportionnel à la distance sur l’affichage.
Page | 37
Hochart – Renault Projet GSE 2015 – 2016
Page | 38
Hochart – Renault Projet GSE 2015 – 2016
Conclusion de la partie 3
Nous avons pu préciser, dans cette partie, le protocole de communication que nous allons utiliser
entre nos 2 plateformes. Nous avons précisé chaque étape du protocole, notamment la couche de
liaison, la couche framing/deframing et la couche de transmission caractère par caractère.
Notre modèle fonctionne conformément aux exigences, nous allons pouvoir nous attacher à la phase
de prototypage.
Page | 39
Hochart – Renault Projet GSE 2015 – 2016
Partie 4 : Prototypage
Objectif : L’objet de cette quatrième partie du projet est d’implémenter sur carte STMicroelectronics
les modèles que nous avons définis. Nous allons donc appliquer les algorithmes définis
précédemment au programme principal de chaque plateforme.
Nous utiliserons deux cartes STMicroelectronics : la première est une carte BCMSTM32F400, la
seconde est une carte STM32Nucleo-L152RET6.
A.1. Liaison
La fonction (simplifiée ci-dessous) effectue l’envoi puis la réception du message. La fonction receive
retourne un code d’exécution dépendant de la validité de la trame reçue (couche inférieure) : si une
erreur est détectée ou si le temps de réception dépasse le Timeout imposé, ou encore si un message
NACK est reçu, alors l’envoi est renouvelé jusqu’à 3 fois.
void liaison(message){
essai=0;
send(message);
err=receive(trame);
A.2. Framing/Deframing
A.2.1 En émission :
Page | 40
Hochart – Renault Projet GSE 2015 – 2016
La fonction de mise en forme de la trame insère le caractère STX (0x02) en début de chaine, puis
ajoute les caractères du message à envoyer, avant de calculer la somme de toutes les valeurs
associées aux caractères de la chaine selon la formule de calcul d’un Checksum vue l’année
précédente :
Si la somme des caractères (STX et ETX inclus) dépasse 255, le checksum est incrémenté d’une unité
est un modulo 256 lui est appliqué. Sa valeur est finalement inversée bit à bit avant d’être intégrée à
la chaine de caractères.
Enfin, le caractère ETX (0x03) est disposé en fin de trame, ainsi qu’un caractère null de sécurité.
A.2.2 En réception :
La réception est également effectuée caractère par caractère, du caractère STX jusqu’au ETX, en
vérifiant le Checksum à postériori. Si une erreur est détectée, ou si le Timeout arrive à son terme
avant la fin de la réception (ici, Timeout=100ms), la valeur 1 est retourné, alors que si la trame est
reconstruite sans erreur dans le temps imparti, la valeur 0 est retournée.
switch(r){
case 2: //Start
I=0;
sommeBuffer=2;
break;
case 3: //Stop
frame[I]=0;
sommeBuffer+=3;
if(sommeBuffer>255){
sommeBuffer++;
}
sommeBuffer=~sommeBuffer;
sommeBuffer=sommeBuffer%256;
Page | 41
Hochart – Renault Projet GSE 2015 – 2016
return 0;
}else{ //Message invalidé par la somme
frame[0]=0;
return 1;
}
default :
frame[I]=r;
sommeBuffer+=r;
I++;
break;
}
}
}
}
Nous allons ici transmettre les caractères un à un sur le canal, mais sans effectuer de décomposition
bit à bit, ni calcul de parité. Nous utilisons la fonction USART1_puts en émission, et la fonction getc
en réception.
if(carte.writeable()){
carte.putc(*text);
text++;
}
}
}
En émission comme en réception, nous devons vérifier l’état des registres avant d’effectuer toute
opération. Par exemple, ci-dessus nous veillons à ce que la carte puisse envoyer des données (FIFO
d’émission vide) avant d’appeler la fonction putc().
Pour ces opérations, nous devons nous adapter à la plateforme utilisée. La fonction ci-dessus est un
exemple d’utilisation pour la carte Nucleo, mais la syntaxe sera différente et sensiblement plus
complexe pour la STM32F400.
Pendant la phase de test nous simulons un échec de Checksum en insérant une erreur dans
l’algorithme, puis nous simulons en condition normale d’utilisation.
Page | 42
Hochart – Renault Projet GSE 2015 – 2016
On observe bien une retransmission jusqu’à 3 fois du message lorsqu’une erreur de Checksum est
détectée, et une transmission fluide en situation normale.
Page | 43
Hochart – Renault Projet GSE 2015 – 2016
Le capteur de distance utilisé pour cette première phase de prototypage sera de type HCSR-04. Celui-
ci fonctionne sur le principe suivant : un signal de 10µs TTL en entrée agit comme signal de départ
pour la prise de mesure. Le capteur émet alors une onde ultrason et attend son retour. Il convertit
ensuite le temps de réponse en signal de sortie TTL de longueur proportionnelle (1m ↔ 5 800µs).
Table1 - Rapport entre la distance mesurée par le capteur et la durée de son signal de sortie
Nous implémentons alors une fonction permettant de générer le signal TTL de 10µs (Trig), et une
fonction sensible aux fronts montant et descendant du signal de sortie (Echo).
Voici le détail des fonctions correspondantes à intégrer dans notre programme sur la carte Nucleo.
Page | 44
Hochart – Renault Projet GSE 2015 – 2016
// _____________________________________
// ECHO => ________/ Distant = Temps / 29/2 \__.... Stop timer.
// ^
//
void echo_fall(){
distance_time.stop(); //Stoppe le timer.
L‘état du Buzzer est mis à jour à une fréquence de 400µs, le micro-contrôleur a donc le temps
d’effectuer d’autres opérations dans l’intervalle disponible. Le déclenchement est opéré à l’aide d’un
timeout régulier dont la précision est de 5% ce qui conviendra pour notre périphérique.
Une classe Buzzer est utilisée pour la gestion de celui-ci. La méthode changeMode() modifie la valeur
de Tsilence (correspond à la fonction Calcul sous Cofluent), et la méthode run() permet l’entrée dans
la machine à états (correspond à la fonction state sous Cofluent).
class Buzzer{
public :
Buzzer(){
TsilenceMs=100;
etat = BipInit;
t.reset();
i=0;
}
int TsilenceMs;
Page | 45
Hochart – Renault Projet GSE 2015 – 2016
void Buzzer::run(){
switch(etat){
case BipInit :
buzz=0;
i=0;
etat = BipUp;
t.start();
break;
case BipUp :
if(t.read_us()>=400 && i<50){
buzz=1;
i++;
etat = BipDown;
t.reset();
t.start();
}
break;
case BipDown :
if(t.read_us()>=400 && i<50){
buzz=0;
i++;
etat = BipUp;
t.reset();
t.start();
}
if(i>=50){
etat = Silent;
t.reset();
t.start();
}
break;
case Silent :
if(t.read_ms()>=TsilenceMs){
etat=BipInit;
}
break;
default :
etat = BipInit;
break;
}
}
Dans le but de limiter la consommation lorsque la voiture est en marche avant, nous rendons le
système sensible aux fronts montant et descendant du signal pos (mise en route de la marche
arrière, mise en route de la marche avant).
Ainsi, lorsque pos passe à 0, les routines de mesure de distance et de transmission des données
(prises en charge par la carte Nucleo sous forme de RTOS) sont misent en route, puis seront arrêtées
lorsque pos reviendra à 1.
Physiquement, nous utiliserons un bouton poussoir disponible sur la carte Nucleo : pos vaut 0
lorsque l’on enfonce le bouton, puis passe à 1 lorsqu’on le relâche.
Page | 46
Hochart – Renault Projet GSE 2015 – 2016
int main() {
position.rise(&position_rise); //Routine sur interruption de pos en front montant.
position.fall(&position_fall); //Routine sur interruption de pos en front descendant.
while(1);
}
Page | 47
Hochart – Renault Projet GSE 2015 – 2016
Les premières instructions du programme principal, avant l’entrée dans la boucle infinie, ont pour
objectif d’initialiser le GPIO puis l’écran LCD embarqué, avant de mettre en place les éléments
graphiques de base (Fond d’écran, couleur et taille de la police, titre, label, illustration…).
Après la phase d’initialisation, le programme est prêt à recevoir les données de distance depuis la
carte Nucleo. Si la réception est valide, un acquittement est renvoyé, la distance reçue en format
caractères est convertie en entier, et l’affichage à l’écran est mis à jour de manière appropriée. Si la
Page | 48
Hochart – Renault Projet GSE 2015 – 2016
réception n’est pas valide, un message NACK est renvoyé, et une notification d’erreur est affichée à
l’écran.
int main(){
char vecteur[60] = " \0";
char data[3];
int dist = 0;
int i;
while(1){
if(receive(data)){ //Attente de la réception d'un message.
send("\x06"); //Si la réception est valide, envoie un acquittement.
dist = trametoint(data); //Convertit la trame en entier.
GLCD_SetTextColor(Black); //Change la couleur d'écriture en noire.
GLCD_DisplayString(3,12,1,data); //Ecrit la distance (3 caractères) à la position x = 3 , y
= 12 (Valeur en caratére) et avec la police 1 (Grande).
data[0] = 0;
makeVecteur(dist,vecteur); //Création du vecteur symbolisant la distance.
GLCD_DisplayString(17,11,0,vecteur); //Ecrit le vecteur de distance sur 4 ligne.
GLCD_DisplayString(18,11,0,vecteur); //Taille des caractères 0
GLCD_DisplayString(19,11,0,vecteur);
GLCD_DisplayString(20,11,0,vecteur);
if(dist <= 17){ //Si la distance <= 17 cm, affiche "Attention choc !"
GLCD_SetTextColor(Red);
GLCD_DisplayString(8,2,1,"Attention choc !");
GLCD_SetTextColor(Black);
}
else if( dist >= 200 ){ //Si la distance >= 200 cm, affiche "Out of range"
GLCD_SetTextColor(Red);
GLCD_DisplayString(8,2,1," Out of range ");
GLCD_SetTextColor(Black);
}else{ //Sinon affiche rien.
GLCD_DisplayString(8,2,1," ");
}
}
else{
send("\x21"); //Si la réception n'est pas valide renvoie un non acquittement.
GLCD_SetTextColor(Red);
GLCD_DisplayString(8,2,1," Data Error ! "); //Affiche "Data Error !"
GLCD_SetTextColor(Black);
}
}
}
Page | 49
Hochart – Renault Projet GSE 2015 – 2016
D. Implémentation générale
Conclusion de la partie 4
Dans cette partie, nous nous sommes confrontés au fonctionnement spécifique des cartes
STMicroelectronics, notamment l’implémentation de timer, de timeout, l’utilisation du GPIO, de
l’écran LCD, etc. Nous avons donc adapté les algorithmes de la partie précédente pour opérer la
communication souhaitée entre les cartes, et implémenter correctement le Buzzer et l’écran LCD.
En pratique, seul l’écran sera réellement implémenté sur la carte STM32F400, le Buzzer sera quant à
lui géré par la carte Nucleo (pour des raisons d’accessibilité aux pins du GPIO).
Notre système est pleinement fonctionnel et répond au cahier des charges du client.
Page | 50
Hochart – Renault Projet GSE 2015 – 2016
Conclusion générale
Ce projet de conception d’un radar de recul est une introduction au travail auquel est confronté un
ingénieur en électronique, mais dans une dimension adaptée au calendrier universitaire.
Cette expérience nous a permis d’enrichir notre façon de travailler en équipe, de réagir avec justesse
face à des problèmes techniques, de nous libérer de situations de blocage, et de mener à bien notre
projet dans les temps impartis. Notre radar est maintenant fonctionnel, et pourrait constituer un
support dans le cadre d’un travail de plus grande dimension en explorant davantage son
industrialisation, son intégration en environnement réel.
Page | 51
Hochart – Renault Projet GSE 2015 – 2016
Annexes
A. Radar : STM32Nucleo-L152RET6
A.1. Aperçu
Structure de fichiers :
UART_Radar.h
UART_Radar.cpp
buzzer.h
main.cpp
A.2.1 UART_Radar.h
#ifndef UART_RADAR_H
#define UART_RADAR_H
//Vérification de l'Acknowledge
int controle(char *frame);
#endif
A.2.2 UART_Radar.cpp
#include "UART_Radar.h"
#include "mbed.h"
#include <string.h>
if(carte.writeable()){
carte.putc(*text);
text++;
}
}
}
Page | 52
Hochart – Renault Projet GSE 2015 – 2016
switch(r){
case 2: //Start
I=0;
sommeBuffer=2;
break;
case 3: //Stop
frame[I]=0;
sommeBuffer+=3;
if(sommeBuffer>255){
sommeBuffer++;
}
sommeBuffer=~sommeBuffer;
sommeBuffer=sommeBuffer%256;
default :
frame[I]=r;
sommeBuffer+=r;
I++;
break;
}
}
}
}
//Vérification de l'Acknowledge
int controle(char *frame){
if (*frame!=6) return 0;
Page | 53
Hochart – Renault Projet GSE 2015 – 2016
else return 1;
}
A.2.3 buzzer.h
#ifndef BUZZER_H
#define BUZZER_H
#include "mbed.h"
DigitalOut buzz(PB_8);
class Buzzer{
public :
Buzzer();
int TsilenceMs;
Buzzer::Buzzer(){
TsilenceMs=100;
etat = BipInit;
t.reset();
i=0;
}
/*
* Initialisation des différents modes de fonctionnement :
* fonction bip : (400µs+400µs)*50 = 40ms
* 0 < d < 25 --> 0 : 5 b/s TsilenceMs 0,16s
* 25 < d < 50 --> 1 : 4 b/s TsilenceMs 0,21s
* 50 < d < 100 --> 2 : 3 b/s TsilenceMs 0,29s
* 100 < d < 150 --> 3 : 2 b/s TsilenceMs 0,46s
* 150 < d < 200 --> 4 : 1 b/s TsilenceMs 0,96s
* 200 < d --> 5 : 0 b/s TsilenceMs infini
*/
/*
Si la valeur sort de son intervalle de fonctionnement,
on modifie le mode de fonctionnement courant.
*/
case BipInit :
Page | 54
Hochart – Renault Projet GSE 2015 – 2016
buzz=0;
i=0;
etat = BipUp;
t.start();
break;
case BipUp :
if(t.read_us()>=400 && i<50){
buzz=1;
i++;
etat = BipDown;
t.reset();
t.start();
}
if(i>=50){
etat = Silent;
t.reset();
t.start();
}
break;
case BipDown :
if(t.read_us()>=400 && i<50){
buzz=0;
i++;
etat = BipUp;
t.reset();
t.start();
}
if(i>=50){
etat = Silent;
t.reset();
t.start();
}
break;
case Silent :
if(t.read_ms()>=TsilenceMs){
etat=BipInit;
}
break;
default :
etat = BipInit;
break;
}
}
#endif
A.2.4 main.cpp
#include "mbed.h"
#include <string.h>
#include "UART_Radar.h"
#include "buzzer.h"
//Instanciation du Timer.
Timer distance_time; //Timer pour la mesure de distance.
Ticker mesure_time; //Timer (fixe) avec interruption pour l'acquisition de la distance.
Ticker send_time; //Timer (fixe) avec interruption pour l'envoi de la distance.
Page | 55
Hochart – Renault Projet GSE 2015 – 2016
Page | 56
Hochart – Renault Projet GSE 2015 – 2016
message[1]=48+(distance/10)%10;
message[2]=48+distance%10;
message[3]=0;
essai=0;
send(message);
pc.printf("%c%c%c\n\r",message[0],message[1],message[2]);
err=receive(trame); //Bug avec le nouvelle affichage
pc.printf("error%d\n\r",err);
int main() {
position.rise(&position_rise); //Routine sur interruption de pos en front montant.
position.fall(&position_fall); //Routine sur interruption de pos en front descendant.
while(1);
}
Page | 57
Hochart – Renault Projet GSE 2015 – 2016
B. Gestionnaire de l’écran
main.c
#include <stdio.h>
#include <string.h>
void makeVecteur(int distance, char vecteur[60]); //Vecteur graphique symbolisant la distance restante
void draw_voiture(int x0 , int y0); //Affiche la voiture à l'écran
void clean_voiture(int x0 , int y0); //Efface la voiture
/***********************Initialisation de L'UART***********************/
void USART1_Initialize(void){
USART_InitTypeDef usart1_Conf;
// Initialisation UART
usart1_Conf.USART_BaudRate = 9600;
usart1_Conf.USART_WordLength = USART_WordLength_8b;
usart1_Conf.USART_StopBits = USART_StopBits_1;
Page | 58
Hochart – Renault Projet GSE 2015 – 2016
usart1_Conf.USART_Parity = USART_Parity_No;
usart1_Conf.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
usart1_Conf.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_Init(USART1, &usart1_Conf);
USART_Cmd(USART1, ENABLE);
}
//Configuration du GPIO
// Broche USART1 :
// CK = PB3
// TX = PB6
// RX = PB7
GPIO_PinConfigure(GPIOB,6,GPIO_MODE_AF,GPIO_OUTPUT_PUSH_PULL,GPIO_OUTPUT_SPEED_100MHz,GPIO_PULL_UP);
GPIO_PinConfigure(GPIOB,7,GPIO_MODE_AF,GPIO_OUTPUT_PUSH_PULL,GPIO_OUTPUT_SPEED_100MHz,GPIO_PULL_UP);
GPIO_PinConfigure(GPIOB,3,GPIO_MODE_AF,GPIO_OUTPUT_PUSH_PULL,GPIO_OUTPUT_SPEED_100MHz,GPIO_PULL_UP);
Page | 59
Hochart – Renault Projet GSE 2015 – 2016
/***********Efface la voiture.****************/
void clean_voiture(int x0 , int y0){
int l,c;
GLCD_SetTextColor(White); //Couleur de la gomme = Blanc.
for(c = 0 ; c<28 ; c++){
for(l = 0 ; l<30 ; l++){
GLCD_PutPixel(x0 + 2*c , y0 + 2*l);
GLCD_PutPixel(x0 + 2*c+1 , y0 + 2*l);
Page | 60
Hochart – Renault Projet GSE 2015 – 2016
int main(){
char vecteur[60] = " \0";
char data[3];
int dist = 0;
int i;
while(1){
if(receive(data)){ //Attente de la réception d'un message.
send("\x06"); //Si la réception est valide, envoie un acquittement.
dist = trametoint(data); //Convertie la trame en entier.
GLCD_SetTextColor(Black); //Change la couleur d'écriture en noire.
GLCD_DisplayString(3,12,1,data); //Ecrit la distance ( 3 caractères ) à la position x = 3 ,
y = 12 (Valeur en caratére) et avec la police 1 (Grande).
data[0] = 0;
makeVecteur(dist,vecteur); //Création du vecteur symbolisant la distance.
GLCD_DisplayString(17,11,0,vecteur); //Ecrit le vecteur de distance sur 4 ligne.
GLCD_DisplayString(18,11,0,vecteur); //Taille des caractères 0
GLCD_DisplayString(19,11,0,vecteur);
GLCD_DisplayString(20,11,0,vecteur);
if(dist <= 17){ //Si la distance <= 17 cm, affiche "Attention choc !"
GLCD_SetTextColor(Red);
GLCD_DisplayString(8,2,1,"Attention choc !");
GLCD_SetTextColor(Black);
}
else if( dist >= 200 ){ //Si la distance >= 200 cm, affiche "Out of range"
GLCD_SetTextColor(Red);
GLCD_DisplayString(8,2,1," Out of range ");
GLCD_SetTextColor(Black);
}else{ //Sinon affiche rien.
GLCD_DisplayString(8,2,1," ");
}
}
else{
send("\x21"); //Si la réception n'est pas valide renvoie un non acquittement.
GLCD_SetTextColor(Red);
GLCD_DisplayString(8,2,1," Data Error ! "); //Affiche aussi Data Error !
GLCD_SetTextColor(Black);
}
}
}
Page | 61