<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
		<id>https://peip-ima.plil.fr/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Jbailet</id>
		<title>Wiki de bureau d'études PeiP - Contributions de l’utilisateur [fr]</title>
		<link rel="self" type="application/atom+xml" href="https://peip-ima.plil.fr/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Jbailet"/>
		<link rel="alternate" type="text/html" href="https://peip-ima.plil.fr/mediawiki/index.php/Sp%C3%A9cial:Contributions/Jbailet"/>
		<updated>2026-04-24T16:11:49Z</updated>
		<subtitle>Contributions de l’utilisateur</subtitle>
		<generator>MediaWiki 1.29.2</generator>

	<entry>
		<id>https://peip-ima.plil.fr/mediawiki/index.php?title=Instrument2012-1&amp;diff=2011</id>
		<title>Instrument2012-1</title>
		<link rel="alternate" type="text/html" href="https://peip-ima.plil.fr/mediawiki/index.php?title=Instrument2012-1&amp;diff=2011"/>
				<updated>2013-05-18T20:08:23Z</updated>
		
		<summary type="html">&lt;p&gt;Jbailet : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;''Version 5.18.1, mise à jour le 18/05/2013 à 22:08''&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
L'objectif du Bureau d'études IMA est de nous faire découvrir la spécialité &lt;br /&gt;
par le biais d'un projet à réaliser, et ainsi appréhender des méthodes de &lt;br /&gt;
travail pour s'initier au côté technique et pratique du département.&lt;br /&gt;
&lt;br /&gt;
Nous nous sommes vu confier le kit robot : Lego Mindstorms,&lt;br /&gt;
et égalemment d'autres matériels électroniques comme une carte Foxboard ou&lt;br /&gt;
un clé Bluetooth.&lt;br /&gt;
&lt;br /&gt;
Notre projet consistera dans un premier temps à concevoir un robot autonome&lt;br /&gt;
naviguant aux instruments, puis dans une deuxième partie&lt;br /&gt;
à intégrer les fonctionnalités des autres groupes dans le but d'une &lt;br /&gt;
démonstration finale.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;include nopre noesc src=&amp;quot;/home/pedago/ppeip/include/video-RobotInstruments-2012-iframe.html&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== LE ROBOT EN AUTONOMIE ==&lt;br /&gt;
&lt;br /&gt;
=== '''Enjeux et objectifs''' ===&lt;br /&gt;
&lt;br /&gt;
Nous devons doter notre robot d'une boussole ou d'un gyroscope pour lui permettre de connaitre précisément sa direction de déplacement. Distinguons le gyroscope, qui renvoie la valeur de vitesse angulaire, et la boussole qui renvoie un cap.&lt;br /&gt;
&lt;br /&gt;
* Nous commencerons par faire en sorte que notre robot sache avancer en ligne droite, pour cela nous utiliserons le contrôle PID. Nous allons pour cela effectuer des corrections sur la trajectoire en utilisant des rotations. L'angle de ces rotations va être calculé en fonction de l'erreur de trajectoire indiqué par l'instrument. Plus exactement par la somme d'une constante multipliée par l'erreur instantanée, d'une autre constante multipliée par l'intégrale de l'erreur et enfin d'une dernière constante multipliée par la dérivée de l'erreur. Il nous faut pour cela trouver les valeurs adaptées des trois constantes.&lt;br /&gt;
&lt;br /&gt;
* Nous ferons ensuite en sorte que notre robot sache contourner les obstacles au plus juste. Au plus juste signifiant qu'il tournera vers la droite ou vers la gauche en jugeant où se trouve le chemin le plus libre. L'algorithme à appliquer consiste à tourner le robot d'un angle faible dans un sens puis dans l'autre et de lire les résultats du sonar. Si les deux mesures indiquent un obstacle trop proche, l'angle est augmenté et le procédé répété. Dès qu'une trajectoire indique un chemin libre ou du moins un obstacle à distance suffisante, le robot avance en ligne droite suivant cette trajectoire. L'instrument doit être utilisé ici pour vérifier que le robot effectue précisément des rotations des angles souhaités et qu'il sache revenir en position initiale pour éventuellement recommencer avec un angle plus grand.&lt;br /&gt;
&lt;br /&gt;
* Pour permettre de suivre le comportement du robot, nous afficherons sur la brique de contrôle MindStorm l'angle de rotation pour le dernier contournement et la distance parcourue le long de la dernière ligne droite.&lt;br /&gt;
&lt;br /&gt;
Nous intégrerons ces comportements pour obtenir un robot capable de contourner les obstacles avec un minimum d'intelligence.&lt;br /&gt;
&lt;br /&gt;
Voici un exemple de contournement d'obstacle avec l'algorithme décrit.&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Parcours-boussole.png|Contournement d'obstacle&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== '''Problèmes rencontrés et solutions apportées''' ===&lt;br /&gt;
&lt;br /&gt;
Nous avons rencontré plusieurs problèmes tout au long de notre projet. Nous nous sommes efforcés soit de les résoudre, soit de les contourner en utilisant d'autres moyens pour arriver à nos fins, notamment sur l'aspect le plus ardu : la programmation.&lt;br /&gt;
&lt;br /&gt;
* '''Problème #1 :''' Absence d'espace libre sur le robot dans le montage initial pour insérer la foxboard.&lt;br /&gt;
** Solution apportée : Création d'un espace de stockage à l'arrière du robot.&lt;br /&gt;
&lt;br /&gt;
* '''Problème #2 :''' Le logiciel de programmation par blocs, bien qu'intuitif, ne nous permet pas d'arriver au degré de complexité auquel nous voudrions mener le robot.&lt;br /&gt;
** Solution apportée : Passage à la programmation par lignes de code en langage NXC.&lt;br /&gt;
&lt;br /&gt;
* '''Problème #3 :''' La difficulté d'intégration du gyroscope et ses valeurs variant trop rapidement le rendent trop compliqué à utiliser.&lt;br /&gt;
** Solution apportée : Malgré le passage en &amp;quot;lowspeed&amp;quot; du capteur, il demeure compliqué, pour le moment. Nous préférerons d'abord travailler avec le compas, pour travailler avec les angles, plutôt que les vitesses de rotations.&lt;br /&gt;
&lt;br /&gt;
* '''Problème #4 :''' Le robot semble avoir du mal à gérer le calcul des angles ET la rotation de ses moteurs.&lt;br /&gt;
** Solution apportée : Allègement du programme. Le robot semble désormais mieux se comporter et fait ce qu'on lui demande sans négliger de commandes.&lt;br /&gt;
&lt;br /&gt;
* '''Problème #5 :''' Le robot part toujours à droite quelle que soit la déviation.&lt;br /&gt;
** Solution apportée : Réécriture du programme afin de distinguer plusieurs cas. Le robot corrige désormais efficacement dans la majorité des cas. &lt;br /&gt;
&lt;br /&gt;
* '''Problème #6 :''' Le robot corrige dans le sens contraire lorsqu'il est autour du cap nord à cause de notre méthode de détection. &lt;br /&gt;
** Solution apportée : L'algorithme actuel est à travailler avec des modulos.&lt;br /&gt;
&lt;br /&gt;
=== '''Algorithmes de programmation utilisés''' ===&lt;br /&gt;
&lt;br /&gt;
==== Variables utilisées ====&lt;br /&gt;
&lt;br /&gt;
On définit dans le programmes plusieurs variables à valeurs entières. Les voici :&lt;br /&gt;
&lt;br /&gt;
* ''' int chdg;''' &amp;gt;&amp;gt;&amp;gt; ''chdg pour &amp;quot;Current Heading&amp;quot;, c'est le cap instantané du robot (en degrés).''&lt;br /&gt;
* ''' int shdg;''' &amp;gt;&amp;gt;&amp;gt; ''shdg pour &amp;quot;Start Heading&amp;quot;, c'est le cap de  référence au début de la trajectoire.''&lt;br /&gt;
* ''' int var;'''  &amp;gt;&amp;gt;&amp;gt; ''C'est la variable &amp;quot;départ moins actuel&amp;quot; (shdg-chdg) utilisé pour l'algorithme décrit plus bas.''&lt;br /&gt;
* ''' int gauche;''' &amp;gt;&amp;gt;&amp;gt; ''C'est la distance vers l'obstacle le plus proche enregistré lorsque le robot tourne la tête à droite.''   &lt;br /&gt;
* ''' int droite;''' &amp;gt;&amp;gt;&amp;gt; ''C'est la distance vers l'obstacle le plus proche enregistré lorsque le robot tourne la tête à gauche.''&lt;br /&gt;
&lt;br /&gt;
On définit, de même, des constantes :&lt;br /&gt;
&lt;br /&gt;
* ''' #define NEAR 30 ''' &amp;gt;&amp;gt;&amp;gt; ''C'est la distance (en cm) à laquelle le radar de proximité ordonne au robot d'arrêter d'avancer.''&lt;br /&gt;
* ''' #define ERREUR 15 ''' &amp;gt;&amp;gt;&amp;gt; ''C'est la marge d'erreur (en degrés) dans laquelle le robot considère que les variations de cap sont négligeables.''&lt;br /&gt;
* ''' #define P 40 &lt;br /&gt;
* ''' #define I 40 ''' &amp;gt;&amp;gt;&amp;gt; ''Ce sont les variables utilisées lors du contrôle PID.''&lt;br /&gt;
* ''' #define D 90&lt;br /&gt;
&lt;br /&gt;
==== Les algorithmes ====&lt;br /&gt;
&lt;br /&gt;
*SetSensorLowspeed(IN_3); &amp;gt;&amp;gt;&amp;gt; Initialisation du radar : le capteur est lancé.&lt;br /&gt;
*SetSensorLowspeed(IN_4); &amp;gt;&amp;gt;&amp;gt; Initialisation de la boussole : le capteur est lancé.&lt;br /&gt;
*chdg = SensorHTCompass(IN_4); &amp;gt;&amp;gt;&amp;gt; shdg prend la valeur du cap et est fixée pour le moment.&lt;br /&gt;
*shdg = SensorHTCompass(IN_4); &amp;gt;&amp;gt;&amp;gt; chdg prend la valeur du cap courant.&lt;br /&gt;
*var =(shdg - chdg); &amp;gt;&amp;gt;&amp;gt; Cela est relativement transparent.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Si le robot est à une distance supérieure à NEAR alors&lt;br /&gt;
*Tant que le robot est à une distance supérieure à NEAR&lt;br /&gt;
**Le robot avance&lt;br /&gt;
**On actualise chdg&lt;br /&gt;
**Si le robot dévie passé une certaine marge d'erreur alors&lt;br /&gt;
***Tant que shdg est différent de chdg&lt;br /&gt;
****On stoppe le robot&lt;br /&gt;
*****Si var est inférieur à 0 alors &lt;br /&gt;
*****On a dévié à gauche, on corrige à droite&lt;br /&gt;
*****On réactualise chdg&lt;br /&gt;
*****On réactualise var&lt;br /&gt;
****Sinon&lt;br /&gt;
*****On a dévié à droite, on corrige à gauche&lt;br /&gt;
*****On réactualise chdg&lt;br /&gt;
*****On réactualise var&lt;br /&gt;
****On réactualise chdg&lt;br /&gt;
***Fin tant que&lt;br /&gt;
**Fin si&lt;br /&gt;
*Fin tant que&lt;br /&gt;
Sinon&lt;br /&gt;
*Tant que le robot est à moins de NEAR d'un obstacle&lt;br /&gt;
**On arrête le robot&lt;br /&gt;
**Rotation du capteur de distance de 60° sur la gauche&lt;br /&gt;
**Enregistrement de la distance avant un obstacle dans ''gauche''&lt;br /&gt;
**Rotation du capteur de distance de 120° à droite&lt;br /&gt;
**Enregistrement de la distance avant un obstacle dans ''droite''&lt;br /&gt;
**Rotation du capteur de 60° à gauche pour retour au centre&lt;br /&gt;
**Si gauche est inférieur ou égal à droite alors&lt;br /&gt;
***Le robot fait une rotation pendant 2 secondes sur la droite&lt;br /&gt;
**Sinon&lt;br /&gt;
***Le robot fait une rotation pendant 2 secondes sur la gauche&lt;br /&gt;
**Fin si&lt;br /&gt;
*On reset shdg au cap courant&lt;br /&gt;
*Fin tant que&lt;br /&gt;
Fin si &amp;lt;br/&amp;gt;&lt;br /&gt;
On arrête le robot&lt;br /&gt;
&lt;br /&gt;
==== Le contrôle PID ====&lt;br /&gt;
&lt;br /&gt;
Nous avons utilisé le contrôle PID dans la rotation du capteur à ultrasons, vulgairement appelé &amp;quot;tête&amp;quot; de notre robot. Celui-ci s'est avéré beaucoup plus simple dans l'action que nous souhaitions réaliser sur la rotation de la tête. Voici comment il a été implémenté.&lt;br /&gt;
Nous avons introduit la syntaxe ''RotateMotorPID(OUT_B, 30, 60, P, I, D);'' où &lt;br /&gt;
*'''OUT_B''' représente la sortie B&lt;br /&gt;
*'''30''' est la puissance de la rotation&lt;br /&gt;
*'''60''' est l'angle de la rotation &lt;br /&gt;
*'''P''', '''I''' et '''D''' sont des constantes définies au début du programme. Il n'est pas utile ici de détailler les fonctions de t permettant le calcul de P, I et D, mais il est en revanche utile de détailler l'utilité de ces trois variables :&lt;br /&gt;
**'''P(t)''' rend le contrôleur plus rapide dans le temps mais il n'assure pas qu'il n'y ai aucune erreur d'équilibrage.&lt;br /&gt;
**'''I(t)''' donne de la &amp;quot;mémoire&amp;quot; au contrôleur, dans un sens il accumules les traces d'erreurs et les compense, avec un zéro erreur de moyenne garantie.&lt;br /&gt;
**'''D(t)''' donnes les &amp;quot;prédiction futures&amp;quot; au contrôleur ( comme la dérivée en maths ), ce qui accélère la réponse.&lt;br /&gt;
&lt;br /&gt;
Le contrôle PID permet donc une précision sans erreur et donc de tourner la tête exactement où il faut en assurant son retour exact à la position de départ, permettant toujours à la &amp;quot;tête&amp;quot; de regarder pile devant le robot sans décalage au fil de ses rotations.&lt;br /&gt;
&lt;br /&gt;
=== '''Avancées du projet''' ===&lt;br /&gt;
&lt;br /&gt;
==== '''Synthèse des fonctionnalités''' ====&lt;br /&gt;
&lt;br /&gt;
* Le robot avance en ligne droite : '''OK'''&lt;br /&gt;
* Le robot corrige sa trajectoire si on l'en dévie : '''OK'''&lt;br /&gt;
* Rotation du capteur ultrason, appelé &amp;quot;tête&amp;quot; et enregistrement des valeurs retournées : '''OK'''&lt;br /&gt;
* Le robot se dirige vers le chemin le plus dégagé : '''OK'''&lt;br /&gt;
* Le robot corrige toujours vers le bon endroit, par exemple si il dévie vers la gauche il corrige à droite : '''PARTIEL, A AMELIORER'''&lt;br /&gt;
* Le robot avance en suivant une ligne de couleur : '''OK'''&lt;br /&gt;
&lt;br /&gt;
==== '''Avancées''' ====&lt;br /&gt;
&lt;br /&gt;
[[File:1.Montage.jpg|200px|thumb|right|baseline|Le montage du robot est presque terminé]]&lt;br /&gt;
&lt;br /&gt;
* Création de la page wiki du projet.&lt;br /&gt;
&lt;br /&gt;
* Montage du robot.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Versionfinale.JPG|200px|thumb|right|baseline|Le montage du robot est presque terminé]]&lt;br /&gt;
&lt;br /&gt;
* Fin du montage du robot.&lt;br /&gt;
&lt;br /&gt;
* Câblage.&lt;br /&gt;
&lt;br /&gt;
* Découverte et utilisation du logiciel de programmation par blocs (Lego Mindstorms NXT).&lt;br /&gt;
&lt;br /&gt;
* Découverte du logiciel de programmation par ligne de code en NXC (Bricx).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Test de plusieurs lignes de codes NXC sur le logiciel (Bricx)&lt;br /&gt;
** Ligne droite&lt;br /&gt;
** Rotation sur lui-même&lt;br /&gt;
** Détection d'obstacle : réponse en tournant vers la gauche pour éviter&lt;br /&gt;
** Rotation de la &amp;quot;tête&amp;quot; (capteur US) sur 120° et adaptation (changement de hauteur du capteur pour éviter la collision avec les puces ultérieurement... &lt;br /&gt;
&lt;br /&gt;
* Implémentation du contrôle PID (Rotation de la tête).&lt;br /&gt;
&lt;br /&gt;
* Réalisation d'un programme permettant au robot de capter les obstacles dans un champ de 120 degré par la rotation de la tête, et contournement de ces derniers.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Avancées majeures de la page du projet&lt;br /&gt;
* Création d'un tâche ''sensor'' qui affiche le cap sur l'écran&lt;br /&gt;
* La tâche ''sensor'' assure aussi une rotation de la tête du robot pour intégrer, au futur, la possibilité de choisir le chemin le plus dégagé.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Implémentation quasi-complète de la rotation de la tête : le robot enregistre désormais dans une variable ''gauche'' et ''droite'' la distance mesurée par ultrasons en tournant la tête vers ledit côté. &lt;br /&gt;
* Le robot choisit alors la plus grande distance dégagée entre la gauche et la droite, tourne, et emprunte ce chemin.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== LE ROBOT MULTIFONCTIONS ==&lt;br /&gt;
&lt;br /&gt;
=== L'intégration du matériel sur le robot ===&lt;br /&gt;
&lt;br /&gt;
La montée des différents composants sur le robot n'a pas toujours été toute simple et nous avons parfois été confronté à des problèmes de montage.&amp;lt;br/&amp;gt;&lt;br /&gt;
La FoxBoard a tout d'abord été montée dans un compartiment spécifique à l'arrière du robot, lui donnant son design particulièrement unique en son genre et... loufoque ! &amp;lt;br/&amp;gt;&lt;br /&gt;
La WebCam, après avoir suscité pas mal d'interrogation quant à son placement, a été montée sur le dessus du boitier Mindstorms, lui assurant une vision globale de l'environnement devant le robot. &amp;lt;br/&amp;gt;&lt;br /&gt;
L'adaptateur USB ainsi que la clé WiFi et l'adaptateur bluetooth ont été ajoutés dans le compartiment de la FoxBoard. &amp;lt;br/&amp;gt;&lt;br /&gt;
Le capteur RFID, accompagné de son capteur de couleur ont été implémentés sous la tête du robot à l'avant du robot, dirigées vers le bas pour suivre les lignes au sol et capter les tags RFID des cartes collées au sol.&lt;br /&gt;
&lt;br /&gt;
[[File:finalmonte.jpg|200px|thumb|center|baseline|Le robot après l'intégration de toutes ses fonctionnalités.]]&lt;br /&gt;
&lt;br /&gt;
=== Le suiveur de ligne ===&lt;br /&gt;
&lt;br /&gt;
Nous avons tout d'abord cherché à intégrer le suiveur de ligne à notre robot. Pour cela, nous avons obtenu le code du groupe de Déborah Saunders &amp;amp; Jean Wasilewski. Cela permet au robot, en plus de ses fonctionnalités de base, de se diriger selon une ligne de couleur (normalisée verte pour tout le monde).&amp;lt;br/&amp;gt;&lt;br /&gt;
L'implémentation a été délicate car il faut placer la sonde à l'avant du robot, vers le bas, près du sol. Hors c'est là qu'était fixée la tête du robot. L'astuce a donc été de placer la tête au dessus du moteur plutôt qu'en dessous, la surelevant et laissant ainsi l'espace libre pour le capteur de couleur, sous le robot.&lt;br /&gt;
&amp;lt;br/&amp;gt;Le robot suit donc une ligne de couleur verte, essayant de retrouver la ligne de couleur lorsque qu'il dévie ou qu'il arrive dans un virage. Pour se faire, il va tourner à gauche et à droite dans des rotations d'angles de plus en plus ouvert pour retrouver la ligne.&lt;br /&gt;
&lt;br /&gt;
=== Webcam et bluetooth ===&lt;br /&gt;
&lt;br /&gt;
Il fut décidé d'intégrer au robot une webcam, afin d'utiliser avec profit ses capacités de contrôle à distance (Voir plus bas). L'utilisateur peut ainsi contrôler son robot et l'envoyer en éclaireur dans une pièce voir ce qu'il se passe par exemple. Le principe est de communiquer les commandes à la foxboard par WiFi, puis de les transmettre au boitier Mindstorm via une clé bluetooth connectée par USB à la foxboard. Les commandes sont détaillées dans le paragraphe suivant.&lt;br /&gt;
&lt;br /&gt;
=== Le contrôle à distance ===&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite intégré le programme de Kévin De Arriba et Alexandre Jouy, qui permet de contrôler le robot à distance. Le robot peut alors être contrôlé et répondre aux commandes via une interface web, en se connectant directement via Wi-Fi. Le principe, pour basculer en mode télécommande est de lui envoyer un octet dans la boite aux lettres n°3 dont les 4 bits de poids forts sont à zéro. Voici la signification de ces octets : &amp;lt;br/&amp;gt;&lt;br /&gt;
valeur 0x00 (0) : arrêt du robot ;&amp;lt;br/&amp;gt;&lt;br /&gt;
valeur 0x01 (1) : le robot avance ;&amp;lt;br/&amp;gt;&lt;br /&gt;
valeur 0x02 (2) : le robot recule ;&amp;lt;br/&amp;gt;&lt;br /&gt;
valeur 0x03 (3) : le robot tourne à gauche ;&amp;lt;br/&amp;gt;&lt;br /&gt;
valeur 0x04 (4) : le robot tourne à droite ;&amp;lt;br/&amp;gt;&lt;br /&gt;
valeur 0x05 (5) : le robot affecte à ses moteurs les valeurs trouvées dans les boites aux lettres n°5 et n°6.&lt;br /&gt;
&lt;br /&gt;
Les valeurs de retour du MindStorm vers la FoxBoard, messages reçu dans la boite aux lettre n°4, sont comme suit :&amp;lt;br/&amp;gt;&lt;br /&gt;
en mode télécommande; 0 si la commande a bien été exécutée, -1 si la commande n'est pas reconnue et enfin -2 si le robot est stoppé à cause d'un obstacle ;&amp;lt;br/&amp;gt;&lt;br /&gt;
en mode récupération d'informations; la valeur de la boussole en degrés, le numéro du tag RFID sur la carte ou encore le code couleur de la ligne suivie (0 pour bleue, 1 pour rouge, -1 si le robot n'est pas entrain de suivre une ligne). ''(Tiré de la page Wiki du groupe)''&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
&lt;br /&gt;
Nous avons donc réussi à mener cet ensemble de Lego inanimés à l'état de machine intelligente, qui réussit d'elle-même à éviter les obstacles et se déplacer de manière programmée dans son environnement sans soucis, en réfléchissant à la meilleure solution qui s'offre à elle. &amp;lt;br/&amp;gt;&lt;br /&gt;
Nous sommes ensuite parvenus à intégrer de multiples fonctionnalités développées par les autres groupes au robot, comme le suivi de ligne, ou encore le contrôle à distance, qui renforcent les possibilités offertes par le robot.&lt;br /&gt;
&lt;br /&gt;
Ce projet nous a aussi fourni des connaissances, notamment dans le langage de programmation utilisé (NXC) que nous avons appris en auto-formation, ainsi que dans la manière de faire communiquer des systèmes électroniques entre eux. (Bluetooth, Wifi, Foxboard...)&lt;br /&gt;
&lt;br /&gt;
De plus, nous pensons avoir obtenu un bel aperçu de la spécialité IMA de notre école, ainsi que des possibilités offertes par le matériel. Nous avons apprécié de pouvoir travailler sur notre projet en autonomie, et d'avoir su bien gérer notre temps, tout en pouvant bénéficier de l'aide et des conseils du corps enseignant dès que nous en avions besoin. Nous remercions donc vivement nos 2 professeurs, messieurs Alexandre Boé et Xavier Redon.&lt;br /&gt;
&lt;br /&gt;
En conclusion, nous pouvons dire que ce bureau d'études fut une réussite pour nous, tant sur le plan des objectifs atteints que des connaissances que nous avons acquises. Cela nous donne une bonne entrevue des projets que nous aurons à mener en cycle ingénieur, ainsi que dans notre vie professionnelle.&amp;lt;br/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jbailet</name></author>	</entry>

	<entry>
		<id>https://peip-ima.plil.fr/mediawiki/index.php?title=Instrument2012-1&amp;diff=2010</id>
		<title>Instrument2012-1</title>
		<link rel="alternate" type="text/html" href="https://peip-ima.plil.fr/mediawiki/index.php?title=Instrument2012-1&amp;diff=2010"/>
				<updated>2013-05-18T20:05:48Z</updated>
		
		<summary type="html">&lt;p&gt;Jbailet : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;''Version 5.18.1, mise à jour le 18/05/2013 à 22:05''&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
L'objectif du Bureau d'études IMA est de nous faire découvrir la spécialité &lt;br /&gt;
par le biais d'un projet à réaliser, et ainsi appréhender des méthodes de &lt;br /&gt;
travail pour s'initier au côté technique et pratique du département.&lt;br /&gt;
&lt;br /&gt;
Nous nous sommes vu confier le kit Robot Mindstorm,&lt;br /&gt;
et égalemment d'autres matériels électroniques comme une carte Foxboard ou&lt;br /&gt;
un clé Bluetooth.&lt;br /&gt;
&lt;br /&gt;
Notre projet consistera dans un premier temps à concevoir un robot autonome&lt;br /&gt;
naviguant aux instruments, puis dans une deuxième partie&lt;br /&gt;
à intégrer les fonctionnalités des autres groupes dans le but d'une &lt;br /&gt;
démonstration finale.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;include nopre noesc src=&amp;quot;/home/pedago/ppeip/include/video-RobotInstruments-2012-iframe.html&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== LE ROBOT EN AUTONOMIE ==&lt;br /&gt;
&lt;br /&gt;
=== '''Enjeux et objectifs''' ===&lt;br /&gt;
&lt;br /&gt;
Nous devons doter notre robot d'une boussole ou d'un gyroscope pour lui permettre de connaitre précisément sa direction de déplacement. Distinguons le gyroscope, qui renvoie la valeur de vitesse angulaire, et la boussole qui renvoie un cap.&lt;br /&gt;
&lt;br /&gt;
* Nous commencerons par faire en sorte que notre robot sache avancer en ligne droite, pour cela nous utiliserons le contrôle PID. Nous allons pour cela effectuer des corrections sur la trajectoire en utilisant des rotations. L'angle de ces rotations va être calculé en fonction de l'erreur de trajectoire indiqué par l'instrument. Plus exactement par la somme d'une constante multipliée par l'erreur instantanée, d'une autre constante multipliée par l'intégrale de l'erreur et enfin d'une dernière constante multipliée par la dérivée de l'erreur. Il nous faut pour cela trouver les valeurs adaptées des trois constantes.&lt;br /&gt;
&lt;br /&gt;
* Nous ferons ensuite en sorte que notre robot sache contourner les obstacles au plus juste. Au plus juste signifiant qu'il tournera vers la droite ou vers la gauche en jugeant où se trouve le chemin le plus libre. L'algorithme à appliquer consiste à tourner le robot d'un angle faible dans un sens puis dans l'autre et de lire les résultats du sonar. Si les deux mesures indiquent un obstacle trop proche, l'angle est augmenté et le procédé répété. Dès qu'une trajectoire indique un chemin libre ou du moins un obstacle à distance suffisante, le robot avance en ligne droite suivant cette trajectoire. L'instrument doit être utilisé ici pour vérifier que le robot effectue précisément des rotations des angles souhaités et qu'il sache revenir en position initiale pour éventuellement recommencer avec un angle plus grand.&lt;br /&gt;
&lt;br /&gt;
* Pour permettre de suivre le comportement du robot, nous afficherons sur la brique de contrôle MindStorm l'angle de rotation pour le dernier contournement et la distance parcourue le long de la dernière ligne droite.&lt;br /&gt;
&lt;br /&gt;
Nous intégrerons ces comportements pour obtenir un robot capable de contourner les obstacles avec un minimum d'intelligence.&lt;br /&gt;
&lt;br /&gt;
Voici un exemple de contournement d'obstacle avec l'algorithme décrit.&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Parcours-boussole.png|Contournement d'obstacle&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== '''Problèmes rencontrés et solutions apportées''' ===&lt;br /&gt;
&lt;br /&gt;
Nous avons rencontré plusieurs problèmes tout au long de notre projet. Nous nous sommes efforcés soit de les résoudre, soit de les contourner en utilisant d'autres moyens pour arriver à nos fins, notamment sur l'aspect le plus ardu : la programmation.&lt;br /&gt;
&lt;br /&gt;
* '''Problème #1 :''' Absence d'espace libre sur le robot dans le montage initial pour insérer la foxboard.&lt;br /&gt;
** Solution apportée : Création d'un espace de stockage à l'arrière du robot.&lt;br /&gt;
&lt;br /&gt;
* '''Problème #2 :''' Le logiciel de programmation par blocs, bien qu'intuitif, ne nous permet pas d'arriver au degré de complexité auquel nous voudrions mener le robot.&lt;br /&gt;
** Solution apportée : Passage à la programmation par lignes de code en langage NXC.&lt;br /&gt;
&lt;br /&gt;
* '''Problème #3 :''' La difficulté d'intégration du gyroscope et ses valeurs variant trop rapidement le rendent trop compliqué à utiliser.&lt;br /&gt;
** Solution apportée : Malgré le passage en &amp;quot;lowspeed&amp;quot; du capteur, il demeure compliqué, pour le moment. Nous préférerons d'abord travailler avec le compas, pour travailler avec les angles, plutôt que les vitesses de rotations.&lt;br /&gt;
&lt;br /&gt;
* '''Problème #4 :''' Le robot semble avoir du mal à gérer le calcul des angles ET la rotation de ses moteurs.&lt;br /&gt;
** Solution apportée : Allègement du programme. Le robot semble désormais mieux se comporter et fait ce qu'on lui demande sans négliger de commandes.&lt;br /&gt;
&lt;br /&gt;
* '''Problème #5 :''' Le robot part toujours à droite quelle que soit la déviation.&lt;br /&gt;
** Solution apportée : Réécriture du programme afin de distinguer plusieurs cas. Le robot corrige désormais efficacement dans la majorité des cas. &lt;br /&gt;
&lt;br /&gt;
* '''Problème #6 :''' Le robot corrige dans le sens contraire lorsqu'il est autour du cap nord à cause de notre méthode de détection. &lt;br /&gt;
** Solution apportée : L'algorithme actuel est à travailler avec des modulos.&lt;br /&gt;
&lt;br /&gt;
=== '''Algorithmes de programmation utilisés''' ===&lt;br /&gt;
&lt;br /&gt;
==== Variables utilisées ====&lt;br /&gt;
&lt;br /&gt;
On définit dans le programmes plusieurs variables à valeurs entières. Les voici :&lt;br /&gt;
&lt;br /&gt;
* ''' int chdg;''' &amp;gt;&amp;gt;&amp;gt; ''chdg pour &amp;quot;Current Heading&amp;quot;, c'est le cap instantané du robot (en degrés).''&lt;br /&gt;
* ''' int shdg;''' &amp;gt;&amp;gt;&amp;gt; ''shdg pour &amp;quot;Start Heading&amp;quot;, c'est le cap de  référence au début de la trajectoire.''&lt;br /&gt;
* ''' int var;'''  &amp;gt;&amp;gt;&amp;gt; ''C'est la variable &amp;quot;départ moins actuel&amp;quot; (shdg-chdg) utilisé pour l'algorithme décrit plus bas.''&lt;br /&gt;
* ''' int gauche;''' &amp;gt;&amp;gt;&amp;gt; ''C'est la distance vers l'obstacle le plus proche enregistré lorsque le robot tourne la tête à droite.''   &lt;br /&gt;
* ''' int droite;''' &amp;gt;&amp;gt;&amp;gt; ''C'est la distance vers l'obstacle le plus proche enregistré lorsque le robot tourne la tête à gauche.''&lt;br /&gt;
&lt;br /&gt;
On définit, de même, des constantes :&lt;br /&gt;
&lt;br /&gt;
* ''' #define NEAR 30 ''' &amp;gt;&amp;gt;&amp;gt; ''C'est la distance (en cm) à laquelle le radar de proximité ordonne au robot d'arrêter d'avancer.''&lt;br /&gt;
* ''' #define ERREUR 15 ''' &amp;gt;&amp;gt;&amp;gt; ''C'est la marge d'erreur (en degrés) dans laquelle le robot considère que les variations de cap sont négligeables.''&lt;br /&gt;
* ''' #define P 40 &lt;br /&gt;
* ''' #define I 40 ''' &amp;gt;&amp;gt;&amp;gt; ''Ce sont les variables utilisées lors du contrôle PID.''&lt;br /&gt;
* ''' #define D 90&lt;br /&gt;
&lt;br /&gt;
==== Les algorithmes ====&lt;br /&gt;
&lt;br /&gt;
*SetSensorLowspeed(IN_3); &amp;gt;&amp;gt;&amp;gt; Initialisation du radar : le capteur est lancé.&lt;br /&gt;
*SetSensorLowspeed(IN_4); &amp;gt;&amp;gt;&amp;gt; Initialisation de la boussole : le capteur est lancé.&lt;br /&gt;
*chdg = SensorHTCompass(IN_4); &amp;gt;&amp;gt;&amp;gt; shdg prend la valeur du cap et est fixée pour le moment.&lt;br /&gt;
*shdg = SensorHTCompass(IN_4); &amp;gt;&amp;gt;&amp;gt; chdg prend la valeur du cap courant.&lt;br /&gt;
*var =(shdg - chdg); &amp;gt;&amp;gt;&amp;gt; Cela est relativement transparent.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Si le robot est à une distance supérieure à NEAR alors&lt;br /&gt;
*Tant que le robot est à une distance supérieure à NEAR&lt;br /&gt;
**Le robot avance&lt;br /&gt;
**On actualise chdg&lt;br /&gt;
**Si le robot dévie passé une certaine marge d'erreur alors&lt;br /&gt;
***Tant que shdg est différent de chdg&lt;br /&gt;
****On stoppe le robot&lt;br /&gt;
*****Si var est inférieur à 0 alors &lt;br /&gt;
*****On a dévié à gauche, on corrige à droite&lt;br /&gt;
*****On réactualise chdg&lt;br /&gt;
*****On réactualise var&lt;br /&gt;
****Sinon&lt;br /&gt;
*****On a dévié à droite, on corrige à gauche&lt;br /&gt;
*****On réactualise chdg&lt;br /&gt;
*****On réactualise var&lt;br /&gt;
****On réactualise chdg&lt;br /&gt;
***Fin tant que&lt;br /&gt;
**Fin si&lt;br /&gt;
*Fin tant que&lt;br /&gt;
Sinon&lt;br /&gt;
*Tant que le robot est à moins de NEAR d'un obstacle&lt;br /&gt;
**On arrête le robot&lt;br /&gt;
**Rotation du capteur de distance de 60° sur la gauche&lt;br /&gt;
**Enregistrement de la distance avant un obstacle dans ''gauche''&lt;br /&gt;
**Rotation du capteur de distance de 120° à droite&lt;br /&gt;
**Enregistrement de la distance avant un obstacle dans ''droite''&lt;br /&gt;
**Rotation du capteur de 60° à gauche pour retour au centre&lt;br /&gt;
**Si gauche est inférieur ou égal à droite alors&lt;br /&gt;
***Le robot fait une rotation pendant 2 secondes sur la droite&lt;br /&gt;
**Sinon&lt;br /&gt;
***Le robot fait une rotation pendant 2 secondes sur la gauche&lt;br /&gt;
**Fin si&lt;br /&gt;
*On reset shdg au cap courant&lt;br /&gt;
*Fin tant que&lt;br /&gt;
Fin si &amp;lt;br/&amp;gt;&lt;br /&gt;
On arrête le robot&lt;br /&gt;
&lt;br /&gt;
==== Le contrôle PID ====&lt;br /&gt;
&lt;br /&gt;
Nous avons utilisé le contrôle PID dans la rotation du capteur à ultrasons, vulgairement appelé &amp;quot;tête&amp;quot; de notre robot. Celui-ci s'est avéré beaucoup plus simple dans l'action que nous souhaitions réaliser sur la rotation de la tête. Voici comment il a été implémenté.&lt;br /&gt;
Nous avons introduit la syntaxe ''RotateMotorPID(OUT_B, 30, 60, P, I, D);'' où &lt;br /&gt;
*'''OUT_B''' représente la sortie B&lt;br /&gt;
*'''30''' est la puissance de la rotation&lt;br /&gt;
*'''60''' est l'angle de la rotation &lt;br /&gt;
*'''P''', '''I''' et '''D''' sont des constantes définies au début du programme. Il n'est pas utile ici de détailler les fonctions de t permettant le calcul de P, I et D, mais il est en revanche utile de détailler l'utilité de ces trois variables :&lt;br /&gt;
**'''P(t)''' rend le contrôleur plus rapide dans le temps mais il n'assure pas qu'il n'y ai aucune erreur d'équilibrage.&lt;br /&gt;
**'''I(t)''' donne de la &amp;quot;mémoire&amp;quot; au contrôleur, dans un sens il accumules les traces d'erreurs et les compense, avec un zéro erreur de moyenne garantie.&lt;br /&gt;
**'''D(t)''' donnes les &amp;quot;prédiction futures&amp;quot; au contrôleur ( comme la dérivée en maths ), ce qui accélère la réponse.&lt;br /&gt;
&lt;br /&gt;
Le contrôle PID permet donc une précision sans erreur et donc de tourner la tête exactement où il faut en assurant son retour exact à la position de départ, permettant toujours à la &amp;quot;tête&amp;quot; de regarder pile devant le robot sans décalage au fil de ses rotations.&lt;br /&gt;
&lt;br /&gt;
=== '''Avancées du projet''' ===&lt;br /&gt;
&lt;br /&gt;
==== '''Synthèse des fonctionnalités''' ====&lt;br /&gt;
&lt;br /&gt;
* Le robot avance en ligne droite : '''OK'''&lt;br /&gt;
* Le robot corrige sa trajectoire si on l'en dévie : '''OK'''&lt;br /&gt;
* Rotation du capteur ultrason, appelé &amp;quot;tête&amp;quot; et enregistrement des valeurs retournées : '''OK'''&lt;br /&gt;
* Le robot se dirige vers le chemin le plus dégagé : '''OK'''&lt;br /&gt;
* Le robot corrige toujours vers le bon endroit, par exemple si il dévie vers la gauche il corrige à droite : '''PARTIEL, A AMELIORER'''&lt;br /&gt;
* Le robot avance en suivant une ligne de couleur : '''OK'''&lt;br /&gt;
&lt;br /&gt;
==== '''Avancées''' ====&lt;br /&gt;
&lt;br /&gt;
[[File:1.Montage.jpg|200px|thumb|right|baseline|Le montage du robot est presque terminé]]&lt;br /&gt;
&lt;br /&gt;
* Création de la page wiki du projet.&lt;br /&gt;
&lt;br /&gt;
* Montage du robot.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Versionfinale.JPG|200px|thumb|right|baseline|Le montage du robot est presque terminé]]&lt;br /&gt;
&lt;br /&gt;
* Fin du montage du robot.&lt;br /&gt;
&lt;br /&gt;
* Câblage.&lt;br /&gt;
&lt;br /&gt;
* Découverte et utilisation du logiciel de programmation par blocs (Lego Mindstorms NXT).&lt;br /&gt;
&lt;br /&gt;
* Découverte du logiciel de programmation par ligne de code en NXC (Bricx).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Test de plusieurs lignes de codes NXC sur le logiciel (Bricx)&lt;br /&gt;
** Ligne droite&lt;br /&gt;
** Rotation sur lui-même&lt;br /&gt;
** Détection d'obstacle : réponse en tournant vers la gauche pour éviter&lt;br /&gt;
** Rotation de la &amp;quot;tête&amp;quot; (capteur US) sur 120° et adaptation (changement de hauteur du capteur pour éviter la collision avec les puces ultérieurement... &lt;br /&gt;
&lt;br /&gt;
* Implémentation du contrôle PID (Rotation de la tête).&lt;br /&gt;
&lt;br /&gt;
* Réalisation d'un programme permettant au robot de capter les obstacles dans un champ de 120 degré par la rotation de la tête, et contournement de ces derniers.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Avancées majeures de la page du projet&lt;br /&gt;
* Création d'un tâche ''sensor'' qui affiche le cap sur l'écran&lt;br /&gt;
* La tâche ''sensor'' assure aussi une rotation de la tête du robot pour intégrer, au futur, la possibilité de choisir le chemin le plus dégagé.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Implémentation quasi-complète de la rotation de la tête : le robot enregistre désormais dans une variable ''gauche'' et ''droite'' la distance mesurée par ultrasons en tournant la tête vers ledit côté. &lt;br /&gt;
* Le robot choisit alors la plus grande distance dégagée entre la gauche et la droite, tourne, et emprunte ce chemin.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== LE ROBOT MULTIFONCTIONS ==&lt;br /&gt;
&lt;br /&gt;
=== L'intégration du matériel sur le robot ===&lt;br /&gt;
&lt;br /&gt;
La montée des différents composants sur le robot n'a pas toujours été toute simple et nous avons parfois été confronté à des problèmes de montage.&amp;lt;br/&amp;gt;&lt;br /&gt;
La FoxBoard a tout d'abord été montée dans un compartiment spécifique à l'arrière du robot, lui donnant son design particulièrement unique en son genre et... loufoque ! &amp;lt;br/&amp;gt;&lt;br /&gt;
La WebCam, après avoir suscité pas mal d'interrogation quant à son placement, a été montée sur le dessus du boitier Mindstorms, lui assurant une vision globale de l'environnement devant le robot. &amp;lt;br/&amp;gt;&lt;br /&gt;
L'adaptateur USB ainsi que la clé WiFi et l'adaptateur bluetooth ont été ajoutés dans le compartiment de la FoxBoard. &amp;lt;br/&amp;gt;&lt;br /&gt;
Le capteur RFID, accompagné de son capteur de couleur ont été implémentés sous la tête du robot à l'avant du robot, dirigées vers le bas pour suivre les lignes au sol et capter les tags RFID des cartes collées au sol.&lt;br /&gt;
&lt;br /&gt;
[[File:finalmonte.jpg|200px|thumb|center|baseline|Le robot après l'intégration de toutes ses fonctionnalités.]]&lt;br /&gt;
&lt;br /&gt;
=== Le suiveur de ligne ===&lt;br /&gt;
&lt;br /&gt;
Nous avons tout d'abord cherché à intégrer le suiveur de ligne à notre robot. Pour cela, nous avons obtenu le code du groupe de Déborah Saunders &amp;amp; Jean Wasilewski. Cela permet au robot, en plus de ses fonctionnalités de base, de se diriger selon une ligne de couleur (normalisée verte pour tout le monde).&amp;lt;br/&amp;gt;&lt;br /&gt;
L'implémentation a été délicate car il faut placer la sonde à l'avant du robot, vers le bas, près du sol. Hors c'est là qu'était fixée la tête du robot. L'astuce a donc été de placer la tête au dessus du moteur plutôt qu'en dessous, la surelevant et laissant ainsi l'espace libre pour le capteur de couleur, sous le robot.&lt;br /&gt;
&amp;lt;br/&amp;gt;Le robot suit donc une ligne de couleur verte, essayant de retrouver la ligne de couleur lorsque qu'il dévie ou qu'il arrive dans un virage. Pour se faire, il va tourner à gauche et à droite dans des rotations d'angles de plus en plus ouvert pour retrouver la ligne.&lt;br /&gt;
&lt;br /&gt;
=== Webcam et bluetooth ===&lt;br /&gt;
&lt;br /&gt;
Il fut décidé d'intégrer au robot une webcam, afin d'utiliser avec profit ses capacités de contrôle à distance (Voir plus bas). L'utilisateur peut ainsi contrôler son robot et l'envoyer en éclaireur dans une pièce voir ce qu'il se passe par exemple. Le principe est de communiquer les commandes à la foxboard par WiFi, puis de les transmettre au boitier Mindstorm via une clé bluetooth connectée par USB à la foxboard. Les commandes sont détaillées dans le paragraphe suivant.&lt;br /&gt;
&lt;br /&gt;
=== Le contrôle à distance ===&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite intégré le programme de Kévin De Arriba et Alexandre Jouy, qui permet de contrôler le robot à distance. Le robot peut alors être contrôlé et répondre aux commandes via une interface web, en se connectant directement via Wi-Fi. Le principe, pour basculer en mode télécommande est de lui envoyer un octet dans la boite aux lettres n°3 dont les 4 bits de poids forts sont à zéro. Voici la signification de ces octets : &amp;lt;br/&amp;gt;&lt;br /&gt;
valeur 0x00 (0) : arrêt du robot ;&amp;lt;br/&amp;gt;&lt;br /&gt;
valeur 0x01 (1) : le robot avance ;&amp;lt;br/&amp;gt;&lt;br /&gt;
valeur 0x02 (2) : le robot recule ;&amp;lt;br/&amp;gt;&lt;br /&gt;
valeur 0x03 (3) : le robot tourne à gauche ;&amp;lt;br/&amp;gt;&lt;br /&gt;
valeur 0x04 (4) : le robot tourne à droite ;&amp;lt;br/&amp;gt;&lt;br /&gt;
valeur 0x05 (5) : le robot affecte à ses moteurs les valeurs trouvées dans les boites aux lettres n°5 et n°6.&lt;br /&gt;
&lt;br /&gt;
Les valeurs de retour du MindStorm vers la FoxBoard, messages reçu dans la boite aux lettre n°4, sont comme suit :&amp;lt;br/&amp;gt;&lt;br /&gt;
en mode télécommande; 0 si la commande a bien été exécutée, -1 si la commande n'est pas reconnue et enfin -2 si le robot est stoppé à cause d'un obstacle ;&amp;lt;br/&amp;gt;&lt;br /&gt;
en mode récupération d'informations; la valeur de la boussole en degrés, le numéro du tag RFID sur la carte ou encore le code couleur de la ligne suivie (0 pour bleue, 1 pour rouge, -1 si le robot n'est pas entrain de suivre une ligne). ''(Tiré de la page Wiki du groupe)''&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
&lt;br /&gt;
Nous avons donc réussi à mener cet ensemble de Lego inanimés à l'état de machine intelligente, qui réussit d'elle-même à éviter les obstacles et se déplacer de manière programmée dans son environnement sans soucis, en réfléchissant à la meilleure solution qui s'offre à elle. &amp;lt;br/&amp;gt;&lt;br /&gt;
Nous sommes ensuite parvenus à intégrer de multiples fonctionnalités développées par les autres groupes au robot, comme le suivi de ligne, ou encore le contrôle à distance, qui renforcent les possibilités offertes par le robot.&lt;br /&gt;
&lt;br /&gt;
Ce projet nous a aussi fourni des connaissances, notamment dans le langage de programmation utilisé (NXC) que nous avons appris en auto-formation, ainsi que dans la manière de faire communiquer des systèmes électroniques entre eux. (Bluetooth, Wifi, Foxboard...)&lt;br /&gt;
&lt;br /&gt;
De plus, nous pensons avoir obtenu un bel aperçu de la spécialité IMA de notre école, ainsi que des possibilités offertes par le matériel. Nous avons apprécié de pouvoir travailler sur notre projet en autonomie, et d'avoir su bien gérer notre temps, tout en pouvant bénéficier de l'aide et des conseils du corps enseignant dès que nous en avions besoin. Nous remercions donc vivement nos 2 professeurs, messieurs Alexandre Boé et Xavier Redon.&lt;br /&gt;
&lt;br /&gt;
En conclusion, nous pouvons dire que ce bureau d'études fut une réussite pour nous, tant sur le plan des objectifs atteints que des connaissances que nous avons acquises. Cela nous donne une bonne entrevue des projets que nous aurons à mener en cycle ingénieur, ainsi que dans notre vie professionnelle.&amp;lt;br/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jbailet</name></author>	</entry>

	<entry>
		<id>https://peip-ima.plil.fr/mediawiki/index.php?title=Instrument2012-1&amp;diff=2009</id>
		<title>Instrument2012-1</title>
		<link rel="alternate" type="text/html" href="https://peip-ima.plil.fr/mediawiki/index.php?title=Instrument2012-1&amp;diff=2009"/>
				<updated>2013-05-18T20:02:03Z</updated>
		
		<summary type="html">&lt;p&gt;Jbailet : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;''Version 5.18.1, mise à jour le 18/05/2013 à 22:01''&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
L'objectif du Bureau d'études IMA est de nous faire découvrir la spécialité &lt;br /&gt;
par le biais d'un projet à réaliser, et ainsi appréhender des méthodes de &lt;br /&gt;
travail pour s'initier au côté technique et pratique du département.&lt;br /&gt;
&lt;br /&gt;
Nous nous sommes vu confier le kit Robot Mindstorm,&lt;br /&gt;
et égalemment d'autres matériels électroniques comme une carte Foxboard ou&lt;br /&gt;
un clé Bluetooth.&lt;br /&gt;
&lt;br /&gt;
Notre projet consistera dans un premier temps à concevoir un robot autonome&lt;br /&gt;
naviguant aux instruments, puis dans une deuxième partie&lt;br /&gt;
à intégrer les fonctionnalités des autres groupes dans le but d'une &lt;br /&gt;
démonstration finale.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;include nopre noesc src=&amp;quot;/home/pedago/ppeip/include/video-RobotInstruments-2012-iframe.html&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== LE ROBOT EN AUTONOMIE ==&lt;br /&gt;
&lt;br /&gt;
=== '''Enjeux et objectifs''' ===&lt;br /&gt;
&lt;br /&gt;
Nous devons doter notre robot d'une boussole ou d'un gyroscope pour lui permettre de connaitre précisément sa direction de déplacement. Distinguons le gyroscope, qui renvoie la valeur de vitesse angulaire, et la boussole qui renvoie un cap.&lt;br /&gt;
&lt;br /&gt;
* Nous commencerons par faire en sorte que notre robot sache avancer en ligne droite, pour cela nous utiliserons le contrôle PID. Nous allons pour cela effectuer des corrections sur la trajectoire en utilisant des rotations. L'angle de ces rotations va être calculé en fonction de l'erreur de trajectoire indiqué par l'instrument. Plus exactement par la somme d'une constante multipliée par l'erreur instantanée, d'une autre constante multipliée par l'intégrale de l'erreur et enfin d'une dernière constante multipliée par la dérivée de l'erreur. Il nous faut pour cela trouver les valeurs adaptées des trois constantes.&lt;br /&gt;
&lt;br /&gt;
* Nous ferons ensuite en sorte que notre robot sache contourner les obstacles au plus juste. Au plus juste signifiant qu'il tournera vers la droite ou vers la gauche en jugeant où se trouve le chemin le plus libre. L'algorithme à appliquer consiste à tourner le robot d'un angle faible dans un sens puis dans l'autre et de lire les résultats du sonar. Si les deux mesures indiquent un obstacle trop proche, l'angle est augmenté et le procédé répété. Dès qu'une trajectoire indique un chemin libre ou du moins un obstacle à distance suffisante, le robot avance en ligne droite suivant cette trajectoire. L'instrument doit être utilisé ici pour vérifier que le robot effectue précisément des rotations des angles souhaités et qu'il sache revenir en position initiale pour éventuellement recommencer avec un angle plus grand.&lt;br /&gt;
&lt;br /&gt;
* Pour permettre de suivre le comportement du robot, nous afficherons sur la brique de contrôle MindStorm l'angle de rotation pour le dernier contournement et la distance parcourue le long de la dernière ligne droite.&lt;br /&gt;
&lt;br /&gt;
Nous intégrerons ces comportements pour obtenir un robot capable de contourner les obstacles avec un minimum d'intelligence.&lt;br /&gt;
&lt;br /&gt;
Voici un exemple de contournement d'obstacle avec l'algorithme décrit.&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Parcours-boussole.png|Contournement d'obstacle&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== '''Problèmes rencontrés et solutions apportées''' ===&lt;br /&gt;
&lt;br /&gt;
Nous avons rencontré plusieurs problèmes tout au long de notre projet. Nous nous sommes efforcés soit de les résoudre, soit de les contourner en utilisant d'autres moyens pour arriver à nos fins, notamment sur l'aspect le plus ardu : la programmation.&lt;br /&gt;
&lt;br /&gt;
* '''Problème #1 :''' Absence d'espace libre sur le robot dans le montage initial pour insérer la foxboard.&lt;br /&gt;
** Solution apportée : Création d'un espace de stockage à l'arrière du robot.&lt;br /&gt;
&lt;br /&gt;
* '''Problème #2 :''' Le logiciel de programmation par blocs, bien qu'intuitif, ne nous permet pas d'arriver au degré de complexité auquel nous voudrions mener le robot.&lt;br /&gt;
** Solution apportée : Passage à la programmation par lignes de code en langage NXC.&lt;br /&gt;
&lt;br /&gt;
* '''Problème #3 :''' La difficulté d'intégration du gyroscope et ses valeurs variant trop rapidement le rendent trop compliqué à utiliser.&lt;br /&gt;
** Solution apportée : Malgré le passage en &amp;quot;lowspeed&amp;quot; du capteur, il demeure compliqué, pour le moment. Nous préférerons d'abord travailler avec le compas, pour travailler avec les angles, plutôt que les vitesses de rotations.&lt;br /&gt;
&lt;br /&gt;
* '''Problème #4 :''' Le robot semble avoir du mal à gérer le calcul des angles ET la rotation de ses moteurs.&lt;br /&gt;
** Solution apportée : Allègement du programme. Le robot semble désormais mieux se comporter et fait ce qu'on lui demande sans négliger de commandes.&lt;br /&gt;
&lt;br /&gt;
* '''Problème #5 :''' Le robot part toujours à droite quelle que soit la déviation.&lt;br /&gt;
** Solution apportée : Réécriture du programme afin de distinguer plusieurs cas. Le robot corrige désormais efficacement dans la majorité des cas. &lt;br /&gt;
&lt;br /&gt;
* '''Problème #6 :''' Le robot corrige dans le sens contraire lorsqu'il est autour du cap nord à cause de notre méthode de détection. &lt;br /&gt;
** Solution apportée : L'algorithme actuel est à travailler avec des modulos.&lt;br /&gt;
&lt;br /&gt;
=== '''Algorithmes de programmation utilisés''' ===&lt;br /&gt;
&lt;br /&gt;
==== Variables utilisées ====&lt;br /&gt;
&lt;br /&gt;
On définit dans le programmes plusieurs variables à valeurs entières. Les voici :&lt;br /&gt;
&lt;br /&gt;
* ''' int chdg;''' &amp;gt;&amp;gt;&amp;gt; ''chdg pour &amp;quot;Current Heading&amp;quot;, c'est le cap instantané du robot (en degrés).''&lt;br /&gt;
* ''' int shdg;''' &amp;gt;&amp;gt;&amp;gt; ''shdg pour &amp;quot;Start Heading&amp;quot;, c'est le cap de  référence au début de la trajectoire.''&lt;br /&gt;
* ''' int var;'''  &amp;gt;&amp;gt;&amp;gt; ''C'est la variable &amp;quot;départ moins actuel&amp;quot; (shdg-chdg) utilisé pour l'algorithme décrit plus bas.''&lt;br /&gt;
* ''' int gauche;''' &amp;gt;&amp;gt;&amp;gt; ''C'est la distance vers l'obstacle le plus proche enregistré lorsque le robot tourne la tête à droite.''   &lt;br /&gt;
* ''' int droite;''' &amp;gt;&amp;gt;&amp;gt; ''C'est la distance vers l'obstacle le plus proche enregistré lorsque le robot tourne la tête à gauche.''&lt;br /&gt;
&lt;br /&gt;
On définit, de même, des constantes :&lt;br /&gt;
&lt;br /&gt;
* ''' #define NEAR 30 ''' &amp;gt;&amp;gt;&amp;gt; ''C'est la distance (en cm) à laquelle le radar de proximité ordonne au robot d'arrêter d'avancer.''&lt;br /&gt;
* ''' #define ERREUR 15 ''' &amp;gt;&amp;gt;&amp;gt; ''C'est la marge d'erreur (en degrés) dans laquelle le robot considère que les variations de cap sont négligeables.''&lt;br /&gt;
* ''' #define P 40 &lt;br /&gt;
* ''' #define I 40 ''' &amp;gt;&amp;gt;&amp;gt; ''Ce sont les variables utilisées lors du contrôle PID.''&lt;br /&gt;
* ''' #define D 90&lt;br /&gt;
&lt;br /&gt;
==== Les algorithmes ====&lt;br /&gt;
&lt;br /&gt;
*SetSensorLowspeed(IN_3); &amp;gt;&amp;gt;&amp;gt; Initialisation du radar : le capteur est lancé.&lt;br /&gt;
*SetSensorLowspeed(IN_4); &amp;gt;&amp;gt;&amp;gt; Initialisation de la boussole : le capteur est lancé.&lt;br /&gt;
*chdg = SensorHTCompass(IN_4); &amp;gt;&amp;gt;&amp;gt; shdg prend la valeur du cap et est fixée pour le moment.&lt;br /&gt;
*shdg = SensorHTCompass(IN_4); &amp;gt;&amp;gt;&amp;gt; chdg prend la valeur du cap courant.&lt;br /&gt;
*var =(shdg - chdg); &amp;gt;&amp;gt;&amp;gt; Cela est relativement transparent.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Si le robot est à une distance supérieure à NEAR alors&lt;br /&gt;
*Tant que le robot est à une distance supérieure à NEAR&lt;br /&gt;
**Le robot avance&lt;br /&gt;
**On actualise chdg&lt;br /&gt;
**Si le robot dévie passé une certaine marge d'erreur alors&lt;br /&gt;
***Tant que shdg est différent de chdg&lt;br /&gt;
****On stoppe le robot&lt;br /&gt;
*****Si var est inférieur à 0 alors &lt;br /&gt;
*****On a dévié à gauche, on corrige à droite&lt;br /&gt;
*****On réactualise chdg&lt;br /&gt;
*****On réactualise var&lt;br /&gt;
****Sinon&lt;br /&gt;
*****On a dévié à droite, on corrige à gauche&lt;br /&gt;
*****On réactualise chdg&lt;br /&gt;
*****On réactualise var&lt;br /&gt;
****On réactualise chdg&lt;br /&gt;
***Fin tant que&lt;br /&gt;
**Fin si&lt;br /&gt;
*Fin tant que&lt;br /&gt;
Sinon&lt;br /&gt;
*Tant que le robot est à moins de NEAR d'un obstacle&lt;br /&gt;
**On arrête le robot&lt;br /&gt;
**Rotation du capteur de distance de 60° sur la gauche&lt;br /&gt;
**Enregistrement de la distance avant un obstacle dans ''gauche''&lt;br /&gt;
**Rotation du capteur de distance de 120° à droite&lt;br /&gt;
**Enregistrement de la distance avant un obstacle dans ''droite''&lt;br /&gt;
**Rotation du capteur de 60° à gauche pour retour au centre&lt;br /&gt;
**Si gauche est inférieur ou égal à droite alors&lt;br /&gt;
***Le robot fait une rotation pendant 2 secondes sur la droite&lt;br /&gt;
**Sinon&lt;br /&gt;
***Le robot fait une rotation pendant 2 secondes sur la gauche&lt;br /&gt;
**Fin si&lt;br /&gt;
*On reset shdg au cap courant&lt;br /&gt;
*Fin tant que&lt;br /&gt;
Fin si &amp;lt;br/&amp;gt;&lt;br /&gt;
On arrête le robot&lt;br /&gt;
&lt;br /&gt;
==== Le contrôle PID ====&lt;br /&gt;
&lt;br /&gt;
Nous avons utilisé le contrôle PID dans la rotation du capteur à ultrasons, vulgairement appelé &amp;quot;tête&amp;quot; de notre robot. Celui-ci s'est avéré beaucoup plus simple dans l'action que nous souhaitions réaliser sur la rotation de la tête. Voici comment il a été implémenté.&lt;br /&gt;
Nous avons introduit la syntaxe ''RotateMotorPID(OUT_B, 30, 60, P, I, D);'' où &lt;br /&gt;
*'''OUT_B''' représente la sortie B&lt;br /&gt;
*'''30''' est la puissance de la rotation&lt;br /&gt;
*'''60''' est l'angle de la rotation &lt;br /&gt;
*'''P''', '''I''' et '''D''' sont des constantes définies au début du programme. Il n'est pas utile ici de détailler les fonctions de t permettant le calcul de P, I et D, mais il est en revanche utile de détailler l'utilité de ces trois variables :&lt;br /&gt;
**'''P(t)''' rend le contrôleur plus rapide dans le temps mais il n'assure pas qu'il n'y ai aucune erreur d'équilibrage.&lt;br /&gt;
**'''I(t)''' donne de la &amp;quot;mémoire&amp;quot; au contrôleur, dans un sens il accumules les traces d'erreurs et les compense, avec un zéro erreur de moyenne garantie.&lt;br /&gt;
**'''D(t)''' donnes les &amp;quot;prédiction futures&amp;quot; au contrôleur ( comme la dérivée en maths ), ce qui accélère la réponse.&lt;br /&gt;
&lt;br /&gt;
Le contrôle PID permet donc une précision sans erreur et donc de tourner la tête exactement où il faut en assurant son retour exact à la position de départ, permettant toujours à la &amp;quot;tête&amp;quot; de regarder pile devant le robot sans décalage au fil de ses rotations.&lt;br /&gt;
&lt;br /&gt;
=== '''Avancées du projet''' ===&lt;br /&gt;
&lt;br /&gt;
==== '''Synthèse des fonctionnalités''' ====&lt;br /&gt;
&lt;br /&gt;
* Le robot avance en ligne droite : '''OK'''&lt;br /&gt;
* Le robot corrige sa trajectoire si on l'en dévie : '''OK'''&lt;br /&gt;
* Rotation du capteur ultrason, appelé &amp;quot;tête&amp;quot; et enregistrement des valeurs retournées : '''OK'''&lt;br /&gt;
* Le robot se dirige vers le chemin le plus dégagé : '''OK'''&lt;br /&gt;
* Le robot corrige toujours vers le bon endroit, par exemple si il dévie vers la gauche il corrige à droite : '''PARTIEL, A AMELIORER'''&lt;br /&gt;
* Le robot avance en suivant une ligne de couleur : '''OK'''&lt;br /&gt;
&lt;br /&gt;
==== '''Avancées''' ====&lt;br /&gt;
&lt;br /&gt;
[[File:1.Montage.jpg|200px|thumb|right|baseline|Le montage du robot est presque terminé]]&lt;br /&gt;
&lt;br /&gt;
* Création de la page wiki du projet.&lt;br /&gt;
&lt;br /&gt;
* Montage du robot.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Versionfinale.JPG|200px|thumb|right|baseline|Le montage du robot est presque terminé]]&lt;br /&gt;
&lt;br /&gt;
* Fin du montage du robot.&lt;br /&gt;
&lt;br /&gt;
* Câblage.&lt;br /&gt;
&lt;br /&gt;
* Découverte et utilisation du logiciel de programmation par blocs (Lego Mindstorms NXT).&lt;br /&gt;
&lt;br /&gt;
* Découverte du logiciel de programmation par ligne de code en NXC (Bricx).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Test de plusieurs lignes de codes NXC sur le logiciel (Bricx)&lt;br /&gt;
** Ligne droite&lt;br /&gt;
** Rotation sur lui-même&lt;br /&gt;
** Détection d'obstacle : réponse en tournant vers la gauche pour éviter&lt;br /&gt;
** Rotation de la &amp;quot;tête&amp;quot; (capteur US) sur 120° et adaptation (changement de hauteur du capteur pour éviter la collision avec les puces ultérieurement... &lt;br /&gt;
&lt;br /&gt;
* Implémentation du contrôle PID (Rotation de la tête).&lt;br /&gt;
&lt;br /&gt;
* Réalisation d'un programme permettant au robot de capter les obstacles dans un champ de 120 degré par la rotation de la tête, et contournement de ces derniers.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Avancées majeures de la page du projet&lt;br /&gt;
* Création d'un tâche ''sensor'' qui affiche le cap sur l'écran&lt;br /&gt;
* La tâche ''sensor'' assure aussi une rotation de la tête du robot pour intégrer, au futur, la possibilité de choisir le chemin le plus dégagé.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Implémentation quasi-complète de la rotation de la tête : le robot enregistre désormais dans une variable ''gauche'' et ''droite'' la distance mesurée par ultrasons en tournant la tête vers ledit côté. &lt;br /&gt;
* Le robot choisit alors la plus grande distance dégagée entre la gauche et la droite, tourne, et emprunte ce chemin.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== LE ROBOT MULTIFONCTIONS ==&lt;br /&gt;
&lt;br /&gt;
=== L'intégration du matériel sur le robot ===&lt;br /&gt;
&lt;br /&gt;
La montée des différents composants sur le robot n'a pas toujours été toute simple et nous avons parfois été confronté à des problèmes de montage.&amp;lt;br/&amp;gt;&lt;br /&gt;
La FoxBoard a tout d'abord été montée dans un compartiment spécifique à l'arrière du robot, lui donnant son design particulièrement unique en son genre et... loufoque ! &amp;lt;br/&amp;gt;&lt;br /&gt;
La WebCam, après avoir suscité pas mal d'interrogation quant à son placement, a été montée sur le dessus du boitier Mindstorms, lui assurant une vision globale de l'environnement devant le robot. &amp;lt;br/&amp;gt;&lt;br /&gt;
L'adaptateur USB ainsi que la clé WiFi et l'adaptateur bluetooth ont été ajoutés dans le compartiment de la FoxBoard. &amp;lt;br/&amp;gt;&lt;br /&gt;
Le capteur RFID, accompagné de son capteur de couleur ont été implémentés sous la tête du robot à l'avant du robot, dirigées vers le bas pour suivre les lignes au sol et capter les tags RFID des cartes collées au sol.&lt;br /&gt;
&lt;br /&gt;
[[File:finalmonte.jpg|200px|thumb|center|baseline|Le robot après l'intégration de toutes ses fonctionnalités.]]&lt;br /&gt;
&lt;br /&gt;
=== Le suiveur de ligne ===&lt;br /&gt;
&lt;br /&gt;
Nous avons tout d'abord cherché à intégrer le suiveur de ligne à notre robot. Pour cela, nous avons obtenu le code du groupe de Déborah Saunders &amp;amp; Jean Wasilewski. Cela permet au robot, en plus de ses fonctionnalités de base, de se diriger selon une ligne de couleur (normalisée verte pour tout le monde).&amp;lt;br/&amp;gt;&lt;br /&gt;
L'implémentation a été délicate car il faut placer la sonde à l'avant du robot, vers le bas, près du sol. Hors c'est là qu'était fixée la tête du robot. L'astuce a donc été de placer la tête au dessus du moteur plutôt qu'en dessous, la surelevant et laissant ainsi l'espace libre pour le capteur de couleur, sous le robot.&lt;br /&gt;
&amp;lt;br/&amp;gt;Le robot suit donc une ligne de couleur verte, essayant de retrouver la ligne de couleur lorsque qu'il dévie ou qu'il arrive dans un virage. Pour se faire, il va tourner à gauche et à droite dans des rotations d'angles de plus en plus ouvert pour retrouver la ligne.&lt;br /&gt;
&lt;br /&gt;
=== Webcam et bluetooth ===&lt;br /&gt;
&lt;br /&gt;
Il fut décidé d'intégrer au robot une webcam, afin d'utiliser avec profit ses capacités de contrôle à distance (Voir plus bas). L'utilisateur peut ainsi contrôler son robot et l'envoyer en éclaireur dans une pièce voir ce qu'il se passe par exemple. Le principe est de communiquer les commandes à la foxboard par WiFi, puis de les transmettre au boitier Mindstorm via une clé bluetooth connectée par USB à la foxboard. Les commandes sont détaillées dans le paragraphe suivant.&lt;br /&gt;
&lt;br /&gt;
=== Le contrôle à distance ===&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite intégré le programme de Kévin De Arriba et Alexandre Jouy, qui permet de contrôler le robot à distance. Le robot peut alors être contrôlé et répondre aux commandes via une interface web, en se connectant directement via Wi-Fi. Le principe, pour basculer en mode télécommande est de lui envoyer un octet dans la boite aux lettres n°3 dont les 4 bits de poids forts sont à zéro. Voici la signification de ces octets : &amp;lt;br/&amp;gt;&lt;br /&gt;
valeur 0x00 (0) : arrêt du robot ;&amp;lt;br/&amp;gt;&lt;br /&gt;
valeur 0x01 (1) : le robot avance ;&amp;lt;br/&amp;gt;&lt;br /&gt;
valeur 0x02 (2) : le robot recule ;&amp;lt;br/&amp;gt;&lt;br /&gt;
valeur 0x03 (3) : le robot tourne à gauche ;&amp;lt;br/&amp;gt;&lt;br /&gt;
valeur 0x04 (4) : le robot tourne à droite ;&amp;lt;br/&amp;gt;&lt;br /&gt;
valeur 0x05 (5) : le robot affecte à ses moteurs les valeurs trouvées dans les boites aux lettres n°5 et n°6.&lt;br /&gt;
&lt;br /&gt;
Les valeurs de retour du MindStorm vers la FoxBoard, messages reçu dans la boite aux lettre n°4, sont comme suit :&amp;lt;br/&amp;gt;&lt;br /&gt;
en mode télécommande; 0 si la commande a bien été exécutée, -1 si la commande n'est pas reconnue et enfin -2 si le robot est stoppé à cause d'un obstacle ;&amp;lt;br/&amp;gt;&lt;br /&gt;
en mode récupération d'informations; la valeur de la boussole en degrés, le numéro du tag RFID sur la carte ou encore le code couleur de la ligne suivie (0 pour bleue, 1 pour rouge, -1 si le robot n'est pas entrain de suivre une ligne). ''(Tiré de la page Wiki du groupe)''&lt;br /&gt;
&lt;br /&gt;
== Conclusion de ce Bureau d'Études ==&lt;br /&gt;
&lt;br /&gt;
Nous avons donc réussi à mener cet ensemble de Lego inanimés à l'état de machine intelligente, qui réussit d'elle-même à éviter les obstacles et se déplacer de manière programmée dans son environnement sans soucis, en réfléchissant à la meilleure solution qui s'offre à elle. &amp;lt;br/&amp;gt;&lt;br /&gt;
Nous sommes ensuite parvenus à intégrer de multiples fonctionnalités développées par les autres groupes au robot, comme le suivi de ligne, ou encore le contrôle à distance, qui renforcent les possibilités offertes par le robot.&lt;br /&gt;
&lt;br /&gt;
Ce projet nous a aussi fourni des connaissances, notamment dans le langage de programmation utilisé (NXC) que nous avons appris en auto-formation, ainsi que dans la manière de faire communiquer des systèmes électroniques entre eux. (Bluetooth, Wifi, Foxboard...)&lt;br /&gt;
&lt;br /&gt;
De plus, nous pensons avoir obtenu un bel aperçu de la spécialité IMA de notre école, ainsi que des possibilités offertes par le matériel. Nous avons apprécié de pouvoir travailler sur notre projet en autonomie, et d'avoir su bien gérer notre temps, tout en pouvant bénéficier de l'aide et des conseils du corps enseignant dès que nous en avions besoin. Nous remercions donc vivement nos 2 professeurs, messieurs Alexandre Boé et Xavier Redon.&lt;br /&gt;
&lt;br /&gt;
En conclusion, nous pouvons dire que ce bureau d'études fut une réussite pour nous, tant sur le plan des objectifs atteints que des connaissances que nous avons acquises. Cela nous donne une bonne entrevue des projets que nous aurons à mener en cycle ingénieur, ainsi que dans notre vie professionnelle.&amp;lt;br/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jbailet</name></author>	</entry>

	<entry>
		<id>https://peip-ima.plil.fr/mediawiki/index.php?title=Instrument2012-1&amp;diff=2008</id>
		<title>Instrument2012-1</title>
		<link rel="alternate" type="text/html" href="https://peip-ima.plil.fr/mediawiki/index.php?title=Instrument2012-1&amp;diff=2008"/>
				<updated>2013-05-18T19:55:31Z</updated>
		
		<summary type="html">&lt;p&gt;Jbailet : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;''Version 5.17.1, mise à jour le 17/05/2013 à 14:43''&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
L'objectif du Bureau d'études IMA est de nous faire découvrir la spécialité &lt;br /&gt;
par le biais d'un projet à réaliser, et ainsi appréhender des méthodes de &lt;br /&gt;
travail pour s'initier au côté technique et pratique du département.&lt;br /&gt;
&lt;br /&gt;
Nous nous sommes vu confier le kit Robot Mindstorm,&lt;br /&gt;
et égalemment d'autres matériels électroniques comme une carte Foxboard ou&lt;br /&gt;
un clé Bluetooth.&lt;br /&gt;
&lt;br /&gt;
Notre projet consistera dans un premier temps à concevoir un robot autonome&lt;br /&gt;
naviguant aux instruments, puis dans une deuxième partie&lt;br /&gt;
à intégrer les fonctionnalités des autres groupes dans le but d'une &lt;br /&gt;
démonstration finale.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;include nopre noesc src=&amp;quot;/home/pedago/ppeip/include/video-RobotInstruments-2012-iframe.html&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== LE ROBOT EN AUTONOMIE ==&lt;br /&gt;
&lt;br /&gt;
=== '''Enjeux et objectifs''' ===&lt;br /&gt;
&lt;br /&gt;
Nous devons doter notre robot d'une boussole ou d'un gyroscope pour lui permettre de connaitre précisément sa direction de déplacement. Distinguons le gyroscope, qui renvoie la valeur de vitesse angulaire, et la boussole qui renvoie un cap.&lt;br /&gt;
&lt;br /&gt;
* Nous commencerons par faire en sorte que notre robot sache avancer en ligne droite, pour cela nous utiliserons le contrôle PID. Nous allons pour cela effectuer des corrections sur la trajectoire en utilisant des rotations. L'angle de ces rotations va être calculé en fonction de l'erreur de trajectoire indiqué par l'instrument. Plus exactement par la somme d'une constante multipliée par l'erreur instantanée, d'une autre constante multipliée par l'intégrale de l'erreur et enfin d'une dernière constante multipliée par la dérivée de l'erreur. Il nous faut pour cela trouver les valeurs adaptées des trois constantes.&lt;br /&gt;
&lt;br /&gt;
* Nous ferons ensuite en sorte que notre robot sache contourner les obstacles au plus juste. Au plus juste signifiant qu'il tournera vers la droite ou vers la gauche en jugeant où se trouve le chemin le plus libre. L'algorithme à appliquer consiste à tourner le robot d'un angle faible dans un sens puis dans l'autre et de lire les résultats du sonar. Si les deux mesures indiquent un obstacle trop proche, l'angle est augmenté et le procédé répété. Dès qu'une trajectoire indique un chemin libre ou du moins un obstacle à distance suffisante, le robot avance en ligne droite suivant cette trajectoire. L'instrument doit être utilisé ici pour vérifier que le robot effectue précisément des rotations des angles souhaités et qu'il sache revenir en position initiale pour éventuellement recommencer avec un angle plus grand.&lt;br /&gt;
&lt;br /&gt;
* Pour permettre de suivre le comportement du robot, nous afficherons sur la brique de contrôle MindStorm l'angle de rotation pour le dernier contournement et la distance parcourue le long de la dernière ligne droite.&lt;br /&gt;
&lt;br /&gt;
Nous intégrerons ces comportements pour obtenir un robot capable de contourner les obstacles avec un minimum d'intelligence.&lt;br /&gt;
&lt;br /&gt;
Voici un exemple de contournement d'obstacle avec l'algorithme décrit.&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Parcours-boussole.png|Contournement d'obstacle&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== '''Problèmes rencontrés et solutions apportées''' ===&lt;br /&gt;
&lt;br /&gt;
Nous avons rencontré plusieurs problèmes tout au long de notre projet. Nous nous sommes efforcés soit de les résoudre, soit de les contourner en utilisant d'autres moyens pour arriver à nos fins, notamment sur l'aspect le plus ardu : la programmation.&lt;br /&gt;
&lt;br /&gt;
* '''Problème #1 :''' Absence d'espace libre sur le robot dans le montage initial pour insérer la foxboard.&lt;br /&gt;
** Solution apportée : Création d'un espace de stockage à l'arrière du robot.&lt;br /&gt;
&lt;br /&gt;
* '''Problème #2 :''' Le logiciel de programmation par blocs, bien qu'intuitif, ne nous permet pas d'arriver au degré de complexité auquel nous voudrions mener le robot.&lt;br /&gt;
** Solution apportée : Passage à la programmation par lignes de code en langage NXC.&lt;br /&gt;
&lt;br /&gt;
* '''Problème #3 :''' La difficulté d'intégration du gyroscope et ses valeurs variant trop rapidement le rendent trop compliqué à utiliser.&lt;br /&gt;
** Solution apportée : Malgré le passage en &amp;quot;lowspeed&amp;quot; du capteur, il demeure compliqué, pour le moment. Nous préférerons d'abord travailler avec le compas, pour travailler avec les angles, plutôt que les vitesses de rotations.&lt;br /&gt;
&lt;br /&gt;
* '''Problème #4 :''' Le robot semble avoir du mal à gérer le calcul des angles ET la rotation de ses moteurs.&lt;br /&gt;
** Solution apportée : Allègement du programme. Le robot semble désormais mieux se comporter et fait ce qu'on lui demande sans négliger de commandes.&lt;br /&gt;
&lt;br /&gt;
* '''Problème #5 :''' Le robot part toujours à droite quelle que soit la déviation.&lt;br /&gt;
** Solution apportée : Réécriture du programme afin de distinguer plusieurs cas. Le robot corrige désormais efficacement dans la majorité des cas. &lt;br /&gt;
&lt;br /&gt;
* '''Problème #6 :''' Le robot corrige dans le sens contraire lorsqu'il est autour du cap nord à cause de notre méthode de détection. &lt;br /&gt;
** Solution apportée : L'algorithme actuel est à travailler avec des modulos.&lt;br /&gt;
&lt;br /&gt;
=== '''Algorithmes de programmation utilisés''' ===&lt;br /&gt;
&lt;br /&gt;
==== Variables utilisées ====&lt;br /&gt;
&lt;br /&gt;
On définit dans le programmes plusieurs variables à valeurs entières. Les voici :&lt;br /&gt;
&lt;br /&gt;
* ''' int chdg;''' &amp;gt;&amp;gt;&amp;gt; ''chdg pour &amp;quot;Current Heading&amp;quot;, c'est le cap instantané du robot (en degrés).''&lt;br /&gt;
* ''' int shdg;''' &amp;gt;&amp;gt;&amp;gt; ''shdg pour &amp;quot;Start Heading&amp;quot;, c'est le cap de  référence au début de la trajectoire.''&lt;br /&gt;
* ''' int var;'''  &amp;gt;&amp;gt;&amp;gt; ''C'est la variable &amp;quot;départ moins actuel&amp;quot; (shdg-chdg) utilisé pour l'algorithme décrit plus bas.''&lt;br /&gt;
* ''' int gauche;''' &amp;gt;&amp;gt;&amp;gt; ''C'est la distance vers l'obstacle le plus proche enregistré lorsque le robot tourne la tête à droite.''   &lt;br /&gt;
* ''' int droite;''' &amp;gt;&amp;gt;&amp;gt; ''C'est la distance vers l'obstacle le plus proche enregistré lorsque le robot tourne la tête à gauche.''&lt;br /&gt;
&lt;br /&gt;
On définit, de même, des constantes :&lt;br /&gt;
&lt;br /&gt;
* ''' #define NEAR 30 ''' &amp;gt;&amp;gt;&amp;gt; ''C'est la distance (en cm) à laquelle le radar de proximité ordonne au robot d'arrêter d'avancer.''&lt;br /&gt;
* ''' #define ERREUR 15 ''' &amp;gt;&amp;gt;&amp;gt; ''C'est la marge d'erreur (en degrés) dans laquelle le robot considère que les variations de cap sont négligeables.''&lt;br /&gt;
* ''' #define P 40 &lt;br /&gt;
* ''' #define I 40 ''' &amp;gt;&amp;gt;&amp;gt; ''Ce sont les variables utilisées lors du contrôle PID.''&lt;br /&gt;
* ''' #define D 90&lt;br /&gt;
&lt;br /&gt;
==== Les algorithmes ====&lt;br /&gt;
&lt;br /&gt;
*SetSensorLowspeed(IN_3); &amp;gt;&amp;gt;&amp;gt; Initialisation du radar : le capteur est lancé.&lt;br /&gt;
*SetSensorLowspeed(IN_4); &amp;gt;&amp;gt;&amp;gt; Initialisation de la boussole : le capteur est lancé.&lt;br /&gt;
*chdg = SensorHTCompass(IN_4); &amp;gt;&amp;gt;&amp;gt; shdg prend la valeur du cap et est fixée pour le moment.&lt;br /&gt;
*shdg = SensorHTCompass(IN_4); &amp;gt;&amp;gt;&amp;gt; chdg prend la valeur du cap courant.&lt;br /&gt;
*var =(shdg - chdg); &amp;gt;&amp;gt;&amp;gt; Cela est relativement transparent.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Si le robot est à une distance supérieure à NEAR alors&lt;br /&gt;
*Tant que le robot est à une distance supérieure à NEAR&lt;br /&gt;
**Le robot avance&lt;br /&gt;
**On actualise chdg&lt;br /&gt;
**Si le robot dévie passé une certaine marge d'erreur alors&lt;br /&gt;
***Tant que shdg est différent de chdg&lt;br /&gt;
****On stoppe le robot&lt;br /&gt;
*****Si var est inférieur à 0 alors &lt;br /&gt;
*****On a dévié à gauche, on corrige à droite&lt;br /&gt;
*****On réactualise chdg&lt;br /&gt;
*****On réactualise var&lt;br /&gt;
****Sinon&lt;br /&gt;
*****On a dévié à droite, on corrige à gauche&lt;br /&gt;
*****On réactualise chdg&lt;br /&gt;
*****On réactualise var&lt;br /&gt;
****On réactualise chdg&lt;br /&gt;
***Fin tant que&lt;br /&gt;
**Fin si&lt;br /&gt;
*Fin tant que&lt;br /&gt;
Sinon&lt;br /&gt;
*Tant que le robot est à moins de NEAR d'un obstacle&lt;br /&gt;
**On arrête le robot&lt;br /&gt;
**Rotation du capteur de distance de 60° sur la gauche&lt;br /&gt;
**Enregistrement de la distance avant un obstacle dans ''gauche''&lt;br /&gt;
**Rotation du capteur de distance de 120° à droite&lt;br /&gt;
**Enregistrement de la distance avant un obstacle dans ''droite''&lt;br /&gt;
**Rotation du capteur de 60° à gauche pour retour au centre&lt;br /&gt;
**Si gauche est inférieur ou égal à droite alors&lt;br /&gt;
***Le robot fait une rotation pendant 2 secondes sur la droite&lt;br /&gt;
**Sinon&lt;br /&gt;
***Le robot fait une rotation pendant 2 secondes sur la gauche&lt;br /&gt;
**Fin si&lt;br /&gt;
*On reset shdg au cap courant&lt;br /&gt;
*Fin tant que&lt;br /&gt;
Fin si &amp;lt;br/&amp;gt;&lt;br /&gt;
On arrête le robot&lt;br /&gt;
&lt;br /&gt;
==== Le contrôle PID ====&lt;br /&gt;
&lt;br /&gt;
Nous avons utilisé le contrôle PID dans la rotation du capteur à ultrasons, vulgairement appelé &amp;quot;tête&amp;quot; de notre robot. Celui-ci s'est avéré beaucoup plus simple dans l'action que nous souhaitions réaliser sur la rotation de la tête. Voici comment il a été implémenté.&lt;br /&gt;
Nous avons introduit la syntaxe ''RotateMotorPID(OUT_B, 30, 60, P, I, D);'' où &lt;br /&gt;
*'''OUT_B''' représente la sortie B&lt;br /&gt;
*'''30''' est la puissance de la rotation&lt;br /&gt;
*'''60''' est l'angle de la rotation &lt;br /&gt;
*'''P''', '''I''' et '''D''' sont des constantes définies au début du programme. Il n'est pas utile ici de détailler les fonctions de t permettant le calcul de P, I et D, mais il est en revanche utile de détailler l'utilité de ces trois variables :&lt;br /&gt;
**'''P(t)''' rend le contrôleur plus rapide dans le temps mais il n'assure pas qu'il n'y ai aucune erreur d'équilibrage.&lt;br /&gt;
**'''I(t)''' donne de la &amp;quot;mémoire&amp;quot; au contrôleur, dans un sens il accumules les traces d'erreurs et les compense, avec un zéro erreur de moyenne garantie.&lt;br /&gt;
**'''D(t)''' donnes les &amp;quot;prédiction futures&amp;quot; au contrôleur ( comme la dérivée en maths ), ce qui accélère la réponse.&lt;br /&gt;
&lt;br /&gt;
Le contrôle PID permet donc une précision sans erreur et donc de tourner la tête exactement où il faut en assurant son retour exact à la position de départ, permettant toujours à la &amp;quot;tête&amp;quot; de regarder pile devant le robot sans décalage au fil de ses rotations.&lt;br /&gt;
&lt;br /&gt;
=== '''Avancées du projet''' ===&lt;br /&gt;
&lt;br /&gt;
==== '''Synthèse des fonctionnalités''' ====&lt;br /&gt;
&lt;br /&gt;
* Le robot avance en ligne droite : '''OK'''&lt;br /&gt;
* Le robot corrige sa trajectoire si on l'en dévie : '''OK'''&lt;br /&gt;
* Rotation du capteur ultrason, appelé &amp;quot;tête&amp;quot; et enregistrement des valeurs retournées : '''OK'''&lt;br /&gt;
* Le robot se dirige vers le chemin le plus dégagé : '''OK'''&lt;br /&gt;
* Le robot corrige toujours vers le bon endroit, par exemple si il dévie vers la gauche il corrige à droite : '''PARTIEL, A AMELIORER'''&lt;br /&gt;
* Le robot avance en suivant une ligne de couleur : '''OK'''&lt;br /&gt;
&lt;br /&gt;
==== '''Avancées''' ====&lt;br /&gt;
&lt;br /&gt;
[[File:1.Montage.jpg|200px|thumb|right|baseline|Le montage du robot est presque terminé]]&lt;br /&gt;
&lt;br /&gt;
* Création de la page wiki du projet.&lt;br /&gt;
&lt;br /&gt;
* Montage du robot.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Versionfinale.JPG|200px|thumb|right|baseline|Le montage du robot est presque terminé]]&lt;br /&gt;
&lt;br /&gt;
* Fin du montage du robot.&lt;br /&gt;
&lt;br /&gt;
* Câblage.&lt;br /&gt;
&lt;br /&gt;
* Découverte et utilisation du logiciel de programmation par blocs (Lego Mindstorms NXT).&lt;br /&gt;
&lt;br /&gt;
* Découverte du logiciel de programmation par ligne de code en NXC (Bricx).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Test de plusieurs lignes de codes NXC sur le logiciel (Bricx)&lt;br /&gt;
** Ligne droite&lt;br /&gt;
** Rotation sur lui-même&lt;br /&gt;
** Détection d'obstacle : réponse en tournant vers la gauche pour éviter&lt;br /&gt;
** Rotation de la &amp;quot;tête&amp;quot; (capteur US) sur 120° et adaptation (changement de hauteur du capteur pour éviter la collision avec les puces ultérieurement... &lt;br /&gt;
&lt;br /&gt;
* Implémentation du contrôle PID (Rotation de la tête).&lt;br /&gt;
&lt;br /&gt;
* Réalisation d'un programme permettant au robot de capter les obstacles dans un champ de 120 degré par la rotation de la tête, et contournement de ces derniers.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Avancées majeures de la page du projet&lt;br /&gt;
* Création d'un tâche ''sensor'' qui affiche le cap sur l'écran&lt;br /&gt;
* La tâche ''sensor'' assure aussi une rotation de la tête du robot pour intégrer, au futur, la possibilité de choisir le chemin le plus dégagé.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Implémentation quasi-complète de la rotation de la tête : le robot enregistre désormais dans une variable ''gauche'' et ''droite'' la distance mesurée par ultrasons en tournant la tête vers ledit côté. &lt;br /&gt;
* Le robot choisit alors la plus grande distance dégagée entre la gauche et la droite, tourne, et emprunte ce chemin.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== LE ROBOT MULTIFONCTIONS ==&lt;br /&gt;
&lt;br /&gt;
=== L'intégration du matériel sur le robot ===&lt;br /&gt;
&lt;br /&gt;
La montée des différents composants sur le robot n'a pas toujours été toute simple et nous avons parfois été confronté à des problèmes de montage.&amp;lt;br/&amp;gt;&lt;br /&gt;
La FoxBoard a tout d'abord été montée dans un compartiment spécifique à l'arrière du robot, lui donnant son design particulièrement unique en son genre et... loufoque ! &amp;lt;br/&amp;gt;&lt;br /&gt;
La WebCam, après avoir suscité pas mal d'interrogation quant à son placement, a été montée sur le dessus du boitier Mindstorms, lui assurant une vision globale de l'environnement devant le robot. &amp;lt;br/&amp;gt;&lt;br /&gt;
L'adaptateur USB ainsi que la clé WiFi et l'adaptateur bluetooth ont été ajoutés dans le compartiment de la FoxBoard. &amp;lt;br/&amp;gt;&lt;br /&gt;
Le capteur RFID, accompagné de son capteur de couleur ont été implémentés sous la tête du robot à l'avant du robot, dirigées vers le bas pour suivre les lignes au sol et capter les tags RFID des cartes collées au sol.&lt;br /&gt;
&lt;br /&gt;
[[File:finalmonte.jpg|200px|thumb|center|baseline|Le robot après l'intégration de toutes ses fonctionnalités.]]&lt;br /&gt;
&lt;br /&gt;
=== Le suiveur de ligne ===&lt;br /&gt;
&lt;br /&gt;
Nous avons tout d'abord cherché à intégrer le suiveur de ligne à notre robot. Pour cela, nous avons obtenu le code du groupe de Déborah Saunders &amp;amp; Jean Wasilewski. Cela permet au robot, en plus de ses fonctionnalités de base, de se diriger selon une ligne de couleur (normalisée verte pour tout le monde).&amp;lt;br/&amp;gt;&lt;br /&gt;
L'implémentation a été délicate car il faut placer la sonde à l'avant du robot, vers le bas, près du sol. Hors c'est là qu'était fixée la tête du robot. L'astuce a donc été de placer la tête au dessus du moteur plutôt qu'en dessous, la surelevant et laissant ainsi l'espace libre pour le capteur de couleur, sous le robot.&lt;br /&gt;
&amp;lt;br/&amp;gt;Le robot suit donc une ligne de couleur verte, essayant de retrouver la ligne de couleur lorsque qu'il dévie ou qu'il arrive dans un virage. Pour se faire, il va tourner à gauche et à droite dans des rotations d'angles de plus en plus ouvert pour retrouver la ligne.&lt;br /&gt;
&lt;br /&gt;
=== Webcam et bluetooth ===&lt;br /&gt;
&lt;br /&gt;
Il fut décidé d'intégrer au robot une webcam, afin d'utiliser avec profit ses capacités de contrôle à distance (Voir plus bas). L'utilisateur peut ainsi contrôler son robot et l'envoyer en éclaireur dans une pièce voir ce qu'il se passe par exemple. Le principe est de communiquer les commandes à la foxboard par WiFi, puis de les transmettre au boitier Mindstorm via une clé bluetooth connectée par USB à la foxboard. Les commandes sont détaillées dans le paragraphe suivant.&lt;br /&gt;
&lt;br /&gt;
=== Le contrôle à distance ===&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite intégré le programme de Kévin De Arriba et Alexandre Jouy, qui permet de contrôler le robot à distance. Le robot peut alors être contrôlé et répondre aux commandes via une interface web, en se connectant directement via Wi-Fi. Le principe, pour basculer en mode télécommande est de lui envoyer un octet dans la boite aux lettres n°3 dont les 4 bits de poids forts sont à zéro. Voici la signification de ces octets : &amp;lt;br/&amp;gt;&lt;br /&gt;
valeur 0x00 (0) : arrêt du robot ;&amp;lt;br/&amp;gt;&lt;br /&gt;
valeur 0x01 (1) : le robot avance ;&amp;lt;br/&amp;gt;&lt;br /&gt;
valeur 0x02 (2) : le robot recule ;&amp;lt;br/&amp;gt;&lt;br /&gt;
valeur 0x03 (3) : le robot tourne à gauche ;&amp;lt;br/&amp;gt;&lt;br /&gt;
valeur 0x04 (4) : le robot tourne à droite ;&amp;lt;br/&amp;gt;&lt;br /&gt;
valeur 0x05 (5) : le robot affecte à ses moteurs les valeurs trouvées dans les boites aux lettres n°5 et n°6.&lt;br /&gt;
&lt;br /&gt;
Les valeurs de retour du MindStorm vers la FoxBoard, messages reçu dans la boite aux lettre n°4, sont comme suit :&amp;lt;br/&amp;gt;&lt;br /&gt;
en mode télécommande; 0 si la commande a bien été exécutée, -1 si la commande n'est pas reconnue et enfin -2 si le robot est stoppé à cause d'un obstacle ;&amp;lt;br/&amp;gt;&lt;br /&gt;
en mode récupération d'informations; la valeur de la boussole en degrés, le numéro du tag RFID sur la carte ou encore le code couleur de la ligne suivie (0 pour bleue, 1 pour rouge, -1 si le robot n'est pas entrain de suivre une ligne). ''(Tiré de la page Wiki du groupe)''&lt;br /&gt;
&lt;br /&gt;
== Conclusion de ce Bureau d'Études ==&lt;br /&gt;
&lt;br /&gt;
Nous avons donc réussi à mener cet ensemble de Lego inanimés à l'état de machine intelligente, qui réussit d'elle-même à éviter les obstacles et se déplacer de manière programmée dans son environnement sans soucis, en réfléchissant à la meilleure solution qui s'offre à elle. &amp;lt;br/&amp;gt;&lt;br /&gt;
Nous sommes ensuite parvenus à intégrer de multiples fonctionnalités développées par les autres groupes au robot, comme le suivi de ligne, ou encore le contrôle à distance, qui renforcent les possibilités offertes par le robot.&lt;br /&gt;
&lt;br /&gt;
Ce projet nous a aussi fourni des connaissances, notamment dans le langage de programmation utilisé (NXC) que nous avons appris en auto-formation, ainsi que dans la manière de faire communiquer des systèmes électroniques entre eux. (Bluetooth, Wifi, Foxboard...)&lt;br /&gt;
&lt;br /&gt;
De plus, nous pensons avoir obtenu un bel aperçu de la spécialité IMA de notre école, ainsi que des possibilités offertes par le matériel. Nous avons apprécié de pouvoir travailler sur notre projet en autonomie, et d'avoir su bien gérer notre temps, tout en pouvant bénéficier de l'aide et des conseils du corps enseignant dès que nous en avions besoin. Nous remercions donc vivement nos 2 professeurs, messieurs Alexandre Boé et Xavier Redon.&lt;br /&gt;
&lt;br /&gt;
En conclusion, nous pouvons dire que ce bureau d'études fut une réussite pour nous, tant sur le plan des objectifs atteints que des connaissances que nous avons acquises. Cela nous donne une bonne entrevue des projets que nous aurons à mener en cycle ingénieur, ainsi que dans notre vie professionnelle.&amp;lt;br/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jbailet</name></author>	</entry>

	<entry>
		<id>https://peip-ima.plil.fr/mediawiki/index.php?title=Instrument2012-1&amp;diff=1234</id>
		<title>Instrument2012-1</title>
		<link rel="alternate" type="text/html" href="https://peip-ima.plil.fr/mediawiki/index.php?title=Instrument2012-1&amp;diff=1234"/>
				<updated>2013-01-31T16:36:16Z</updated>
		
		<summary type="html">&lt;p&gt;Jbailet : /* Avancée du 28/01/2013 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''Avancée du 28/01/2013''' ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- Création de la page wiki du projet.&lt;br /&gt;
&lt;br /&gt;
- Montage du robot.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== '''Avancée du 31/01/2013''' ==&lt;br /&gt;
&lt;br /&gt;
- Fin du montage du robot.&lt;br /&gt;
&lt;br /&gt;
- Câblage.&lt;br /&gt;
&lt;br /&gt;
- Découverte et utilisation du logiciel de programmation par blocs (Lego Mindstorms NXT).&lt;br /&gt;
&lt;br /&gt;
{VIDEOS}&lt;br /&gt;
&lt;br /&gt;
- Découverte du logiciel de programmation par ligne de code en NXC (Bricx).&lt;/div&gt;</summary>
		<author><name>Jbailet</name></author>	</entry>

	<entry>
		<id>https://peip-ima.plil.fr/mediawiki/index.php?title=Instrument2012-1&amp;diff=1233</id>
		<title>Instrument2012-1</title>
		<link rel="alternate" type="text/html" href="https://peip-ima.plil.fr/mediawiki/index.php?title=Instrument2012-1&amp;diff=1233"/>
				<updated>2013-01-28T07:28:42Z</updated>
		
		<summary type="html">&lt;p&gt;Jbailet : /* Avancée du 28/01/2013 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''Avancée du 28/01/2013''' ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- Création de la page wiki du projet.&lt;br /&gt;
&lt;br /&gt;
- Montage du robot.&lt;/div&gt;</summary>
		<author><name>Jbailet</name></author>	</entry>

	<entry>
		<id>https://peip-ima.plil.fr/mediawiki/index.php?title=Instrument2012-1&amp;diff=1232</id>
		<title>Instrument2012-1</title>
		<link rel="alternate" type="text/html" href="https://peip-ima.plil.fr/mediawiki/index.php?title=Instrument2012-1&amp;diff=1232"/>
				<updated>2013-01-28T07:27:41Z</updated>
		
		<summary type="html">&lt;p&gt;Jbailet : /* Avancée du 28/01/2013 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''Avancée du 28/01/2013''' ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- Création de la page wiki du projet.&lt;br /&gt;
- Montage du robot.&lt;/div&gt;</summary>
		<author><name>Jbailet</name></author>	</entry>

	<entry>
		<id>https://peip-ima.plil.fr/mediawiki/index.php?title=Instrument2012-1&amp;diff=1231</id>
		<title>Instrument2012-1</title>
		<link rel="alternate" type="text/html" href="https://peip-ima.plil.fr/mediawiki/index.php?title=Instrument2012-1&amp;diff=1231"/>
				<updated>2013-01-28T07:27:16Z</updated>
		
		<summary type="html">&lt;p&gt;Jbailet : /* Avancée du 28/01/2013 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''Avancée du 28/01/2013''' ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- Création de la page wiki du projet.\n&lt;br /&gt;
- Montage du robot.&lt;/div&gt;</summary>
		<author><name>Jbailet</name></author>	</entry>

	<entry>
		<id>https://peip-ima.plil.fr/mediawiki/index.php?title=Instrument2012-1&amp;diff=1230</id>
		<title>Instrument2012-1</title>
		<link rel="alternate" type="text/html" href="https://peip-ima.plil.fr/mediawiki/index.php?title=Instrument2012-1&amp;diff=1230"/>
				<updated>2013-01-28T07:27:06Z</updated>
		
		<summary type="html">&lt;p&gt;Jbailet : /* Avancée du 28/01/2013 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''Avancée du 28/01/2013''' ==&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- Création de la page wiki du projet.\n&lt;br /&gt;
- Montage du robot.&lt;/div&gt;</summary>
		<author><name>Jbailet</name></author>	</entry>

	<entry>
		<id>https://peip-ima.plil.fr/mediawiki/index.php?title=Instrument2012-1&amp;diff=1229</id>
		<title>Instrument2012-1</title>
		<link rel="alternate" type="text/html" href="https://peip-ima.plil.fr/mediawiki/index.php?title=Instrument2012-1&amp;diff=1229"/>
				<updated>2013-01-28T07:26:39Z</updated>
		
		<summary type="html">&lt;p&gt;Jbailet : Meooow.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''Avancée du 28/01/2013''' ==&lt;br /&gt;
&lt;br /&gt;
- Création de la page wiki du projet.&lt;br /&gt;
- Montage du robot.&lt;/div&gt;</summary>
		<author><name>Jbailet</name></author>	</entry>

	<entry>
		<id>https://peip-ima.plil.fr/mediawiki/index.php?title=BE_2012-2013&amp;diff=1224</id>
		<title>BE 2012-2013</title>
		<link rel="alternate" type="text/html" href="https://peip-ima.plil.fr/mediawiki/index.php?title=BE_2012-2013&amp;diff=1224"/>
				<updated>2013-01-24T15:53:54Z</updated>
		
		<summary type="html">&lt;p&gt;Jbailet : /* Robot naviguant aux instruments */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= But à atteindre =&lt;br /&gt;
&lt;br /&gt;
Ce bureau d'étude a comme finalité la construction de robots patrouilleurs. Ces robots doivent parcourir de façon semi-autonome un espace en accumulant des données. Ces données peuvent être, par exemple, des images de leur environnement ou le résultat d'écoutes WiFi. Un robot semi-autonome est un robot capable de se déplacer dans son espace sans intervention humaine en suivant un balisage quelconque (marquage au sol, tags RFID, sons particuliers, etc). Un humain doit cependant pouvoir prendre le contrôle partiel ou total d'un robot. Le contrôle partiel consiste à faire varier la vitesse du robot, le sens du parcours du robot, etc. Le contrôle total consiste à gérer complétement le déplacement du robot, même si ce dernier évite encore les collisions (que le contrôleur pourrait ne pas avoir pu prévoir). Les robots doivent aussi pouvoir communiquer entre eux pour s'échanger des informations de positionnement, pour pouvoir s'éviter ou pour pouvoir se regrouper (par exemple pour pouvoir explorer en détail un lieu particulier). A ce propos il est fondamental que les robots sachent se positionner pour pouvoir annoter les informations envoyées ou stockées (images ou données).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Matériel à votre disposition =&lt;br /&gt;
&lt;br /&gt;
[[Image:boite_mindstorm.jpg|150px|right]]&lt;br /&gt;
[[Image:foxboard.jpg|150px|left]]&lt;br /&gt;
Les couches basses du robot seront réalisées à l'aide de Lego MindStorm. Le Lego va permettre de réaliser le chassis avec sa motorisation et d'y installer divers capteurs. Il est même possible d'assurer une certaine communication entre robots grâce à la technologie &amp;lt;tt&amp;gt;bluetooth&amp;lt;/tt&amp;gt; intégrée au micro-contrôleur MindStorm. Pour aller plus loin, il est nécessaire d'embarquer un micro-PC de type FoxBoard sur le robot. C'est ce micro-PC qui fera faire les acquisitions d'images ou les analyses WiFi et c'est à lui que le micro-contrôleur du MindStorm pourra envoyer ses données de localisation.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Répartition des tâches =&lt;br /&gt;
&lt;br /&gt;
Chaque binôme va se voir affecter une des problématiques décrites dans les sous-sections suivantes. Par la suite les résultats devront être incorporés dans chaque robot pour obtenir un robot tel que décrit plus haut. Notez que tous les robots doivent savoir s'arrêter quand un obstacle se présente devant eux (utilisation du sonar MindStorm).&lt;br /&gt;
&lt;br /&gt;
== Robot suiveur de ligne ==&lt;br /&gt;
Vous devez créer un robot capable de suivre une courbe discontinue au sol. Le robot doit être capable de réaliser les actions ci-dessous.&lt;br /&gt;
* en cas de perte du marquage, tourner dans un sens puis dans l'autre pour tenter de le retrouver avec des angles de plus en plus grands ;&lt;br /&gt;
* si le marquage ne peut pas être retrouvé, se remettre dans la position de la perte initiale et partir tout droit ;&lt;br /&gt;
* se remettre dans l'axe du marquage lorsque ce marquage est retrouvé ;&lt;br /&gt;
* s'arrêter quand un obstacle se présente devant lui et repartir si l'obstacle disparait ;&lt;br /&gt;
* changer de parcours sur commande, c'est à dire emprunter un parcours d'une couleur différente dès qu'il est rencontré ;&lt;br /&gt;
* inverser son sens de parcours.&lt;br /&gt;
&lt;br /&gt;
Voici des exemples de parcours discontinus pouvant être suivis dans les deux sens.&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Parcours-carre.png|Parcours carré&lt;br /&gt;
File:Parcours-cercle.png‎|Parcours avec arcs&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table border=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt; &amp;lt;th&amp;gt;Elèves&amp;lt;/th&amp;gt; &amp;lt;th&amp;gt;Matériel&amp;lt;/th&amp;gt; &amp;lt;th&amp;gt;Page&amp;lt;/th&amp;gt; &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; {Floriane Chevalier} &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Boite lego MindStorm&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Scotch de couleur&amp;lt;/span&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; [[SuiveurLigne2012-1|Robot suiveur de ligne 1]] &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Robots synchronisés ==&lt;br /&gt;
Cette étude sera menée par deux binômes. Vos deux robots doivent être capables de se synchroniser. Il vous est demandé de réaliser le comportement suivant :&lt;br /&gt;
&lt;br /&gt;
* séparés, les robots avancent tout droit et s'arrêtent dès qu'ils détectent un obstacle avec leur sonar ;&lt;br /&gt;
* les deux robots doivent pouvoir être couplés côte à côte ;&lt;br /&gt;
* dans le mode couplé, les robots avancent quand aucun obstacle n'est détecté par leurs sonars ;&lt;br /&gt;
* dans le mode couplé, si un robot détecte un obstacle et l'autre non le couple tourne dans la direction où aucun obstacle n'est détecté.&lt;br /&gt;
&lt;br /&gt;
La communication entre les deux robots se fait par &amp;lt;tt&amp;gt;bluetooth&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table border=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt; &amp;lt;th&amp;gt;Elèves&amp;lt;/th&amp;gt; &amp;lt;th&amp;gt;Matériel&amp;lt;/th&amp;gt; &amp;lt;th&amp;gt;Page&amp;lt;/th&amp;gt; &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; {Vos prénoms et noms ici} &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Boite lego MindStorm&amp;lt;/span&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; [[Synchronize2011-1|Robot communicant 1]] &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;  {Vos prénoms et noms ici} &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Boite lego MindStorm&amp;lt;/span&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; [[Synchronize2012-2|Robot communicant 2]] &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Robot suiveur RFID ==&lt;br /&gt;
Vous doterez votre robot d'un lecteur RFID et d'un équipement de type boussole. Votre robot doit être capable de réaliser les opérations ci-après :&lt;br /&gt;
&lt;br /&gt;
* trouver sous une marque de couleur précise (feuille A4, disque, ...) une carte RFID ;&lt;br /&gt;
* partir dans une direction donnée ; le robot s'oriente avec la boussole puis se lance avec ses deux moteurs sans tenter de corriger la trajectoire ;&lt;br /&gt;
* mémoriser des caps en fonction des identifiants des cartes RFID.&lt;br /&gt;
&lt;br /&gt;
Par la suite vous intégrez ces trois fonctionnalités pour obtenir un robot capable de suivre une trajectoire matérialisée par des marques sous lesquelles une carte RFID est dissimulée.&lt;br /&gt;
Quand le robot détecte une marque via son capteur de couleur, il se met à chercher l'emplacement exact de la carte RFID. Une fois la carte localisée, le robot trouve le prochain cap à suivre en fonction de l'identifiant de la carte RFID. Le robot s'oriente sur ce cap avec sa boussole puis se lance vers la marque suivante. Et ainsi de suite.&lt;br /&gt;
&lt;br /&gt;
Voici un exemple de parcours en suivant des marques RFID.&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Parcours-marques.png|Parcours RFID&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table border=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt; &amp;lt;th&amp;gt;Elèves&amp;lt;/th&amp;gt; &amp;lt;th&amp;gt;Matériel&amp;lt;/th&amp;gt; &amp;lt;th&amp;gt;Page&amp;lt;/th&amp;gt; &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Jouy Alexandre - De Arriba Kévin &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;Boite lego MindStorm&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;Module RFID&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;Cartes RFID&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;module boussole&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;Marques de couleur&amp;lt;/span&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; [[SuiveurRFID2012-1|Robot suiveur RFID 1]] &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Robot naviguant aux instruments ==&lt;br /&gt;
Vous doterez votre robot d'une boussole ou d'un gyroscope pour lui permettre de connaitre précisement sa direction. Vous devez réaliser les actions décrites dans la suite.&lt;br /&gt;
&lt;br /&gt;
* Vous commencerez par faire en sorte que votre robot sache avancer en ligne droite, pour cela vous utiliserez le contrôle PID décrit sur la page [http://wikipedia.org/wiki/PID_controller WikiPedia]. Pour simplifier ce qui est dit sur cette page, sachez le principe appliqué à votre robot va être d'effectuer des corrections sur la trajectoire en utilisant des rotations. L'angle de ces rotations va être calculé en fonction de l'erreur de trajectoire indiqué par l'instrument. Plus exactement par la somme d'une constante multipliée par l'erreur instantanée, d'une autre constante multipliée par l'intégrale de l'erreur et enfin d'une dernière constante multipliée par la dérivée de l'erreur. A vous de trouver les valeurs adaptées des trois constantes.&lt;br /&gt;
&lt;br /&gt;
* Par la suite faites en sorte que votre robot sache contourner les obstacles au plus juste. Au plus juste signifiant qu'il tournera vers la droite ou vers la gauche en jugeant où se trouve le chemin le plus libre. L'algorithme à appliquer consiste à tourner le robot d'un angle faible dans un sens puis dans l'autre et de lire les resultats du sonar. Si les deux mesures indiquent un obstacle trop proche, l'angle est augmenté et le procédé répété. Dès qu'une trajectoire indique un chemin libre ou du moins un obstacle à distance suffisante, le robot avance en ligne droite suivant cette trajectoire. L'instrument doit être utilisée ici pour vérifier que le robot effectue précisement des rotations des angles souhaités et qu'il sache revenir en position initiale pour éventuellement recommencer avec un angle plus grand.&lt;br /&gt;
&lt;br /&gt;
* Pour permettre de suivre le comportement du robot, faites afficher sur la brique de contrôle MindStorm l'angle de rotation pour le dernier contournement et la distance parcourue le long de la dernière ligne droite.&lt;br /&gt;
&lt;br /&gt;
Intégrez les comportements pour obtenir un robot capable de contourner les obstacles avec un minimum d'intelligence.&lt;br /&gt;
&lt;br /&gt;
Voici un exemple de contournement d'obstacle avec l'algorithme décrit.&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Parcours-boussole.png|Contournement d'obstacle&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table border=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt; &amp;lt;th&amp;gt;Elèves&amp;lt;/th&amp;gt; &amp;lt;th&amp;gt;Matériel&amp;lt;/th&amp;gt; &amp;lt;th&amp;gt;Page&amp;lt;/th&amp;gt; &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Bailet Jérôme - Teneur Timothée&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;Boite lego MindStorm&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;Module boussole&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;Module gyroscope&amp;lt;/span&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; [[Instrument2012-1|Robot aux instruments 1]] &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Robot solaire ==&lt;br /&gt;
Le but est de concevoir un robot capable de trouver le meilleur point de rechargement solaire dans une pièce et de se mettre en mode de rechargement&lt;br /&gt;
tout en étant capable de se réveiller après une période de charge. Vous devez réaliser les actions décrites dans la suite.&lt;br /&gt;
&lt;br /&gt;
* Votre robot doit déjà être capable de se déplacer dans une pièce en évitant les obstacles et de mesurer l'ensoleillement en différents points. L'algorithme de recherche du point idéal pourrait être de se déplacer à volonté (on suppose la pièce fermée) en calculant l'ensoleillement maximal. Au bout d'un temps défini, le robot compare l'ensoleillement local au maximum trouvé dans son premier parcours et s'arrête dès qu'il tombe sur un ensoleillement égal à une fraction du maximum (80% par exemple). &lt;br /&gt;
&lt;br /&gt;
* Concevez une alimentation ad hoc. Par exemple une batterie rechargeable pour MindStorm connectée, via des relais, d'une part au bloc contrôleur du MindStorm et d'autre part aux panneaux solaires. Un régulateur entre les panneaux et la batterie peut être nécessaire. Réalisez aussi un dispositif électronique indépendant capable de coller le relai d'alimentation du MindStorm dès que la charge de la batterie est raisonnable. Commencez par lister le matériel nécessaire pour passer la commande.&lt;br /&gt;
&lt;br /&gt;
* Il ne vous reste plus qu'à écrire le comportement du robot quand il trouve son coin au soleil. A savoir, coller le relai de charge de sa batterie tout en se suicidant en decollant son relai d'alimentation. Il lui faut aussi décoller le relai de chargement quand il se réveille.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table border=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt; &amp;lt;th&amp;gt;Elèves&amp;lt;/th&amp;gt; &amp;lt;th&amp;gt;Matériel&amp;lt;/th&amp;gt; &amp;lt;th&amp;gt;Page&amp;lt;/th&amp;gt; &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; {Geiger Emilien}&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;Boite lego MindStorm&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;Batterie rechargeable pour MindStorm&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;Panneaux solaires&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;Modules relais&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;Dispositif électronique de réveil&amp;lt;/span&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; [[Solaire2012-1|Robot solaire 1]] &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Robot téléguidé avec système embarqué ==&lt;br /&gt;
Votre robot doit pouvoir être radio-guidé par un contrôleur. Le dit contrôleur peut diriger le robot au vu de l'image de la webcam embarquée. L'acquisition de la webcam et sa diffusion par WiFi est assuré par un système embarqué FoxBoard. La FoxBoard vous sera livrée configurée mais il faudra l'embarquer dans votre robot avec tous ses accessoires (webcam, module &amp;lt;tt&amp;gt;bluetooth&amp;lt;/tt&amp;gt;, boitier de piles). Un calcul du temps d'autonomie doit être effectué. Dans un premier temps le radio-guidage peut se faire à l'aide du logiciel MindStorm par &amp;lt;tt&amp;gt;bluetooth&amp;lt;/tt&amp;gt;. Dans un second temps il faut étudier la possibilité d'un radio-guidage par WiFi, les ordres étant transmis par un navigateur Web au serveur Web de la FoxBoard puis transmis au micro-contrôleur MindStorm par &amp;lt;tt&amp;gt;bluetooth&amp;lt;/tt&amp;gt;. Vous aurez le choix de programmer votre robot avec le logiciel MindStorm ou avec un langage de bas niveau proche du langage C (voir la page web [http://www.eggwall.com/2011/08/lego-nxt-mindstorm-with-linux.html]).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table border=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt; &amp;lt;th&amp;gt;Elèves&amp;lt;/th&amp;gt; &amp;lt;th&amp;gt;Matériel&amp;lt;/th&amp;gt; &amp;lt;th&amp;gt;Page&amp;lt;/th&amp;gt; &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Jean-Christophe Fabrici,Gunst Nicolas &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;  &amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;Boite lego MindStorm&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;Téléphone Android&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;FoxBoard avec webcam, interface WiFi, convertisseur &amp;lt;tt&amp;gt;bluetooth&amp;lt;/tt&amp;gt;&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;Boitier piles&amp;lt;/span&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; [[Teleguide2012-1|Robot téléguidé 1]] &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Intégration des fonctionnalités =&lt;br /&gt;
Une fois toutes les études terminées et les solutions implantées (sous forme de briques personnalisées par exemple), vous doterez votre robot des fonctionnalités nécessaires à la réalisation de la démonstration finale. Votre robot doit être capable de suivre des marquages discontinus au sol, être capable de communiquer avec les autres robots, être capable de se repérer dans l'espace en repérant des cartes RFID et enfin doit embarquer une FoxBoard avec une connexion WiFi et une webcam.&lt;br /&gt;
&lt;br /&gt;
Les robots peuvent se trouver soit dans un mode autonome soit dans un mode téléguidé. Dans le mode téléguidé, le robot est contrôlé à l'aide d'un téléphone Android connecté sur le réseau WiFi de l'école. Il doit être possible de le faire avancer, reculer ou tourner. Il doit être possible aussi d'obtenir une image de la webcam.&lt;br /&gt;
&lt;br /&gt;
Le comportement en mode autonome est plus complexe :&lt;br /&gt;
* le robot tente de suivre un marquage de couleur au sol, ce marquage peut être discontinu, la boussole est utilisée pour passer en ligne droite d'un marquage à l'autre et pour suivre les marquages ;&lt;br /&gt;
* le contrôleur peut demander à un robot de changer de sens de parcours ou de changer de couleur de parcours ;&lt;br /&gt;
* les robots communiquent à leur FoxBoard la couleur du parcours suivi, le dernier tag RFID détecté et la position de leur boussole ;&lt;br /&gt;
* ces informations sont diffusées entre les FoxBoard, elles sont aussi capable d'indiquer la position des robots sur une carte ;&lt;br /&gt;
* quand une FoxBoard s'aperçoit qu'un parcours est utilisé par moins de robots qu'un autre parcours, elle peut demander à son robot de changer de couleur de parcours pour équilibrer le nombre de robots.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table border=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt; &amp;lt;th&amp;gt;Matériel&amp;lt;/th&amp;gt;&lt;br /&gt;
     &amp;lt;td&amp;gt;Boite lego MindStorm&amp;lt;/td&amp;gt;&lt;br /&gt;
     &amp;lt;td&amp;gt;Module RFID&amp;lt;/td&amp;gt;&lt;br /&gt;
     &amp;lt;td&amp;gt;Module boussole&amp;lt;/td&amp;gt;&lt;br /&gt;
     &amp;lt;td&amp;gt;Module gyroscope&amp;lt;/td&amp;gt;&lt;br /&gt;
     &amp;lt;td&amp;gt;Téléphone Android&amp;lt;/td&amp;gt; &lt;br /&gt;
     &amp;lt;td&amp;gt;FoxBoard&amp;lt;/td&amp;gt;&lt;br /&gt;
     &amp;lt;td&amp;gt;WebCam&amp;lt;/td&amp;gt;&lt;br /&gt;
     &amp;lt;td&amp;gt;Adaptateur USB/WiFi&amp;lt;/td&amp;gt;&lt;br /&gt;
     &amp;lt;td&amp;gt;Adaptateur BlueTooth&amp;lt;/td&amp;gt;&lt;br /&gt;
     &amp;lt;td&amp;gt;Hub USB&amp;lt;/td&amp;gt;&lt;br /&gt;
     &amp;lt;td&amp;gt;Boitier piles&amp;lt;/td&amp;gt;&lt;br /&gt;
     &amp;lt;td&amp;gt;Piles rechargeables&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt; &amp;lt;th&amp;gt;Nombre&amp;lt;/th&amp;gt;&lt;br /&gt;
     &amp;lt;td&amp;gt;&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;8/8&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt; &lt;br /&gt;
     &amp;lt;td&amp;gt;&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;8/8&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt; &lt;br /&gt;
     &amp;lt;td&amp;gt;&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;8/8&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt; &lt;br /&gt;
     &amp;lt;td&amp;gt;&amp;lt;span style=&amp;quot;color: orange;&amp;quot;&amp;gt;1/8&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt; &lt;br /&gt;
     &amp;lt;td&amp;gt;&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;8/8&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt; &lt;br /&gt;
     &amp;lt;td&amp;gt;&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;8/8&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt; &lt;br /&gt;
     &amp;lt;td&amp;gt;&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;8/8&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt; &lt;br /&gt;
     &amp;lt;td&amp;gt;&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;8/8&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt; &lt;br /&gt;
     &amp;lt;td&amp;gt;&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;8/8&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt; &lt;br /&gt;
     &amp;lt;td&amp;gt;&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;8/8 (deux non testés)&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt; &lt;br /&gt;
     &amp;lt;td&amp;gt;&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;8/8&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt; &lt;br /&gt;
     &amp;lt;td&amp;gt;&amp;lt;span style=&amp;quot;color: green;&amp;quot;&amp;gt;100/100&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt; &lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour configurer la FoxBoard avec tout le matériel nécessaire, suivez les [[FoxBoard pour MindStorm 2012|instructions]].&lt;br /&gt;
&lt;br /&gt;
Pour une description du système à obtenir suivez la [[FoxBoard MindStorm système 2012|flèche]].&lt;br /&gt;
&lt;br /&gt;
= Robot récupérateur d'objet =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table border=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt; &amp;lt;th&amp;gt;Elèves&amp;lt;/th&amp;gt; &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Déborah Saunders et Jean Wasilewski &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le robot vient récupérer un objet avec 4 servo-moteurs&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Démonstration finale =&lt;br /&gt;
Pour la démonstration finale vous tracerez une grande piste comprenant au moins deux parcours (voir schéma ci-dessous). Des cartes RFID doivent être disposées en des points précis de chaque parcours. Vous placerez vos robots sur l'un des parcours, tous orientés dans le même sens. Les robots vont cheminer un certain temps sur ce parcours (l'occasion de vérifier le bon suivi du marquage au sol et que les robots savent tenir leurs distances). Ils doivent ensuite se répartir automatiquement sur les deux parcours disponibles. Un contrôleur ordonne à son robot de changer de sens de parcours. Les robots devraient se bloquer. Le contrôleur téléguide le robot pour le sortir du parcours, les autres robots devraient se débloquer.&lt;br /&gt;
&lt;br /&gt;
Voici un exemple de double parcours.&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Parcours-double.png|Parcours double&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Notation =&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Noms !! Partie I !! Partie II !! Rapport Wiki !! Soutenance vidéo !! Total&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Jbailet</name></author>	</entry>

	</feed>