<?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=Dtillaux</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=Dtillaux"/>
		<link rel="alternate" type="text/html" href="https://peip-ima.plil.fr/mediawiki/index.php/Sp%C3%A9cial:Contributions/Dtillaux"/>
		<updated>2026-04-25T04:58:57Z</updated>
		<subtitle>Contributions de l’utilisateur</subtitle>
		<generator>MediaWiki 1.29.2</generator>

	<entry>
		<id>https://peip-ima.plil.fr/mediawiki/index.php?title=Binome2017-9&amp;diff=9896</id>
		<title>Binome2017-9</title>
		<link rel="alternate" type="text/html" href="https://peip-ima.plil.fr/mediawiki/index.php?title=Binome2017-9&amp;diff=9896"/>
				<updated>2018-05-23T09:38:21Z</updated>
		
		<summary type="html">&lt;p&gt;Dtillaux : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Binôme 9 saison 8: Raphaël Bonvalet, Damien Tillaux.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Projet Quireekoo =&lt;br /&gt;
&lt;br /&gt;
Le but du projet Quireekoo est de créer un robot communiquant avec d'autre via infra-rouge. Ce projet à eu lieux lors des bureaux d'étude de PEIP en IMA au S4 2018 de notre cursus pour devenir ingénieur. Voici la transcription phonétique de Quireekoo: /Kirikou/.&lt;br /&gt;
&lt;br /&gt;
= Cahier des charges =&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Kiki.jpg|middle]]&lt;br /&gt;
&lt;br /&gt;
Quireekoo sera un robot fait de A à Z. Le circuit imprimé sera totalement revu et sera guidé grâce à une ATMEGA-328. Le physique sera totalement design par nous même et son programme sera totalement autonome.&lt;br /&gt;
&lt;br /&gt;
Quireekoo étant petit et vaillant est un véhicule de petite taille. A la défaut de jambe, Quireekoo ce déplace avec 2 servos moteurs continue. A la place des yeux, un sonar pour éviter ses obstacles et ne pas trébucher. Pour ses oreilles nous avons prévu 2 Tsop38238 pour pouvoir repérer et fuir ses ennemis.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Réalisation du projet =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Voici les différentes étapes par lesquels nous sommes passés lors de la création de Quireekoo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Liste des objets récupérés =&lt;br /&gt;
&lt;br /&gt;
- sonar&lt;br /&gt;
- led infra-rouge&lt;br /&gt;
- 2 servos-moteurs&lt;br /&gt;
- boitier de pile  &lt;br /&gt;
- 6 piles&lt;br /&gt;
- 1 bille&lt;br /&gt;
- 1 tsop&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Réalisation de PCB ==&lt;br /&gt;
&lt;br /&gt;
=== Idée principale ===&lt;br /&gt;
&lt;br /&gt;
Nous voulions refaire nous même le PCB de Quireekoo mais nous n'avions pratiquement aucune base sur comment créer un circuit imprimé pour ce genre de projet. Du coups nous avons pris comme modèle, le modèle donnée sur la page principale du projet. ([https://peip-ima.plil.fr/mediawiki/index.php/BE_2017-2018 BE 2017-2018])&lt;br /&gt;
&lt;br /&gt;
Voici le schématique sur lequel nous nous sommes basé.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:RobotPCB schem.png|500px|thumb||left|Schématique original]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Notre PCB ===&lt;br /&gt;
&lt;br /&gt;
Notre PCB a été réalisé sur Fritzing. Nous avons créé ce circuit imprimé à notre image pour notre véhicule. Nous avons enlevé le driver de moteur et les sorties moteurs car nous voulions un robot de petite taille. Donc le moyen de déplacement choisi a alors été le servo-moteur. Pour les réceptions infra-rouge nous n'avons prévu que deux sorties pour des Tsop pour pouvoir laisser un plus grande chance au chasseur de ne pas être repéré, pour une approche plus vrai que nature. Pour savoir si un chasseur nous a attrapé, nous utilisons une sonde de Hall.&lt;br /&gt;
&lt;br /&gt;
De plus, en cas de problème nous avons créé toutes les sorties du microcontrôleur. Si un problème apparaît sur une des pins utilisées, nous pourrons la relocaliser sur une autre sortie.&lt;br /&gt;
&lt;br /&gt;
Un objectif supplémentaire était de réaliser un PCB le plus petit possible pour que le véhicule le soit aussi. Ce fut presque un succès, la carte est d'une taille environ de 5cm*5cm. Elle aurait pu être encore plus petite avec plus de travail mais nous ne pouvions pas nous le permettre si nous voulions tout faire.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Voici le schématique et le PCB de Quireekoo.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Quireekoo schem.png|500px|thumb|left|Schématique de Quireekoo]]&lt;br /&gt;
[[Fichier:Quireekoo pcb.png|500px|thumb|right|PCB de Quireekoo]]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Réalisation de la partie mécanique du véhicule ==&lt;br /&gt;
&lt;br /&gt;
Pour la partie mécanique de Quireekoo on a choisi de le faire sur inkscape afin de pouvoir effectuer une découpe laser. Le robot est composé de deux plaques de plexiglas, une pour le châssis où il y a les servos moteur, la bille et le bloc de pile, et une pour placer le sonar, le circuit imprimée, les Tsop et la sonde de hall. &lt;br /&gt;
&lt;br /&gt;
Voici à quoi ressemble la partie du bas sur inkscape : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Partie bas.jpg|700px|]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour la partie du haut c'était un peu plus compliqué car il fallait trouver comment placer les tsop, la sonde de hall et le sonar. Pour pouvoir fixer ceux-ci on a choisi de faire des trous en forme de rectangles avec une taille égale à la taille des pins de chaque capteurs différents. Après il fallait aussi mettre les trous pour fixer le circuit imprimé au même endroit que ceux qui se trouve sur celui-ci. Pour ce faire, on a utilisé le fichier .svg donné par Fritzing. On a également mis des trous en forme de rectangle sur les côtés pour pouvoir laisser passer les fils.&lt;br /&gt;
&lt;br /&gt;
Voici à quoi ressemble la partie du haut sur inkscape :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Partie haut.png|700px|]]&lt;br /&gt;
&lt;br /&gt;
Pour finir il nous restait les roues à faire. On a opté pour garder les roues données avec les servos moteurs en y rajoutant des partie en plexiglas au pistolet à colle pour rendre celles-ci plus grandes.&lt;br /&gt;
&lt;br /&gt;
Voici à quoi cela ressemble sur inkscape : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Roue.png|200px|]]&lt;br /&gt;
&lt;br /&gt;
Le problème avec cette solution c'est que les roues ne sont pas adhérentes. De ce fait là, on a ajouté une partie d'élastique autour avec de la colle glue.&lt;br /&gt;
&lt;br /&gt;
Voici a quoi le robot ressemble à la fin :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Quireekoo.jpg|200px|]]&lt;br /&gt;
&lt;br /&gt;
== Réalisation du code Arduino ==&lt;br /&gt;
&lt;br /&gt;
Voici maintenant la présentation du code téléversé dans Quireekoo.&lt;br /&gt;
&lt;br /&gt;
=== Le code ===&lt;br /&gt;
&lt;br /&gt;
{  &lt;br /&gt;
  #include &amp;lt;Servo.h&amp;gt;&lt;br /&gt;
  #include &amp;lt;IRremote.h&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  //déclaration des différentes pins&lt;br /&gt;
  &lt;br /&gt;
  #define SERVO1 11&lt;br /&gt;
  #define SERVO2 13&lt;br /&gt;
  #define ECHO 17&lt;br /&gt;
  #define TRIGG 18&lt;br /&gt;
  #define HALL A2&lt;br /&gt;
  #define IR 2&lt;br /&gt;
  #define VCCIR1 A0&lt;br /&gt;
  #define VCCIR2 A1&lt;br /&gt;
  &lt;br /&gt;
  //création de la classe Mouv pour le déplacement du robot&lt;br /&gt;
  &lt;br /&gt;
  class Mouv {&lt;br /&gt;
  &lt;br /&gt;
          Servo servo1;&lt;br /&gt;
          Servo servo2;&lt;br /&gt;
          int servo1Pin;&lt;br /&gt;
          int servo2Pin;&lt;br /&gt;
          &lt;br /&gt;
          int etatRotation;&lt;br /&gt;
          int etatSonar;&lt;br /&gt;
          int etatHall;&lt;br /&gt;
          int etatTsop;&lt;br /&gt;
          &lt;br /&gt;
          long intervalTsop;&lt;br /&gt;
          &lt;br /&gt;
          long intervalMouvement1;&lt;br /&gt;
          long intervalMouvement2;&lt;br /&gt;
          long intervalMouvement3;&lt;br /&gt;
          long intervalMouvement4;&lt;br /&gt;
          &lt;br /&gt;
          unsigned long lastMillis;&lt;br /&gt;
          &lt;br /&gt;
          &lt;br /&gt;
    public:&lt;br /&gt;
      Mouv(int pin1 , int pin2){&lt;br /&gt;
        servo1Pin= pin1;&lt;br /&gt;
        servo2Pin = pin2;&lt;br /&gt;
        &lt;br /&gt;
        etatRotation = 0;&lt;br /&gt;
        etatSonar = 0;&lt;br /&gt;
        etatHall = 0;&lt;br /&gt;
        etatTsop = 0;&lt;br /&gt;
        lastMillis = 0;&lt;br /&gt;
        &lt;br /&gt;
        intervalTsop = 500;&lt;br /&gt;
        &lt;br /&gt;
        intervalMouvement1 = 1500;&lt;br /&gt;
        intervalMouvement2 = 1700;&lt;br /&gt;
        intervalMouvement3 = 3200;&lt;br /&gt;
        intervalMouvement4 = 3400;&lt;br /&gt;
      }&lt;br /&gt;
    &lt;br /&gt;
      void attacher(){&lt;br /&gt;
        servo1.attach(servo1Pin);&lt;br /&gt;
        servo2.attach(servo2Pin);&lt;br /&gt;
      }&lt;br /&gt;
  &lt;br /&gt;
      void deplacement(int distanceObstacle , int tsop , int hall, int* attraper){&lt;br /&gt;
        unsigned long currentMillis = millis();&lt;br /&gt;
        &lt;br /&gt;
        if (hall == 1){&lt;br /&gt;
          etatHall = 1;&lt;br /&gt;
          *attraper = 1;&lt;br /&gt;
        }&lt;br /&gt;
        else if (distanceObstacle &amp;lt; 200){&lt;br /&gt;
          etatSonar = 1;&lt;br /&gt;
        }&lt;br /&gt;
        else if (tsop==1){&lt;br /&gt;
          etatTsop = 1;&lt;br /&gt;
          lastMillis = currentMillis;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        if (etatHall == 1){&lt;br /&gt;
          servo1.write(90);&lt;br /&gt;
          servo2.write(90);&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        else if (etatSonar ==1){&lt;br /&gt;
          if (etatRotation == 0){&lt;br /&gt;
            etatRotation = random(1,3);&lt;br /&gt;
          }&lt;br /&gt;
          if(etatRotation == 1){&lt;br /&gt;
            servo1.write(180);&lt;br /&gt;
            servo2.write(180);&lt;br /&gt;
          }&lt;br /&gt;
          else{&lt;br /&gt;
            servo1.write(0);&lt;br /&gt;
            servo2.write(0);&lt;br /&gt;
          }&lt;br /&gt;
          etatSonar = 0 ;&lt;br /&gt;
          lastMillis = currentMillis;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        else if (etatTsop == 1){&lt;br /&gt;
          if (etatRotation == 0){&lt;br /&gt;
            etatRotation = random(1,3);&lt;br /&gt;
          }&lt;br /&gt;
          &lt;br /&gt;
          if(etatRotation == 1){&lt;br /&gt;
            servo1.write(180);&lt;br /&gt;
            servo2.write(180);&lt;br /&gt;
          }&lt;br /&gt;
          else{&lt;br /&gt;
            servo1.write(0);&lt;br /&gt;
            servo2.write(0);&lt;br /&gt;
          }&lt;br /&gt;
          &lt;br /&gt;
          if (currentMillis - lastMillis &amp;gt;= intervalTsop){&lt;br /&gt;
            etatTsop = 0;&lt;br /&gt;
            lastMillis = currentMillis;&lt;br /&gt;
          }&lt;br /&gt;
        }   &lt;br /&gt;
        &lt;br /&gt;
        else{&lt;br /&gt;
          etatRotation = 0;&lt;br /&gt;
          if (currentMillis - lastMillis &amp;lt; intervalMouvement1){&lt;br /&gt;
            servo1.write(180);&lt;br /&gt;
            servo2.write(70);&lt;br /&gt;
          }&lt;br /&gt;
          else if ((currentMillis - lastMillis &amp;gt;= intervalMouvement2) &amp;amp;&amp;amp;  (currentMillis - lastMillis &amp;lt;= intervalMouvement3)){&lt;br /&gt;
            servo1.write(98);&lt;br /&gt;
            servo2.write(0);&lt;br /&gt;
          }&lt;br /&gt;
          else{&lt;br /&gt;
            servo1.write(180);&lt;br /&gt;
            servo2.write(0);&lt;br /&gt;
            if (currentMillis - lastMillis &amp;gt;= intervalMouvement4){&lt;br /&gt;
              lastMillis = currentMillis;&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;br /&gt;
  Mouv servo(SERVO1,SERVO2);&lt;br /&gt;
  &lt;br /&gt;
  //varibable pour le sonnar&lt;br /&gt;
  &lt;br /&gt;
  long lectureEcho;&lt;br /&gt;
  long distance;&lt;br /&gt;
  const float SOUND_SPEED = 340.0 / 1000;&lt;br /&gt;
  &lt;br /&gt;
  //varibable pour la sonde de hall&lt;br /&gt;
  &lt;br /&gt;
  int* attraper;&lt;br /&gt;
  &lt;br /&gt;
  //varibable pour les tsop&lt;br /&gt;
  &lt;br /&gt;
  unsigned long last_millis = 0; &lt;br /&gt;
  long interval = 500;&lt;br /&gt;
  &lt;br /&gt;
  int broche_reception1 = VCCIR1;&lt;br /&gt;
  IRrecv reception_ir1(broche_reception1);&lt;br /&gt;
  decode_results decode_ir1;&lt;br /&gt;
  &lt;br /&gt;
  int broche_reception2 = VCCIR2;&lt;br /&gt;
  IRrecv reception_ir2(broche_reception2);&lt;br /&gt;
  decode_results decode_ir2; &lt;br /&gt;
  &lt;br /&gt;
  //instance pour l'emmission infra-rouge&lt;br /&gt;
  &lt;br /&gt;
  IRsend emission_ir; &lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  void setup() {&lt;br /&gt;
    pinMode(TRIGG,OUTPUT);&lt;br /&gt;
    digitalWrite(TRIGG,0);&lt;br /&gt;
    pinMode(ECHO,INPUT); &lt;br /&gt;
    pinMode(IR,OUTPUT);&lt;br /&gt;
    digitalWrite(IR,1);&lt;br /&gt;
  &lt;br /&gt;
    servo.attacher();&lt;br /&gt;
    &lt;br /&gt;
    reception_ir1.enableIRIn(); // démarre la réception&lt;br /&gt;
    reception_ir2.enableIRIn();&lt;br /&gt;
    &lt;br /&gt;
    attraper = malloc(sizeof(int));&lt;br /&gt;
    *attraper = 0;&lt;br /&gt;
    &lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  void loop() {&lt;br /&gt;
    servo.deplacement(sonar(),tsop(attraper),hall(),attraper);  &lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  int sonar() {&lt;br /&gt;
    digitalWrite(TRIGG, 1);&lt;br /&gt;
    delayMicroseconds(10);&lt;br /&gt;
    digitalWrite(TRIGG,0);&lt;br /&gt;
    long measure = pulseIn(ECHO, HIGH);&lt;br /&gt;
    &lt;br /&gt;
    float distance_mm = measure / 2.0 * SOUND_SPEED;&lt;br /&gt;
    return distance_mm; &lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  int tsop(int * attraper ){&lt;br /&gt;
    unsigned long current_millis = millis();&lt;br /&gt;
    int etatTsop = 0;&lt;br /&gt;
    if ((current_millis - last_millis &amp;gt;= interval)&amp;amp;&amp;amp;(*attraper == 0)){&lt;br /&gt;
       emission_ir.sendNEC(1, 32); &lt;br /&gt;
       last_millis = current_millis; &lt;br /&gt;
       reception_ir1.enableIRIn();&lt;br /&gt;
       reception_ir2.enableIRIn();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    if (reception_ir1.decode(&amp;amp;decode_ir1)) &lt;br /&gt;
    { &lt;br /&gt;
      if(decode_ir1.value == 1){&lt;br /&gt;
        etatTsop = 1;&lt;br /&gt;
      }&lt;br /&gt;
  &lt;br /&gt;
      reception_ir1.resume();&lt;br /&gt;
      reception_ir2.enableIRIn();&lt;br /&gt;
    }&lt;br /&gt;
    if (reception_ir2.decode(&amp;amp;decode_ir2)) &lt;br /&gt;
    { &lt;br /&gt;
      if(decode_ir2.value == 1){&lt;br /&gt;
        etatTsop = 1;&lt;br /&gt;
      } &lt;br /&gt;
      reception_ir2.resume();  &lt;br /&gt;
      reception_ir1.enableIRIn();&lt;br /&gt;
    }&lt;br /&gt;
    return etatTsop;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  int hall(){&lt;br /&gt;
    int etatHall = 0;&lt;br /&gt;
    if(digitalRead(HALL) == 0){&lt;br /&gt;
      etatHall = 1;&lt;br /&gt;
    }&lt;br /&gt;
    return etatHall;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
=== Description de la structure du code ===&lt;br /&gt;
&lt;br /&gt;
==== Fonction sonar() ====&lt;br /&gt;
&lt;br /&gt;
Cette fonction permet au sonar de calculer la distance séparant le robot d'un obstacle.&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
  int sonar() {&lt;br /&gt;
    digitalWrite(TRIGG, 1);&lt;br /&gt;
    delayMicroseconds(10);&lt;br /&gt;
    digitalWrite(TRIGG,0);&lt;br /&gt;
    long measure = pulseIn(ECHO, HIGH);&lt;br /&gt;
    &lt;br /&gt;
    float distance_mm = measure / 2.0 * SOUND_SPEED;&lt;br /&gt;
    return distance_mm; &lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Fonction tsop()====&lt;br /&gt;
&lt;br /&gt;
Cette fonction a deux rôles. Le premier est de lire les entrées des tsop et de renvoyer si un prédateur a été détecté ou non. Le deuxième est d'émettre un signal infra-rouge permettant au prédateur de nous détecter.&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
  int tsop(int * attraper ){&lt;br /&gt;
    unsigned long current_millis = millis();&lt;br /&gt;
    int etatTsop = 0;&lt;br /&gt;
    if ((current_millis - last_millis &amp;gt;= interval)&amp;amp;&amp;amp;(*attraper == 0)){&lt;br /&gt;
       emission_ir.sendNEC(1, 32); &lt;br /&gt;
       last_millis = current_millis; &lt;br /&gt;
       reception_ir1.enableIRIn();&lt;br /&gt;
       reception_ir2.enableIRIn();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    if (reception_ir1.decode(&amp;amp;decode_ir1)) &lt;br /&gt;
    { &lt;br /&gt;
      if(decode_ir1.value == 1){&lt;br /&gt;
        etatTsop = 1;&lt;br /&gt;
      }&lt;br /&gt;
  &lt;br /&gt;
      reception_ir1.resume();&lt;br /&gt;
      reception_ir2.enableIRIn();&lt;br /&gt;
    }&lt;br /&gt;
    if (reception_ir2.decode(&amp;amp;decode_ir2)) &lt;br /&gt;
    { &lt;br /&gt;
      if(decode_ir2.value == 1){&lt;br /&gt;
        etatTsop = 1;&lt;br /&gt;
      } &lt;br /&gt;
      reception_ir2.resume();  &lt;br /&gt;
      reception_ir1.enableIRIn();&lt;br /&gt;
    }&lt;br /&gt;
    return etatTsop;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Les particularités de cette fonction sont que, premièrement pour faciliter la programmation, l'émission et la réception ont été mise dans la même fonction car elles demandent toutes les deux la même bibliothèque et les même timer, donc pour éviter tout conflit ceci fut une bonne solution. Deuxièmement, la fonction tsop() contient un pointeur en paramètre. Ce pointeur permet au robot de savoir s'il doit continuer à émettre ou non s'il est attrapé.&lt;br /&gt;
&lt;br /&gt;
L'émission du signal infra-rouge ici se fait toute les 0.5s. En effet si les émissions sont trop proches il y a conflit avec la réception.&lt;br /&gt;
&lt;br /&gt;
==== Fonction hall()====&lt;br /&gt;
&lt;br /&gt;
Cette fonction permet de voir si un prédateur nous a détecté et attrapé grâce à l'émission d'une onde électromagnétique.&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
  int hall(){&lt;br /&gt;
    int etatHall = 0;&lt;br /&gt;
    if(digitalRead(HALL) == 0){&lt;br /&gt;
      etatHall = 1;&lt;br /&gt;
    }&lt;br /&gt;
    return etatHall;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Fonction deplacement() ====&lt;br /&gt;
&lt;br /&gt;
Pour le déplacement du robot nous avons choisi de créer un classe pour avoir un code plus propre et une fonction loop() ne contenant qu'une seul ligne de code.&lt;br /&gt;
&lt;br /&gt;
La Classe Mouv contient 2 fonctions. La première attacher() permet de lier les instances servo aux pins associées. Elle est appelée dans le setup(). La deuxième fonction est la fonction de déplacement appelée deplacement(). Cette fonction est la seule appelée de la fonction loop().&lt;br /&gt;
&lt;br /&gt;
Cette fonction est alors la fonction principale du robot, car c'est elle qui va décider du déplacement du robot en fonction des différentes entrées des capteurs. Elle contient en paramètre les différentes entrées du sonar, du tsop, de la sonde de hall, mais aussi un pointeur pour pouvoir sauvegarder en mémoire le fait que le robot soit attrapé ou non.&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
      void deplacement(int distanceObstacle , int tsop , int hall, int* attraper){&lt;br /&gt;
        unsigned long currentMillis = millis();&lt;br /&gt;
        &lt;br /&gt;
        if (hall == 1){&lt;br /&gt;
          etatHall = 1;&lt;br /&gt;
          *attraper = 1;&lt;br /&gt;
        }&lt;br /&gt;
        else if (distanceObstacle &amp;lt; 200){&lt;br /&gt;
          etatSonar = 1;&lt;br /&gt;
        }&lt;br /&gt;
        else if (tsop==1){&lt;br /&gt;
          etatTsop = 1;&lt;br /&gt;
          lastMillis = currentMillis;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        if (etatHall == 1){&lt;br /&gt;
          servo1.write(90);&lt;br /&gt;
          servo2.write(90);&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        else if (etatSonar ==1){&lt;br /&gt;
          if (etatRotation == 0){&lt;br /&gt;
            etatRotation = random(1,3);&lt;br /&gt;
          }&lt;br /&gt;
          if(etatRotation == 1){&lt;br /&gt;
            servo1.write(180);&lt;br /&gt;
            servo2.write(180);&lt;br /&gt;
          }&lt;br /&gt;
          else{&lt;br /&gt;
            servo1.write(0);&lt;br /&gt;
            servo2.write(0);&lt;br /&gt;
          }&lt;br /&gt;
          etatSonnar = 0 ;&lt;br /&gt;
          lastMillis = currentMillis;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        else if (etatTsop == 1){&lt;br /&gt;
          if (etatRotation == 0){&lt;br /&gt;
            etatRotation = random(1,3);&lt;br /&gt;
          }&lt;br /&gt;
          &lt;br /&gt;
          if(etatRotation == 1){&lt;br /&gt;
            servo1.write(180);&lt;br /&gt;
            servo2.write(180);&lt;br /&gt;
          }&lt;br /&gt;
          else{&lt;br /&gt;
            servo1.write(0);&lt;br /&gt;
            servo2.write(0);&lt;br /&gt;
          }&lt;br /&gt;
          &lt;br /&gt;
          if (currentMillis - lastMillis &amp;gt;= intervalTsop){&lt;br /&gt;
            etatTsop = 0;&lt;br /&gt;
            lastMillis = currentMillis;&lt;br /&gt;
          }&lt;br /&gt;
        }   &lt;br /&gt;
        &lt;br /&gt;
        else{&lt;br /&gt;
          etatRotation = 0;&lt;br /&gt;
          if (currentMillis - lastMillis &amp;lt; intervalMouvement1){&lt;br /&gt;
            servo1.write(180);&lt;br /&gt;
            servo2.write(70);&lt;br /&gt;
          }&lt;br /&gt;
          else if ((currentMillis - lastMillis &amp;gt;= intervalMouvement2) &amp;amp;&amp;amp;  (currentMillis - lastMillis &amp;lt;= intervalMouvement3)){&lt;br /&gt;
            servo1.write(98);&lt;br /&gt;
            servo2.write(0);&lt;br /&gt;
          }&lt;br /&gt;
          else{&lt;br /&gt;
            servo1.write(180);&lt;br /&gt;
            servo2.write(0);&lt;br /&gt;
            if (currentMillis - lastMillis &amp;gt;= intervalMouvement4){&lt;br /&gt;
              lastMillis = currentMillis;&lt;br /&gt;
            }&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Cette fonction est divisée en deux partie. La première est la distribution des états du robot en fonction des entrées. Par la suite, la fonction va décider quel déplacement faire en fonction des priorités des différents états. L'état le plus prioritaire est l'état etatHall. Celui ci indique si le robot est attrapé et une fois passé à 1 il ne peut plus changer et le déplacement associé est un sur-place pour le robot. Après il y a l'état associé aux obstacles et si la distance devient inférieur à celle écrite, le robot tourne sur lui même dans une direction aléatoire jusqu'à ne plus percevoir d'obstacle. Le suivant est celui de la détection de prédateur. Ici si un prédateur est détecté, Quireekoo va aussi se tourner dans une direction aléatoire. Mais la différence c'est que ici il va tourner pendant un certain intervalle de temps rentré dans le code. Le dernier déplacement n'est exécuté seulement si aucun des trois autres n'est fait. C'est le déplacement de base du robot. Ce déplacement est juste en zigzag.&lt;br /&gt;
&lt;br /&gt;
=== Les difficultés rencontrées ===&lt;br /&gt;
&lt;br /&gt;
Une grande difficulté lors de la programmation de Quireekoo fut l’émission et la réception infra-rouge. En effet la première idée pour l'émission était de juste allumer et éteindre la led infra-rouge à un fréquence de 38 kHz avec les intervalles de temps précis comme utilisé ici pour d'autre fonction avec les currentMillis et lastMillis. Les tsop réagissaient bien à l'émission. Le problème est que si l'on rajoutais des fonctions comme le déplacement ou le sonar, le temps d'arriver jusqu'à l'émission l'intervalle de temps qui permettait une fréquence de 38 kHz était dépassé. &lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
  void allumer()&lt;br /&gt;
  {&lt;br /&gt;
    // check to see if it's time to change the state of the LED&lt;br /&gt;
    unsigned long currentMicros = micros();&lt;br /&gt;
     &lt;br /&gt;
    if((ledState == HIGH) &amp;amp;&amp;amp; (currentMicros - previousMicros &amp;gt;= OnTime))&lt;br /&gt;
    {&lt;br /&gt;
      ledState = LOW;  // Turn it off&lt;br /&gt;
      previousMicros = currentMicros;  // Remember the time&lt;br /&gt;
      digitalWrite(ledPin, ledState);  // Update the actual LED&lt;br /&gt;
    }&lt;br /&gt;
    else if ((ledState == LOW) &amp;amp;&amp;amp; (currentMicros - previousMicros &amp;gt;= OffTime))&lt;br /&gt;
    {&lt;br /&gt;
      ledState = HIGH;  // turn it on&lt;br /&gt;
      previousMicros = currentMicros;   // Remember the time&lt;br /&gt;
      digitalWrite(ledPin, ledState);   // Update the actual LED&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
Une solution fur de passer directement par les interruptions timer. Mais deux problèmes ce sont encore révélés. Le premier était que tous les timer étaient déjà utilisés par la bibliothèque servo.h, donc impossible de faire les interruptions. De plus avec cette façon de faire ou la précédente, il était impossible de faire passer un message à travers l'émission, donc impossible de différencier une proie d'un prédateur.&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
    // initialize timer1 &lt;br /&gt;
    noInterrupts();           // disable all interrupts&lt;br /&gt;
    TCCR5A = 0;&lt;br /&gt;
    TCCR5B = 0;&lt;br /&gt;
    TCNT5  = 0;&lt;br /&gt;
  &lt;br /&gt;
    OCR5A = 421;            // compare match register 16MHz/256/2Hz&lt;br /&gt;
    TCCR5B |= (1 &amp;lt;&amp;lt; WGM52);   // CTC mode&lt;br /&gt;
    TCCR5B |= (1 &amp;lt;&amp;lt; CS50);    // 256 prescaler &lt;br /&gt;
    TIMSK5 |= (1 &amp;lt;&amp;lt; OCIE5A);  // enable timer compare interrupt&lt;br /&gt;
    interrupts();             // enable all interrupts&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  ISR(TIMER5_COMPA_vect)          // timer compare interrupt service routine&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(ledPin, digitalRead(ledPin) ^ 1);   // toggle LED pin&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Nous en sommes arrivé à utiliser la bibliothèque IRremote.h. Avec cette bibliothèque, l'émission et la réception infra-rouge se fait très simplement si elles sont séparées. Mais les applications utilisant les même timer, il y a alors conflit pour faire fonctionner les deux en même temps. Cela nous a pris du temps pour trouver une solution car aucune information n'a pu être trouvé sur le web. Le problème était que si nous faisions une émission, les timer de la réception était annulé. Il fallait alors les ré-allouer pour la réception après l'émission avec le ligne de code: reception_ir1.enableIRIn();.&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
 if ((current_millis - last_millis &amp;gt;= interval)&amp;amp;&amp;amp;(*attraper == 0)){&lt;br /&gt;
       emission_ir.sendNEC(1, 32); &lt;br /&gt;
       last_millis = current_millis; &lt;br /&gt;
       reception_ir1.enableIRIn();&lt;br /&gt;
       reception_ir2.enableIRIn();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Cette solution a alors été partagée avec les autres groupes qui avaient besoin d'émettre et de réceptionner un signal.&lt;br /&gt;
&lt;br /&gt;
= Nos erreurs lors du projet =&lt;br /&gt;
&lt;br /&gt;
Au cours de ce projet nous avons fait quelque erreurs. Nous avons alors appris de ces erreurs et allons les décrire.&lt;br /&gt;
&lt;br /&gt;
== Erreur lors de la création du circuit imprimé ==&lt;br /&gt;
&lt;br /&gt;
Pour ce projet nous voulions faire tout le robot par nous même. Nous avons aussi refait le PCB en prenant comme exemple celui donner sur la page du projet qui est aussi celui affiché plus haut. Lorsque nous avions recopié le schéma, nous avons vu le leds de contrôle et avons décidé de les supprimer de notre circuit en pensant qu'elle ne servirait à rien. Ceci fut alors une grande erreur. Car lorsque nous avons reçu le circuit et que nous avons commencé à souder les composants, faire des tests pour savoir si les composant fonctionnaient comme il fallait ou de savoir si les soudures étaient bien faites devint très compliqué. Par chance aucun gros problème majeur n'a été trouvé. Nous savons maintenant que l'utilisation de led de contrôle est primordiale lors de la création de prototype.&lt;br /&gt;
&lt;br /&gt;
== Erreur lors de la création de la structure ==&lt;br /&gt;
&lt;br /&gt;
Quelques problèmes mineurs ont été rencontrés. Lors de la création des trous pour faire rentrer les tsop, le sonar et la sonde de hall, nous avions pris les mesures de la longueurs de pins mais la mesure précise. De ce fait, sans une petite marge de distance, les fils ne passaient pas. Nous avons alors juste limé un peu et le problème fut résolu.&lt;br /&gt;
&lt;br /&gt;
De plus nous n'avions pas prévu de trous ou autres solutions pour maintenir la batterie avec les piles. Nous l'avons alors attachée avec des élastiques. Cela fonctionne mais rend la rend inaccessible.&lt;br /&gt;
&lt;br /&gt;
Nous remercions aussi Vincent de nous avoir passé un des ces supports pour les servos-moteurs, car sans nous nous demandons comment nous aurions pu les attacher.&lt;br /&gt;
&lt;br /&gt;
== Erreur de conception ==&lt;br /&gt;
&lt;br /&gt;
Lorsque nous avons commencé à penser au projet, nous avons pensé à faire un robot le plus petit possible pour être le plus dur à attraper. Pour cela, nous avions décidé d'utiliser des servos-moteurs pour le déplacement. Nous pensions que la vitesse de rotation était suffisante pour avoir un robot plutôt rapide. La vitesse n'est alors pas si lente que ça mais nous nous attendions à mieux. Une question vient alors ce poser: aurait-il mieux fallut mettre des moteurs et non des servos-moteurs? Le défauts des moteurs est que ceci prennent alors plus de place et donc le robot n'est plus aussi petit que la taille voulut au départ. Nous avons alors conclut que les servos-moteurs restaient alors la meilleur solution pour le déplacement.&lt;/div&gt;</summary>
		<author><name>Dtillaux</name></author>	</entry>

	<entry>
		<id>https://peip-ima.plil.fr/mediawiki/index.php?title=Binome2017-9&amp;diff=9628</id>
		<title>Binome2017-9</title>
		<link rel="alternate" type="text/html" href="https://peip-ima.plil.fr/mediawiki/index.php?title=Binome2017-9&amp;diff=9628"/>
				<updated>2018-05-05T15:47:22Z</updated>
		
		<summary type="html">&lt;p&gt;Dtillaux : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Binôme 9 saison 8: Raphaël Bonvalet, Damien Tillaux.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Projet Quireekoo =&lt;br /&gt;
&lt;br /&gt;
Le but du projet Quireekoo est de créer un robot communiquant avec d'autre via infra-rouge. Ce projet à eu lieux lors des bureaux d'étude de PEIP en IMA au S4 2018 de notre cursus pour devenir ingénieur. Voici la transcription phonétique de Quireekoo: /Kirikou/.&lt;br /&gt;
&lt;br /&gt;
= Cahier des charges =&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Kiki.jpg|middle]]&lt;br /&gt;
&lt;br /&gt;
Quireekoo sera un robot fait de A à Z. Le circuit imprimé sera totalement revu et sera guidé grâce à une ATMEGA-328. Le physique sera totalement design par nous même et son programme sera totalement autonome.&lt;br /&gt;
&lt;br /&gt;
Quireekoo étant petit et vaillant est un véhicule de petite taille. A la défaut de jambe, Quireekoo ce déplace avec 2 servos moteurs continue. A la place des yeux, un sonar pour éviter ses obstacles et ne pas trébucher. Pour ses oreilles nous avons prévu 2 Tsop38238 pour pouvoir repérer et fuir ses ennemis.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Réalisation du projet =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Voici les différentes étapes par lesquels nous sommes passer lors de la création de Quireekoo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Réalisation de PCB ==&lt;br /&gt;
&lt;br /&gt;
=== Idée principale ===&lt;br /&gt;
&lt;br /&gt;
Nous voulions refaire nous même le PCB de Quireekoo mais nous n'avions pratiquement aucune base sur comment créer un circuit imprimé pour ce genre de projet. Du coups nous avons pris comme modèle, le modèle donnée sur la page principale du projet. ([https://peip-ima.plil.fr/mediawiki/index.php/BE_2017-2018 BE 2017-2018])&lt;br /&gt;
&lt;br /&gt;
Voici le schématique sur lequel nous nous sommes basé.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:RobotPCB schem.png|500px|thumb||left|Schématique original]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Notre PCB ===&lt;br /&gt;
&lt;br /&gt;
Notre PCB a été réalisé sur Fritzing. Nous avons créer ce circuit imprimé à notre image pour notre véhicule. Nous avons enlevé le driver de moteur et les sorties moteurs car nous voulions un robot de petite taille. Donc le moyen de déplacement choisi a alors été le servo-moteur. Pour les réceptions infra-rouge nous n'avons prévu que deux sorties pour des Tsop pour pouvoir laisser un plus grande chance au chasseur de ne pas être repéré, pour une approche plus vrai que nature. Pour savoir si un chasseur nous a attrapé, nous utilisons une sonde de Hall.&lt;br /&gt;
&lt;br /&gt;
De plus, en cas de problème nous avons créé toutes les sorties du microcontrôleur. Si un problème apparaît sur une des pins utilisées, nous pourrons la relocaliser sur une autre sortie.&lt;br /&gt;
&lt;br /&gt;
Un objectif supplémentaire était de réaliser un PCB le plus petit possible pour que le véhicule le soit aussi. Ce fut presque un succès, la carte est d'une taille environ de 5cm*5cm. Elle aurait pu être encore plus petite avec plus de travail mais nous ne pouvions pas nous le permettre si nous voulions tout faire.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Voici le schématique et le PCB de Quireekoo.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Quireekoo schem.png|500px|thumb|left|Schématique de Quireekoo]]&lt;br /&gt;
[[Fichier:Quireekoo pcb.png|500px|thumb|right|PCB de Quireekoo]]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Réalisation de la partie mécanique du véhicule ==&lt;br /&gt;
&lt;br /&gt;
Pour la partie mécanique de Quireekoo on a choisi de le faire sur inkscape afin de pouvoir effectuer une découpe laser. Le robot est composé de deux plaques de plexiglas, une pour le châssis où il y a les servos moteur, la bille et le bloc de pile, et une pour placer le sonar, le circuit imprimée, les Tsop et la sonde de hall. &lt;br /&gt;
&lt;br /&gt;
Voici à quoi ressemble la partie du bas sur inkscape : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Partie bas.jpg|700px|]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour la partie du haut c'était un peu plus compliqué car il fallait trouver comment placer les tsop, la sonde de hall et le sonar. Pour pouvoir fixer ceux-ci on a choisi de faire des trous en forme de rectangles avec une taille égale à la taille des pins de chaque capteurs différents. Après il fallait aussi mettre les trous pour fixer le circuit imprimé au même endroit que ceux qui se trouve sur celui-ci. Pour ce faire, on a utilisé le fichier .svg donné par Fritzing. On a également mis des trous en forme de rectangle sur les côtés pour pouvoir laisser passer les fils.&lt;br /&gt;
&lt;br /&gt;
Voici à quoi ressemble la partie du haut sur inkscape :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Partie haut.png|700px|]]&lt;br /&gt;
&lt;br /&gt;
Pour finir il nous restait les roues à faire. On a opté pour garder les roues données avec les servos moteurs en y rajoutant des partie en plexiglas au pistolet à colle pour rendre celles-ci plus grandes.&lt;br /&gt;
&lt;br /&gt;
Voici à quoi cela ressemble sur inkscape : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Roue.png|200px|]]&lt;br /&gt;
&lt;br /&gt;
Le problème avec cette solution c'est que les roues ne sont pas adhérentes. De ce fait là, on a ajouté une partie d'élastique autour avec de la colle glue.&lt;br /&gt;
&lt;br /&gt;
Voici a quoi le robot ressemble à la fin :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Quireekoo.jpg|200px|]]&lt;br /&gt;
&lt;br /&gt;
== Réalisation du code Arduino ==&lt;br /&gt;
&lt;br /&gt;
Voici maintenant la présentation du code téléversé dans Quireekoo.&lt;br /&gt;
&lt;br /&gt;
=== Le code ===&lt;br /&gt;
&lt;br /&gt;
{  &lt;br /&gt;
  #include &amp;lt;Servo.h&amp;gt;&lt;br /&gt;
  #include &amp;lt;IRremote.h&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  //déclaration des différentes pins&lt;br /&gt;
  &lt;br /&gt;
  #define SERVO1 11&lt;br /&gt;
  #define SERVO2 13&lt;br /&gt;
  #define ECHO 17&lt;br /&gt;
  #define TRIGG 18&lt;br /&gt;
  #define HALL A2&lt;br /&gt;
  #define IR 2&lt;br /&gt;
  #define VCCIR1 A0&lt;br /&gt;
  #define VCCIR2 A1&lt;br /&gt;
  &lt;br /&gt;
  //création de la classe Mouv pour le déplacement du robot&lt;br /&gt;
  &lt;br /&gt;
  class Mouv {&lt;br /&gt;
  &lt;br /&gt;
          Servo servo1;&lt;br /&gt;
          Servo servo2;&lt;br /&gt;
          int servo1Pin;&lt;br /&gt;
          int servo2Pin;&lt;br /&gt;
          &lt;br /&gt;
          int etatRotation;&lt;br /&gt;
          int etatSonar;&lt;br /&gt;
          int etatHall;&lt;br /&gt;
          int etatTsop;&lt;br /&gt;
          &lt;br /&gt;
          long intervalTsop;&lt;br /&gt;
          &lt;br /&gt;
          long intervalMouvement1;&lt;br /&gt;
          long intervalMouvement2;&lt;br /&gt;
          long intervalMouvement3;&lt;br /&gt;
          long intervalMouvement4;&lt;br /&gt;
          &lt;br /&gt;
          unsigned long lastMillis;&lt;br /&gt;
          &lt;br /&gt;
          &lt;br /&gt;
    public:&lt;br /&gt;
      Mouv(int pin1 , int pin2){&lt;br /&gt;
        servo1Pin= pin1;&lt;br /&gt;
        servo2Pin = pin2;&lt;br /&gt;
        &lt;br /&gt;
        etatRotation = 0;&lt;br /&gt;
        etatSonar = 0;&lt;br /&gt;
        etatHall = 0;&lt;br /&gt;
        etatTsop = 0;&lt;br /&gt;
        lastMillis = 0;&lt;br /&gt;
        &lt;br /&gt;
        intervalTsop = 500;&lt;br /&gt;
        &lt;br /&gt;
        intervalMouvement1 = 1500;&lt;br /&gt;
        intervalMouvement2 = 1700;&lt;br /&gt;
        intervalMouvement3 = 3200;&lt;br /&gt;
        intervalMouvement4 = 3400;&lt;br /&gt;
      }&lt;br /&gt;
    &lt;br /&gt;
      void attacher(){&lt;br /&gt;
        servo1.attach(servo1Pin);&lt;br /&gt;
        servo2.attach(servo2Pin);&lt;br /&gt;
      }&lt;br /&gt;
  &lt;br /&gt;
      void deplacement(int distanceObstacle , int tsop , int hall, int* attraper){&lt;br /&gt;
        unsigned long currentMillis = millis();&lt;br /&gt;
        &lt;br /&gt;
        if (hall == 1){&lt;br /&gt;
          etatHall = 1;&lt;br /&gt;
          *attraper = 1;&lt;br /&gt;
        }&lt;br /&gt;
        else if (distanceObstacle &amp;lt; 200){&lt;br /&gt;
          etatSonar = 1;&lt;br /&gt;
        }&lt;br /&gt;
        else if (tsop==1){&lt;br /&gt;
          etatTsop = 1;&lt;br /&gt;
          lastMillis = currentMillis;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        if (etatHall == 1){&lt;br /&gt;
          servo1.write(90);&lt;br /&gt;
          servo2.write(90);&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        else if (etatSonar ==1){&lt;br /&gt;
          if (etatRotation == 0){&lt;br /&gt;
            etatRotation = random(1,3);&lt;br /&gt;
          }&lt;br /&gt;
          if(etatRotation == 1){&lt;br /&gt;
            servo1.write(180);&lt;br /&gt;
            servo2.write(180);&lt;br /&gt;
          }&lt;br /&gt;
          else{&lt;br /&gt;
            servo1.write(0);&lt;br /&gt;
            servo2.write(0);&lt;br /&gt;
          }&lt;br /&gt;
          etatSonar = 0 ;&lt;br /&gt;
          lastMillis = currentMillis;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        else if (etatTsop == 1){&lt;br /&gt;
          if (etatRotation == 0){&lt;br /&gt;
            etatRotation = random(1,3);&lt;br /&gt;
          }&lt;br /&gt;
          &lt;br /&gt;
          if(etatRotation == 1){&lt;br /&gt;
            servo1.write(180);&lt;br /&gt;
            servo2.write(180);&lt;br /&gt;
          }&lt;br /&gt;
          else{&lt;br /&gt;
            servo1.write(0);&lt;br /&gt;
            servo2.write(0);&lt;br /&gt;
          }&lt;br /&gt;
          &lt;br /&gt;
          if (currentMillis - lastMillis &amp;gt;= intervalTsop){&lt;br /&gt;
            etatTsop = 0;&lt;br /&gt;
            lastMillis = currentMillis;&lt;br /&gt;
          }&lt;br /&gt;
        }   &lt;br /&gt;
        &lt;br /&gt;
        else{&lt;br /&gt;
          etatRotation = 0;&lt;br /&gt;
          if (currentMillis - lastMillis &amp;lt; intervalMouvement1){&lt;br /&gt;
            servo1.write(180);&lt;br /&gt;
            servo2.write(70);&lt;br /&gt;
          }&lt;br /&gt;
          else if ((currentMillis - lastMillis &amp;gt;= intervalMouvement2) &amp;amp;&amp;amp;  (currentMillis - lastMillis &amp;lt;= intervalMouvement3)){&lt;br /&gt;
            servo1.write(98);&lt;br /&gt;
            servo2.write(0);&lt;br /&gt;
          }&lt;br /&gt;
          else{&lt;br /&gt;
            servo1.write(180);&lt;br /&gt;
            servo2.write(0);&lt;br /&gt;
            if (currentMillis - lastMillis &amp;gt;= intervalMouvement4){&lt;br /&gt;
              lastMillis = currentMillis;&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;br /&gt;
  Mouv servo(SERVO1,SERVO2);&lt;br /&gt;
  &lt;br /&gt;
  //varibable pour le sonnar&lt;br /&gt;
  &lt;br /&gt;
  long lectureEcho;&lt;br /&gt;
  long distance;&lt;br /&gt;
  const float SOUND_SPEED = 340.0 / 1000;&lt;br /&gt;
  &lt;br /&gt;
  //varibable pour la sonde de hall&lt;br /&gt;
  &lt;br /&gt;
  int* attraper;&lt;br /&gt;
  &lt;br /&gt;
  //varibable pour les tsop&lt;br /&gt;
  &lt;br /&gt;
  unsigned long last_millis = 0; &lt;br /&gt;
  long interval = 500;&lt;br /&gt;
  &lt;br /&gt;
  int broche_reception1 = VCCIR1;&lt;br /&gt;
  IRrecv reception_ir1(broche_reception1);&lt;br /&gt;
  decode_results decode_ir1;&lt;br /&gt;
  &lt;br /&gt;
  int broche_reception2 = VCCIR2;&lt;br /&gt;
  IRrecv reception_ir2(broche_reception2);&lt;br /&gt;
  decode_results decode_ir2; &lt;br /&gt;
  &lt;br /&gt;
  //instance pour l'emmission infra-rouge&lt;br /&gt;
  &lt;br /&gt;
  IRsend emission_ir; &lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  void setup() {&lt;br /&gt;
    pinMode(TRIGG,OUTPUT);&lt;br /&gt;
    digitalWrite(TRIGG,0);&lt;br /&gt;
    pinMode(ECHO,INPUT); &lt;br /&gt;
    pinMode(IR,OUTPUT);&lt;br /&gt;
    digitalWrite(IR,1);&lt;br /&gt;
  &lt;br /&gt;
    servo.attacher();&lt;br /&gt;
    &lt;br /&gt;
    reception_ir1.enableIRIn(); // démarre la réception&lt;br /&gt;
    reception_ir2.enableIRIn();&lt;br /&gt;
    &lt;br /&gt;
    attraper = malloc(sizeof(int));&lt;br /&gt;
    *attraper = 0;&lt;br /&gt;
    &lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  void loop() {&lt;br /&gt;
    servo.deplacement(sonar(),tsop(attraper),hall(),attraper);  &lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  int sonar() {&lt;br /&gt;
    digitalWrite(TRIGG, 1);&lt;br /&gt;
    delayMicroseconds(10);&lt;br /&gt;
    digitalWrite(TRIGG,0);&lt;br /&gt;
    long measure = pulseIn(ECHO, HIGH);&lt;br /&gt;
    &lt;br /&gt;
    float distance_mm = measure / 2.0 * SOUND_SPEED;&lt;br /&gt;
    return distance_mm; &lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  int tsop(int * attraper ){&lt;br /&gt;
    unsigned long current_millis = millis();&lt;br /&gt;
    int etatTsop = 0;&lt;br /&gt;
    if ((current_millis - last_millis &amp;gt;= interval)&amp;amp;&amp;amp;(*attraper == 0)){&lt;br /&gt;
       emission_ir.sendNEC(1, 32); &lt;br /&gt;
       last_millis = current_millis; &lt;br /&gt;
       reception_ir1.enableIRIn();&lt;br /&gt;
       reception_ir2.enableIRIn();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    if (reception_ir1.decode(&amp;amp;decode_ir1)) &lt;br /&gt;
    { &lt;br /&gt;
      if(decode_ir1.value == 1){&lt;br /&gt;
        etatTsop = 1;&lt;br /&gt;
      }&lt;br /&gt;
  &lt;br /&gt;
      reception_ir1.resume();&lt;br /&gt;
      reception_ir2.enableIRIn();&lt;br /&gt;
    }&lt;br /&gt;
    if (reception_ir2.decode(&amp;amp;decode_ir2)) &lt;br /&gt;
    { &lt;br /&gt;
      if(decode_ir2.value == 1){&lt;br /&gt;
        etatTsop = 1;&lt;br /&gt;
      } &lt;br /&gt;
      reception_ir2.resume();  &lt;br /&gt;
      reception_ir1.enableIRIn();&lt;br /&gt;
    }&lt;br /&gt;
    return etatTsop;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  int hall(){&lt;br /&gt;
    int etatHall = 0;&lt;br /&gt;
    if(digitalRead(HALL) == 0){&lt;br /&gt;
      etatHall = 1;&lt;br /&gt;
    }&lt;br /&gt;
    return etatHall;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
=== Description de la structure du code ===&lt;br /&gt;
&lt;br /&gt;
==== Fonction sonar() ====&lt;br /&gt;
&lt;br /&gt;
Cette fonction permet au sonar de calculer la distance séparant le robot d'un obstacle.&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
  int sonar() {&lt;br /&gt;
    digitalWrite(TRIGG, 1);&lt;br /&gt;
    delayMicroseconds(10);&lt;br /&gt;
    digitalWrite(TRIGG,0);&lt;br /&gt;
    long measure = pulseIn(ECHO, HIGH);&lt;br /&gt;
    &lt;br /&gt;
    float distance_mm = measure / 2.0 * SOUND_SPEED;&lt;br /&gt;
    return distance_mm; &lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Fonction tsop()====&lt;br /&gt;
&lt;br /&gt;
Cette fonction a deux rôles. Le premier est de lire les entrées des tsop et de renvoyer si un prédateur a été détecter ou non. Le deuxième est d'émettre un signal infra-rouge permettant au prédateur de nous détecter.&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
  int tsop(int * attraper ){&lt;br /&gt;
    unsigned long current_millis = millis();&lt;br /&gt;
    int etatTsop = 0;&lt;br /&gt;
    if ((current_millis - last_millis &amp;gt;= interval)&amp;amp;&amp;amp;(*attraper == 0)){&lt;br /&gt;
       emission_ir.sendNEC(1, 32); &lt;br /&gt;
       last_millis = current_millis; &lt;br /&gt;
       reception_ir1.enableIRIn();&lt;br /&gt;
       reception_ir2.enableIRIn();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    if (reception_ir1.decode(&amp;amp;decode_ir1)) &lt;br /&gt;
    { &lt;br /&gt;
      if(decode_ir1.value == 1){&lt;br /&gt;
        etatTsop = 1;&lt;br /&gt;
      }&lt;br /&gt;
  &lt;br /&gt;
      reception_ir1.resume();&lt;br /&gt;
      reception_ir2.enableIRIn();&lt;br /&gt;
    }&lt;br /&gt;
    if (reception_ir2.decode(&amp;amp;decode_ir2)) &lt;br /&gt;
    { &lt;br /&gt;
      if(decode_ir2.value == 1){&lt;br /&gt;
        etatTsop = 1;&lt;br /&gt;
      } &lt;br /&gt;
      reception_ir2.resume();  &lt;br /&gt;
      reception_ir1.enableIRIn();&lt;br /&gt;
    }&lt;br /&gt;
    return etatTsop;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Les particularités de cette fonction sont que, premièrement pour facilité la programmation l'émission et la réception ont été mises dans la même fonction car elles demandent toutes les deux la même bibliothèque et les même timer, donc pour éviter tout conflit ceci fut une bonne solution. Deuxièmement, la fonction tsop() contient un pointeur en paramètre. Ce pointeur permet au robot de savoir s'il doit continuer à émettre ou non s'il est attrapé.&lt;br /&gt;
&lt;br /&gt;
L'émission du signal infra-rouge ici ce fait toute les 0.5s. En effet si les émissions sont trop proche il y a conflit avec la réception.&lt;br /&gt;
&lt;br /&gt;
==== Fonction hall()====&lt;br /&gt;
&lt;br /&gt;
Cette fonction permet de voir si un prédateur nous a détecté et attrapé grâce à l'émission d'une onde électromagnétique.&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
  int hall(){&lt;br /&gt;
    int etatHall = 0;&lt;br /&gt;
    if(digitalRead(HALL) == 0){&lt;br /&gt;
      etatHall = 1;&lt;br /&gt;
    }&lt;br /&gt;
    return etatHall;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Fonction deplacement() ====&lt;br /&gt;
&lt;br /&gt;
Pour le déplacement du robot nous avons choisi de créer un classe pour avoir un code plus propre et une fonction loop() ne contenant qu'une seul ligne de code.&lt;br /&gt;
&lt;br /&gt;
La Classe Mouv contient 2 fonctions. La première attacher() permet de lier les instances servo aux pins associées. Elle est appelée dans le setup(). La deuxième fonction est la fonction de déplacement appelée deplacement(). Cette fonction est la seule appelée de la fonction loop().&lt;br /&gt;
&lt;br /&gt;
Cette fonction est alors la fonction principale du robot, car c'est elle qui va décider du déplacement du robot en fonction des différentes entrées des capteurs. Elle contient en paramètre les différentes entrées du sonar, du tsop, de la sonde de hall, mais aussi un pointeur pour pouvoir sauvegarder en mémoire le fait que le robot soit attrapé ou non.&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
      void deplacement(int distanceObstacle , int tsop , int hall, int* attraper){&lt;br /&gt;
        unsigned long currentMillis = millis();&lt;br /&gt;
        &lt;br /&gt;
        if (hall == 1){&lt;br /&gt;
          etatHall = 1;&lt;br /&gt;
          *attraper = 1;&lt;br /&gt;
        }&lt;br /&gt;
        else if (distanceObstacle &amp;lt; 200){&lt;br /&gt;
          etatSonar = 1;&lt;br /&gt;
        }&lt;br /&gt;
        else if (tsop==1){&lt;br /&gt;
          etatTsop = 1;&lt;br /&gt;
          lastMillis = currentMillis;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        if (etatHall == 1){&lt;br /&gt;
          servo1.write(90);&lt;br /&gt;
          servo2.write(90);&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        else if (etatSonar ==1){&lt;br /&gt;
          if (etatRotation == 0){&lt;br /&gt;
            etatRotation = random(1,3);&lt;br /&gt;
          }&lt;br /&gt;
          if(etatRotation == 1){&lt;br /&gt;
            servo1.write(180);&lt;br /&gt;
            servo2.write(180);&lt;br /&gt;
          }&lt;br /&gt;
          else{&lt;br /&gt;
            servo1.write(0);&lt;br /&gt;
            servo2.write(0);&lt;br /&gt;
          }&lt;br /&gt;
          etatSonnar = 0 ;&lt;br /&gt;
          lastMillis = currentMillis;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        else if (etatTsop == 1){&lt;br /&gt;
          if (etatRotation == 0){&lt;br /&gt;
            etatRotation = random(1,3);&lt;br /&gt;
          }&lt;br /&gt;
          &lt;br /&gt;
          if(etatRotation == 1){&lt;br /&gt;
            servo1.write(180);&lt;br /&gt;
            servo2.write(180);&lt;br /&gt;
          }&lt;br /&gt;
          else{&lt;br /&gt;
            servo1.write(0);&lt;br /&gt;
            servo2.write(0);&lt;br /&gt;
          }&lt;br /&gt;
          &lt;br /&gt;
          if (currentMillis - lastMillis &amp;gt;= intervalTsop){&lt;br /&gt;
            etatTsop = 0;&lt;br /&gt;
            lastMillis = currentMillis;&lt;br /&gt;
          }&lt;br /&gt;
        }   &lt;br /&gt;
        &lt;br /&gt;
        else{&lt;br /&gt;
          etatRotation = 0;&lt;br /&gt;
          if (currentMillis - lastMillis &amp;lt; intervalMouvement1){&lt;br /&gt;
            servo1.write(180);&lt;br /&gt;
            servo2.write(70);&lt;br /&gt;
          }&lt;br /&gt;
          else if ((currentMillis - lastMillis &amp;gt;= intervalMouvement2) &amp;amp;&amp;amp;  (currentMillis - lastMillis &amp;lt;= intervalMouvement3)){&lt;br /&gt;
            servo1.write(98);&lt;br /&gt;
            servo2.write(0);&lt;br /&gt;
          }&lt;br /&gt;
          else{&lt;br /&gt;
            servo1.write(180);&lt;br /&gt;
            servo2.write(0);&lt;br /&gt;
            if (currentMillis - lastMillis &amp;gt;= intervalMouvement4){&lt;br /&gt;
              lastMillis = currentMillis;&lt;br /&gt;
            }&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Cette fonction est divisée en deux partie. La première est la distribution des états du robot en fonction des entrées. Par la suite, la fonction va décidé quel déplacement faire en fonction des priorités des différents états. L'états le plus prioritaire est l'états etatHall. Celui ci indique si le robot est attrapé et une fois passé à 1 il ne peut plus changer et le déplacement associé est un sur-place pour le robot. Après il y a l'état associé au obstacle et si la distance devient inférieur à celle écrite, le robot tourne sur lui même dans une direction aléatoire jusqu'à ne plus percevoir d'obstacle. Le suivant est celui de la détection de prédateur. Ici si un prédateur est détectée, Quireekoo va aussi ce tourner dans une direction aléatoire. Mais la différence c'est que ici il va tourner pendant un certain intervalle de temps rentré dans le code. Le dernier déplacement n'est exécuter seulement si aucun des trois autres n'est fait. C'est le déplacement de base du robot. Ce déplacement est juste en zigzag.&lt;br /&gt;
&lt;br /&gt;
=== Les difficultés rencontrées ===&lt;br /&gt;
&lt;br /&gt;
Une grand difficulté lors de la programmation de Quireekoo fut l’émission et la réception infra-rouge. En effet la première idée pour l'émission était de juste allumer et éteindre la led infra-rouge à un fréquence de 38 kHz avec les intervalles de temps précis comme utilisé ici pour d'autre fonction avec les currentMillis et lastMillis. Les tsop réagissaient bien à l'émission. Le problème est que si l'on rajoutais des fonctions comme le déplacement ou le sonar, le temps d'arriver jusqu'à l'émission l'intervalle de temps qui permettait une fréquence de 38 kHz était dépassé. &lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
  void allumer()&lt;br /&gt;
  {&lt;br /&gt;
    // check to see if it's time to change the state of the LED&lt;br /&gt;
    unsigned long currentMicros = micros();&lt;br /&gt;
     &lt;br /&gt;
    if((ledState == HIGH) &amp;amp;&amp;amp; (currentMicros - previousMicros &amp;gt;= OnTime))&lt;br /&gt;
    {&lt;br /&gt;
      ledState = LOW;  // Turn it off&lt;br /&gt;
      previousMicros = currentMicros;  // Remember the time&lt;br /&gt;
      digitalWrite(ledPin, ledState);  // Update the actual LED&lt;br /&gt;
    }&lt;br /&gt;
    else if ((ledState == LOW) &amp;amp;&amp;amp; (currentMicros - previousMicros &amp;gt;= OffTime))&lt;br /&gt;
    {&lt;br /&gt;
      ledState = HIGH;  // turn it on&lt;br /&gt;
      previousMicros = currentMicros;   // Remember the time&lt;br /&gt;
      digitalWrite(ledPin, ledState);   // Update the actual LED&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
Une solution fur de passer directement par les interruptions timer. Mais deux problèmes ce sont encore révélés. Le premier était que tout les timer étaient déjà utilisé par la bibliothèque servo.h, donc impossible de faire les interruptions. De plus avec cette façon de faire ou la précédente, il était impossible de faire passer un message à travers l'émission, donc impossible de différencier une proie d'un prédateur.&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
    // initialize timer1 &lt;br /&gt;
    noInterrupts();           // disable all interrupts&lt;br /&gt;
    TCCR5A = 0;&lt;br /&gt;
    TCCR5B = 0;&lt;br /&gt;
    TCNT5  = 0;&lt;br /&gt;
  &lt;br /&gt;
    OCR5A = 421;            // compare match register 16MHz/256/2Hz&lt;br /&gt;
    TCCR5B |= (1 &amp;lt;&amp;lt; WGM52);   // CTC mode&lt;br /&gt;
    TCCR5B |= (1 &amp;lt;&amp;lt; CS50);    // 256 prescaler &lt;br /&gt;
    TIMSK5 |= (1 &amp;lt;&amp;lt; OCIE5A);  // enable timer compare interrupt&lt;br /&gt;
    interrupts();             // enable all interrupts&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  ISR(TIMER5_COMPA_vect)          // timer compare interrupt service routine&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(ledPin, digitalRead(ledPin) ^ 1);   // toggle LED pin&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Nous en sommes arrivé à utiliser la bibliothèque IRremote.h. Avec cette bibliothèque, l'émission et la réception infra-rouge ce fait très simplement si elles sont séparées. Mais les applications utilisant les même timer, il y a alors conflit pour faire fonctionner les deux en même temps. Cela nous a pris du temps pour trouver une solution car aucune information n'a pu être trouvé sur le web. Le problème était que si nous faisions une émission, les timer de la réception était annulé. Il fallait alors les ré-allouer pour la réception après l'émission avec le ligne de code: reception_ir1.enableIRIn();.&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
 if ((current_millis - last_millis &amp;gt;= interval)&amp;amp;&amp;amp;(*attraper == 0)){&lt;br /&gt;
       emission_ir.sendNEC(1, 32); &lt;br /&gt;
       last_millis = current_millis; &lt;br /&gt;
       reception_ir1.enableIRIn();&lt;br /&gt;
       reception_ir2.enableIRIn();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Cette solution a alors été partagée avec les autres groupes qui avaient besoin d'émettre et de réceptionner un signal.&lt;br /&gt;
&lt;br /&gt;
= Nos erreurs lors du projet =&lt;br /&gt;
&lt;br /&gt;
Au cours de ce projet nous avons fait quelque erreurs. Nous avons alors appris de ces erreurs et allons les décrire.&lt;br /&gt;
&lt;br /&gt;
== Erreur lors de la création du circuit imprimé ==&lt;br /&gt;
&lt;br /&gt;
Pour ce projet nous voulions faire tout le robot par nous même. Nous avons aussi refait le PCB en prenant comme exemple celui donner sur la page du projet qui est aussi celui affiché plus haut. Lorsque nous avions recopié le schéma, nous avons vu le leds de contrôle et avons décidé de les supprimer de notre circuit en pensant qu'elle ne servirait à rien. Ceci fut alors une grande erreur. Car lorsque nous avons reçu le circuit et que nous avons commencé à souder les composants, faire des tests pour savoir si les composant fonctionnaient comme il fallait ou de savoir si les soudures étaient bien faites devint très compliqué. Par chance aucun gros problème majeur n'a été trouvé. Nous savons maintenant que l'utilisation de led de contrôle est primordiale lors de la création de prototype.&lt;br /&gt;
&lt;br /&gt;
== Erreur lors de la création de la structure ==&lt;br /&gt;
&lt;br /&gt;
Quelques problèmes mineurs ont été rencontrés. Lors de la création des trous pour faire rentrer les tsop, le sonar et la sonde de hall, nous avions pris les mesures de la longueurs de pins mais la mesure précise. De ce fait, sans une petite marge de distance, les fils ne passaient pas. Nous avons alors juste limé un peu et le problème fut résolu.&lt;br /&gt;
&lt;br /&gt;
De plus nous n'avions pas prévu de trous ou autres solutions pour maintenir la batterie avec les piles. Nous l'avons alors attachée avec des élastiques. Cela fonctionne mais rend la rend inaccessible.&lt;br /&gt;
&lt;br /&gt;
Nous remercions aussi Vincent de nous avoir passé un des ces supports pour les servos-moteurs, car sans nous nous demandons comment nous aurions pu les attacher.&lt;br /&gt;
&lt;br /&gt;
== Erreur de conception ==&lt;br /&gt;
&lt;br /&gt;
Lorsque nous avons commencé à penser au projet, nous avons pensé à faire un robot le plus petit possible pour être le plus dur à attraper. Pour cela, nous avions décidé d'utiliser des servos-moteurs pour le déplacement. Nous pensions que la vitesse de rotation était suffisante pour avoir un robot plutôt rapide. La vitesse n'est alors pas si lente que ça mais nous nous attendions à mieux. Une question vient alors ce poser: aurait-il mieux fallut mettre des moteurs et non des servos-moteurs? Le défauts des moteurs est que ceci prennent alors plus de place et donc le robot n'est plus aussi petit que la taille voulut au départ. Nous avons alors conclut que les servos-moteurs restaient alors la meilleur solution pour le déplacement.&lt;br /&gt;
&lt;br /&gt;
= Conclusion =&lt;br /&gt;
&lt;br /&gt;
Nous sommes très content d'avoir fait ce projet et de l'avoir fini dans les temps. Quireekoo fonctionne très bien et est comme nous voulions le concevoir à l'origine.&lt;/div&gt;</summary>
		<author><name>Dtillaux</name></author>	</entry>

	<entry>
		<id>https://peip-ima.plil.fr/mediawiki/index.php?title=Binome2017-9&amp;diff=9626</id>
		<title>Binome2017-9</title>
		<link rel="alternate" type="text/html" href="https://peip-ima.plil.fr/mediawiki/index.php?title=Binome2017-9&amp;diff=9626"/>
				<updated>2018-05-05T15:40:45Z</updated>
		
		<summary type="html">&lt;p&gt;Dtillaux : /* Nos erreurs lors du projet */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Binôme 9 saison 8: Raphaël Bonvalet, Damien Tillaux.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Projet Quireekoo =&lt;br /&gt;
&lt;br /&gt;
Le but du projet Quireekoo est de créer un robot communiquant avec d'autre via infra-rouge. Ce projet à eu lieux lors des bureaux d'étude de PEIP en IMA au S4 2018 de notre cursus pour devenir ingénieur. Voici la transcription phonétique de Quireekoo: /Kirikou/.&lt;br /&gt;
&lt;br /&gt;
= Cahier des charges =&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Kiki.jpg|middle]]&lt;br /&gt;
&lt;br /&gt;
Quireekoo sera un robot fait de A à Z. Le circuit imprimé sera totalement revu et sera guidé grâce à une ATMEGA-328. Le physique sera totalement design par nous même et son programme sera totalement autonome.&lt;br /&gt;
&lt;br /&gt;
Quireekoo étant petit et vaillant est un véhicule de petite taille. A la défaut de jambe, Quireekoo ce déplace avec 2 servos moteurs continue. A la place des yeux, un sonar pour éviter ses obstacles et ne pas trébucher. Pour ses oreilles nous avons prévu 2 Tsop38238 pour pouvoir repérer et fuir ses ennemis.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Réalisation du projet =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Voici les différentes étapes par lesquels nous sommes passer lors de la création de Quireekoo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Réalisation de PCB ==&lt;br /&gt;
&lt;br /&gt;
=== Idée principale ===&lt;br /&gt;
&lt;br /&gt;
Nous voulions refaire nous même le PCB de Quireekoo mais nous n'avions pratiquement aucune base sur comment créer un circuit imprimé pour ce genre de projet. Du coups nous avons pris comme modèle, le modèle donnée sur la page principale du projet. ([https://peip-ima.plil.fr/mediawiki/index.php/BE_2017-2018 BE 2017-2018])&lt;br /&gt;
&lt;br /&gt;
Voici le schématique sur lequel nous nous sommes basé.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:RobotPCB schem.png|500px|thumb||left|Schématique original]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Notre PCB ===&lt;br /&gt;
&lt;br /&gt;
Notre PCB a été réalisé sur Fritzing. Nous avons créer ce circuit imprimé à notre image pour notre véhicule. Nous avons enlevé le driver de moteur et les sorties moteurs car nous voulions un robot de petite taille. Donc le moyen de déplacement choisi a alors été le servo-moteur. Pour les réceptions infra-rouge nous n'avons prévu que deux sorties pour des Tsop pour pouvoir laisser un plus grande chance au chasseur de ne pas être repéré, pour une approche plus vrai que nature. Pour savoir si un chasseur nous a attrapé, nous utilisons une sonde de Hall.&lt;br /&gt;
&lt;br /&gt;
De plus, en cas de problème nous avons créé toutes les sorties du microcontrôleur. Si un problème apparaît sur une des pins utilisées, nous pourrons la relocaliser sur une autre sortie.&lt;br /&gt;
&lt;br /&gt;
Un objectif supplémentaire était de réaliser un PCB le plus petit possible pour que le véhicule le soit aussi. Ce fut presque un succès, la carte est d'une taille environ de 5cm*5cm. Elle aurait pu être encore plus petite avec plus de travail mais nous ne pouvions pas nous le permettre si nous voulions tout faire.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Voici le schématique et le PCB de Quireekoo.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Quireekoo schem.png|500px|thumb|left|Schématique de Quireekoo]]&lt;br /&gt;
[[Fichier:Quireekoo pcb.png|500px|thumb|right|PCB de Quireekoo]]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Réalisation de la partie mécanique du véhicule ==&lt;br /&gt;
&lt;br /&gt;
Pour la partie mécanique de Quireekoo on a choisi de le faire sur inkscape afin de pouvoir effectuer une découpe laser. Le robot est composé de deux plaques de plexiglas, une pour le châssis où il y a les servos moteur, la bille et le bloc de pile, et une pour placer le sonar, le circuit imprimée, les Tsop et la sonde de hall. &lt;br /&gt;
&lt;br /&gt;
Voici à quoi ressemble la partie du bas sur inkscape : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Partie bas.jpg|700px|]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour la partie du haut c'était un peu plus compliqué car il fallait trouver comment placer les tsop, la sonde de hall et le sonar. Pour pouvoir fixer ceux-ci on a choisi de faire des trous en forme de rectangles avec une taille égale à la taille des pins de chaque capteurs différents. Après il fallait aussi mettre les trous pour fixer le circuit imprimé au même endroit que ceux qui se trouve sur celui-ci. Pour ce faire, on a utilisé le fichier .svg donné par Fritzing. On a également mis des trous en forme de rectangle sur les côtés pour pouvoir laisser passer les fils.&lt;br /&gt;
&lt;br /&gt;
Voici à quoi ressemble la partie du haut sur inkscape :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Partie haut.png|700px|]]&lt;br /&gt;
&lt;br /&gt;
Pour finir il nous restait les roues à faire. On a opté pour garder les roues données avec les servos moteurs en y rajoutant des partie en plexiglas au pistolet à colle pour rendre celles-ci plus grandes.&lt;br /&gt;
&lt;br /&gt;
Voici à quoi cela ressemble sur inkscape : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Roue.png|200px|]]&lt;br /&gt;
&lt;br /&gt;
Le problème avec cette solution c'est que les roues ne sont pas adhérentes. De ce fait là, on a ajouté une partie d'élastique autour avec de la colle glue.&lt;br /&gt;
&lt;br /&gt;
Voici a quoi le robot ressemble à la fin :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Quireekoo.jpg|200px|]]&lt;br /&gt;
&lt;br /&gt;
== Réalisation du code Arduino ==&lt;br /&gt;
&lt;br /&gt;
Voici maintenant la présentation du code téléversé dans Quireekoo.&lt;br /&gt;
&lt;br /&gt;
=== Le code ===&lt;br /&gt;
&lt;br /&gt;
{  &lt;br /&gt;
  #include &amp;lt;Servo.h&amp;gt;&lt;br /&gt;
  #include &amp;lt;IRremote.h&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  //déclaration des différentes pins&lt;br /&gt;
  &lt;br /&gt;
  #define SERVO1 11&lt;br /&gt;
  #define SERVO2 13&lt;br /&gt;
  #define ECHO 17&lt;br /&gt;
  #define TRIGG 18&lt;br /&gt;
  #define HALL A2&lt;br /&gt;
  #define IR 2&lt;br /&gt;
  #define VCCIR1 A0&lt;br /&gt;
  #define VCCIR2 A1&lt;br /&gt;
  &lt;br /&gt;
  //création de la classe Mouv pour le déplacement du robot&lt;br /&gt;
  &lt;br /&gt;
  class Mouv {&lt;br /&gt;
  &lt;br /&gt;
          Servo servo1;&lt;br /&gt;
          Servo servo2;&lt;br /&gt;
          int servo1Pin;&lt;br /&gt;
          int servo2Pin;&lt;br /&gt;
          &lt;br /&gt;
          int etatRotation;&lt;br /&gt;
          int etatSonar;&lt;br /&gt;
          int etatHall;&lt;br /&gt;
          int etatTsop;&lt;br /&gt;
          &lt;br /&gt;
          long intervalTsop;&lt;br /&gt;
          &lt;br /&gt;
          long intervalMouvement1;&lt;br /&gt;
          long intervalMouvement2;&lt;br /&gt;
          long intervalMouvement3;&lt;br /&gt;
          long intervalMouvement4;&lt;br /&gt;
          &lt;br /&gt;
          unsigned long lastMillis;&lt;br /&gt;
          &lt;br /&gt;
          &lt;br /&gt;
    public:&lt;br /&gt;
      Mouv(int pin1 , int pin2){&lt;br /&gt;
        servo1Pin= pin1;&lt;br /&gt;
        servo2Pin = pin2;&lt;br /&gt;
        &lt;br /&gt;
        etatRotation = 0;&lt;br /&gt;
        etatSonar = 0;&lt;br /&gt;
        etatHall = 0;&lt;br /&gt;
        etatTsop = 0;&lt;br /&gt;
        lastMillis = 0;&lt;br /&gt;
        &lt;br /&gt;
        intervalTsop = 500;&lt;br /&gt;
        &lt;br /&gt;
        intervalMouvement1 = 1500;&lt;br /&gt;
        intervalMouvement2 = 1700;&lt;br /&gt;
        intervalMouvement3 = 3200;&lt;br /&gt;
        intervalMouvement4 = 3400;&lt;br /&gt;
      }&lt;br /&gt;
    &lt;br /&gt;
      void attacher(){&lt;br /&gt;
        servo1.attach(servo1Pin);&lt;br /&gt;
        servo2.attach(servo2Pin);&lt;br /&gt;
      }&lt;br /&gt;
  &lt;br /&gt;
      void deplacement(int distanceObstacle , int tsop , int hall, int* attraper){&lt;br /&gt;
        unsigned long currentMillis = millis();&lt;br /&gt;
        &lt;br /&gt;
        if (hall == 1){&lt;br /&gt;
          etatHall = 1;&lt;br /&gt;
          *attraper = 1;&lt;br /&gt;
        }&lt;br /&gt;
        else if (distanceObstacle &amp;lt; 200){&lt;br /&gt;
          etatSonar = 1;&lt;br /&gt;
        }&lt;br /&gt;
        else if (tsop==1){&lt;br /&gt;
          etatTsop = 1;&lt;br /&gt;
          lastMillis = currentMillis;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        if (etatHall == 1){&lt;br /&gt;
          servo1.write(90);&lt;br /&gt;
          servo2.write(90);&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        else if (etatSonar ==1){&lt;br /&gt;
          if (etatRotation == 0){&lt;br /&gt;
            etatRotation = random(1,3);&lt;br /&gt;
          }&lt;br /&gt;
          if(etatRotation == 1){&lt;br /&gt;
            servo1.write(180);&lt;br /&gt;
            servo2.write(180);&lt;br /&gt;
          }&lt;br /&gt;
          else{&lt;br /&gt;
            servo1.write(0);&lt;br /&gt;
            servo2.write(0);&lt;br /&gt;
          }&lt;br /&gt;
          etatSonar = 0 ;&lt;br /&gt;
          lastMillis = currentMillis;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        else if (etatTsop == 1){&lt;br /&gt;
          if (etatRotation == 0){&lt;br /&gt;
            etatRotation = random(1,3);&lt;br /&gt;
          }&lt;br /&gt;
          &lt;br /&gt;
          if(etatRotation == 1){&lt;br /&gt;
            servo1.write(180);&lt;br /&gt;
            servo2.write(180);&lt;br /&gt;
          }&lt;br /&gt;
          else{&lt;br /&gt;
            servo1.write(0);&lt;br /&gt;
            servo2.write(0);&lt;br /&gt;
          }&lt;br /&gt;
          &lt;br /&gt;
          if (currentMillis - lastMillis &amp;gt;= intervalTsop){&lt;br /&gt;
            etatTsop = 0;&lt;br /&gt;
            lastMillis = currentMillis;&lt;br /&gt;
          }&lt;br /&gt;
        }   &lt;br /&gt;
        &lt;br /&gt;
        else{&lt;br /&gt;
          etatRotation = 0;&lt;br /&gt;
          if (currentMillis - lastMillis &amp;lt; intervalMouvement1){&lt;br /&gt;
            servo1.write(180);&lt;br /&gt;
            servo2.write(70);&lt;br /&gt;
          }&lt;br /&gt;
          else if ((currentMillis - lastMillis &amp;gt;= intervalMouvement2) &amp;amp;&amp;amp;  (currentMillis - lastMillis &amp;lt;= intervalMouvement3)){&lt;br /&gt;
            servo1.write(98);&lt;br /&gt;
            servo2.write(0);&lt;br /&gt;
          }&lt;br /&gt;
          else{&lt;br /&gt;
            servo1.write(180);&lt;br /&gt;
            servo2.write(0);&lt;br /&gt;
            if (currentMillis - lastMillis &amp;gt;= intervalMouvement4){&lt;br /&gt;
              lastMillis = currentMillis;&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;br /&gt;
  Mouv servo(SERVO1,SERVO2);&lt;br /&gt;
  &lt;br /&gt;
  //varibable pour le sonnar&lt;br /&gt;
  &lt;br /&gt;
  long lectureEcho;&lt;br /&gt;
  long distance;&lt;br /&gt;
  const float SOUND_SPEED = 340.0 / 1000;&lt;br /&gt;
  &lt;br /&gt;
  //varibable pour la sonde de hall&lt;br /&gt;
  &lt;br /&gt;
  int* attraper;&lt;br /&gt;
  &lt;br /&gt;
  //varibable pour les tsop&lt;br /&gt;
  &lt;br /&gt;
  unsigned long last_millis = 0; &lt;br /&gt;
  long interval = 500;&lt;br /&gt;
  &lt;br /&gt;
  int broche_reception1 = VCCIR1;&lt;br /&gt;
  IRrecv reception_ir1(broche_reception1);&lt;br /&gt;
  decode_results decode_ir1;&lt;br /&gt;
  &lt;br /&gt;
  int broche_reception2 = VCCIR2;&lt;br /&gt;
  IRrecv reception_ir2(broche_reception2);&lt;br /&gt;
  decode_results decode_ir2; &lt;br /&gt;
  &lt;br /&gt;
  //instance pour l'emmission infra-rouge&lt;br /&gt;
  &lt;br /&gt;
  IRsend emission_ir; &lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  void setup() {&lt;br /&gt;
    pinMode(TRIGG,OUTPUT);&lt;br /&gt;
    digitalWrite(TRIGG,0);&lt;br /&gt;
    pinMode(ECHO,INPUT); &lt;br /&gt;
    pinMode(IR,OUTPUT);&lt;br /&gt;
    digitalWrite(IR,1);&lt;br /&gt;
  &lt;br /&gt;
    servo.attacher();&lt;br /&gt;
    &lt;br /&gt;
    reception_ir1.enableIRIn(); // démarre la réception&lt;br /&gt;
    reception_ir2.enableIRIn();&lt;br /&gt;
    &lt;br /&gt;
    attraper = malloc(sizeof(int));&lt;br /&gt;
    *attraper = 0;&lt;br /&gt;
    &lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  void loop() {&lt;br /&gt;
    servo.deplacement(sonar(),tsop(attraper),hall(),attraper);  &lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  int sonar() {&lt;br /&gt;
    digitalWrite(TRIGG, 1);&lt;br /&gt;
    delayMicroseconds(10);&lt;br /&gt;
    digitalWrite(TRIGG,0);&lt;br /&gt;
    long measure = pulseIn(ECHO, HIGH);&lt;br /&gt;
    &lt;br /&gt;
    float distance_mm = measure / 2.0 * SOUND_SPEED;&lt;br /&gt;
    return distance_mm; &lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  int tsop(int * attraper ){&lt;br /&gt;
    unsigned long current_millis = millis();&lt;br /&gt;
    int etatTsop = 0;&lt;br /&gt;
    if ((current_millis - last_millis &amp;gt;= interval)&amp;amp;&amp;amp;(*attraper == 0)){&lt;br /&gt;
       emission_ir.sendNEC(1, 32); &lt;br /&gt;
       last_millis = current_millis; &lt;br /&gt;
       reception_ir1.enableIRIn();&lt;br /&gt;
       reception_ir2.enableIRIn();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    if (reception_ir1.decode(&amp;amp;decode_ir1)) &lt;br /&gt;
    { &lt;br /&gt;
      if(decode_ir1.value == 1){&lt;br /&gt;
        etatTsop = 1;&lt;br /&gt;
      }&lt;br /&gt;
  &lt;br /&gt;
      reception_ir1.resume();&lt;br /&gt;
      reception_ir2.enableIRIn();&lt;br /&gt;
    }&lt;br /&gt;
    if (reception_ir2.decode(&amp;amp;decode_ir2)) &lt;br /&gt;
    { &lt;br /&gt;
      if(decode_ir2.value == 1){&lt;br /&gt;
        etatTsop = 1;&lt;br /&gt;
      } &lt;br /&gt;
      reception_ir2.resume();  &lt;br /&gt;
      reception_ir1.enableIRIn();&lt;br /&gt;
    }&lt;br /&gt;
    return etatTsop;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  int hall(){&lt;br /&gt;
    int etatHall = 0;&lt;br /&gt;
    if(digitalRead(HALL) == 0){&lt;br /&gt;
      etatHall = 1;&lt;br /&gt;
    }&lt;br /&gt;
    return etatHall;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
=== Description de la structure du code ===&lt;br /&gt;
&lt;br /&gt;
==== Fonction sonar() ====&lt;br /&gt;
&lt;br /&gt;
Cette fonction permet au sonar de calculer la distance séparant le robot d'un obstacle.&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
  int sonar() {&lt;br /&gt;
    digitalWrite(TRIGG, 1);&lt;br /&gt;
    delayMicroseconds(10);&lt;br /&gt;
    digitalWrite(TRIGG,0);&lt;br /&gt;
    long measure = pulseIn(ECHO, HIGH);&lt;br /&gt;
    &lt;br /&gt;
    float distance_mm = measure / 2.0 * SOUND_SPEED;&lt;br /&gt;
    return distance_mm; &lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Fonction tsop()====&lt;br /&gt;
&lt;br /&gt;
Cette fonction a deux rôles. Le premier est de lire les entrées des tsop et de renvoyer si un prédateur a été détecter ou non. Le deuxième est d'émettre un signal infra-rouge permettant au prédateur de nous détecter.&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
  int tsop(int * attraper ){&lt;br /&gt;
    unsigned long current_millis = millis();&lt;br /&gt;
    int etatTsop = 0;&lt;br /&gt;
    if ((current_millis - last_millis &amp;gt;= interval)&amp;amp;&amp;amp;(*attraper == 0)){&lt;br /&gt;
       emission_ir.sendNEC(1, 32); &lt;br /&gt;
       last_millis = current_millis; &lt;br /&gt;
       reception_ir1.enableIRIn();&lt;br /&gt;
       reception_ir2.enableIRIn();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    if (reception_ir1.decode(&amp;amp;decode_ir1)) &lt;br /&gt;
    { &lt;br /&gt;
      if(decode_ir1.value == 1){&lt;br /&gt;
        etatTsop = 1;&lt;br /&gt;
      }&lt;br /&gt;
  &lt;br /&gt;
      reception_ir1.resume();&lt;br /&gt;
      reception_ir2.enableIRIn();&lt;br /&gt;
    }&lt;br /&gt;
    if (reception_ir2.decode(&amp;amp;decode_ir2)) &lt;br /&gt;
    { &lt;br /&gt;
      if(decode_ir2.value == 1){&lt;br /&gt;
        etatTsop = 1;&lt;br /&gt;
      } &lt;br /&gt;
      reception_ir2.resume();  &lt;br /&gt;
      reception_ir1.enableIRIn();&lt;br /&gt;
    }&lt;br /&gt;
    return etatTsop;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Les particularités de cette fonction sont que, premièrement pour facilité la programmation l'émission et la réception ont été mises dans la même fonction car elles demandent toutes les deux la même bibliothèque et les même timer, donc pour éviter tout conflit ceci fut une bonne solution. Deuxièmement, la fonction tsop() contient un pointeur en paramètre. Ce pointeur permet au robot de savoir s'il doit continuer à émettre ou non s'il est attrapé.&lt;br /&gt;
&lt;br /&gt;
L'émission du signal infra-rouge ici ce fait toute les 0.5s. En effet si les émissions sont trop proche il y a conflit avec la réception.&lt;br /&gt;
&lt;br /&gt;
==== Fonction hall()====&lt;br /&gt;
&lt;br /&gt;
Cette fonction permet de voir si un prédateur nous a détecté et attrapé grâce à l'émission d'une onde électromagnétique.&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
  int hall(){&lt;br /&gt;
    int etatHall = 0;&lt;br /&gt;
    if(digitalRead(HALL) == 0){&lt;br /&gt;
      etatHall = 1;&lt;br /&gt;
    }&lt;br /&gt;
    return etatHall;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Fonction deplacement() ====&lt;br /&gt;
&lt;br /&gt;
Pour le déplacement du robot nous avons choisi de créer un classe pour avoir un code plus propre et une fonction loop() ne contenant qu'une seul ligne de code.&lt;br /&gt;
&lt;br /&gt;
La Classe Mouv contient 2 fonctions. La première attacher() permet de lier les instances servo aux pins associées. Elle est appelée dans le setup(). La deuxième fonction est la fonction de déplacement appelée deplacement(). Cette fonction est la seule appelée de la fonction loop().&lt;br /&gt;
&lt;br /&gt;
Cette fonction est alors la fonction principale du robot, car c'est elle qui va décider du déplacement du robot en fonction des différentes entrées des capteurs. Elle contient en paramètre les différentes entrées du sonar, du tsop, de la sonde de hall, mais aussi un pointeur pour pouvoir sauvegarder en mémoire le fait que le robot soit attrapé ou non.&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
      void deplacement(int distanceObstacle , int tsop , int hall, int* attraper){&lt;br /&gt;
        unsigned long currentMillis = millis();&lt;br /&gt;
        &lt;br /&gt;
        if (hall == 1){&lt;br /&gt;
          etatHall = 1;&lt;br /&gt;
          *attraper = 1;&lt;br /&gt;
        }&lt;br /&gt;
        else if (distanceObstacle &amp;lt; 200){&lt;br /&gt;
          etatSonar = 1;&lt;br /&gt;
        }&lt;br /&gt;
        else if (tsop==1){&lt;br /&gt;
          etatTsop = 1;&lt;br /&gt;
          lastMillis = currentMillis;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        if (etatHall == 1){&lt;br /&gt;
          servo1.write(90);&lt;br /&gt;
          servo2.write(90);&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        else if (etatSonar ==1){&lt;br /&gt;
          if (etatRotation == 0){&lt;br /&gt;
            etatRotation = random(1,3);&lt;br /&gt;
          }&lt;br /&gt;
          if(etatRotation == 1){&lt;br /&gt;
            servo1.write(180);&lt;br /&gt;
            servo2.write(180);&lt;br /&gt;
          }&lt;br /&gt;
          else{&lt;br /&gt;
            servo1.write(0);&lt;br /&gt;
            servo2.write(0);&lt;br /&gt;
          }&lt;br /&gt;
          etatSonnar = 0 ;&lt;br /&gt;
          lastMillis = currentMillis;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        else if (etatTsop == 1){&lt;br /&gt;
          if (etatRotation == 0){&lt;br /&gt;
            etatRotation = random(1,3);&lt;br /&gt;
          }&lt;br /&gt;
          &lt;br /&gt;
          if(etatRotation == 1){&lt;br /&gt;
            servo1.write(180);&lt;br /&gt;
            servo2.write(180);&lt;br /&gt;
          }&lt;br /&gt;
          else{&lt;br /&gt;
            servo1.write(0);&lt;br /&gt;
            servo2.write(0);&lt;br /&gt;
          }&lt;br /&gt;
          &lt;br /&gt;
          if (currentMillis - lastMillis &amp;gt;= intervalTsop){&lt;br /&gt;
            etatTsop = 0;&lt;br /&gt;
            lastMillis = currentMillis;&lt;br /&gt;
          }&lt;br /&gt;
        }   &lt;br /&gt;
        &lt;br /&gt;
        else{&lt;br /&gt;
          etatRotation = 0;&lt;br /&gt;
          if (currentMillis - lastMillis &amp;lt; intervalMouvement1){&lt;br /&gt;
            servo1.write(180);&lt;br /&gt;
            servo2.write(70);&lt;br /&gt;
          }&lt;br /&gt;
          else if ((currentMillis - lastMillis &amp;gt;= intervalMouvement2) &amp;amp;&amp;amp;  (currentMillis - lastMillis &amp;lt;= intervalMouvement3)){&lt;br /&gt;
            servo1.write(98);&lt;br /&gt;
            servo2.write(0);&lt;br /&gt;
          }&lt;br /&gt;
          else{&lt;br /&gt;
            servo1.write(180);&lt;br /&gt;
            servo2.write(0);&lt;br /&gt;
            if (currentMillis - lastMillis &amp;gt;= intervalMouvement4){&lt;br /&gt;
              lastMillis = currentMillis;&lt;br /&gt;
            }&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Cette fonction est divisée en deux partie. La première est la distribution des états du robot en fonction des entrées. Par la suite, la fonction va décidé quel déplacement faire en fonction des priorités des différents états. L'états le plus prioritaire est l'états etatHall. Celui ci indique si le robot est attrapé et une fois passé à 1 il ne peut plus changer et le déplacement associé est un sur-place pour le robot. Après il y a l'état associé au obstacle et si la distance devient inférieur à celle écrite, le robot tourne sur lui même dans une direction aléatoire jusqu'à ne plus percevoir d'obstacle. Le suivant est celui de la détection de prédateur. Ici si un prédateur est détectée, Quireekoo va aussi ce tourner dans une direction aléatoire. Mais la différence c'est que ici il va tourner pendant un certain intervalle de temps rentré dans le code. Le dernier déplacement n'est exécuter seulement si aucun des trois autres n'est fait. C'est le déplacement de base du robot. Ce déplacement est juste en zigzag.&lt;br /&gt;
&lt;br /&gt;
=== Les difficultés rencontrées ===&lt;br /&gt;
&lt;br /&gt;
Une grand difficulté lors de la programmation de Quireekoo fut l’émission et la réception infra-rouge. En effet la première idée pour l'émission était de juste allumer et éteindre la led infra-rouge à un fréquence de 38 kHz avec les intervalles de temps précis comme utilisé ici pour d'autre fonction avec les currentMillis et lastMillis. Les tsop réagissaient bien à l'émission. Le problème est que si l'on rajoutais des fonctions comme le déplacement ou le sonar, le temps d'arriver jusqu'à l'émission l'intervalle de temps qui permettait une fréquence de 38 kHz était dépassé. &lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
  void allumer()&lt;br /&gt;
  {&lt;br /&gt;
    // check to see if it's time to change the state of the LED&lt;br /&gt;
    unsigned long currentMicros = micros();&lt;br /&gt;
     &lt;br /&gt;
    if((ledState == HIGH) &amp;amp;&amp;amp; (currentMicros - previousMicros &amp;gt;= OnTime))&lt;br /&gt;
    {&lt;br /&gt;
      ledState = LOW;  // Turn it off&lt;br /&gt;
      previousMicros = currentMicros;  // Remember the time&lt;br /&gt;
      digitalWrite(ledPin, ledState);  // Update the actual LED&lt;br /&gt;
    }&lt;br /&gt;
    else if ((ledState == LOW) &amp;amp;&amp;amp; (currentMicros - previousMicros &amp;gt;= OffTime))&lt;br /&gt;
    {&lt;br /&gt;
      ledState = HIGH;  // turn it on&lt;br /&gt;
      previousMicros = currentMicros;   // Remember the time&lt;br /&gt;
      digitalWrite(ledPin, ledState);   // Update the actual LED&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
Une solution fur de passer directement par les interruptions timer. Mais deux problèmes ce sont encore révélés. Le premier était que tout les timer étaient déjà utilisé par la bibliothèque servo.h, donc impossible de faire les interruptions. De plus avec cette façon de faire ou la précédente, il était impossible de faire passer un message à travers l'émission, donc impossible de différencier une proie d'un prédateur.&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
    // initialize timer1 &lt;br /&gt;
    noInterrupts();           // disable all interrupts&lt;br /&gt;
    TCCR5A = 0;&lt;br /&gt;
    TCCR5B = 0;&lt;br /&gt;
    TCNT5  = 0;&lt;br /&gt;
  &lt;br /&gt;
    OCR5A = 421;            // compare match register 16MHz/256/2Hz&lt;br /&gt;
    TCCR5B |= (1 &amp;lt;&amp;lt; WGM52);   // CTC mode&lt;br /&gt;
    TCCR5B |= (1 &amp;lt;&amp;lt; CS50);    // 256 prescaler &lt;br /&gt;
    TIMSK5 |= (1 &amp;lt;&amp;lt; OCIE5A);  // enable timer compare interrupt&lt;br /&gt;
    interrupts();             // enable all interrupts&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  ISR(TIMER5_COMPA_vect)          // timer compare interrupt service routine&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(ledPin, digitalRead(ledPin) ^ 1);   // toggle LED pin&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Nous en sommes arrivé à utiliser la bibliothèque IRremote.h. Avec cette bibliothèque, l'émission et la réception infra-rouge ce fait très simplement si elles sont séparées. Mais les applications utilisant les même timer, il y a alors conflit pour faire fonctionner les deux en même temps. Cela nous a pris du temps pour trouver une solution car aucune information n'a pu être trouvé sur le web. Le problème était que si nous faisions une émission, les timer de la réception était annulé. Il fallait alors les ré-allouer pour la réception après l'émission avec le ligne de code: reception_ir1.enableIRIn();.&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
 if ((current_millis - last_millis &amp;gt;= interval)&amp;amp;&amp;amp;(*attraper == 0)){&lt;br /&gt;
       emission_ir.sendNEC(1, 32); &lt;br /&gt;
       last_millis = current_millis; &lt;br /&gt;
       reception_ir1.enableIRIn();&lt;br /&gt;
       reception_ir2.enableIRIn();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Cette solution a alors été partagée avec les autres groupes qui avaient besoin d'émettre et de réceptionner un signal.&lt;br /&gt;
&lt;br /&gt;
= Nos erreurs lors du projet =&lt;br /&gt;
&lt;br /&gt;
Au cours de ce projet nous avons fait quelque erreurs. Nous avons alors appris de ces erreurs et allons les décrire.&lt;br /&gt;
&lt;br /&gt;
== Erreur lors de la création du circuit imprimé ==&lt;br /&gt;
&lt;br /&gt;
Pour ce projet nous voulions faire tout le robot par nous même. Nous avons aussi refait le PCB en prenant comme exemple celui donner sur la page du projet qui est aussi celui affiché plus haut. Lorsque nous avions recopié le schéma, nous avons vu le leds de contrôle et avons décidé de les supprimer de notre circuit en pensant qu'elle ne servirait à rien. Ceci fut alors une grande erreur. Car lorsque nous avons reçu le circuit et que nous avons commencé à souder les composants, faire des tests pour savoir si les composant fonctionnaient comme il fallait ou de savoir si les soudures étaient bien faites devint très compliqué. Par chance aucun gros problème majeur n'a été trouvé. Nous savons maintenant que l'utilisation de led de contrôle est primordiale lors de la création de prototype.&lt;br /&gt;
&lt;br /&gt;
== Erreur lors de la création de la structure ==&lt;br /&gt;
&lt;br /&gt;
Quelques problèmes mineurs ont été rencontrés. Lors de la création des trous pour faire rentrer les tsop, le sonar et la sonde de hall, nous avions pris les mesures de la longueurs de pins mais la mesure précise. De ce fait, sans une petite marge de distance, les fils ne passaient pas. Nous avons alors juste limé un peu et le problème fut résolu.&lt;br /&gt;
&lt;br /&gt;
De plus nous n'avions pas prévu de trous ou autres solutions pour maintenir la batterie avec les piles. Nous l'avons alors attachée avec des élastiques. Cela fonctionne mais rend la rend inaccessible.&lt;br /&gt;
&lt;br /&gt;
Nous remercions aussi Vincent de nous avoir passé un des ces supports pour les servos-moteurs, car sans nous nous demandons comment nous aurions pu les attacher.&lt;br /&gt;
&lt;br /&gt;
== Erreur de conception ==&lt;br /&gt;
&lt;br /&gt;
Lorsque nous avons commencé à penser au projet, nous avons pensé à faire un robot le plus petit possible pour être le plus dur à attraper. Pour cela, nous avions décidé d'utiliser des servos-moteurs pour le déplacement. Nous pensions que la vitesse de rotation était suffisante pour avoir un robot plutôt rapide. La vitesse n'est alors pas si lente que ça mais nous nous attendions à mieux. Une question vient alors ce poser: aurait-il mieux fallut mettre des moteurs et non des servos-moteurs? Le défauts des moteurs est que ceci prennent alors plus de place et donc le robot n'est plus aussi petit que la taille voulut au départ. Nous avons alors conclut que les servos-moteurs restaient alors la meilleur solution pour le déplacement.&lt;/div&gt;</summary>
		<author><name>Dtillaux</name></author>	</entry>

	<entry>
		<id>https://peip-ima.plil.fr/mediawiki/index.php?title=Binome2017-9&amp;diff=9615</id>
		<title>Binome2017-9</title>
		<link rel="alternate" type="text/html" href="https://peip-ima.plil.fr/mediawiki/index.php?title=Binome2017-9&amp;diff=9615"/>
				<updated>2018-05-05T15:05:48Z</updated>
		
		<summary type="html">&lt;p&gt;Dtillaux : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Binôme 9 saison 8: Raphaël Bonvalet, Damien Tillaux.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Projet Quireekoo =&lt;br /&gt;
&lt;br /&gt;
Le but du projet Quireekoo est de créer un robot communiquant avec d'autre via infra-rouge. Ce projet à eu lieux lors des bureaux d'étude de PEIP en IMA au S4 2018 de notre cursus pour devenir ingénieur. Voici la transcription phonétique de Quireekoo: /Kirikou/.&lt;br /&gt;
&lt;br /&gt;
= Cahier des charges =&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Kiki.jpg|middle]]&lt;br /&gt;
&lt;br /&gt;
Quireekoo sera un robot fait de A à Z. Le circuit imprimé sera totalement revu et sera guidé grâce à une ATMEGA-328. Le physique sera totalement design par nous même et son programme sera totalement autonome.&lt;br /&gt;
&lt;br /&gt;
Quireekoo étant petit et vaillant est un véhicule de petite taille. A la défaut de jambe, Quireekoo ce déplace avec 2 servos moteurs continue. A la place des yeux, un sonar pour éviter ses obstacles et ne pas trébucher. Pour ses oreilles nous avons prévu 2 Tsop38238 pour pouvoir repérer et fuir ses ennemis.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Réalisation du projet =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Voici les différentes étapes par lesquels nous sommes passer lors de la création de Quireekoo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Réalisation de PCB ==&lt;br /&gt;
&lt;br /&gt;
=== Idée principale ===&lt;br /&gt;
&lt;br /&gt;
Nous voulions refaire nous même le PCB de Quireekoo mais nous n'avions pratiquement aucune base sur comment créer un circuit imprimé pour ce genre de projet. Du coups nous avons pris comme modèle, le modèle donnée sur la page principale du projet. ([https://peip-ima.plil.fr/mediawiki/index.php/BE_2017-2018 BE 2017-2018])&lt;br /&gt;
&lt;br /&gt;
Voici le schématique sur lequel nous nous sommes basé.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:RobotPCB schem.png|500px|thumb||left|Schématique original]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Notre PCB ===&lt;br /&gt;
&lt;br /&gt;
Notre PCB a été réalisé sur Fritzing. Nous avons créer ce circuit imprimé à notre image pour notre véhicule. Nous avons enlevé le driver de moteur et les sorties moteurs car nous voulions un robot de petite taille. Donc le moyen de déplacement choisi a alors été le servo-moteur. Pour les réceptions infra-rouge nous n'avons prévu que deux sorties pour des Tsop pour pouvoir laisser un plus grande chance au chasseur de ne pas être repéré, pour une approche plus vrai que nature. Pour savoir si un chasseur nous a attrapé, nous utilisons une sonde de Hall.&lt;br /&gt;
&lt;br /&gt;
De plus, en cas de problème nous avons créé toutes les sorties du microcontrôleur. Si un problème apparaît sur une des pins utilisées, nous pourrons la relocaliser sur une autre sortie.&lt;br /&gt;
&lt;br /&gt;
Un objectif supplémentaire était de réaliser un PCB le plus petit possible pour que le véhicule le soit aussi. Ce fut presque un succès, la carte est d'une taille environ de 5cm*5cm. Elle aurait pu être encore plus petite avec plus de travail mais nous ne pouvions pas nous le permettre si nous voulions tout faire.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Voici le schématique et le PCB de Quireekoo.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Quireekoo schem.png|500px|thumb|left|Schématique de Quireekoo]]&lt;br /&gt;
[[Fichier:Quireekoo pcb.png|500px|thumb|right|PCB de Quireekoo]]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Réalisation de la partie mécanique du véhicule ==&lt;br /&gt;
&lt;br /&gt;
Pour la partie mécanique de Quireekoo on a choisi de le faire sur inkscape afin de pouvoir effectuer une découpe laser. Le robot est composé de deux plaques de plexiglas, une pour le châssis où il y a les servos moteur, la bille et le bloc de pile, et une pour placer le sonar, le circuit imprimée, les Tsop et la sonde de hall. &lt;br /&gt;
&lt;br /&gt;
Voici à quoi ressemble la partie du bas sur inkscape : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Partie bas.jpg|700px|]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour la partie du haut c'était un peu plus compliqué car il fallait trouver comment placer les tsop, la sonde de hall et le sonar. Pour pouvoir fixer ceux-ci on a choisi de faire des trous en forme de rectangles avec une taille égale à la taille des pins de chaque capteurs différents. Après il fallait aussi mettre les trous pour fixer le circuit imprimé au même endroit que ceux qui se trouve sur celui-ci. Pour ce faire, on a utilisé le fichier .svg donné par Fritzing. On a également mis des trous en forme de rectangle sur les côtés pour pouvoir laisser passer les fils.&lt;br /&gt;
&lt;br /&gt;
Voici à quoi ressemble la partie du haut sur inkscape :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Partie haut.png|700px|]]&lt;br /&gt;
&lt;br /&gt;
Pour finir il nous restait les roues à faire. On a opté pour garder les roues données avec les servos moteurs en y rajoutant des partie en plexiglas au pistolet à colle pour rendre celles-ci plus grandes.&lt;br /&gt;
&lt;br /&gt;
Voici à quoi cela ressemble sur inkscape : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Roue.png|200px|]]&lt;br /&gt;
&lt;br /&gt;
Le problème avec cette solution c'est que les roues ne sont pas adhérentes. De ce fait là, on a ajouté une partie d'élastique autour avec de la colle glue.&lt;br /&gt;
&lt;br /&gt;
Voici a quoi le robot ressemble à la fin :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Quireekoo.jpg|200px|]]&lt;br /&gt;
&lt;br /&gt;
== Réalisation du code Arduino ==&lt;br /&gt;
&lt;br /&gt;
Voici maintenant la présentation du code téléversé dans Quireekoo.&lt;br /&gt;
&lt;br /&gt;
=== Le code ===&lt;br /&gt;
&lt;br /&gt;
{  &lt;br /&gt;
  #include &amp;lt;Servo.h&amp;gt;&lt;br /&gt;
  #include &amp;lt;IRremote.h&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  //déclaration des différentes pins&lt;br /&gt;
  &lt;br /&gt;
  #define SERVO1 11&lt;br /&gt;
  #define SERVO2 13&lt;br /&gt;
  #define ECHO 17&lt;br /&gt;
  #define TRIGG 18&lt;br /&gt;
  #define HALL A2&lt;br /&gt;
  #define IR 2&lt;br /&gt;
  #define VCCIR1 A0&lt;br /&gt;
  #define VCCIR2 A1&lt;br /&gt;
  &lt;br /&gt;
  //création de la classe Mouv pour le déplacement du robot&lt;br /&gt;
  &lt;br /&gt;
  class Mouv {&lt;br /&gt;
  &lt;br /&gt;
          Servo servo1;&lt;br /&gt;
          Servo servo2;&lt;br /&gt;
          int servo1Pin;&lt;br /&gt;
          int servo2Pin;&lt;br /&gt;
          &lt;br /&gt;
          int etatRotation;&lt;br /&gt;
          int etatSonar;&lt;br /&gt;
          int etatHall;&lt;br /&gt;
          int etatTsop;&lt;br /&gt;
          &lt;br /&gt;
          long intervalTsop;&lt;br /&gt;
          &lt;br /&gt;
          long intervalMouvement1;&lt;br /&gt;
          long intervalMouvement2;&lt;br /&gt;
          long intervalMouvement3;&lt;br /&gt;
          long intervalMouvement4;&lt;br /&gt;
          &lt;br /&gt;
          unsigned long lastMillis;&lt;br /&gt;
          &lt;br /&gt;
          &lt;br /&gt;
    public:&lt;br /&gt;
      Mouv(int pin1 , int pin2){&lt;br /&gt;
        servo1Pin= pin1;&lt;br /&gt;
        servo2Pin = pin2;&lt;br /&gt;
        &lt;br /&gt;
        etatRotation = 0;&lt;br /&gt;
        etatSonar = 0;&lt;br /&gt;
        etatHall = 0;&lt;br /&gt;
        etatTsop = 0;&lt;br /&gt;
        lastMillis = 0;&lt;br /&gt;
        &lt;br /&gt;
        intervalTsop = 500;&lt;br /&gt;
        &lt;br /&gt;
        intervalMouvement1 = 1500;&lt;br /&gt;
        intervalMouvement2 = 1700;&lt;br /&gt;
        intervalMouvement3 = 3200;&lt;br /&gt;
        intervalMouvement4 = 3400;&lt;br /&gt;
      }&lt;br /&gt;
    &lt;br /&gt;
      void attacher(){&lt;br /&gt;
        servo1.attach(servo1Pin);&lt;br /&gt;
        servo2.attach(servo2Pin);&lt;br /&gt;
      }&lt;br /&gt;
  &lt;br /&gt;
      void deplacement(int distanceObstacle , int tsop , int hall, int* attraper){&lt;br /&gt;
        unsigned long currentMillis = millis();&lt;br /&gt;
        &lt;br /&gt;
        if (hall == 1){&lt;br /&gt;
          etatHall = 1;&lt;br /&gt;
          *attraper = 1;&lt;br /&gt;
        }&lt;br /&gt;
        else if (distanceObstacle &amp;lt; 200){&lt;br /&gt;
          etatSonar = 1;&lt;br /&gt;
        }&lt;br /&gt;
        else if (tsop==1){&lt;br /&gt;
          etatTsop = 1;&lt;br /&gt;
          lastMillis = currentMillis;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        if (etatHall == 1){&lt;br /&gt;
          servo1.write(90);&lt;br /&gt;
          servo2.write(90);&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        else if (etatSonar ==1){&lt;br /&gt;
          if (etatRotation == 0){&lt;br /&gt;
            etatRotation = random(1,3);&lt;br /&gt;
          }&lt;br /&gt;
          if(etatRotation == 1){&lt;br /&gt;
            servo1.write(180);&lt;br /&gt;
            servo2.write(180);&lt;br /&gt;
          }&lt;br /&gt;
          else{&lt;br /&gt;
            servo1.write(0);&lt;br /&gt;
            servo2.write(0);&lt;br /&gt;
          }&lt;br /&gt;
          etatSonar = 0 ;&lt;br /&gt;
          lastMillis = currentMillis;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        else if (etatTsop == 1){&lt;br /&gt;
          if (etatRotation == 0){&lt;br /&gt;
            etatRotation = random(1,3);&lt;br /&gt;
          }&lt;br /&gt;
          &lt;br /&gt;
          if(etatRotation == 1){&lt;br /&gt;
            servo1.write(180);&lt;br /&gt;
            servo2.write(180);&lt;br /&gt;
          }&lt;br /&gt;
          else{&lt;br /&gt;
            servo1.write(0);&lt;br /&gt;
            servo2.write(0);&lt;br /&gt;
          }&lt;br /&gt;
          &lt;br /&gt;
          if (currentMillis - lastMillis &amp;gt;= intervalTsop){&lt;br /&gt;
            etatTsop = 0;&lt;br /&gt;
            lastMillis = currentMillis;&lt;br /&gt;
          }&lt;br /&gt;
        }   &lt;br /&gt;
        &lt;br /&gt;
        else{&lt;br /&gt;
          etatRotation = 0;&lt;br /&gt;
          if (currentMillis - lastMillis &amp;lt; intervalMouvement1){&lt;br /&gt;
            servo1.write(180);&lt;br /&gt;
            servo2.write(70);&lt;br /&gt;
          }&lt;br /&gt;
          else if ((currentMillis - lastMillis &amp;gt;= intervalMouvement2) &amp;amp;&amp;amp;  (currentMillis - lastMillis &amp;lt;= intervalMouvement3)){&lt;br /&gt;
            servo1.write(98);&lt;br /&gt;
            servo2.write(0);&lt;br /&gt;
          }&lt;br /&gt;
          else{&lt;br /&gt;
            servo1.write(180);&lt;br /&gt;
            servo2.write(0);&lt;br /&gt;
            if (currentMillis - lastMillis &amp;gt;= intervalMouvement4){&lt;br /&gt;
              lastMillis = currentMillis;&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;br /&gt;
  Mouv servo(SERVO1,SERVO2);&lt;br /&gt;
  &lt;br /&gt;
  //varibable pour le sonnar&lt;br /&gt;
  &lt;br /&gt;
  long lectureEcho;&lt;br /&gt;
  long distance;&lt;br /&gt;
  const float SOUND_SPEED = 340.0 / 1000;&lt;br /&gt;
  &lt;br /&gt;
  //varibable pour la sonde de hall&lt;br /&gt;
  &lt;br /&gt;
  int* attraper;&lt;br /&gt;
  &lt;br /&gt;
  //varibable pour les tsop&lt;br /&gt;
  &lt;br /&gt;
  unsigned long last_millis = 0; &lt;br /&gt;
  long interval = 500;&lt;br /&gt;
  &lt;br /&gt;
  int broche_reception1 = VCCIR1;&lt;br /&gt;
  IRrecv reception_ir1(broche_reception1);&lt;br /&gt;
  decode_results decode_ir1;&lt;br /&gt;
  &lt;br /&gt;
  int broche_reception2 = VCCIR2;&lt;br /&gt;
  IRrecv reception_ir2(broche_reception2);&lt;br /&gt;
  decode_results decode_ir2; &lt;br /&gt;
  &lt;br /&gt;
  //instance pour l'emmission infra-rouge&lt;br /&gt;
  &lt;br /&gt;
  IRsend emission_ir; &lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  void setup() {&lt;br /&gt;
    pinMode(TRIGG,OUTPUT);&lt;br /&gt;
    digitalWrite(TRIGG,0);&lt;br /&gt;
    pinMode(ECHO,INPUT); &lt;br /&gt;
    pinMode(IR,OUTPUT);&lt;br /&gt;
    digitalWrite(IR,1);&lt;br /&gt;
  &lt;br /&gt;
    servo.attacher();&lt;br /&gt;
    &lt;br /&gt;
    reception_ir1.enableIRIn(); // démarre la réception&lt;br /&gt;
    reception_ir2.enableIRIn();&lt;br /&gt;
    &lt;br /&gt;
    attraper = malloc(sizeof(int));&lt;br /&gt;
    *attraper = 0;&lt;br /&gt;
    &lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  void loop() {&lt;br /&gt;
    servo.deplacement(sonar(),tsop(attraper),hall(),attraper);  &lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  int sonar() {&lt;br /&gt;
    digitalWrite(TRIGG, 1);&lt;br /&gt;
    delayMicroseconds(10);&lt;br /&gt;
    digitalWrite(TRIGG,0);&lt;br /&gt;
    long measure = pulseIn(ECHO, HIGH);&lt;br /&gt;
    &lt;br /&gt;
    float distance_mm = measure / 2.0 * SOUND_SPEED;&lt;br /&gt;
    return distance_mm; &lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  int tsop(int * attraper ){&lt;br /&gt;
    unsigned long current_millis = millis();&lt;br /&gt;
    int etatTsop = 0;&lt;br /&gt;
    if ((current_millis - last_millis &amp;gt;= interval)&amp;amp;&amp;amp;(*attraper == 0)){&lt;br /&gt;
       emission_ir.sendNEC(1, 32); &lt;br /&gt;
       last_millis = current_millis; &lt;br /&gt;
       reception_ir1.enableIRIn();&lt;br /&gt;
       reception_ir2.enableIRIn();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    if (reception_ir1.decode(&amp;amp;decode_ir1)) &lt;br /&gt;
    { &lt;br /&gt;
      if(decode_ir1.value == 1){&lt;br /&gt;
        etatTsop = 1;&lt;br /&gt;
      }&lt;br /&gt;
  &lt;br /&gt;
      reception_ir1.resume();&lt;br /&gt;
      reception_ir2.enableIRIn();&lt;br /&gt;
    }&lt;br /&gt;
    if (reception_ir2.decode(&amp;amp;decode_ir2)) &lt;br /&gt;
    { &lt;br /&gt;
      if(decode_ir2.value == 1){&lt;br /&gt;
        etatTsop = 1;&lt;br /&gt;
      } &lt;br /&gt;
      reception_ir2.resume();  &lt;br /&gt;
      reception_ir1.enableIRIn();&lt;br /&gt;
    }&lt;br /&gt;
    return etatTsop;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  int hall(){&lt;br /&gt;
    int etatHall = 0;&lt;br /&gt;
    if(digitalRead(HALL) == 0){&lt;br /&gt;
      etatHall = 1;&lt;br /&gt;
    }&lt;br /&gt;
    return etatHall;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
=== Description de la structure du code ===&lt;br /&gt;
&lt;br /&gt;
==== Fonction sonar() ====&lt;br /&gt;
&lt;br /&gt;
Cette fonction permet au sonar de calculer la distance séparant le robot d'un obstacle.&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
  int sonar() {&lt;br /&gt;
    digitalWrite(TRIGG, 1);&lt;br /&gt;
    delayMicroseconds(10);&lt;br /&gt;
    digitalWrite(TRIGG,0);&lt;br /&gt;
    long measure = pulseIn(ECHO, HIGH);&lt;br /&gt;
    &lt;br /&gt;
    float distance_mm = measure / 2.0 * SOUND_SPEED;&lt;br /&gt;
    return distance_mm; &lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Fonction tsop()====&lt;br /&gt;
&lt;br /&gt;
Cette fonction a deux rôles. Le premier est de lire les entrées des tsop et de renvoyer si un prédateur a été détecter ou non. Le deuxième est d'émettre un signal infra-rouge permettant au prédateur de nous détecter.&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
  int tsop(int * attraper ){&lt;br /&gt;
    unsigned long current_millis = millis();&lt;br /&gt;
    int etatTsop = 0;&lt;br /&gt;
    if ((current_millis - last_millis &amp;gt;= interval)&amp;amp;&amp;amp;(*attraper == 0)){&lt;br /&gt;
       emission_ir.sendNEC(1, 32); &lt;br /&gt;
       last_millis = current_millis; &lt;br /&gt;
       reception_ir1.enableIRIn();&lt;br /&gt;
       reception_ir2.enableIRIn();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    if (reception_ir1.decode(&amp;amp;decode_ir1)) &lt;br /&gt;
    { &lt;br /&gt;
      if(decode_ir1.value == 1){&lt;br /&gt;
        etatTsop = 1;&lt;br /&gt;
      }&lt;br /&gt;
  &lt;br /&gt;
      reception_ir1.resume();&lt;br /&gt;
      reception_ir2.enableIRIn();&lt;br /&gt;
    }&lt;br /&gt;
    if (reception_ir2.decode(&amp;amp;decode_ir2)) &lt;br /&gt;
    { &lt;br /&gt;
      if(decode_ir2.value == 1){&lt;br /&gt;
        etatTsop = 1;&lt;br /&gt;
      } &lt;br /&gt;
      reception_ir2.resume();  &lt;br /&gt;
      reception_ir1.enableIRIn();&lt;br /&gt;
    }&lt;br /&gt;
    return etatTsop;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Les particularités de cette fonction sont que, premièrement pour facilité la programmation l'émission et la réception ont été mises dans la même fonction car elles demandent toutes les deux la même bibliothèque et les même timer, donc pour éviter tout conflit ceci fut une bonne solution. Deuxièmement, la fonction tsop() contient un pointeur en paramètre. Ce pointeur permet au robot de savoir s'il doit continuer à émettre ou non s'il est attrapé.&lt;br /&gt;
&lt;br /&gt;
L'émission du signal infra-rouge ici ce fait toute les 0.5s. En effet si les émissions sont trop proche il y a conflit avec la réception.&lt;br /&gt;
&lt;br /&gt;
==== Fonction hall()====&lt;br /&gt;
&lt;br /&gt;
Cette fonction permet de voir si un prédateur nous a détecté et attrapé grâce à l'émission d'une onde électromagnétique.&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
  int hall(){&lt;br /&gt;
    int etatHall = 0;&lt;br /&gt;
    if(digitalRead(HALL) == 0){&lt;br /&gt;
      etatHall = 1;&lt;br /&gt;
    }&lt;br /&gt;
    return etatHall;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Fonction deplacement() ====&lt;br /&gt;
&lt;br /&gt;
Pour le déplacement du robot nous avons choisi de créer un classe pour avoir un code plus propre et une fonction loop() ne contenant qu'une seul ligne de code.&lt;br /&gt;
&lt;br /&gt;
La Classe Mouv contient 2 fonctions. La première attacher() permet de lier les instances servo aux pins associées. Elle est appelée dans le setup(). La deuxième fonction est la fonction de déplacement appelée deplacement(). Cette fonction est la seule appelée de la fonction loop().&lt;br /&gt;
&lt;br /&gt;
Cette fonction est alors la fonction principale du robot, car c'est elle qui va décider du déplacement du robot en fonction des différentes entrées des capteurs. Elle contient en paramètre les différentes entrées du sonar, du tsop, de la sonde de hall, mais aussi un pointeur pour pouvoir sauvegarder en mémoire le fait que le robot soit attrapé ou non.&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
      void deplacement(int distanceObstacle , int tsop , int hall, int* attraper){&lt;br /&gt;
        unsigned long currentMillis = millis();&lt;br /&gt;
        &lt;br /&gt;
        if (hall == 1){&lt;br /&gt;
          etatHall = 1;&lt;br /&gt;
          *attraper = 1;&lt;br /&gt;
        }&lt;br /&gt;
        else if (distanceObstacle &amp;lt; 200){&lt;br /&gt;
          etatSonar = 1;&lt;br /&gt;
        }&lt;br /&gt;
        else if (tsop==1){&lt;br /&gt;
          etatTsop = 1;&lt;br /&gt;
          lastMillis = currentMillis;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        if (etatHall == 1){&lt;br /&gt;
          servo1.write(90);&lt;br /&gt;
          servo2.write(90);&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        else if (etatSonar ==1){&lt;br /&gt;
          if (etatRotation == 0){&lt;br /&gt;
            etatRotation = random(1,3);&lt;br /&gt;
          }&lt;br /&gt;
          if(etatRotation == 1){&lt;br /&gt;
            servo1.write(180);&lt;br /&gt;
            servo2.write(180);&lt;br /&gt;
          }&lt;br /&gt;
          else{&lt;br /&gt;
            servo1.write(0);&lt;br /&gt;
            servo2.write(0);&lt;br /&gt;
          }&lt;br /&gt;
          etatSonnar = 0 ;&lt;br /&gt;
          lastMillis = currentMillis;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        else if (etatTsop == 1){&lt;br /&gt;
          if (etatRotation == 0){&lt;br /&gt;
            etatRotation = random(1,3);&lt;br /&gt;
          }&lt;br /&gt;
          &lt;br /&gt;
          if(etatRotation == 1){&lt;br /&gt;
            servo1.write(180);&lt;br /&gt;
            servo2.write(180);&lt;br /&gt;
          }&lt;br /&gt;
          else{&lt;br /&gt;
            servo1.write(0);&lt;br /&gt;
            servo2.write(0);&lt;br /&gt;
          }&lt;br /&gt;
          &lt;br /&gt;
          if (currentMillis - lastMillis &amp;gt;= intervalTsop){&lt;br /&gt;
            etatTsop = 0;&lt;br /&gt;
            lastMillis = currentMillis;&lt;br /&gt;
          }&lt;br /&gt;
        }   &lt;br /&gt;
        &lt;br /&gt;
        else{&lt;br /&gt;
          etatRotation = 0;&lt;br /&gt;
          if (currentMillis - lastMillis &amp;lt; intervalMouvement1){&lt;br /&gt;
            servo1.write(180);&lt;br /&gt;
            servo2.write(70);&lt;br /&gt;
          }&lt;br /&gt;
          else if ((currentMillis - lastMillis &amp;gt;= intervalMouvement2) &amp;amp;&amp;amp;  (currentMillis - lastMillis &amp;lt;= intervalMouvement3)){&lt;br /&gt;
            servo1.write(98);&lt;br /&gt;
            servo2.write(0);&lt;br /&gt;
          }&lt;br /&gt;
          else{&lt;br /&gt;
            servo1.write(180);&lt;br /&gt;
            servo2.write(0);&lt;br /&gt;
            if (currentMillis - lastMillis &amp;gt;= intervalMouvement4){&lt;br /&gt;
              lastMillis = currentMillis;&lt;br /&gt;
            }&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Cette fonction est divisée en deux partie. La première est la distribution des états du robot en fonction des entrées. Par la suite, la fonction va décidé quel déplacement faire en fonction des priorités des différents états. L'états le plus prioritaire est l'états etatHall. Celui ci indique si le robot est attrapé et une fois passé à 1 il ne peut plus changer et le déplacement associé est un sur-place pour le robot. Après il y a l'état associé au obstacle et si la distance devient inférieur à celle écrite, le robot tourne sur lui même dans une direction aléatoire jusqu'à ne plus percevoir d'obstacle. Le suivant est celui de la détection de prédateur. Ici si un prédateur est détectée, Quireekoo va aussi ce tourner dans une direction aléatoire. Mais la différence c'est que ici il va tourner pendant un certain intervalle de temps rentré dans le code. Le dernier déplacement n'est exécuter seulement si aucun des trois autres n'est fait. C'est le déplacement de base du robot. Ce déplacement est juste en zigzag.&lt;br /&gt;
&lt;br /&gt;
=== Les difficultés rencontrées ===&lt;br /&gt;
&lt;br /&gt;
Une grand difficulté lors de la programmation de Quireekoo fut l’émission et la réception infra-rouge. En effet la première idée pour l'émission était de juste allumer et éteindre la led infra-rouge à un fréquence de 38 kHz avec les intervalles de temps précis comme utilisé ici pour d'autre fonction avec les currentMillis et lastMillis. Les tsop réagissaient bien à l'émission. Le problème est que si l'on rajoutais des fonctions comme le déplacement ou le sonar, le temps d'arriver jusqu'à l'émission l'intervalle de temps qui permettait une fréquence de 38 kHz était dépassé. &lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
  void allumer()&lt;br /&gt;
  {&lt;br /&gt;
    // check to see if it's time to change the state of the LED&lt;br /&gt;
    unsigned long currentMicros = micros();&lt;br /&gt;
     &lt;br /&gt;
    if((ledState == HIGH) &amp;amp;&amp;amp; (currentMicros - previousMicros &amp;gt;= OnTime))&lt;br /&gt;
    {&lt;br /&gt;
      ledState = LOW;  // Turn it off&lt;br /&gt;
      previousMicros = currentMicros;  // Remember the time&lt;br /&gt;
      digitalWrite(ledPin, ledState);  // Update the actual LED&lt;br /&gt;
    }&lt;br /&gt;
    else if ((ledState == LOW) &amp;amp;&amp;amp; (currentMicros - previousMicros &amp;gt;= OffTime))&lt;br /&gt;
    {&lt;br /&gt;
      ledState = HIGH;  // turn it on&lt;br /&gt;
      previousMicros = currentMicros;   // Remember the time&lt;br /&gt;
      digitalWrite(ledPin, ledState);   // Update the actual LED&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
Une solution fur de passer directement par les interruptions timer. Mais deux problèmes ce sont encore révélés. Le premier était que tout les timer étaient déjà utilisé par la bibliothèque servo.h, donc impossible de faire les interruptions. De plus avec cette façon de faire ou la précédente, il était impossible de faire passer un message à travers l'émission, donc impossible de différencier une proie d'un prédateur.&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
    // initialize timer1 &lt;br /&gt;
    noInterrupts();           // disable all interrupts&lt;br /&gt;
    TCCR5A = 0;&lt;br /&gt;
    TCCR5B = 0;&lt;br /&gt;
    TCNT5  = 0;&lt;br /&gt;
  &lt;br /&gt;
    OCR5A = 421;            // compare match register 16MHz/256/2Hz&lt;br /&gt;
    TCCR5B |= (1 &amp;lt;&amp;lt; WGM52);   // CTC mode&lt;br /&gt;
    TCCR5B |= (1 &amp;lt;&amp;lt; CS50);    // 256 prescaler &lt;br /&gt;
    TIMSK5 |= (1 &amp;lt;&amp;lt; OCIE5A);  // enable timer compare interrupt&lt;br /&gt;
    interrupts();             // enable all interrupts&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  ISR(TIMER5_COMPA_vect)          // timer compare interrupt service routine&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(ledPin, digitalRead(ledPin) ^ 1);   // toggle LED pin&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Nous en sommes arrivé à utiliser la bibliothèque IRremote.h. Avec cette bibliothèque, l'émission et la réception infra-rouge ce fait très simplement si elles sont séparées. Mais les applications utilisant les même timer, il y a alors conflit pour faire fonctionner les deux en même temps. Cela nous a pris du temps pour trouver une solution car aucune information n'a pu être trouvé sur le web. Le problème était que si nous faisions une émission, les timer de la réception était annulé. Il fallait alors les ré-allouer pour la réception après l'émission avec le ligne de code: reception_ir1.enableIRIn();.&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
 if ((current_millis - last_millis &amp;gt;= interval)&amp;amp;&amp;amp;(*attraper == 0)){&lt;br /&gt;
       emission_ir.sendNEC(1, 32); &lt;br /&gt;
       last_millis = current_millis; &lt;br /&gt;
       reception_ir1.enableIRIn();&lt;br /&gt;
       reception_ir2.enableIRIn();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Cette solution a alors été partagée avec les autres groupes qui avaient besoin d'émettre et de réceptionner un signal.&lt;br /&gt;
&lt;br /&gt;
= Nos erreurs lors du projet =&lt;/div&gt;</summary>
		<author><name>Dtillaux</name></author>	</entry>

	<entry>
		<id>https://peip-ima.plil.fr/mediawiki/index.php?title=Binome2017-9&amp;diff=9614</id>
		<title>Binome2017-9</title>
		<link rel="alternate" type="text/html" href="https://peip-ima.plil.fr/mediawiki/index.php?title=Binome2017-9&amp;diff=9614"/>
				<updated>2018-05-05T15:04:22Z</updated>
		
		<summary type="html">&lt;p&gt;Dtillaux : /* Les difficultés rencontrées */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Binôme 9 saison 8: Raphaël Bonvalet, Damien Tillaux.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Projet Quireekoo =&lt;br /&gt;
&lt;br /&gt;
Le but du projet Quireekoo est de créer un robot communiquant avec d'autre via infra-rouge. Ce projet à eu lieux lors des bureaux d'étude de PEIP en IMA au S4 2018 de notre cursus pour devenir ingénieur. Voici la transcription phonétique de Quireekoo: /Kirikou/.&lt;br /&gt;
&lt;br /&gt;
= Cahier des charges =&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Kiki.jpg|middle]]&lt;br /&gt;
&lt;br /&gt;
Quireekoo sera un robot fait de A à Z. Le circuit imprimé sera totalement revu et sera guidé grâce à une ATMEGA-328. Le physique sera totalement design par nous même et son programme sera totalement autonome.&lt;br /&gt;
&lt;br /&gt;
Quireekoo étant petit et vaillant est un véhicule de petite taille. A la défaut de jambe, Quireekoo ce déplace avec 2 servos moteurs continue. A la place des yeux, un sonar pour éviter ses obstacles et ne pas trébucher. Pour ses oreilles nous avons prévu 2 Tsop38238 pour pouvoir repérer et fuir ses ennemis.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Réalisation du projet =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Voici les différentes étapes par lesquels nous sommes passer lors de la création de Quireekoo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Réalisation de PCB ==&lt;br /&gt;
&lt;br /&gt;
=== Idée principale ===&lt;br /&gt;
&lt;br /&gt;
Nous voulions refaire nous même le PCB de Quireekoo mais nous n'avions pratiquement aucune base sur comment créer un circuit imprimé pour ce genre de projet. Du coups nous avons pris comme modèle, le modèle donnée sur la page principale du projet. ([https://peip-ima.plil.fr/mediawiki/index.php/BE_2017-2018 BE 2017-2018])&lt;br /&gt;
&lt;br /&gt;
Voici le schématique sur lequel nous nous sommes basé.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:RobotPCB schem.png|500px|thumb||left|Schématique original]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Notre PCB ===&lt;br /&gt;
&lt;br /&gt;
Notre PCB a été réalisé sur Fritzing. Nous avons créer ce circuit imprimé à notre image pour notre véhicule. Nous avons enlevé le driver de moteur et les sorties moteurs car nous voulions un robot de petite taille. Donc le moyen de déplacement choisi a alors été le servo-moteur. Pour les réceptions infra-rouge nous n'avons prévu que deux sorties pour des Tsop pour pouvoir laisser un plus grande chance au chasseur de ne pas être repéré, pour une approche plus vrai que nature. Pour savoir si un chasseur nous a attrapé, nous utilisons une sonde de Hall.&lt;br /&gt;
&lt;br /&gt;
De plus, en cas de problème nous avons créé toutes les sorties du microcontrôleur. Si un problème apparaît sur une des pins utilisées, nous pourrons la relocaliser sur une autre sortie.&lt;br /&gt;
&lt;br /&gt;
Un objectif supplémentaire était de réaliser un PCB le plus petit possible pour que le véhicule le soit aussi. Ce fut presque un succès, la carte est d'une taille environ de 5cm*5cm. Elle aurait pu être encore plus petite avec plus de travail mais nous ne pouvions pas nous le permettre si nous voulions tout faire.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Voici le schématique et le PCB de Quireekoo.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Quireekoo schem.png|500px|thumb|left|Schématique de Quireekoo]]&lt;br /&gt;
[[Fichier:Quireekoo pcb.png|500px|thumb|right|PCB de Quireekoo]]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Réalisation de la partie mécanique du véhicule ==&lt;br /&gt;
&lt;br /&gt;
Pour la partie mécanique de Quireekoo on a choisi de le faire sur inkscape afin de pouvoir effectuer une découpe laser. Le robot est composé de deux plaques de plexiglas, une pour le châssis où il y a les servos moteur, la bille et le bloc de pile, et une pour placer le sonar, le circuit imprimée, les Tsop et la sonde de hall. &lt;br /&gt;
&lt;br /&gt;
Voici à quoi ressemble la partie du bas sur inkscape : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Partie bas.jpg|700px|]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour la partie du haut c'était un peu plus compliqué car il fallait trouver comment placer les tsop, la sonde de hall et le sonar. Pour pouvoir fixer ceux-ci on a choisi de faire des trous en forme de rectangles avec une taille égale à la taille des pins de chaque capteurs différents. Après il fallait aussi mettre les trous pour fixer le circuit imprimé au même endroit que ceux qui se trouve sur celui-ci. Pour ce faire, on a utilisé le fichier .svg donné par Fritzing. On a également mis des trous en forme de rectangle sur les côtés pour pouvoir laisser passer les fils.&lt;br /&gt;
&lt;br /&gt;
Voici à quoi ressemble la partie du haut sur inkscape :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Partie haut.png|700px|]]&lt;br /&gt;
&lt;br /&gt;
Pour finir il nous restait les roues à faire. On a opté pour garder les roues données avec les servos moteurs en y rajoutant des partie en plexiglas au pistolet à colle pour rendre celles-ci plus grandes.&lt;br /&gt;
&lt;br /&gt;
Voici à quoi cela ressemble sur inkscape : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Roue.png|200px|]]&lt;br /&gt;
&lt;br /&gt;
Le problème avec cette solution c'est que les roues ne sont pas adhérentes. De ce fait là, on a ajouté une partie d'élastique autour avec de la colle glue.&lt;br /&gt;
&lt;br /&gt;
Voici a quoi le robot ressemble à la fin :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Quireekoo.jpg|200px|]]&lt;br /&gt;
&lt;br /&gt;
== Réalisation du code Arduino ==&lt;br /&gt;
&lt;br /&gt;
Voici maintenant la présentation du code téléversé dans Quireekoo.&lt;br /&gt;
&lt;br /&gt;
=== Le code ===&lt;br /&gt;
&lt;br /&gt;
{  &lt;br /&gt;
  #include &amp;lt;Servo.h&amp;gt;&lt;br /&gt;
  #include &amp;lt;IRremote.h&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  //déclaration des différentes pins&lt;br /&gt;
  &lt;br /&gt;
  #define SERVO1 11&lt;br /&gt;
  #define SERVO2 13&lt;br /&gt;
  #define ECHO 17&lt;br /&gt;
  #define TRIGG 18&lt;br /&gt;
  #define HALL A2&lt;br /&gt;
  #define IR 2&lt;br /&gt;
  #define VCCIR1 A0&lt;br /&gt;
  #define VCCIR2 A1&lt;br /&gt;
  &lt;br /&gt;
  //création de la classe Mouv pour le déplacement du robot&lt;br /&gt;
  &lt;br /&gt;
  class Mouv {&lt;br /&gt;
  &lt;br /&gt;
          Servo servo1;&lt;br /&gt;
          Servo servo2;&lt;br /&gt;
          int servo1Pin;&lt;br /&gt;
          int servo2Pin;&lt;br /&gt;
          &lt;br /&gt;
          int etatRotation;&lt;br /&gt;
          int etatSonar;&lt;br /&gt;
          int etatHall;&lt;br /&gt;
          int etatTsop;&lt;br /&gt;
          &lt;br /&gt;
          long intervalTsop;&lt;br /&gt;
          &lt;br /&gt;
          long intervalMouvement1;&lt;br /&gt;
          long intervalMouvement2;&lt;br /&gt;
          long intervalMouvement3;&lt;br /&gt;
          long intervalMouvement4;&lt;br /&gt;
          &lt;br /&gt;
          unsigned long lastMillis;&lt;br /&gt;
          &lt;br /&gt;
          &lt;br /&gt;
    public:&lt;br /&gt;
      Mouv(int pin1 , int pin2){&lt;br /&gt;
        servo1Pin= pin1;&lt;br /&gt;
        servo2Pin = pin2;&lt;br /&gt;
        &lt;br /&gt;
        etatRotation = 0;&lt;br /&gt;
        etatSonar = 0;&lt;br /&gt;
        etatHall = 0;&lt;br /&gt;
        etatTsop = 0;&lt;br /&gt;
        lastMillis = 0;&lt;br /&gt;
        &lt;br /&gt;
        intervalTsop = 500;&lt;br /&gt;
        &lt;br /&gt;
        intervalMouvement1 = 1500;&lt;br /&gt;
        intervalMouvement2 = 1700;&lt;br /&gt;
        intervalMouvement3 = 3200;&lt;br /&gt;
        intervalMouvement4 = 3400;&lt;br /&gt;
      }&lt;br /&gt;
    &lt;br /&gt;
      void attacher(){&lt;br /&gt;
        servo1.attach(servo1Pin);&lt;br /&gt;
        servo2.attach(servo2Pin);&lt;br /&gt;
      }&lt;br /&gt;
  &lt;br /&gt;
      void deplacement(int distanceObstacle , int tsop , int hall, int* attraper){&lt;br /&gt;
        unsigned long currentMillis = millis();&lt;br /&gt;
        &lt;br /&gt;
        if (hall == 1){&lt;br /&gt;
          etatHall = 1;&lt;br /&gt;
          *attraper = 1;&lt;br /&gt;
        }&lt;br /&gt;
        else if (distanceObstacle &amp;lt; 200){&lt;br /&gt;
          etatSonar = 1;&lt;br /&gt;
        }&lt;br /&gt;
        else if (tsop==1){&lt;br /&gt;
          etatTsop = 1;&lt;br /&gt;
          lastMillis = currentMillis;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        if (etatHall == 1){&lt;br /&gt;
          servo1.write(90);&lt;br /&gt;
          servo2.write(90);&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        else if (etatSonar ==1){&lt;br /&gt;
          if (etatRotation == 0){&lt;br /&gt;
            etatRotation = random(1,3);&lt;br /&gt;
          }&lt;br /&gt;
          if(etatRotation == 1){&lt;br /&gt;
            servo1.write(180);&lt;br /&gt;
            servo2.write(180);&lt;br /&gt;
          }&lt;br /&gt;
          else{&lt;br /&gt;
            servo1.write(0);&lt;br /&gt;
            servo2.write(0);&lt;br /&gt;
          }&lt;br /&gt;
          etatSonar = 0 ;&lt;br /&gt;
          lastMillis = currentMillis;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        else if (etatTsop == 1){&lt;br /&gt;
          if (etatRotation == 0){&lt;br /&gt;
            etatRotation = random(1,3);&lt;br /&gt;
          }&lt;br /&gt;
          &lt;br /&gt;
          if(etatRotation == 1){&lt;br /&gt;
            servo1.write(180);&lt;br /&gt;
            servo2.write(180);&lt;br /&gt;
          }&lt;br /&gt;
          else{&lt;br /&gt;
            servo1.write(0);&lt;br /&gt;
            servo2.write(0);&lt;br /&gt;
          }&lt;br /&gt;
          &lt;br /&gt;
          if (currentMillis - lastMillis &amp;gt;= intervalTsop){&lt;br /&gt;
            etatTsop = 0;&lt;br /&gt;
            lastMillis = currentMillis;&lt;br /&gt;
          }&lt;br /&gt;
        }   &lt;br /&gt;
        &lt;br /&gt;
        else{&lt;br /&gt;
          etatRotation = 0;&lt;br /&gt;
          if (currentMillis - lastMillis &amp;lt; intervalMouvement1){&lt;br /&gt;
            servo1.write(180);&lt;br /&gt;
            servo2.write(70);&lt;br /&gt;
          }&lt;br /&gt;
          else if ((currentMillis - lastMillis &amp;gt;= intervalMouvement2) &amp;amp;&amp;amp;  (currentMillis - lastMillis &amp;lt;= intervalMouvement3)){&lt;br /&gt;
            servo1.write(98);&lt;br /&gt;
            servo2.write(0);&lt;br /&gt;
          }&lt;br /&gt;
          else{&lt;br /&gt;
            servo1.write(180);&lt;br /&gt;
            servo2.write(0);&lt;br /&gt;
            if (currentMillis - lastMillis &amp;gt;= intervalMouvement4){&lt;br /&gt;
              lastMillis = currentMillis;&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;br /&gt;
  Mouv servo(SERVO1,SERVO2);&lt;br /&gt;
  &lt;br /&gt;
  //varibable pour le sonnar&lt;br /&gt;
  &lt;br /&gt;
  long lectureEcho;&lt;br /&gt;
  long distance;&lt;br /&gt;
  const float SOUND_SPEED = 340.0 / 1000;&lt;br /&gt;
  &lt;br /&gt;
  //varibable pour la sonde de hall&lt;br /&gt;
  &lt;br /&gt;
  int* attraper;&lt;br /&gt;
  &lt;br /&gt;
  //varibable pour les tsop&lt;br /&gt;
  &lt;br /&gt;
  unsigned long last_millis = 0; &lt;br /&gt;
  long interval = 500;&lt;br /&gt;
  &lt;br /&gt;
  int broche_reception1 = VCCIR1;&lt;br /&gt;
  IRrecv reception_ir1(broche_reception1);&lt;br /&gt;
  decode_results decode_ir1;&lt;br /&gt;
  &lt;br /&gt;
  int broche_reception2 = VCCIR2;&lt;br /&gt;
  IRrecv reception_ir2(broche_reception2);&lt;br /&gt;
  decode_results decode_ir2; &lt;br /&gt;
  &lt;br /&gt;
  //instance pour l'emmission infra-rouge&lt;br /&gt;
  &lt;br /&gt;
  IRsend emission_ir; &lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  void setup() {&lt;br /&gt;
    pinMode(TRIGG,OUTPUT);&lt;br /&gt;
    digitalWrite(TRIGG,0);&lt;br /&gt;
    pinMode(ECHO,INPUT); &lt;br /&gt;
    pinMode(IR,OUTPUT);&lt;br /&gt;
    digitalWrite(IR,1);&lt;br /&gt;
  &lt;br /&gt;
    servo.attacher();&lt;br /&gt;
    &lt;br /&gt;
    reception_ir1.enableIRIn(); // démarre la réception&lt;br /&gt;
    reception_ir2.enableIRIn();&lt;br /&gt;
    &lt;br /&gt;
    attraper = malloc(sizeof(int));&lt;br /&gt;
    *attraper = 0;&lt;br /&gt;
    &lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  void loop() {&lt;br /&gt;
    servo.deplacement(sonar(),tsop(attraper),hall(),attraper);  &lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  int sonar() {&lt;br /&gt;
    digitalWrite(TRIGG, 1);&lt;br /&gt;
    delayMicroseconds(10);&lt;br /&gt;
    digitalWrite(TRIGG,0);&lt;br /&gt;
    long measure = pulseIn(ECHO, HIGH);&lt;br /&gt;
    &lt;br /&gt;
    float distance_mm = measure / 2.0 * SOUND_SPEED;&lt;br /&gt;
    return distance_mm; &lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  int tsop(int * attraper ){&lt;br /&gt;
    unsigned long current_millis = millis();&lt;br /&gt;
    int etatTsop = 0;&lt;br /&gt;
    if ((current_millis - last_millis &amp;gt;= interval)&amp;amp;&amp;amp;(*attraper == 0)){&lt;br /&gt;
       emission_ir.sendNEC(1, 32); &lt;br /&gt;
       last_millis = current_millis; &lt;br /&gt;
       reception_ir1.enableIRIn();&lt;br /&gt;
       reception_ir2.enableIRIn();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    if (reception_ir1.decode(&amp;amp;decode_ir1)) &lt;br /&gt;
    { &lt;br /&gt;
      if(decode_ir1.value == 1){&lt;br /&gt;
        etatTsop = 1;&lt;br /&gt;
      }&lt;br /&gt;
  &lt;br /&gt;
      reception_ir1.resume();&lt;br /&gt;
      reception_ir2.enableIRIn();&lt;br /&gt;
    }&lt;br /&gt;
    if (reception_ir2.decode(&amp;amp;decode_ir2)) &lt;br /&gt;
    { &lt;br /&gt;
      if(decode_ir2.value == 1){&lt;br /&gt;
        etatTsop = 1;&lt;br /&gt;
      } &lt;br /&gt;
      reception_ir2.resume();  &lt;br /&gt;
      reception_ir1.enableIRIn();&lt;br /&gt;
    }&lt;br /&gt;
    return etatTsop;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  int hall(){&lt;br /&gt;
    int etatHall = 0;&lt;br /&gt;
    if(digitalRead(HALL) == 0){&lt;br /&gt;
      etatHall = 1;&lt;br /&gt;
    }&lt;br /&gt;
    return etatHall;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
=== Description de la structure du code ===&lt;br /&gt;
&lt;br /&gt;
==== Fonction sonar() ====&lt;br /&gt;
&lt;br /&gt;
Cette fonction permet au sonar de calculer la distance séparant le robot d'un obstacle.&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
  int sonar() {&lt;br /&gt;
    digitalWrite(TRIGG, 1);&lt;br /&gt;
    delayMicroseconds(10);&lt;br /&gt;
    digitalWrite(TRIGG,0);&lt;br /&gt;
    long measure = pulseIn(ECHO, HIGH);&lt;br /&gt;
    &lt;br /&gt;
    float distance_mm = measure / 2.0 * SOUND_SPEED;&lt;br /&gt;
    return distance_mm; &lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Fonction tsop()====&lt;br /&gt;
&lt;br /&gt;
Cette fonction a deux rôles. Le premier est de lire les entrées des tsop et de renvoyer si un prédateur a été détecter ou non. Le deuxième est d'émettre un signal infra-rouge permettant au prédateur de nous détecter.&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
  int tsop(int * attraper ){&lt;br /&gt;
    unsigned long current_millis = millis();&lt;br /&gt;
    int etatTsop = 0;&lt;br /&gt;
    if ((current_millis - last_millis &amp;gt;= interval)&amp;amp;&amp;amp;(*attraper == 0)){&lt;br /&gt;
       emission_ir.sendNEC(1, 32); &lt;br /&gt;
       last_millis = current_millis; &lt;br /&gt;
       reception_ir1.enableIRIn();&lt;br /&gt;
       reception_ir2.enableIRIn();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    if (reception_ir1.decode(&amp;amp;decode_ir1)) &lt;br /&gt;
    { &lt;br /&gt;
      if(decode_ir1.value == 1){&lt;br /&gt;
        etatTsop = 1;&lt;br /&gt;
      }&lt;br /&gt;
  &lt;br /&gt;
      reception_ir1.resume();&lt;br /&gt;
      reception_ir2.enableIRIn();&lt;br /&gt;
    }&lt;br /&gt;
    if (reception_ir2.decode(&amp;amp;decode_ir2)) &lt;br /&gt;
    { &lt;br /&gt;
      if(decode_ir2.value == 1){&lt;br /&gt;
        etatTsop = 1;&lt;br /&gt;
      } &lt;br /&gt;
      reception_ir2.resume();  &lt;br /&gt;
      reception_ir1.enableIRIn();&lt;br /&gt;
    }&lt;br /&gt;
    return etatTsop;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Les particularités de cette fonction sont que, premièrement pour facilité la programmation l'émission et la réception ont été mises dans la même fonction car elles demandent toutes les deux la même bibliothèque et les même timer, donc pour éviter tout conflit ceci fut une bonne solution. Deuxièmement, la fonction tsop() contient un pointeur en paramètre. Ce pointeur permet au robot de savoir s'il doit continuer à émettre ou non s'il est attrapé.&lt;br /&gt;
&lt;br /&gt;
L'émission du signal infra-rouge ici ce fait toute les 0.5s. En effet si les émissions sont trop proche il y a conflit avec la réception.&lt;br /&gt;
&lt;br /&gt;
==== Fonction hall()====&lt;br /&gt;
&lt;br /&gt;
Cette fonction permet de voir si un prédateur nous a détecté et attrapé grâce à l'émission d'une onde électromagnétique.&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
  int hall(){&lt;br /&gt;
    int etatHall = 0;&lt;br /&gt;
    if(digitalRead(HALL) == 0){&lt;br /&gt;
      etatHall = 1;&lt;br /&gt;
    }&lt;br /&gt;
    return etatHall;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Fonction deplacement() ====&lt;br /&gt;
&lt;br /&gt;
Pour le déplacement du robot nous avons choisi de créer un classe pour avoir un code plus propre et une fonction loop() ne contenant qu'une seul ligne de code.&lt;br /&gt;
&lt;br /&gt;
La Classe Mouv contient 2 fonctions. La première attacher() permet de lier les instances servo aux pins associées. Elle est appelée dans le setup(). La deuxième fonction est la fonction de déplacement appelée deplacement(). Cette fonction est la seule appelée de la fonction loop().&lt;br /&gt;
&lt;br /&gt;
Cette fonction est alors la fonction principale du robot, car c'est elle qui va décider du déplacement du robot en fonction des différentes entrées des capteurs. Elle contient en paramètre les différentes entrées du sonar, du tsop, de la sonde de hall, mais aussi un pointeur pour pouvoir sauvegarder en mémoire le fait que le robot soit attrapé ou non.&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
      void deplacement(int distanceObstacle , int tsop , int hall, int* attraper){&lt;br /&gt;
        unsigned long currentMillis = millis();&lt;br /&gt;
        &lt;br /&gt;
        if (hall == 1){&lt;br /&gt;
          etatHall = 1;&lt;br /&gt;
          *attraper = 1;&lt;br /&gt;
        }&lt;br /&gt;
        else if (distanceObstacle &amp;lt; 200){&lt;br /&gt;
          etatSonar = 1;&lt;br /&gt;
        }&lt;br /&gt;
        else if (tsop==1){&lt;br /&gt;
          etatTsop = 1;&lt;br /&gt;
          lastMillis = currentMillis;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        if (etatHall == 1){&lt;br /&gt;
          servo1.write(90);&lt;br /&gt;
          servo2.write(90);&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        else if (etatSonar ==1){&lt;br /&gt;
          if (etatRotation == 0){&lt;br /&gt;
            etatRotation = random(1,3);&lt;br /&gt;
          }&lt;br /&gt;
          if(etatRotation == 1){&lt;br /&gt;
            servo1.write(180);&lt;br /&gt;
            servo2.write(180);&lt;br /&gt;
          }&lt;br /&gt;
          else{&lt;br /&gt;
            servo1.write(0);&lt;br /&gt;
            servo2.write(0);&lt;br /&gt;
          }&lt;br /&gt;
          etatSonnar = 0 ;&lt;br /&gt;
          lastMillis = currentMillis;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        else if (etatTsop == 1){&lt;br /&gt;
          if (etatRotation == 0){&lt;br /&gt;
            etatRotation = random(1,3);&lt;br /&gt;
          }&lt;br /&gt;
          &lt;br /&gt;
          if(etatRotation == 1){&lt;br /&gt;
            servo1.write(180);&lt;br /&gt;
            servo2.write(180);&lt;br /&gt;
          }&lt;br /&gt;
          else{&lt;br /&gt;
            servo1.write(0);&lt;br /&gt;
            servo2.write(0);&lt;br /&gt;
          }&lt;br /&gt;
          &lt;br /&gt;
          if (currentMillis - lastMillis &amp;gt;= intervalTsop){&lt;br /&gt;
            etatTsop = 0;&lt;br /&gt;
            lastMillis = currentMillis;&lt;br /&gt;
          }&lt;br /&gt;
        }   &lt;br /&gt;
        &lt;br /&gt;
        else{&lt;br /&gt;
          etatRotation = 0;&lt;br /&gt;
          if (currentMillis - lastMillis &amp;lt; intervalMouvement1){&lt;br /&gt;
            servo1.write(180);&lt;br /&gt;
            servo2.write(70);&lt;br /&gt;
          }&lt;br /&gt;
          else if ((currentMillis - lastMillis &amp;gt;= intervalMouvement2) &amp;amp;&amp;amp;  (currentMillis - lastMillis &amp;lt;= intervalMouvement3)){&lt;br /&gt;
            servo1.write(98);&lt;br /&gt;
            servo2.write(0);&lt;br /&gt;
          }&lt;br /&gt;
          else{&lt;br /&gt;
            servo1.write(180);&lt;br /&gt;
            servo2.write(0);&lt;br /&gt;
            if (currentMillis - lastMillis &amp;gt;= intervalMouvement4){&lt;br /&gt;
              lastMillis = currentMillis;&lt;br /&gt;
            }&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Cette fonction est divisée en deux partie. La première est la distribution des états du robot en fonction des entrées. Par la suite, la fonction va décidé quel déplacement faire en fonction des priorités des différents états. L'états le plus prioritaire est l'états etatHall. Celui ci indique si le robot est attrapé et une fois passé à 1 il ne peut plus changer et le déplacement associé est un sur-place pour le robot. Après il y a l'état associé au obstacle et si la distance devient inférieur à celle écrite, le robot tourne sur lui même dans une direction aléatoire jusqu'à ne plus percevoir d'obstacle. Le suivant est celui de la détection de prédateur. Ici si un prédateur est détectée, Quireekoo va aussi ce tourner dans une direction aléatoire. Mais la différence c'est que ici il va tourner pendant un certain intervalle de temps rentré dans le code. Le dernier déplacement n'est exécuter seulement si aucun des trois autres n'est fait. C'est le déplacement de base du robot. Ce déplacement est juste en zigzag.&lt;br /&gt;
&lt;br /&gt;
=== Les difficultés rencontrées ===&lt;br /&gt;
&lt;br /&gt;
Une grand difficulté lors de la programmation de Quireekoo fut l’émission et la réception infra-rouge. En effet la première idée pour l'émission était de juste allumer et éteindre la led infra-rouge à un fréquence de 38 kHz avec les intervalles de temps précis comme utilisé ici pour d'autre fonction avec les currentMillis et lastMillis. Les tsop réagissaient bien à l'émission. Le problème est que si l'on rajoutais des fonctions comme le déplacement ou le sonar, le temps d'arriver jusqu'à l'émission l'intervalle de temps qui permettait une fréquence de 38 kHz était dépassé. &lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
  void allumer()&lt;br /&gt;
  {&lt;br /&gt;
    // check to see if it's time to change the state of the LED&lt;br /&gt;
    unsigned long currentMicros = micros();&lt;br /&gt;
     &lt;br /&gt;
    if((ledState == HIGH) &amp;amp;&amp;amp; (currentMicros - previousMicros &amp;gt;= OnTime))&lt;br /&gt;
    {&lt;br /&gt;
      ledState = LOW;  // Turn it off&lt;br /&gt;
      previousMicros = currentMicros;  // Remember the time&lt;br /&gt;
      digitalWrite(ledPin, ledState);  // Update the actual LED&lt;br /&gt;
    }&lt;br /&gt;
    else if ((ledState == LOW) &amp;amp;&amp;amp; (currentMicros - previousMicros &amp;gt;= OffTime))&lt;br /&gt;
    {&lt;br /&gt;
      ledState = HIGH;  // turn it on&lt;br /&gt;
      previousMicros = currentMicros;   // Remember the time&lt;br /&gt;
      digitalWrite(ledPin, ledState);   // Update the actual LED&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
Une solution fur de passer directement par les interruptions timer. Mais deux problèmes ce sont encore révélés. Le premier était que tout les timer étaient déjà utilisé par la bibliothèque servo.h, donc impossible de faire les interruptions. De plus avec cette façon de faire ou la précédente, il était impossible de faire passer un message à travers l'émission, donc impossible de différencier une proie d'un prédateur.&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
    // initialize timer1 &lt;br /&gt;
    noInterrupts();           // disable all interrupts&lt;br /&gt;
    TCCR5A = 0;&lt;br /&gt;
    TCCR5B = 0;&lt;br /&gt;
    TCNT5  = 0;&lt;br /&gt;
  &lt;br /&gt;
    OCR5A = 421;            // compare match register 16MHz/256/2Hz&lt;br /&gt;
    TCCR5B |= (1 &amp;lt;&amp;lt; WGM52);   // CTC mode&lt;br /&gt;
    TCCR5B |= (1 &amp;lt;&amp;lt; CS50);    // 256 prescaler &lt;br /&gt;
    TIMSK5 |= (1 &amp;lt;&amp;lt; OCIE5A);  // enable timer compare interrupt&lt;br /&gt;
    interrupts();             // enable all interrupts&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  ISR(TIMER5_COMPA_vect)          // timer compare interrupt service routine&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(ledPin, digitalRead(ledPin) ^ 1);   // toggle LED pin&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Nous en sommes arrivé à utiliser la bibliothèque IRremote.h. Avec cette bibliothèque, l'émission et la réception infra-rouge ce fait très simplement si elles sont séparées. Mais les applications utilisant les même timer, il y a alors conflit pour faire fonctionner les deux en même temps. Cela nous a pris du temps pour trouver une solution car aucune information n'a pu être trouvé sur le web. Le problème était que si nous faisions une émission, les timer de la réception était annulé. Il fallait alors les ré-allouer pour la réception après l'émission avec le ligne de code: reception_ir1.enableIRIn();.&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
 if ((current_millis - last_millis &amp;gt;= interval)&amp;amp;&amp;amp;(*attraper == 0)){&lt;br /&gt;
       emission_ir.sendNEC(1, 32); &lt;br /&gt;
       last_millis = current_millis; &lt;br /&gt;
       reception_ir1.enableIRIn();&lt;br /&gt;
       reception_ir2.enableIRIn();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Cette solution a alors été partagée avec les autres groupes qui avaient besoin d'émettre et de réceptionner un signal.&lt;/div&gt;</summary>
		<author><name>Dtillaux</name></author>	</entry>

	<entry>
		<id>https://peip-ima.plil.fr/mediawiki/index.php?title=Binome2017-9&amp;diff=9613</id>
		<title>Binome2017-9</title>
		<link rel="alternate" type="text/html" href="https://peip-ima.plil.fr/mediawiki/index.php?title=Binome2017-9&amp;diff=9613"/>
				<updated>2018-05-05T15:03:03Z</updated>
		
		<summary type="html">&lt;p&gt;Dtillaux : /* Les difficultés rencontrées */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Binôme 9 saison 8: Raphaël Bonvalet, Damien Tillaux.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Projet Quireekoo =&lt;br /&gt;
&lt;br /&gt;
Le but du projet Quireekoo est de créer un robot communiquant avec d'autre via infra-rouge. Ce projet à eu lieux lors des bureaux d'étude de PEIP en IMA au S4 2018 de notre cursus pour devenir ingénieur. Voici la transcription phonétique de Quireekoo: /Kirikou/.&lt;br /&gt;
&lt;br /&gt;
= Cahier des charges =&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Kiki.jpg|middle]]&lt;br /&gt;
&lt;br /&gt;
Quireekoo sera un robot fait de A à Z. Le circuit imprimé sera totalement revu et sera guidé grâce à une ATMEGA-328. Le physique sera totalement design par nous même et son programme sera totalement autonome.&lt;br /&gt;
&lt;br /&gt;
Quireekoo étant petit et vaillant est un véhicule de petite taille. A la défaut de jambe, Quireekoo ce déplace avec 2 servos moteurs continue. A la place des yeux, un sonar pour éviter ses obstacles et ne pas trébucher. Pour ses oreilles nous avons prévu 2 Tsop38238 pour pouvoir repérer et fuir ses ennemis.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Réalisation du projet =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Voici les différentes étapes par lesquels nous sommes passer lors de la création de Quireekoo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Réalisation de PCB ==&lt;br /&gt;
&lt;br /&gt;
=== Idée principale ===&lt;br /&gt;
&lt;br /&gt;
Nous voulions refaire nous même le PCB de Quireekoo mais nous n'avions pratiquement aucune base sur comment créer un circuit imprimé pour ce genre de projet. Du coups nous avons pris comme modèle, le modèle donnée sur la page principale du projet. ([https://peip-ima.plil.fr/mediawiki/index.php/BE_2017-2018 BE 2017-2018])&lt;br /&gt;
&lt;br /&gt;
Voici le schématique sur lequel nous nous sommes basé.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:RobotPCB schem.png|500px|thumb||left|Schématique original]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Notre PCB ===&lt;br /&gt;
&lt;br /&gt;
Notre PCB a été réalisé sur Fritzing. Nous avons créer ce circuit imprimé à notre image pour notre véhicule. Nous avons enlevé le driver de moteur et les sorties moteurs car nous voulions un robot de petite taille. Donc le moyen de déplacement choisi a alors été le servo-moteur. Pour les réceptions infra-rouge nous n'avons prévu que deux sorties pour des Tsop pour pouvoir laisser un plus grande chance au chasseur de ne pas être repéré, pour une approche plus vrai que nature. Pour savoir si un chasseur nous a attrapé, nous utilisons une sonde de Hall.&lt;br /&gt;
&lt;br /&gt;
De plus, en cas de problème nous avons créé toutes les sorties du microcontrôleur. Si un problème apparaît sur une des pins utilisées, nous pourrons la relocaliser sur une autre sortie.&lt;br /&gt;
&lt;br /&gt;
Un objectif supplémentaire était de réaliser un PCB le plus petit possible pour que le véhicule le soit aussi. Ce fut presque un succès, la carte est d'une taille environ de 5cm*5cm. Elle aurait pu être encore plus petite avec plus de travail mais nous ne pouvions pas nous le permettre si nous voulions tout faire.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Voici le schématique et le PCB de Quireekoo.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Quireekoo schem.png|500px|thumb|left|Schématique de Quireekoo]]&lt;br /&gt;
[[Fichier:Quireekoo pcb.png|500px|thumb|right|PCB de Quireekoo]]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Réalisation de la partie mécanique du véhicule ==&lt;br /&gt;
&lt;br /&gt;
Pour la partie mécanique de Quireekoo on a choisi de le faire sur inkscape afin de pouvoir effectuer une découpe laser. Le robot est composé de deux plaques de plexiglas, une pour le châssis où il y a les servos moteur, la bille et le bloc de pile, et une pour placer le sonar, le circuit imprimée, les Tsop et la sonde de hall. &lt;br /&gt;
&lt;br /&gt;
Voici à quoi ressemble la partie du bas sur inkscape : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Partie bas.jpg|700px|]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour la partie du haut c'était un peu plus compliqué car il fallait trouver comment placer les tsop, la sonde de hall et le sonar. Pour pouvoir fixer ceux-ci on a choisi de faire des trous en forme de rectangles avec une taille égale à la taille des pins de chaque capteurs différents. Après il fallait aussi mettre les trous pour fixer le circuit imprimé au même endroit que ceux qui se trouve sur celui-ci. Pour ce faire, on a utilisé le fichier .svg donné par Fritzing. On a également mis des trous en forme de rectangle sur les côtés pour pouvoir laisser passer les fils.&lt;br /&gt;
&lt;br /&gt;
Voici à quoi ressemble la partie du haut sur inkscape :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Partie haut.png|700px|]]&lt;br /&gt;
&lt;br /&gt;
Pour finir il nous restait les roues à faire. On a opté pour garder les roues données avec les servos moteurs en y rajoutant des partie en plexiglas au pistolet à colle pour rendre celles-ci plus grandes.&lt;br /&gt;
&lt;br /&gt;
Voici à quoi cela ressemble sur inkscape : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Roue.png|200px|]]&lt;br /&gt;
&lt;br /&gt;
Le problème avec cette solution c'est que les roues ne sont pas adhérentes. De ce fait là, on a ajouté une partie d'élastique autour avec de la colle glue.&lt;br /&gt;
&lt;br /&gt;
Voici a quoi le robot ressemble à la fin :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Quireekoo.jpg|200px|]]&lt;br /&gt;
&lt;br /&gt;
== Réalisation du code Arduino ==&lt;br /&gt;
&lt;br /&gt;
Voici maintenant la présentation du code téléversé dans Quireekoo.&lt;br /&gt;
&lt;br /&gt;
=== Le code ===&lt;br /&gt;
&lt;br /&gt;
{  &lt;br /&gt;
  #include &amp;lt;Servo.h&amp;gt;&lt;br /&gt;
  #include &amp;lt;IRremote.h&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  //déclaration des différentes pins&lt;br /&gt;
  &lt;br /&gt;
  #define SERVO1 11&lt;br /&gt;
  #define SERVO2 13&lt;br /&gt;
  #define ECHO 17&lt;br /&gt;
  #define TRIGG 18&lt;br /&gt;
  #define HALL A2&lt;br /&gt;
  #define IR 2&lt;br /&gt;
  #define VCCIR1 A0&lt;br /&gt;
  #define VCCIR2 A1&lt;br /&gt;
  &lt;br /&gt;
  //création de la classe Mouv pour le déplacement du robot&lt;br /&gt;
  &lt;br /&gt;
  class Mouv {&lt;br /&gt;
  &lt;br /&gt;
          Servo servo1;&lt;br /&gt;
          Servo servo2;&lt;br /&gt;
          int servo1Pin;&lt;br /&gt;
          int servo2Pin;&lt;br /&gt;
          &lt;br /&gt;
          int etatRotation;&lt;br /&gt;
          int etatSonar;&lt;br /&gt;
          int etatHall;&lt;br /&gt;
          int etatTsop;&lt;br /&gt;
          &lt;br /&gt;
          long intervalTsop;&lt;br /&gt;
          &lt;br /&gt;
          long intervalMouvement1;&lt;br /&gt;
          long intervalMouvement2;&lt;br /&gt;
          long intervalMouvement3;&lt;br /&gt;
          long intervalMouvement4;&lt;br /&gt;
          &lt;br /&gt;
          unsigned long lastMillis;&lt;br /&gt;
          &lt;br /&gt;
          &lt;br /&gt;
    public:&lt;br /&gt;
      Mouv(int pin1 , int pin2){&lt;br /&gt;
        servo1Pin= pin1;&lt;br /&gt;
        servo2Pin = pin2;&lt;br /&gt;
        &lt;br /&gt;
        etatRotation = 0;&lt;br /&gt;
        etatSonar = 0;&lt;br /&gt;
        etatHall = 0;&lt;br /&gt;
        etatTsop = 0;&lt;br /&gt;
        lastMillis = 0;&lt;br /&gt;
        &lt;br /&gt;
        intervalTsop = 500;&lt;br /&gt;
        &lt;br /&gt;
        intervalMouvement1 = 1500;&lt;br /&gt;
        intervalMouvement2 = 1700;&lt;br /&gt;
        intervalMouvement3 = 3200;&lt;br /&gt;
        intervalMouvement4 = 3400;&lt;br /&gt;
      }&lt;br /&gt;
    &lt;br /&gt;
      void attacher(){&lt;br /&gt;
        servo1.attach(servo1Pin);&lt;br /&gt;
        servo2.attach(servo2Pin);&lt;br /&gt;
      }&lt;br /&gt;
  &lt;br /&gt;
      void deplacement(int distanceObstacle , int tsop , int hall, int* attraper){&lt;br /&gt;
        unsigned long currentMillis = millis();&lt;br /&gt;
        &lt;br /&gt;
        if (hall == 1){&lt;br /&gt;
          etatHall = 1;&lt;br /&gt;
          *attraper = 1;&lt;br /&gt;
        }&lt;br /&gt;
        else if (distanceObstacle &amp;lt; 200){&lt;br /&gt;
          etatSonar = 1;&lt;br /&gt;
        }&lt;br /&gt;
        else if (tsop==1){&lt;br /&gt;
          etatTsop = 1;&lt;br /&gt;
          lastMillis = currentMillis;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        if (etatHall == 1){&lt;br /&gt;
          servo1.write(90);&lt;br /&gt;
          servo2.write(90);&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        else if (etatSonar ==1){&lt;br /&gt;
          if (etatRotation == 0){&lt;br /&gt;
            etatRotation = random(1,3);&lt;br /&gt;
          }&lt;br /&gt;
          if(etatRotation == 1){&lt;br /&gt;
            servo1.write(180);&lt;br /&gt;
            servo2.write(180);&lt;br /&gt;
          }&lt;br /&gt;
          else{&lt;br /&gt;
            servo1.write(0);&lt;br /&gt;
            servo2.write(0);&lt;br /&gt;
          }&lt;br /&gt;
          etatSonar = 0 ;&lt;br /&gt;
          lastMillis = currentMillis;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        else if (etatTsop == 1){&lt;br /&gt;
          if (etatRotation == 0){&lt;br /&gt;
            etatRotation = random(1,3);&lt;br /&gt;
          }&lt;br /&gt;
          &lt;br /&gt;
          if(etatRotation == 1){&lt;br /&gt;
            servo1.write(180);&lt;br /&gt;
            servo2.write(180);&lt;br /&gt;
          }&lt;br /&gt;
          else{&lt;br /&gt;
            servo1.write(0);&lt;br /&gt;
            servo2.write(0);&lt;br /&gt;
          }&lt;br /&gt;
          &lt;br /&gt;
          if (currentMillis - lastMillis &amp;gt;= intervalTsop){&lt;br /&gt;
            etatTsop = 0;&lt;br /&gt;
            lastMillis = currentMillis;&lt;br /&gt;
          }&lt;br /&gt;
        }   &lt;br /&gt;
        &lt;br /&gt;
        else{&lt;br /&gt;
          etatRotation = 0;&lt;br /&gt;
          if (currentMillis - lastMillis &amp;lt; intervalMouvement1){&lt;br /&gt;
            servo1.write(180);&lt;br /&gt;
            servo2.write(70);&lt;br /&gt;
          }&lt;br /&gt;
          else if ((currentMillis - lastMillis &amp;gt;= intervalMouvement2) &amp;amp;&amp;amp;  (currentMillis - lastMillis &amp;lt;= intervalMouvement3)){&lt;br /&gt;
            servo1.write(98);&lt;br /&gt;
            servo2.write(0);&lt;br /&gt;
          }&lt;br /&gt;
          else{&lt;br /&gt;
            servo1.write(180);&lt;br /&gt;
            servo2.write(0);&lt;br /&gt;
            if (currentMillis - lastMillis &amp;gt;= intervalMouvement4){&lt;br /&gt;
              lastMillis = currentMillis;&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;br /&gt;
  Mouv servo(SERVO1,SERVO2);&lt;br /&gt;
  &lt;br /&gt;
  //varibable pour le sonnar&lt;br /&gt;
  &lt;br /&gt;
  long lectureEcho;&lt;br /&gt;
  long distance;&lt;br /&gt;
  const float SOUND_SPEED = 340.0 / 1000;&lt;br /&gt;
  &lt;br /&gt;
  //varibable pour la sonde de hall&lt;br /&gt;
  &lt;br /&gt;
  int* attraper;&lt;br /&gt;
  &lt;br /&gt;
  //varibable pour les tsop&lt;br /&gt;
  &lt;br /&gt;
  unsigned long last_millis = 0; &lt;br /&gt;
  long interval = 500;&lt;br /&gt;
  &lt;br /&gt;
  int broche_reception1 = VCCIR1;&lt;br /&gt;
  IRrecv reception_ir1(broche_reception1);&lt;br /&gt;
  decode_results decode_ir1;&lt;br /&gt;
  &lt;br /&gt;
  int broche_reception2 = VCCIR2;&lt;br /&gt;
  IRrecv reception_ir2(broche_reception2);&lt;br /&gt;
  decode_results decode_ir2; &lt;br /&gt;
  &lt;br /&gt;
  //instance pour l'emmission infra-rouge&lt;br /&gt;
  &lt;br /&gt;
  IRsend emission_ir; &lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  void setup() {&lt;br /&gt;
    pinMode(TRIGG,OUTPUT);&lt;br /&gt;
    digitalWrite(TRIGG,0);&lt;br /&gt;
    pinMode(ECHO,INPUT); &lt;br /&gt;
    pinMode(IR,OUTPUT);&lt;br /&gt;
    digitalWrite(IR,1);&lt;br /&gt;
  &lt;br /&gt;
    servo.attacher();&lt;br /&gt;
    &lt;br /&gt;
    reception_ir1.enableIRIn(); // démarre la réception&lt;br /&gt;
    reception_ir2.enableIRIn();&lt;br /&gt;
    &lt;br /&gt;
    attraper = malloc(sizeof(int));&lt;br /&gt;
    *attraper = 0;&lt;br /&gt;
    &lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  void loop() {&lt;br /&gt;
    servo.deplacement(sonar(),tsop(attraper),hall(),attraper);  &lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  int sonar() {&lt;br /&gt;
    digitalWrite(TRIGG, 1);&lt;br /&gt;
    delayMicroseconds(10);&lt;br /&gt;
    digitalWrite(TRIGG,0);&lt;br /&gt;
    long measure = pulseIn(ECHO, HIGH);&lt;br /&gt;
    &lt;br /&gt;
    float distance_mm = measure / 2.0 * SOUND_SPEED;&lt;br /&gt;
    return distance_mm; &lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  int tsop(int * attraper ){&lt;br /&gt;
    unsigned long current_millis = millis();&lt;br /&gt;
    int etatTsop = 0;&lt;br /&gt;
    if ((current_millis - last_millis &amp;gt;= interval)&amp;amp;&amp;amp;(*attraper == 0)){&lt;br /&gt;
       emission_ir.sendNEC(1, 32); &lt;br /&gt;
       last_millis = current_millis; &lt;br /&gt;
       reception_ir1.enableIRIn();&lt;br /&gt;
       reception_ir2.enableIRIn();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    if (reception_ir1.decode(&amp;amp;decode_ir1)) &lt;br /&gt;
    { &lt;br /&gt;
      if(decode_ir1.value == 1){&lt;br /&gt;
        etatTsop = 1;&lt;br /&gt;
      }&lt;br /&gt;
  &lt;br /&gt;
      reception_ir1.resume();&lt;br /&gt;
      reception_ir2.enableIRIn();&lt;br /&gt;
    }&lt;br /&gt;
    if (reception_ir2.decode(&amp;amp;decode_ir2)) &lt;br /&gt;
    { &lt;br /&gt;
      if(decode_ir2.value == 1){&lt;br /&gt;
        etatTsop = 1;&lt;br /&gt;
      } &lt;br /&gt;
      reception_ir2.resume();  &lt;br /&gt;
      reception_ir1.enableIRIn();&lt;br /&gt;
    }&lt;br /&gt;
    return etatTsop;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  int hall(){&lt;br /&gt;
    int etatHall = 0;&lt;br /&gt;
    if(digitalRead(HALL) == 0){&lt;br /&gt;
      etatHall = 1;&lt;br /&gt;
    }&lt;br /&gt;
    return etatHall;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
=== Description de la structure du code ===&lt;br /&gt;
&lt;br /&gt;
==== Fonction sonar() ====&lt;br /&gt;
&lt;br /&gt;
Cette fonction permet au sonar de calculer la distance séparant le robot d'un obstacle.&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
  int sonar() {&lt;br /&gt;
    digitalWrite(TRIGG, 1);&lt;br /&gt;
    delayMicroseconds(10);&lt;br /&gt;
    digitalWrite(TRIGG,0);&lt;br /&gt;
    long measure = pulseIn(ECHO, HIGH);&lt;br /&gt;
    &lt;br /&gt;
    float distance_mm = measure / 2.0 * SOUND_SPEED;&lt;br /&gt;
    return distance_mm; &lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Fonction tsop()====&lt;br /&gt;
&lt;br /&gt;
Cette fonction a deux rôles. Le premier est de lire les entrées des tsop et de renvoyer si un prédateur a été détecter ou non. Le deuxième est d'émettre un signal infra-rouge permettant au prédateur de nous détecter.&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
  int tsop(int * attraper ){&lt;br /&gt;
    unsigned long current_millis = millis();&lt;br /&gt;
    int etatTsop = 0;&lt;br /&gt;
    if ((current_millis - last_millis &amp;gt;= interval)&amp;amp;&amp;amp;(*attraper == 0)){&lt;br /&gt;
       emission_ir.sendNEC(1, 32); &lt;br /&gt;
       last_millis = current_millis; &lt;br /&gt;
       reception_ir1.enableIRIn();&lt;br /&gt;
       reception_ir2.enableIRIn();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    if (reception_ir1.decode(&amp;amp;decode_ir1)) &lt;br /&gt;
    { &lt;br /&gt;
      if(decode_ir1.value == 1){&lt;br /&gt;
        etatTsop = 1;&lt;br /&gt;
      }&lt;br /&gt;
  &lt;br /&gt;
      reception_ir1.resume();&lt;br /&gt;
      reception_ir2.enableIRIn();&lt;br /&gt;
    }&lt;br /&gt;
    if (reception_ir2.decode(&amp;amp;decode_ir2)) &lt;br /&gt;
    { &lt;br /&gt;
      if(decode_ir2.value == 1){&lt;br /&gt;
        etatTsop = 1;&lt;br /&gt;
      } &lt;br /&gt;
      reception_ir2.resume();  &lt;br /&gt;
      reception_ir1.enableIRIn();&lt;br /&gt;
    }&lt;br /&gt;
    return etatTsop;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Les particularités de cette fonction sont que, premièrement pour facilité la programmation l'émission et la réception ont été mises dans la même fonction car elles demandent toutes les deux la même bibliothèque et les même timer, donc pour éviter tout conflit ceci fut une bonne solution. Deuxièmement, la fonction tsop() contient un pointeur en paramètre. Ce pointeur permet au robot de savoir s'il doit continuer à émettre ou non s'il est attrapé.&lt;br /&gt;
&lt;br /&gt;
L'émission du signal infra-rouge ici ce fait toute les 0.5s. En effet si les émissions sont trop proche il y a conflit avec la réception.&lt;br /&gt;
&lt;br /&gt;
==== Fonction hall()====&lt;br /&gt;
&lt;br /&gt;
Cette fonction permet de voir si un prédateur nous a détecté et attrapé grâce à l'émission d'une onde électromagnétique.&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
  int hall(){&lt;br /&gt;
    int etatHall = 0;&lt;br /&gt;
    if(digitalRead(HALL) == 0){&lt;br /&gt;
      etatHall = 1;&lt;br /&gt;
    }&lt;br /&gt;
    return etatHall;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Fonction deplacement() ====&lt;br /&gt;
&lt;br /&gt;
Pour le déplacement du robot nous avons choisi de créer un classe pour avoir un code plus propre et une fonction loop() ne contenant qu'une seul ligne de code.&lt;br /&gt;
&lt;br /&gt;
La Classe Mouv contient 2 fonctions. La première attacher() permet de lier les instances servo aux pins associées. Elle est appelée dans le setup(). La deuxième fonction est la fonction de déplacement appelée deplacement(). Cette fonction est la seule appelée de la fonction loop().&lt;br /&gt;
&lt;br /&gt;
Cette fonction est alors la fonction principale du robot, car c'est elle qui va décider du déplacement du robot en fonction des différentes entrées des capteurs. Elle contient en paramètre les différentes entrées du sonar, du tsop, de la sonde de hall, mais aussi un pointeur pour pouvoir sauvegarder en mémoire le fait que le robot soit attrapé ou non.&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
      void deplacement(int distanceObstacle , int tsop , int hall, int* attraper){&lt;br /&gt;
        unsigned long currentMillis = millis();&lt;br /&gt;
        &lt;br /&gt;
        if (hall == 1){&lt;br /&gt;
          etatHall = 1;&lt;br /&gt;
          *attraper = 1;&lt;br /&gt;
        }&lt;br /&gt;
        else if (distanceObstacle &amp;lt; 200){&lt;br /&gt;
          etatSonar = 1;&lt;br /&gt;
        }&lt;br /&gt;
        else if (tsop==1){&lt;br /&gt;
          etatTsop = 1;&lt;br /&gt;
          lastMillis = currentMillis;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        if (etatHall == 1){&lt;br /&gt;
          servo1.write(90);&lt;br /&gt;
          servo2.write(90);&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        else if (etatSonar ==1){&lt;br /&gt;
          if (etatRotation == 0){&lt;br /&gt;
            etatRotation = random(1,3);&lt;br /&gt;
          }&lt;br /&gt;
          if(etatRotation == 1){&lt;br /&gt;
            servo1.write(180);&lt;br /&gt;
            servo2.write(180);&lt;br /&gt;
          }&lt;br /&gt;
          else{&lt;br /&gt;
            servo1.write(0);&lt;br /&gt;
            servo2.write(0);&lt;br /&gt;
          }&lt;br /&gt;
          etatSonnar = 0 ;&lt;br /&gt;
          lastMillis = currentMillis;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        else if (etatTsop == 1){&lt;br /&gt;
          if (etatRotation == 0){&lt;br /&gt;
            etatRotation = random(1,3);&lt;br /&gt;
          }&lt;br /&gt;
          &lt;br /&gt;
          if(etatRotation == 1){&lt;br /&gt;
            servo1.write(180);&lt;br /&gt;
            servo2.write(180);&lt;br /&gt;
          }&lt;br /&gt;
          else{&lt;br /&gt;
            servo1.write(0);&lt;br /&gt;
            servo2.write(0);&lt;br /&gt;
          }&lt;br /&gt;
          &lt;br /&gt;
          if (currentMillis - lastMillis &amp;gt;= intervalTsop){&lt;br /&gt;
            etatTsop = 0;&lt;br /&gt;
            lastMillis = currentMillis;&lt;br /&gt;
          }&lt;br /&gt;
        }   &lt;br /&gt;
        &lt;br /&gt;
        else{&lt;br /&gt;
          etatRotation = 0;&lt;br /&gt;
          if (currentMillis - lastMillis &amp;lt; intervalMouvement1){&lt;br /&gt;
            servo1.write(180);&lt;br /&gt;
            servo2.write(70);&lt;br /&gt;
          }&lt;br /&gt;
          else if ((currentMillis - lastMillis &amp;gt;= intervalMouvement2) &amp;amp;&amp;amp;  (currentMillis - lastMillis &amp;lt;= intervalMouvement3)){&lt;br /&gt;
            servo1.write(98);&lt;br /&gt;
            servo2.write(0);&lt;br /&gt;
          }&lt;br /&gt;
          else{&lt;br /&gt;
            servo1.write(180);&lt;br /&gt;
            servo2.write(0);&lt;br /&gt;
            if (currentMillis - lastMillis &amp;gt;= intervalMouvement4){&lt;br /&gt;
              lastMillis = currentMillis;&lt;br /&gt;
            }&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Cette fonction est divisée en deux partie. La première est la distribution des états du robot en fonction des entrées. Par la suite, la fonction va décidé quel déplacement faire en fonction des priorités des différents états. L'états le plus prioritaire est l'états etatHall. Celui ci indique si le robot est attrapé et une fois passé à 1 il ne peut plus changer et le déplacement associé est un sur-place pour le robot. Après il y a l'état associé au obstacle et si la distance devient inférieur à celle écrite, le robot tourne sur lui même dans une direction aléatoire jusqu'à ne plus percevoir d'obstacle. Le suivant est celui de la détection de prédateur. Ici si un prédateur est détectée, Quireekoo va aussi ce tourner dans une direction aléatoire. Mais la différence c'est que ici il va tourner pendant un certain intervalle de temps rentré dans le code. Le dernier déplacement n'est exécuter seulement si aucun des trois autres n'est fait. C'est le déplacement de base du robot. Ce déplacement est juste en zigzag.&lt;br /&gt;
&lt;br /&gt;
=== Les difficultés rencontrées ===&lt;br /&gt;
&lt;br /&gt;
Une grand difficulté lors de la programmation de Quireekoo fut l’émission et la réception infra-rouge. En effet la première idée pour l'émission était de juste allumer et éteindre la led infra-rouge à un fréquence de 38 kHz avec les intervalles de temps précis comme utilisé ici pour d'autre fonction avec les currentMillis et lastMillis. Les tsop réagissaient bien à l'émission. Le problème est que si l'on rajoutais des fonctions comme le déplacement ou le sonar, le temps d'arriver jusqu'à l'émission l'intervalle de temps qui permettait une fréquence de 38 kHz était dépassé. &lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
  void allumer()&lt;br /&gt;
  {&lt;br /&gt;
    // check to see if it's time to change the state of the LED&lt;br /&gt;
    unsigned long currentMicros = micros();&lt;br /&gt;
     &lt;br /&gt;
    if((ledState == HIGH) &amp;amp;&amp;amp; (currentMicros - previousMicros &amp;gt;= OnTime))&lt;br /&gt;
    {&lt;br /&gt;
      ledState = LOW;  // Turn it off&lt;br /&gt;
      previousMicros = currentMicros;  // Remember the time&lt;br /&gt;
      digitalWrite(ledPin, ledState);  // Update the actual LED&lt;br /&gt;
    }&lt;br /&gt;
    else if ((ledState == LOW) &amp;amp;&amp;amp; (currentMicros - previousMicros &amp;gt;= OffTime))&lt;br /&gt;
    {&lt;br /&gt;
      ledState = HIGH;  // turn it on&lt;br /&gt;
      previousMicros = currentMicros;   // Remember the time&lt;br /&gt;
      digitalWrite(ledPin, ledState);   // Update the actual LED&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
Une solution fur de passer directement par les interruptions timer. Mais deux problèmes ce sont encore révélés. Le premier était que tout les timer étaient déjà utilisé par la bibliothèque servo.h, donc impossible de faire les interruptions. De plus avec cette façon de faire ou la précédente, il était impossible de faire passer un message à travers l'émission, donc impossible de différencier une proie d'un prédateur.&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
    // initialize timer1 &lt;br /&gt;
    noInterrupts();           // disable all interrupts&lt;br /&gt;
    TCCR5A = 0;&lt;br /&gt;
    TCCR5B = 0;&lt;br /&gt;
    TCNT5  = 0;&lt;br /&gt;
  &lt;br /&gt;
    OCR5A = 421;            // compare match register 16MHz/256/2Hz&lt;br /&gt;
    TCCR5B |= (1 &amp;lt;&amp;lt; WGM52);   // CTC mode&lt;br /&gt;
    TCCR5B |= (1 &amp;lt;&amp;lt; CS50);    // 256 prescaler &lt;br /&gt;
    TIMSK5 |= (1 &amp;lt;&amp;lt; OCIE5A);  // enable timer compare interrupt&lt;br /&gt;
    interrupts();             // enable all interrupts&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  ISR(TIMER5_COMPA_vect)          // timer compare interrupt service routine&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(ledPin, digitalRead(ledPin) ^ 1);   // toggle LED pin&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Nous en sommes arrivé à utiliser la bibliothèque IRremote.h. Avec cette bibliothèque, l'émission et la réception infra-rouge ce fait très simplement si elles sont séparées. Mais les applications utilisant les même timer, il y a alors conflit pour faire fonctionner les deux en même temps. Cela nous a pris du temps pour trouver une solution car aucune information n'a pu être trouvé sur le web. Le problème était que si nous faisions une émission, les timer de la réception était annulé. Il fallait alors les ré-allouer pour la réception après l'émission avec le ligne de code: reception_ir1.enableIRIn();.&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
 if ((current_millis - last_millis &amp;gt;= interval)&amp;amp;&amp;amp;(*attraper == 0)){&lt;br /&gt;
       emission_ir.sendNEC(1, 32); &lt;br /&gt;
       last_millis = current_millis; &lt;br /&gt;
       reception_ir1.enableIRIn();&lt;br /&gt;
       reception_ir2.enableIRIn();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Dtillaux</name></author>	</entry>

	<entry>
		<id>https://peip-ima.plil.fr/mediawiki/index.php?title=Binome2017-9&amp;diff=9612</id>
		<title>Binome2017-9</title>
		<link rel="alternate" type="text/html" href="https://peip-ima.plil.fr/mediawiki/index.php?title=Binome2017-9&amp;diff=9612"/>
				<updated>2018-05-05T14:53:20Z</updated>
		
		<summary type="html">&lt;p&gt;Dtillaux : /* Réalisation du code Arduino */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Binôme 9 saison 8: Raphaël Bonvalet, Damien Tillaux.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Projet Quireekoo =&lt;br /&gt;
&lt;br /&gt;
Le but du projet Quireekoo est de créer un robot communiquant avec d'autre via infra-rouge. Ce projet à eu lieux lors des bureaux d'étude de PEIP en IMA au S4 2018 de notre cursus pour devenir ingénieur. Voici la transcription phonétique de Quireekoo: /Kirikou/.&lt;br /&gt;
&lt;br /&gt;
= Cahier des charges =&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Kiki.jpg|middle]]&lt;br /&gt;
&lt;br /&gt;
Quireekoo sera un robot fait de A à Z. Le circuit imprimé sera totalement revu et sera guidé grâce à une ATMEGA-328. Le physique sera totalement design par nous même et son programme sera totalement autonome.&lt;br /&gt;
&lt;br /&gt;
Quireekoo étant petit et vaillant est un véhicule de petite taille. A la défaut de jambe, Quireekoo ce déplace avec 2 servos moteurs continue. A la place des yeux, un sonar pour éviter ses obstacles et ne pas trébucher. Pour ses oreilles nous avons prévu 2 Tsop38238 pour pouvoir repérer et fuir ses ennemis.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Réalisation du projet =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Voici les différentes étapes par lesquels nous sommes passer lors de la création de Quireekoo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Réalisation de PCB ==&lt;br /&gt;
&lt;br /&gt;
=== Idée principale ===&lt;br /&gt;
&lt;br /&gt;
Nous voulions refaire nous même le PCB de Quireekoo mais nous n'avions pratiquement aucune base sur comment créer un circuit imprimé pour ce genre de projet. Du coups nous avons pris comme modèle, le modèle donnée sur la page principale du projet. ([https://peip-ima.plil.fr/mediawiki/index.php/BE_2017-2018 BE 2017-2018])&lt;br /&gt;
&lt;br /&gt;
Voici le schématique sur lequel nous nous sommes basé.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:RobotPCB schem.png|500px|thumb||left|Schématique original]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Notre PCB ===&lt;br /&gt;
&lt;br /&gt;
Notre PCB a été réalisé sur Fritzing. Nous avons créer ce circuit imprimé à notre image pour notre véhicule. Nous avons enlevé le driver de moteur et les sorties moteurs car nous voulions un robot de petite taille. Donc le moyen de déplacement choisi a alors été le servo-moteur. Pour les réceptions infra-rouge nous n'avons prévu que deux sorties pour des Tsop pour pouvoir laisser un plus grande chance au chasseur de ne pas être repéré, pour une approche plus vrai que nature. Pour savoir si un chasseur nous a attrapé, nous utilisons une sonde de Hall.&lt;br /&gt;
&lt;br /&gt;
De plus, en cas de problème nous avons créé toutes les sorties du microcontrôleur. Si un problème apparaît sur une des pins utilisées, nous pourrons la relocaliser sur une autre sortie.&lt;br /&gt;
&lt;br /&gt;
Un objectif supplémentaire était de réaliser un PCB le plus petit possible pour que le véhicule le soit aussi. Ce fut presque un succès, la carte est d'une taille environ de 5cm*5cm. Elle aurait pu être encore plus petite avec plus de travail mais nous ne pouvions pas nous le permettre si nous voulions tout faire.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Voici le schématique et le PCB de Quireekoo.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Quireekoo schem.png|500px|thumb|left|Schématique de Quireekoo]]&lt;br /&gt;
[[Fichier:Quireekoo pcb.png|500px|thumb|right|PCB de Quireekoo]]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Réalisation de la partie mécanique du véhicule ==&lt;br /&gt;
&lt;br /&gt;
Pour la partie mécanique de Quireekoo on a choisi de le faire sur inkscape afin de pouvoir effectuer une découpe laser. Le robot est composé de deux plaques de plexiglas, une pour le châssis où il y a les servos moteur, la bille et le bloc de pile, et une pour placer le sonar, le circuit imprimée, les Tsop et la sonde de hall. &lt;br /&gt;
&lt;br /&gt;
Voici à quoi ressemble la partie du bas sur inkscape : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Partie bas.jpg|700px|]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour la partie du haut c'était un peu plus compliqué car il fallait trouver comment placer les tsop, la sonde de hall et le sonar. Pour pouvoir fixer ceux-ci on a choisi de faire des trous en forme de rectangles avec une taille égale à la taille des pins de chaque capteurs différents. Après il fallait aussi mettre les trous pour fixer le circuit imprimé au même endroit que ceux qui se trouve sur celui-ci. Pour ce faire, on a utilisé le fichier .svg donné par Fritzing. On a également mis des trous en forme de rectangle sur les côtés pour pouvoir laisser passer les fils.&lt;br /&gt;
&lt;br /&gt;
Voici à quoi ressemble la partie du haut sur inkscape :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Partie haut.png|700px|]]&lt;br /&gt;
&lt;br /&gt;
Pour finir il nous restait les roues à faire. On a opté pour garder les roues données avec les servos moteurs en y rajoutant des partie en plexiglas au pistolet à colle pour rendre celles-ci plus grandes.&lt;br /&gt;
&lt;br /&gt;
Voici à quoi cela ressemble sur inkscape : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Roue.png|200px|]]&lt;br /&gt;
&lt;br /&gt;
Le problème avec cette solution c'est que les roues ne sont pas adhérentes. De ce fait là, on a ajouté une partie d'élastique autour avec de la colle glue.&lt;br /&gt;
&lt;br /&gt;
Voici a quoi le robot ressemble à la fin :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Quireekoo.jpg|200px|]]&lt;br /&gt;
&lt;br /&gt;
== Réalisation du code Arduino ==&lt;br /&gt;
&lt;br /&gt;
Voici maintenant la présentation du code téléversé dans Quireekoo.&lt;br /&gt;
&lt;br /&gt;
=== Le code ===&lt;br /&gt;
&lt;br /&gt;
{  &lt;br /&gt;
  #include &amp;lt;Servo.h&amp;gt;&lt;br /&gt;
  #include &amp;lt;IRremote.h&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  //déclaration des différentes pins&lt;br /&gt;
  &lt;br /&gt;
  #define SERVO1 11&lt;br /&gt;
  #define SERVO2 13&lt;br /&gt;
  #define ECHO 17&lt;br /&gt;
  #define TRIGG 18&lt;br /&gt;
  #define HALL A2&lt;br /&gt;
  #define IR 2&lt;br /&gt;
  #define VCCIR1 A0&lt;br /&gt;
  #define VCCIR2 A1&lt;br /&gt;
  &lt;br /&gt;
  //création de la classe Mouv pour le déplacement du robot&lt;br /&gt;
  &lt;br /&gt;
  class Mouv {&lt;br /&gt;
  &lt;br /&gt;
          Servo servo1;&lt;br /&gt;
          Servo servo2;&lt;br /&gt;
          int servo1Pin;&lt;br /&gt;
          int servo2Pin;&lt;br /&gt;
          &lt;br /&gt;
          int etatRotation;&lt;br /&gt;
          int etatSonar;&lt;br /&gt;
          int etatHall;&lt;br /&gt;
          int etatTsop;&lt;br /&gt;
          &lt;br /&gt;
          long intervalTsop;&lt;br /&gt;
          &lt;br /&gt;
          long intervalMouvement1;&lt;br /&gt;
          long intervalMouvement2;&lt;br /&gt;
          long intervalMouvement3;&lt;br /&gt;
          long intervalMouvement4;&lt;br /&gt;
          &lt;br /&gt;
          unsigned long lastMillis;&lt;br /&gt;
          &lt;br /&gt;
          &lt;br /&gt;
    public:&lt;br /&gt;
      Mouv(int pin1 , int pin2){&lt;br /&gt;
        servo1Pin= pin1;&lt;br /&gt;
        servo2Pin = pin2;&lt;br /&gt;
        &lt;br /&gt;
        etatRotation = 0;&lt;br /&gt;
        etatSonar = 0;&lt;br /&gt;
        etatHall = 0;&lt;br /&gt;
        etatTsop = 0;&lt;br /&gt;
        lastMillis = 0;&lt;br /&gt;
        &lt;br /&gt;
        intervalTsop = 500;&lt;br /&gt;
        &lt;br /&gt;
        intervalMouvement1 = 1500;&lt;br /&gt;
        intervalMouvement2 = 1700;&lt;br /&gt;
        intervalMouvement3 = 3200;&lt;br /&gt;
        intervalMouvement4 = 3400;&lt;br /&gt;
      }&lt;br /&gt;
    &lt;br /&gt;
      void attacher(){&lt;br /&gt;
        servo1.attach(servo1Pin);&lt;br /&gt;
        servo2.attach(servo2Pin);&lt;br /&gt;
      }&lt;br /&gt;
  &lt;br /&gt;
      void deplacement(int distanceObstacle , int tsop , int hall, int* attraper){&lt;br /&gt;
        unsigned long currentMillis = millis();&lt;br /&gt;
        &lt;br /&gt;
        if (hall == 1){&lt;br /&gt;
          etatHall = 1;&lt;br /&gt;
          *attraper = 1;&lt;br /&gt;
        }&lt;br /&gt;
        else if (distanceObstacle &amp;lt; 200){&lt;br /&gt;
          etatSonar = 1;&lt;br /&gt;
        }&lt;br /&gt;
        else if (tsop==1){&lt;br /&gt;
          etatTsop = 1;&lt;br /&gt;
          lastMillis = currentMillis;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        if (etatHall == 1){&lt;br /&gt;
          servo1.write(90);&lt;br /&gt;
          servo2.write(90);&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        else if (etatSonar ==1){&lt;br /&gt;
          if (etatRotation == 0){&lt;br /&gt;
            etatRotation = random(1,3);&lt;br /&gt;
          }&lt;br /&gt;
          if(etatRotation == 1){&lt;br /&gt;
            servo1.write(180);&lt;br /&gt;
            servo2.write(180);&lt;br /&gt;
          }&lt;br /&gt;
          else{&lt;br /&gt;
            servo1.write(0);&lt;br /&gt;
            servo2.write(0);&lt;br /&gt;
          }&lt;br /&gt;
          etatSonar = 0 ;&lt;br /&gt;
          lastMillis = currentMillis;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        else if (etatTsop == 1){&lt;br /&gt;
          if (etatRotation == 0){&lt;br /&gt;
            etatRotation = random(1,3);&lt;br /&gt;
          }&lt;br /&gt;
          &lt;br /&gt;
          if(etatRotation == 1){&lt;br /&gt;
            servo1.write(180);&lt;br /&gt;
            servo2.write(180);&lt;br /&gt;
          }&lt;br /&gt;
          else{&lt;br /&gt;
            servo1.write(0);&lt;br /&gt;
            servo2.write(0);&lt;br /&gt;
          }&lt;br /&gt;
          &lt;br /&gt;
          if (currentMillis - lastMillis &amp;gt;= intervalTsop){&lt;br /&gt;
            etatTsop = 0;&lt;br /&gt;
            lastMillis = currentMillis;&lt;br /&gt;
          }&lt;br /&gt;
        }   &lt;br /&gt;
        &lt;br /&gt;
        else{&lt;br /&gt;
          etatRotation = 0;&lt;br /&gt;
          if (currentMillis - lastMillis &amp;lt; intervalMouvement1){&lt;br /&gt;
            servo1.write(180);&lt;br /&gt;
            servo2.write(70);&lt;br /&gt;
          }&lt;br /&gt;
          else if ((currentMillis - lastMillis &amp;gt;= intervalMouvement2) &amp;amp;&amp;amp;  (currentMillis - lastMillis &amp;lt;= intervalMouvement3)){&lt;br /&gt;
            servo1.write(98);&lt;br /&gt;
            servo2.write(0);&lt;br /&gt;
          }&lt;br /&gt;
          else{&lt;br /&gt;
            servo1.write(180);&lt;br /&gt;
            servo2.write(0);&lt;br /&gt;
            if (currentMillis - lastMillis &amp;gt;= intervalMouvement4){&lt;br /&gt;
              lastMillis = currentMillis;&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;br /&gt;
  Mouv servo(SERVO1,SERVO2);&lt;br /&gt;
  &lt;br /&gt;
  //varibable pour le sonnar&lt;br /&gt;
  &lt;br /&gt;
  long lectureEcho;&lt;br /&gt;
  long distance;&lt;br /&gt;
  const float SOUND_SPEED = 340.0 / 1000;&lt;br /&gt;
  &lt;br /&gt;
  //varibable pour la sonde de hall&lt;br /&gt;
  &lt;br /&gt;
  int* attraper;&lt;br /&gt;
  &lt;br /&gt;
  //varibable pour les tsop&lt;br /&gt;
  &lt;br /&gt;
  unsigned long last_millis = 0; &lt;br /&gt;
  long interval = 500;&lt;br /&gt;
  &lt;br /&gt;
  int broche_reception1 = VCCIR1;&lt;br /&gt;
  IRrecv reception_ir1(broche_reception1);&lt;br /&gt;
  decode_results decode_ir1;&lt;br /&gt;
  &lt;br /&gt;
  int broche_reception2 = VCCIR2;&lt;br /&gt;
  IRrecv reception_ir2(broche_reception2);&lt;br /&gt;
  decode_results decode_ir2; &lt;br /&gt;
  &lt;br /&gt;
  //instance pour l'emmission infra-rouge&lt;br /&gt;
  &lt;br /&gt;
  IRsend emission_ir; &lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  void setup() {&lt;br /&gt;
    pinMode(TRIGG,OUTPUT);&lt;br /&gt;
    digitalWrite(TRIGG,0);&lt;br /&gt;
    pinMode(ECHO,INPUT); &lt;br /&gt;
    pinMode(IR,OUTPUT);&lt;br /&gt;
    digitalWrite(IR,1);&lt;br /&gt;
  &lt;br /&gt;
    servo.attacher();&lt;br /&gt;
    &lt;br /&gt;
    reception_ir1.enableIRIn(); // démarre la réception&lt;br /&gt;
    reception_ir2.enableIRIn();&lt;br /&gt;
    &lt;br /&gt;
    attraper = malloc(sizeof(int));&lt;br /&gt;
    *attraper = 0;&lt;br /&gt;
    &lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  void loop() {&lt;br /&gt;
    servo.deplacement(sonar(),tsop(attraper),hall(),attraper);  &lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  int sonar() {&lt;br /&gt;
    digitalWrite(TRIGG, 1);&lt;br /&gt;
    delayMicroseconds(10);&lt;br /&gt;
    digitalWrite(TRIGG,0);&lt;br /&gt;
    long measure = pulseIn(ECHO, HIGH);&lt;br /&gt;
    &lt;br /&gt;
    float distance_mm = measure / 2.0 * SOUND_SPEED;&lt;br /&gt;
    return distance_mm; &lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  int tsop(int * attraper ){&lt;br /&gt;
    unsigned long current_millis = millis();&lt;br /&gt;
    int etatTsop = 0;&lt;br /&gt;
    if ((current_millis - last_millis &amp;gt;= interval)&amp;amp;&amp;amp;(*attraper == 0)){&lt;br /&gt;
       emission_ir.sendNEC(1, 32); &lt;br /&gt;
       last_millis = current_millis; &lt;br /&gt;
       reception_ir1.enableIRIn();&lt;br /&gt;
       reception_ir2.enableIRIn();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    if (reception_ir1.decode(&amp;amp;decode_ir1)) &lt;br /&gt;
    { &lt;br /&gt;
      if(decode_ir1.value == 1){&lt;br /&gt;
        etatTsop = 1;&lt;br /&gt;
      }&lt;br /&gt;
  &lt;br /&gt;
      reception_ir1.resume();&lt;br /&gt;
      reception_ir2.enableIRIn();&lt;br /&gt;
    }&lt;br /&gt;
    if (reception_ir2.decode(&amp;amp;decode_ir2)) &lt;br /&gt;
    { &lt;br /&gt;
      if(decode_ir2.value == 1){&lt;br /&gt;
        etatTsop = 1;&lt;br /&gt;
      } &lt;br /&gt;
      reception_ir2.resume();  &lt;br /&gt;
      reception_ir1.enableIRIn();&lt;br /&gt;
    }&lt;br /&gt;
    return etatTsop;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  int hall(){&lt;br /&gt;
    int etatHall = 0;&lt;br /&gt;
    if(digitalRead(HALL) == 0){&lt;br /&gt;
      etatHall = 1;&lt;br /&gt;
    }&lt;br /&gt;
    return etatHall;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
=== Description de la structure du code ===&lt;br /&gt;
&lt;br /&gt;
==== Fonction sonar() ====&lt;br /&gt;
&lt;br /&gt;
Cette fonction permet au sonar de calculer la distance séparant le robot d'un obstacle.&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
  int sonar() {&lt;br /&gt;
    digitalWrite(TRIGG, 1);&lt;br /&gt;
    delayMicroseconds(10);&lt;br /&gt;
    digitalWrite(TRIGG,0);&lt;br /&gt;
    long measure = pulseIn(ECHO, HIGH);&lt;br /&gt;
    &lt;br /&gt;
    float distance_mm = measure / 2.0 * SOUND_SPEED;&lt;br /&gt;
    return distance_mm; &lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Fonction tsop()====&lt;br /&gt;
&lt;br /&gt;
Cette fonction a deux rôles. Le premier est de lire les entrées des tsop et de renvoyer si un prédateur a été détecter ou non. Le deuxième est d'émettre un signal infra-rouge permettant au prédateur de nous détecter.&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
  int tsop(int * attraper ){&lt;br /&gt;
    unsigned long current_millis = millis();&lt;br /&gt;
    int etatTsop = 0;&lt;br /&gt;
    if ((current_millis - last_millis &amp;gt;= interval)&amp;amp;&amp;amp;(*attraper == 0)){&lt;br /&gt;
       emission_ir.sendNEC(1, 32); &lt;br /&gt;
       last_millis = current_millis; &lt;br /&gt;
       reception_ir1.enableIRIn();&lt;br /&gt;
       reception_ir2.enableIRIn();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    if (reception_ir1.decode(&amp;amp;decode_ir1)) &lt;br /&gt;
    { &lt;br /&gt;
      if(decode_ir1.value == 1){&lt;br /&gt;
        etatTsop = 1;&lt;br /&gt;
      }&lt;br /&gt;
  &lt;br /&gt;
      reception_ir1.resume();&lt;br /&gt;
      reception_ir2.enableIRIn();&lt;br /&gt;
    }&lt;br /&gt;
    if (reception_ir2.decode(&amp;amp;decode_ir2)) &lt;br /&gt;
    { &lt;br /&gt;
      if(decode_ir2.value == 1){&lt;br /&gt;
        etatTsop = 1;&lt;br /&gt;
      } &lt;br /&gt;
      reception_ir2.resume();  &lt;br /&gt;
      reception_ir1.enableIRIn();&lt;br /&gt;
    }&lt;br /&gt;
    return etatTsop;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Les particularités de cette fonction sont que, premièrement pour facilité la programmation l'émission et la réception ont été mises dans la même fonction car elles demandent toutes les deux la même bibliothèque et les même timer, donc pour éviter tout conflit ceci fut une bonne solution. Deuxièmement, la fonction tsop() contient un pointeur en paramètre. Ce pointeur permet au robot de savoir s'il doit continuer à émettre ou non s'il est attrapé.&lt;br /&gt;
&lt;br /&gt;
L'émission du signal infra-rouge ici ce fait toute les 0.5s. En effet si les émissions sont trop proche il y a conflit avec la réception.&lt;br /&gt;
&lt;br /&gt;
==== Fonction hall()====&lt;br /&gt;
&lt;br /&gt;
Cette fonction permet de voir si un prédateur nous a détecté et attrapé grâce à l'émission d'une onde électromagnétique.&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
  int hall(){&lt;br /&gt;
    int etatHall = 0;&lt;br /&gt;
    if(digitalRead(HALL) == 0){&lt;br /&gt;
      etatHall = 1;&lt;br /&gt;
    }&lt;br /&gt;
    return etatHall;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Fonction deplacement() ====&lt;br /&gt;
&lt;br /&gt;
Pour le déplacement du robot nous avons choisi de créer un classe pour avoir un code plus propre et une fonction loop() ne contenant qu'une seul ligne de code.&lt;br /&gt;
&lt;br /&gt;
La Classe Mouv contient 2 fonctions. La première attacher() permet de lier les instances servo aux pins associées. Elle est appelée dans le setup(). La deuxième fonction est la fonction de déplacement appelée deplacement(). Cette fonction est la seule appelée de la fonction loop().&lt;br /&gt;
&lt;br /&gt;
Cette fonction est alors la fonction principale du robot, car c'est elle qui va décider du déplacement du robot en fonction des différentes entrées des capteurs. Elle contient en paramètre les différentes entrées du sonar, du tsop, de la sonde de hall, mais aussi un pointeur pour pouvoir sauvegarder en mémoire le fait que le robot soit attrapé ou non.&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
      void deplacement(int distanceObstacle , int tsop , int hall, int* attraper){&lt;br /&gt;
        unsigned long currentMillis = millis();&lt;br /&gt;
        &lt;br /&gt;
        if (hall == 1){&lt;br /&gt;
          etatHall = 1;&lt;br /&gt;
          *attraper = 1;&lt;br /&gt;
        }&lt;br /&gt;
        else if (distanceObstacle &amp;lt; 200){&lt;br /&gt;
          etatSonar = 1;&lt;br /&gt;
        }&lt;br /&gt;
        else if (tsop==1){&lt;br /&gt;
          etatTsop = 1;&lt;br /&gt;
          lastMillis = currentMillis;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        if (etatHall == 1){&lt;br /&gt;
          servo1.write(90);&lt;br /&gt;
          servo2.write(90);&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        else if (etatSonar ==1){&lt;br /&gt;
          if (etatRotation == 0){&lt;br /&gt;
            etatRotation = random(1,3);&lt;br /&gt;
          }&lt;br /&gt;
          if(etatRotation == 1){&lt;br /&gt;
            servo1.write(180);&lt;br /&gt;
            servo2.write(180);&lt;br /&gt;
          }&lt;br /&gt;
          else{&lt;br /&gt;
            servo1.write(0);&lt;br /&gt;
            servo2.write(0);&lt;br /&gt;
          }&lt;br /&gt;
          etatSonnar = 0 ;&lt;br /&gt;
          lastMillis = currentMillis;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        else if (etatTsop == 1){&lt;br /&gt;
          if (etatRotation == 0){&lt;br /&gt;
            etatRotation = random(1,3);&lt;br /&gt;
          }&lt;br /&gt;
          &lt;br /&gt;
          if(etatRotation == 1){&lt;br /&gt;
            servo1.write(180);&lt;br /&gt;
            servo2.write(180);&lt;br /&gt;
          }&lt;br /&gt;
          else{&lt;br /&gt;
            servo1.write(0);&lt;br /&gt;
            servo2.write(0);&lt;br /&gt;
          }&lt;br /&gt;
          &lt;br /&gt;
          if (currentMillis - lastMillis &amp;gt;= intervalTsop){&lt;br /&gt;
            etatTsop = 0;&lt;br /&gt;
            lastMillis = currentMillis;&lt;br /&gt;
          }&lt;br /&gt;
        }   &lt;br /&gt;
        &lt;br /&gt;
        else{&lt;br /&gt;
          etatRotation = 0;&lt;br /&gt;
          if (currentMillis - lastMillis &amp;lt; intervalMouvement1){&lt;br /&gt;
            servo1.write(180);&lt;br /&gt;
            servo2.write(70);&lt;br /&gt;
          }&lt;br /&gt;
          else if ((currentMillis - lastMillis &amp;gt;= intervalMouvement2) &amp;amp;&amp;amp;  (currentMillis - lastMillis &amp;lt;= intervalMouvement3)){&lt;br /&gt;
            servo1.write(98);&lt;br /&gt;
            servo2.write(0);&lt;br /&gt;
          }&lt;br /&gt;
          else{&lt;br /&gt;
            servo1.write(180);&lt;br /&gt;
            servo2.write(0);&lt;br /&gt;
            if (currentMillis - lastMillis &amp;gt;= intervalMouvement4){&lt;br /&gt;
              lastMillis = currentMillis;&lt;br /&gt;
            }&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Cette fonction est divisée en deux partie. La première est la distribution des états du robot en fonction des entrées. Par la suite, la fonction va décidé quel déplacement faire en fonction des priorités des différents états. L'états le plus prioritaire est l'états etatHall. Celui ci indique si le robot est attrapé et une fois passé à 1 il ne peut plus changer et le déplacement associé est un sur-place pour le robot. Après il y a l'état associé au obstacle et si la distance devient inférieur à celle écrite, le robot tourne sur lui même dans une direction aléatoire jusqu'à ne plus percevoir d'obstacle. Le suivant est celui de la détection de prédateur. Ici si un prédateur est détectée, Quireekoo va aussi ce tourner dans une direction aléatoire. Mais la différence c'est que ici il va tourner pendant un certain intervalle de temps rentré dans le code. Le dernier déplacement n'est exécuter seulement si aucun des trois autres n'est fait. C'est le déplacement de base du robot. Ce déplacement est juste en zigzag.&lt;br /&gt;
&lt;br /&gt;
=== Les difficultés rencontrées ===&lt;br /&gt;
&lt;br /&gt;
Une grand difficulté lors de la programmation de Quireekoo fut l’émission et la réception infra-rouge. En effet la première idée pour l'émission était de juste allumer et éteindre la led infra-rouge à un fréquence de 38 kHz avec les intervalles de temps précis comme utilisé ici pour d'autre fonction avec les currentMillis et lastMillis. Les tsop réagissaient bien à l'émission. Le problème est que si l'on rajoutais des fonctions comme le déplacement ou le sonar, le temps d'arriver jusqu'à l'émission l'intervalle de temps qui permettait une fréquence de 38 kHz était dépassé. &lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
  void allumer()&lt;br /&gt;
  {&lt;br /&gt;
    // check to see if it's time to change the state of the LED&lt;br /&gt;
    unsigned long currentMicros = micros();&lt;br /&gt;
     &lt;br /&gt;
    if((ledState == HIGH) &amp;amp;&amp;amp; (currentMicros - previousMicros &amp;gt;= OnTime))&lt;br /&gt;
    {&lt;br /&gt;
      ledState = LOW;  // Turn it off&lt;br /&gt;
      previousMicros = currentMicros;  // Remember the time&lt;br /&gt;
      digitalWrite(ledPin, ledState);  // Update the actual LED&lt;br /&gt;
    }&lt;br /&gt;
    else if ((ledState == LOW) &amp;amp;&amp;amp; (currentMicros - previousMicros &amp;gt;= OffTime))&lt;br /&gt;
    {&lt;br /&gt;
      ledState = HIGH;  // turn it on&lt;br /&gt;
      previousMicros = currentMicros;   // Remember the time&lt;br /&gt;
      digitalWrite(ledPin, ledState);   // Update the actual LED&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
Une solution fur de passer directement par les interruptions timer. Mais deux problèmes ce sont encore révélés. Le premier était que tout les timer étaient déjà utilisé par la bibliothèque servo.h, donc impossible de faire les interruptions. De plus avec cette façon de faire ou la précédente, il était impossible de faire passer un message à travers l'émission, donc impossible de différencier une proie d'un prédateur.&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
    // initialize timer1 &lt;br /&gt;
    noInterrupts();           // disable all interrupts&lt;br /&gt;
    TCCR5A = 0;&lt;br /&gt;
    TCCR5B = 0;&lt;br /&gt;
    TCNT5  = 0;&lt;br /&gt;
  &lt;br /&gt;
    OCR5A = 421;            // compare match register 16MHz/256/2Hz&lt;br /&gt;
    TCCR5B |= (1 &amp;lt;&amp;lt; WGM52);   // CTC mode&lt;br /&gt;
    TCCR5B |= (1 &amp;lt;&amp;lt; CS50);    // 256 prescaler &lt;br /&gt;
    TIMSK5 |= (1 &amp;lt;&amp;lt; OCIE5A);  // enable timer compare interrupt&lt;br /&gt;
    interrupts();             // enable all interrupts&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  ISR(TIMER5_COMPA_vect)          // timer compare interrupt service routine&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(ledPin, digitalRead(ledPin) ^ 1);   // toggle LED pin&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Nous en sommes arrivé à utiliser la bibliothèque IRemote.h&lt;/div&gt;</summary>
		<author><name>Dtillaux</name></author>	</entry>

	<entry>
		<id>https://peip-ima.plil.fr/mediawiki/index.php?title=Binome2017-9&amp;diff=9610</id>
		<title>Binome2017-9</title>
		<link rel="alternate" type="text/html" href="https://peip-ima.plil.fr/mediawiki/index.php?title=Binome2017-9&amp;diff=9610"/>
				<updated>2018-05-05T14:13:56Z</updated>
		
		<summary type="html">&lt;p&gt;Dtillaux : /* Réalisation du code Arduino */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Binôme 9 saison 8: Raphaël Bonvalet, Damien Tillaux.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Projet Quireekoo =&lt;br /&gt;
&lt;br /&gt;
Le but du projet Quireekoo est de créer un robot communiquant avec d'autre via infra-rouge. Ce projet à eu lieux lors des bureaux d'étude de PEIP en IMA au S4 2018 de notre cursus pour devenir ingénieur. Voici la transcription phonétique de Quireekoo: /Kirikou/.&lt;br /&gt;
&lt;br /&gt;
= Cahier des charges =&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Kiki.jpg|middle]]&lt;br /&gt;
&lt;br /&gt;
Quireekoo sera un robot fait de A à Z. Le circuit imprimé sera totalement revu et sera guidé grâce à une ATMEGA-328. Le physique sera totalement design par nous même et son programme sera totalement autonome.&lt;br /&gt;
&lt;br /&gt;
Quireekoo étant petit et vaillant est un véhicule de petite taille. A la défaut de jambe, Quireekoo ce déplace avec 2 servos moteurs continue. A la place des yeux, un sonar pour éviter ses obstacles et ne pas trébucher. Pour ses oreilles nous avons prévu 2 Tsop38238 pour pouvoir repérer et fuir ses ennemis.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Réalisation du projet =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Voici les différentes étapes par lesquels nous sommes passer lors de la création de Quireekoo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Réalisation de PCB ==&lt;br /&gt;
&lt;br /&gt;
=== Idée principale ===&lt;br /&gt;
&lt;br /&gt;
Nous voulions refaire nous même le PCB de Quireekoo mais nous n'avions pratiquement aucune base sur comment créer un circuit imprimé pour ce genre de projet. Du coups nous avons pris comme modèle, le modèle donnée sur la page principale du projet. ([https://peip-ima.plil.fr/mediawiki/index.php/BE_2017-2018 BE 2017-2018])&lt;br /&gt;
&lt;br /&gt;
Voici le schématique sur lequel nous nous sommes basé.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:RobotPCB schem.png|500px|thumb||left|Schématique original]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Notre PCB ===&lt;br /&gt;
&lt;br /&gt;
Notre PCB a été réalisé sur Fritzing. Nous avons créer ce circuit imprimé à notre image pour notre véhicule. Nous avons enlevé le driver de moteur et les sorties moteurs car nous voulions un robot de petite taille. Donc le moyen de déplacement choisi a alors été le servo-moteur. Pour les réceptions infra-rouge nous n'avons prévu que deux sorties pour des Tsop pour pouvoir laisser un plus grande chance au chasseur de ne pas être repéré, pour une approche plus vrai que nature. Pour savoir si un chasseur nous a attrapé, nous utilisons une sonde de Hall.&lt;br /&gt;
&lt;br /&gt;
De plus, en cas de problème nous avons créé toutes les sorties du microcontrôleur. Si un problème apparaît sur une des pins utilisées, nous pourrons la relocaliser sur une autre sortie.&lt;br /&gt;
&lt;br /&gt;
Un objectif supplémentaire était de réaliser un PCB le plus petit possible pour que le véhicule le soit aussi. Ce fut presque un succès, la carte est d'une taille environ de 5cm*5cm. Elle aurait pu être encore plus petite avec plus de travail mais nous ne pouvions pas nous le permettre si nous voulions tout faire.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Voici le schématique et le PCB de Quireekoo.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Quireekoo schem.png|500px|thumb|left|Schématique de Quireekoo]]&lt;br /&gt;
[[Fichier:Quireekoo pcb.png|500px|thumb|right|PCB de Quireekoo]]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Réalisation de la partie mécanique du véhicule ==&lt;br /&gt;
&lt;br /&gt;
Pour la partie mécanique de Quireekoo on a choisi de le faire sur inkscape afin de pouvoir effectuer une découpe laser. Le robot est composé de deux plaques de plexiglas, une pour le châssis où il y a les servos moteur, la bille et le bloc de pile, et une pour placer le sonar, le circuit imprimée, les Tsop et la sonde de hall. &lt;br /&gt;
&lt;br /&gt;
Voici à quoi ressemble la partie du bas sur inkscape : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Partie bas.jpg|700px|]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour la partie du haut c'était un peu plus compliqué car il fallait trouver comment placer les tsop, la sonde de hall et le sonar. Pour pouvoir fixer ceux-ci on a choisi de faire des trous en forme de rectangles avec une taille égale à la taille des pins de chaque capteurs différents. Après il fallait aussi mettre les trous pour fixer le circuit imprimé au même endroit que ceux qui se trouve sur celui-ci. Pour ce faire, on a utilisé le fichier .svg donné par Fritzing. On a également mis des trous en forme de rectangle sur les côtés pour pouvoir laisser passer les fils.&lt;br /&gt;
&lt;br /&gt;
Voici à quoi ressemble la partie du haut sur inkscape :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Partie haut.png|700px|]]&lt;br /&gt;
&lt;br /&gt;
Pour finir il nous restait les roues à faire. On a opté pour garder les roues données avec les servos moteurs en y rajoutant des partie en plexiglas au pistolet à colle pour rendre celles-ci plus grandes.&lt;br /&gt;
&lt;br /&gt;
Voici à quoi cela ressemble sur inkscape : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Roue.png|200px|]]&lt;br /&gt;
&lt;br /&gt;
Le problème avec cette solution c'est que les roues ne sont pas adhérentes. De ce fait là, on a ajouté une partie d'élastique autour avec de la colle glue.&lt;br /&gt;
&lt;br /&gt;
Voici a quoi le robot ressemble à la fin :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Quireekoo.jpg|200px|]]&lt;br /&gt;
&lt;br /&gt;
== Réalisation du code Arduino ==&lt;br /&gt;
&lt;br /&gt;
Voici maintenant la présentation du code téléversé dans Quireekoo.&lt;br /&gt;
&lt;br /&gt;
=== Le code ===&lt;br /&gt;
&lt;br /&gt;
{  &lt;br /&gt;
  #include &amp;lt;Servo.h&amp;gt;&lt;br /&gt;
  #include &amp;lt;IRremote.h&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  //déclaration des différentes pins&lt;br /&gt;
  &lt;br /&gt;
  #define SERVO1 11&lt;br /&gt;
  #define SERVO2 13&lt;br /&gt;
  #define ECHO 17&lt;br /&gt;
  #define TRIGG 18&lt;br /&gt;
  #define HALL A2&lt;br /&gt;
  #define IR 2&lt;br /&gt;
  #define VCCIR1 A0&lt;br /&gt;
  #define VCCIR2 A1&lt;br /&gt;
  &lt;br /&gt;
  //création de la classe Mouv pour le déplacement du robot&lt;br /&gt;
  &lt;br /&gt;
  class Mouv {&lt;br /&gt;
  &lt;br /&gt;
          Servo servo1;&lt;br /&gt;
          Servo servo2;&lt;br /&gt;
          int servo1Pin;&lt;br /&gt;
          int servo2Pin;&lt;br /&gt;
          &lt;br /&gt;
          int etatRotation;&lt;br /&gt;
          int etatSonar;&lt;br /&gt;
          int etatHall;&lt;br /&gt;
          int etatTsop;&lt;br /&gt;
          &lt;br /&gt;
          long intervalTsop;&lt;br /&gt;
          &lt;br /&gt;
          long intervalMouvement1;&lt;br /&gt;
          long intervalMouvement2;&lt;br /&gt;
          long intervalMouvement3;&lt;br /&gt;
          long intervalMouvement4;&lt;br /&gt;
          &lt;br /&gt;
          unsigned long lastMillis;&lt;br /&gt;
          &lt;br /&gt;
          &lt;br /&gt;
    public:&lt;br /&gt;
      Mouv(int pin1 , int pin2){&lt;br /&gt;
        servo1Pin= pin1;&lt;br /&gt;
        servo2Pin = pin2;&lt;br /&gt;
        &lt;br /&gt;
        etatRotation = 0;&lt;br /&gt;
        etatSonar = 0;&lt;br /&gt;
        etatHall = 0;&lt;br /&gt;
        etatTsop = 0;&lt;br /&gt;
        lastMillis = 0;&lt;br /&gt;
        &lt;br /&gt;
        intervalTsop = 500;&lt;br /&gt;
        &lt;br /&gt;
        intervalMouvement1 = 1500;&lt;br /&gt;
        intervalMouvement2 = 1700;&lt;br /&gt;
        intervalMouvement3 = 3200;&lt;br /&gt;
        intervalMouvement4 = 3400;&lt;br /&gt;
      }&lt;br /&gt;
    &lt;br /&gt;
      void attacher(){&lt;br /&gt;
        servo1.attach(servo1Pin);&lt;br /&gt;
        servo2.attach(servo2Pin);&lt;br /&gt;
      }&lt;br /&gt;
  &lt;br /&gt;
      void deplacement(int distanceObstacle , int tsop , int hall, int* attraper){&lt;br /&gt;
        unsigned long currentMillis = millis();&lt;br /&gt;
        &lt;br /&gt;
        if (hall == 1){&lt;br /&gt;
          etatHall = 1;&lt;br /&gt;
          *attraper = 1;&lt;br /&gt;
        }&lt;br /&gt;
        else if (distanceObstacle &amp;lt; 200){&lt;br /&gt;
          etatSonar = 1;&lt;br /&gt;
        }&lt;br /&gt;
        else if (tsop==1){&lt;br /&gt;
          etatTsop = 1;&lt;br /&gt;
          lastMillis = currentMillis;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        if (etatHall == 1){&lt;br /&gt;
          servo1.write(90);&lt;br /&gt;
          servo2.write(90);&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        else if (etatSonar ==1){&lt;br /&gt;
          if (etatRotation == 0){&lt;br /&gt;
            etatRotation = random(1,3);&lt;br /&gt;
          }&lt;br /&gt;
          if(etatRotation == 1){&lt;br /&gt;
            servo1.write(180);&lt;br /&gt;
            servo2.write(180);&lt;br /&gt;
          }&lt;br /&gt;
          else{&lt;br /&gt;
            servo1.write(0);&lt;br /&gt;
            servo2.write(0);&lt;br /&gt;
          }&lt;br /&gt;
          etatSonar = 0 ;&lt;br /&gt;
          lastMillis = currentMillis;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        else if (etatTsop == 1){&lt;br /&gt;
          if (etatRotation == 0){&lt;br /&gt;
            etatRotation = random(1,3);&lt;br /&gt;
          }&lt;br /&gt;
          &lt;br /&gt;
          if(etatRotation == 1){&lt;br /&gt;
            servo1.write(180);&lt;br /&gt;
            servo2.write(180);&lt;br /&gt;
          }&lt;br /&gt;
          else{&lt;br /&gt;
            servo1.write(0);&lt;br /&gt;
            servo2.write(0);&lt;br /&gt;
          }&lt;br /&gt;
          &lt;br /&gt;
          if (currentMillis - lastMillis &amp;gt;= intervalTsop){&lt;br /&gt;
            etatTsop = 0;&lt;br /&gt;
            lastMillis = currentMillis;&lt;br /&gt;
          }&lt;br /&gt;
        }   &lt;br /&gt;
        &lt;br /&gt;
        else{&lt;br /&gt;
          etatRotation = 0;&lt;br /&gt;
          if (currentMillis - lastMillis &amp;lt; intervalMouvement1){&lt;br /&gt;
            servo1.write(180);&lt;br /&gt;
            servo2.write(70);&lt;br /&gt;
          }&lt;br /&gt;
          else if ((currentMillis - lastMillis &amp;gt;= intervalMouvement2) &amp;amp;&amp;amp;  (currentMillis - lastMillis &amp;lt;= intervalMouvement3)){&lt;br /&gt;
            servo1.write(98);&lt;br /&gt;
            servo2.write(0);&lt;br /&gt;
          }&lt;br /&gt;
          else{&lt;br /&gt;
            servo1.write(180);&lt;br /&gt;
            servo2.write(0);&lt;br /&gt;
            if (currentMillis - lastMillis &amp;gt;= intervalMouvement4){&lt;br /&gt;
              lastMillis = currentMillis;&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;br /&gt;
  Mouv servo(SERVO1,SERVO2);&lt;br /&gt;
  &lt;br /&gt;
  //varibable pour le sonnar&lt;br /&gt;
  &lt;br /&gt;
  long lectureEcho;&lt;br /&gt;
  long distance;&lt;br /&gt;
  const float SOUND_SPEED = 340.0 / 1000;&lt;br /&gt;
  &lt;br /&gt;
  //varibable pour la sonde de hall&lt;br /&gt;
  &lt;br /&gt;
  int* attraper;&lt;br /&gt;
  &lt;br /&gt;
  //varibable pour les tsop&lt;br /&gt;
  &lt;br /&gt;
  unsigned long last_millis = 0; &lt;br /&gt;
  long interval = 500;&lt;br /&gt;
  &lt;br /&gt;
  int broche_reception1 = VCCIR1;&lt;br /&gt;
  IRrecv reception_ir1(broche_reception1);&lt;br /&gt;
  decode_results decode_ir1;&lt;br /&gt;
  &lt;br /&gt;
  int broche_reception2 = VCCIR2;&lt;br /&gt;
  IRrecv reception_ir2(broche_reception2);&lt;br /&gt;
  decode_results decode_ir2; &lt;br /&gt;
  &lt;br /&gt;
  //instance pour l'emmission infra-rouge&lt;br /&gt;
  &lt;br /&gt;
  IRsend emission_ir; &lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  void setup() {&lt;br /&gt;
    pinMode(TRIGG,OUTPUT);&lt;br /&gt;
    digitalWrite(TRIGG,0);&lt;br /&gt;
    pinMode(ECHO,INPUT); &lt;br /&gt;
    pinMode(IR,OUTPUT);&lt;br /&gt;
    digitalWrite(IR,1);&lt;br /&gt;
  &lt;br /&gt;
    servo.attacher();&lt;br /&gt;
    &lt;br /&gt;
    reception_ir1.enableIRIn(); // démarre la réception&lt;br /&gt;
    reception_ir2.enableIRIn();&lt;br /&gt;
    &lt;br /&gt;
    attraper = malloc(sizeof(int));&lt;br /&gt;
    *attraper = 0;&lt;br /&gt;
    &lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  void loop() {&lt;br /&gt;
    servo.deplacement(sonar(),tsop(attraper),hall(),attraper);  &lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  int sonar() {&lt;br /&gt;
    digitalWrite(TRIGG, 1);&lt;br /&gt;
    delayMicroseconds(10);&lt;br /&gt;
    digitalWrite(TRIGG,0);&lt;br /&gt;
    long measure = pulseIn(ECHO, HIGH);&lt;br /&gt;
    &lt;br /&gt;
    float distance_mm = measure / 2.0 * SOUND_SPEED;&lt;br /&gt;
    return distance_mm; &lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  int tsop(int * attraper ){&lt;br /&gt;
    unsigned long current_millis = millis();&lt;br /&gt;
    int etatTsop = 0;&lt;br /&gt;
    if ((current_millis - last_millis &amp;gt;= interval)&amp;amp;&amp;amp;(*attraper == 0)){&lt;br /&gt;
       emission_ir.sendNEC(1, 32); &lt;br /&gt;
       last_millis = current_millis; &lt;br /&gt;
       reception_ir1.enableIRIn();&lt;br /&gt;
       reception_ir2.enableIRIn();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    if (reception_ir1.decode(&amp;amp;decode_ir1)) &lt;br /&gt;
    { &lt;br /&gt;
      if(decode_ir1.value == 1){&lt;br /&gt;
        etatTsop = 1;&lt;br /&gt;
      }&lt;br /&gt;
  &lt;br /&gt;
      reception_ir1.resume();&lt;br /&gt;
      reception_ir2.enableIRIn();&lt;br /&gt;
    }&lt;br /&gt;
    if (reception_ir2.decode(&amp;amp;decode_ir2)) &lt;br /&gt;
    { &lt;br /&gt;
      if(decode_ir2.value == 1){&lt;br /&gt;
        etatTsop = 1;&lt;br /&gt;
      } &lt;br /&gt;
      reception_ir2.resume();  &lt;br /&gt;
      reception_ir1.enableIRIn();&lt;br /&gt;
    }&lt;br /&gt;
    return etatTsop;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  int hall(){&lt;br /&gt;
    int etatHall = 0;&lt;br /&gt;
    if(digitalRead(HALL) == 0){&lt;br /&gt;
      etatHall = 1;&lt;br /&gt;
    }&lt;br /&gt;
    return etatHall;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
=== Description de la structure du code ===&lt;br /&gt;
&lt;br /&gt;
==== Fonction sonar() ====&lt;br /&gt;
&lt;br /&gt;
Cette fonction permet au sonar de calculer la distance séparant le robot d'un obstacle.&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
  int sonar() {&lt;br /&gt;
    digitalWrite(TRIGG, 1);&lt;br /&gt;
    delayMicroseconds(10);&lt;br /&gt;
    digitalWrite(TRIGG,0);&lt;br /&gt;
    long measure = pulseIn(ECHO, HIGH);&lt;br /&gt;
    &lt;br /&gt;
    float distance_mm = measure / 2.0 * SOUND_SPEED;&lt;br /&gt;
    return distance_mm; &lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Fonction tsop()====&lt;br /&gt;
&lt;br /&gt;
Cette fonction a deux rôles. Le premier est de lire les entrées des tsop et de renvoyer si un prédateur a été détecter ou non. Le deuxième est d'émettre un signal infra-rouge permettant au prédateur de nous détecter.&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
  int tsop(int * attraper ){&lt;br /&gt;
    unsigned long current_millis = millis();&lt;br /&gt;
    int etatTsop = 0;&lt;br /&gt;
    if ((current_millis - last_millis &amp;gt;= interval)&amp;amp;&amp;amp;(*attraper == 0)){&lt;br /&gt;
       emission_ir.sendNEC(1, 32); &lt;br /&gt;
       last_millis = current_millis; &lt;br /&gt;
       reception_ir1.enableIRIn();&lt;br /&gt;
       reception_ir2.enableIRIn();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    if (reception_ir1.decode(&amp;amp;decode_ir1)) &lt;br /&gt;
    { &lt;br /&gt;
      if(decode_ir1.value == 1){&lt;br /&gt;
        etatTsop = 1;&lt;br /&gt;
      }&lt;br /&gt;
  &lt;br /&gt;
      reception_ir1.resume();&lt;br /&gt;
      reception_ir2.enableIRIn();&lt;br /&gt;
    }&lt;br /&gt;
    if (reception_ir2.decode(&amp;amp;decode_ir2)) &lt;br /&gt;
    { &lt;br /&gt;
      if(decode_ir2.value == 1){&lt;br /&gt;
        etatTsop = 1;&lt;br /&gt;
      } &lt;br /&gt;
      reception_ir2.resume();  &lt;br /&gt;
      reception_ir1.enableIRIn();&lt;br /&gt;
    }&lt;br /&gt;
    return etatTsop;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Les particularités de cette fonction sont que, premièrement pour facilité la programmation l'émission et la réception ont été mises dans la même fonction car elles demandent toutes les deux la même bibliothèque et les même timer, donc pour éviter tout conflit ceci fut une bonne solution. Deuxièmement, la fonction tsop() contient un pointeur en paramètre. Ce pointeur permet au robot de savoir s'il doit continuer à émettre ou non s'il est attrapé.&lt;br /&gt;
&lt;br /&gt;
L'émission du signal infra-rouge ici ce fait toute les 0.5s. En effet si les émissions sont trop proche il y a conflit avec la réception.&lt;br /&gt;
&lt;br /&gt;
==== Fonction hall()====&lt;br /&gt;
&lt;br /&gt;
Cette fonction permet de voir si un prédateur nous a détecté et attrapé grâce à l'émission d'une onde électromagnétique.&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
  int hall(){&lt;br /&gt;
    int etatHall = 0;&lt;br /&gt;
    if(digitalRead(HALL) == 0){&lt;br /&gt;
      etatHall = 1;&lt;br /&gt;
    }&lt;br /&gt;
    return etatHall;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Fonction deplacement() ====&lt;br /&gt;
&lt;br /&gt;
Pour le déplacement du robot nous avons choisi de créer un classe pour avoir un code plus propre et une fonction loop() ne contenant qu'une seul ligne de code.&lt;br /&gt;
&lt;br /&gt;
La Classe Mouv contient 2 fonctions. La première attacher() permet de lier les instances servo aux pins associées. Elle est appelée dans le setup(). La deuxième fonction est la fonction de déplacement appelée deplacement(). Cette fonction est la seule appelée de la fonction loop().&lt;br /&gt;
&lt;br /&gt;
Cette fonction est alors la fonction principale du robot, car c'est elle qui va décider du déplacement du robot en fonction des différentes entrées des capteurs. Elle contient en paramètre les différentes entrées du sonar, du tsop, de la sonde de hall, mais aussi un pointeur pour pouvoir sauvegarder en mémoire le fait que le robot soit attrapé ou non.&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
      void deplacement(int distanceObstacle , int tsop , int hall, int* attraper){&lt;br /&gt;
        unsigned long currentMillis = millis();&lt;br /&gt;
        &lt;br /&gt;
        if (hall == 1){&lt;br /&gt;
          etatHall = 1;&lt;br /&gt;
          *attraper = 1;&lt;br /&gt;
        }&lt;br /&gt;
        else if (distanceObstacle &amp;lt; 200){&lt;br /&gt;
          etatSonar = 1;&lt;br /&gt;
        }&lt;br /&gt;
        else if (tsop==1){&lt;br /&gt;
          etatTsop = 1;&lt;br /&gt;
          lastMillis = currentMillis;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        if (etatHall == 1){&lt;br /&gt;
          servo1.write(90);&lt;br /&gt;
          servo2.write(90);&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        else if (etatSonar ==1){&lt;br /&gt;
          if (etatRotation == 0){&lt;br /&gt;
            etatRotation = random(1,3);&lt;br /&gt;
          }&lt;br /&gt;
          if(etatRotation == 1){&lt;br /&gt;
            servo1.write(180);&lt;br /&gt;
            servo2.write(180);&lt;br /&gt;
          }&lt;br /&gt;
          else{&lt;br /&gt;
            servo1.write(0);&lt;br /&gt;
            servo2.write(0);&lt;br /&gt;
          }&lt;br /&gt;
          etatSonnar = 0 ;&lt;br /&gt;
          lastMillis = currentMillis;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        else if (etatTsop == 1){&lt;br /&gt;
          if (etatRotation == 0){&lt;br /&gt;
            etatRotation = random(1,3);&lt;br /&gt;
          }&lt;br /&gt;
          &lt;br /&gt;
          if(etatRotation == 1){&lt;br /&gt;
            servo1.write(180);&lt;br /&gt;
            servo2.write(180);&lt;br /&gt;
          }&lt;br /&gt;
          else{&lt;br /&gt;
            servo1.write(0);&lt;br /&gt;
            servo2.write(0);&lt;br /&gt;
          }&lt;br /&gt;
          &lt;br /&gt;
          if (currentMillis - lastMillis &amp;gt;= intervalTsop){&lt;br /&gt;
            etatTsop = 0;&lt;br /&gt;
            lastMillis = currentMillis;&lt;br /&gt;
          }&lt;br /&gt;
        }   &lt;br /&gt;
        &lt;br /&gt;
        else{&lt;br /&gt;
          etatRotation = 0;&lt;br /&gt;
          if (currentMillis - lastMillis &amp;lt; intervalMouvement1){&lt;br /&gt;
            servo1.write(180);&lt;br /&gt;
            servo2.write(70);&lt;br /&gt;
          }&lt;br /&gt;
          else if ((currentMillis - lastMillis &amp;gt;= intervalMouvement2) &amp;amp;&amp;amp;  (currentMillis - lastMillis &amp;lt;= intervalMouvement3)){&lt;br /&gt;
            servo1.write(98);&lt;br /&gt;
            servo2.write(0);&lt;br /&gt;
          }&lt;br /&gt;
          else{&lt;br /&gt;
            servo1.write(180);&lt;br /&gt;
            servo2.write(0);&lt;br /&gt;
            if (currentMillis - lastMillis &amp;gt;= intervalMouvement4){&lt;br /&gt;
              lastMillis = currentMillis;&lt;br /&gt;
            }&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Cette fonction est divisée en deux partie. La première est la distribution des états du robot en fonction des entrées. Par la suite, la fonction va décidé quel déplacement faire en fonction des priorités des différents états. L'états le plus prioritaire est l'états etatHall. Celui ci indique si le robot est attrapé et une fois passé à 1 il ne peut plus changer et le déplacement associé est un sur-place pour le robot. Après il y a l'état associé au obstacle et si la distance devient inférieur à celle écrite, le robot tourne sur lui même dans une direction aléatoire jusqu'à ne plus percevoir d'obstacle. Le suivant est celui de la détection de prédateur. Ici si un prédateur est détectée, Quireekoo va aussi ce tourner dans une direction aléatoire. Mais la différence c'est que ici il va tourner pendant un certain intervalle de temps rentré dans le code. Le dernier déplacement n'est exécuter seulement si aucun des trois autres n'est fait. C'est le déplacement de base du robot. Ce déplacement est juste en zigzag.&lt;/div&gt;</summary>
		<author><name>Dtillaux</name></author>	</entry>

	<entry>
		<id>https://peip-ima.plil.fr/mediawiki/index.php?title=Binome2017-9&amp;diff=9604</id>
		<title>Binome2017-9</title>
		<link rel="alternate" type="text/html" href="https://peip-ima.plil.fr/mediawiki/index.php?title=Binome2017-9&amp;diff=9604"/>
				<updated>2018-05-05T13:29:28Z</updated>
		
		<summary type="html">&lt;p&gt;Dtillaux : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Binôme 9 saison 8: Raphaël Bonvalet, Damien Tillaux.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Projet Quireekoo =&lt;br /&gt;
&lt;br /&gt;
Le but du projet Quireekoo est de créer un robot communiquant avec d'autre via infra-rouge. Ce projet à eu lieux lors des bureaux d'étude de PEIP en IMA au S4 2018 de notre cursus pour devenir ingénieur. Voici la transcription phonétique de Quireekoo: /Kirikou/.&lt;br /&gt;
&lt;br /&gt;
= Cahier des charges =&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Kiki.jpg|middle]]&lt;br /&gt;
&lt;br /&gt;
Quireekoo sera un robot fait de A à Z. Le circuit imprimé sera totalement revu et sera guidé grâce à une ATMEGA-328. Le physique sera totalement design par nous même et son programme sera totalement autonome.&lt;br /&gt;
&lt;br /&gt;
Quireekoo étant petit et vaillant est un véhicule de petite taille. A la défaut de jambe, Quireekoo ce déplace avec 2 servos moteurs continue. A la place des yeux, un sonar pour éviter ses obstacles et ne pas trébucher. Pour ses oreilles nous avons prévu 2 Tsop38238 pour pouvoir repérer et fuir ses ennemis.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Réalisation du projet =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Voici les différentes étapes par lesquels nous sommes passer lors de la création de Quireekoo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Réalisation de PCB ==&lt;br /&gt;
&lt;br /&gt;
=== Idée principale ===&lt;br /&gt;
&lt;br /&gt;
Nous voulions refaire nous même le PCB de Quireekoo mais nous n'avions pratiquement aucune base sur comment créer un circuit imprimé pour ce genre de projet. Du coups nous avons pris comme modèle, le modèle donnée sur la page principale du projet. ([https://peip-ima.plil.fr/mediawiki/index.php/BE_2017-2018 BE 2017-2018])&lt;br /&gt;
&lt;br /&gt;
Voici le schématique sur lequel nous nous sommes basé.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:RobotPCB schem.png|500px|thumb||left|Schématique original]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Notre PCB ===&lt;br /&gt;
&lt;br /&gt;
Notre PCB a été réalisé sur Fritzing. Nous avons créer ce circuit imprimé à notre image pour notre véhicule. Nous avons enlevé le driver de moteur et les sorties moteurs car nous voulions un robot de petite taille. Donc le moyen de déplacement choisi a alors été le servo-moteur. Pour les réceptions infra-rouge nous n'avons prévu que deux sorties pour des Tsop pour pouvoir laisser un plus grande chance au chasseur de ne pas être repéré, pour une approche plus vrai que nature. Pour savoir si un chasseur nous a attrapé, nous utilisons une sonde de Hall.&lt;br /&gt;
&lt;br /&gt;
De plus, en cas de problème nous avons créé toutes les sorties du microcontrôleur. Si un problème apparaît sur une des pins utilisées, nous pourrons la relocaliser sur une autre sortie.&lt;br /&gt;
&lt;br /&gt;
Un objectif supplémentaire était de réaliser un PCB le plus petit possible pour que le véhicule le soit aussi. Ce fut presque un succès, la carte est d'une taille environ de 5cm*5cm. Elle aurait pu être encore plus petite avec plus de travail mais nous ne pouvions pas nous le permettre si nous voulions tout faire.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Voici le schématique et le PCB de Quireekoo.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Quireekoo schem.png|500px|thumb|left|Schématique de Quireekoo]]&lt;br /&gt;
[[Fichier:Quireekoo pcb.png|500px|thumb|right|PCB de Quireekoo]]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Réalisation de la partie mécanique du véhicule ==&lt;br /&gt;
&lt;br /&gt;
Pour la partie mécanique de Quireekoo on a choisi de le faire sur inkscape afin de pouvoir effectuer une découpe laser. Le robot est composé de deux plaques de plexiglas, une pour le châssis où il y a les servos moteur, la bille et le bloc de pile, et une pour placer le sonar, le circuit imprimée, les Tsop et la sonde de hall. &lt;br /&gt;
&lt;br /&gt;
Voici à quoi ressemble la partie du bas sur inkscape : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Partie bas.jpg|700px|]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour la partie du haut c'était un peu plus compliqué car il fallait trouver comment placer les tsop, la sonde de hall et le sonar. Pour pouvoir fixer ceux-ci on a choisi de faire des trous en forme de rectangles avec une taille égale à la taille des pins de chaque capteurs différents. Après il fallait aussi mettre les trous pour fixer le circuit imprimé au même endroit que ceux qui se trouve sur celui-ci. Pour ce faire, on a utilisé le fichier .svg donné par Fritzing. On a également mis des trous en forme de rectangle sur les côtés pour pouvoir laisser passer les fils.&lt;br /&gt;
&lt;br /&gt;
Voici à quoi ressemble la partie du haut sur inkscape :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Partie haut.png|700px|]]&lt;br /&gt;
&lt;br /&gt;
Pour finir il nous restait les roues à faire. On a opté pour garder les roues données avec les servos moteurs en y rajoutant des partie en plexiglas au pistolet à colle pour rendre celles-ci plus grandes.&lt;br /&gt;
&lt;br /&gt;
Voici à quoi cela ressemble sur inkscape : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Roue.png|200px|]]&lt;br /&gt;
&lt;br /&gt;
Le problème avec cette solution c'est que les roues ne sont pas adhérentes. De ce fait là, on a ajouté une partie d'élastique autour avec de la colle glue.&lt;br /&gt;
&lt;br /&gt;
Voici a quoi le robot ressemble à la fin :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Quireekoo.jpg|200px|]]&lt;br /&gt;
&lt;br /&gt;
== Réalisation du code Arduino ==&lt;br /&gt;
&lt;br /&gt;
Voici maintenant la présentation du code téléversé dans Quireekoo.&lt;br /&gt;
&lt;br /&gt;
=== Le code ===&lt;br /&gt;
&lt;br /&gt;
{  &lt;br /&gt;
  #include &amp;lt;Servo.h&amp;gt;&lt;br /&gt;
  #include &amp;lt;IRremote.h&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  //déclaration des différentes pins&lt;br /&gt;
  &lt;br /&gt;
  #define SERVO1 11&lt;br /&gt;
  #define SERVO2 13&lt;br /&gt;
  #define ECHO 17&lt;br /&gt;
  #define TRIGG 18&lt;br /&gt;
  #define HALL A2&lt;br /&gt;
  #define IR 2&lt;br /&gt;
  #define VCCIR1 A0&lt;br /&gt;
  #define VCCIR2 A1&lt;br /&gt;
  &lt;br /&gt;
  //création de la classe Mouv pour le déplacement du robot&lt;br /&gt;
  &lt;br /&gt;
  class Mouv {&lt;br /&gt;
  &lt;br /&gt;
          Servo servo1;&lt;br /&gt;
          Servo servo2;&lt;br /&gt;
          int servo1Pin;&lt;br /&gt;
          int servo2Pin;&lt;br /&gt;
          &lt;br /&gt;
          int etatRotation;&lt;br /&gt;
          int etatSonnar;&lt;br /&gt;
          int etatHall;&lt;br /&gt;
          int etatTsop;&lt;br /&gt;
          &lt;br /&gt;
          long intervalTsop;&lt;br /&gt;
          &lt;br /&gt;
          long intervalMouvement1;&lt;br /&gt;
          long intervalMouvement2;&lt;br /&gt;
          long intervalMouvement3;&lt;br /&gt;
          long intervalMouvement4;&lt;br /&gt;
          &lt;br /&gt;
          unsigned long lastMillis;&lt;br /&gt;
          &lt;br /&gt;
          &lt;br /&gt;
    public:&lt;br /&gt;
      Mouv(int pin1 , int pin2){&lt;br /&gt;
        servo1Pin= pin1;&lt;br /&gt;
        servo2Pin = pin2;&lt;br /&gt;
        &lt;br /&gt;
        etatRotation = 0;&lt;br /&gt;
        etatSonnar = 0;&lt;br /&gt;
        etatHall = 0;&lt;br /&gt;
        etatTsop = 0;&lt;br /&gt;
        lastMillis = 0;&lt;br /&gt;
        &lt;br /&gt;
        intervalTsop = 500;&lt;br /&gt;
        &lt;br /&gt;
        intervalMouvement1 = 1500;&lt;br /&gt;
        intervalMouvement2 = 1700;&lt;br /&gt;
        intervalMouvement3 = 3200;&lt;br /&gt;
        intervalMouvement4 = 3400;&lt;br /&gt;
      }&lt;br /&gt;
    &lt;br /&gt;
      void attacher(){&lt;br /&gt;
        servo1.attach(servo1Pin);&lt;br /&gt;
        servo2.attach(servo2Pin);&lt;br /&gt;
      }&lt;br /&gt;
  &lt;br /&gt;
      void deplacementNormal(int distanceObstacle , int tsop , int hall, int* attraper){&lt;br /&gt;
        unsigned long currentMillis = millis();&lt;br /&gt;
        &lt;br /&gt;
        if (hall == 1){&lt;br /&gt;
          etatHall = 1;&lt;br /&gt;
          *attraper = 1;&lt;br /&gt;
        }&lt;br /&gt;
        else if (distanceObstacle &amp;lt; 200){&lt;br /&gt;
          etatSonnar = 1;&lt;br /&gt;
        }&lt;br /&gt;
        else if (tsop==1){&lt;br /&gt;
          etatTsop = 1;&lt;br /&gt;
          lastMillis = currentMillis;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        if (etatHall == 1){&lt;br /&gt;
          servo1.write(90);&lt;br /&gt;
          servo2.write(90);&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        else if (etatSonnar ==1){&lt;br /&gt;
          if (etatRotation == 0){&lt;br /&gt;
            etatRotation = random(1,3);&lt;br /&gt;
          }&lt;br /&gt;
          if(etatRotation == 1){&lt;br /&gt;
            servo1.write(180);&lt;br /&gt;
            servo2.write(180);&lt;br /&gt;
          }&lt;br /&gt;
          else{&lt;br /&gt;
            servo1.write(0);&lt;br /&gt;
            servo2.write(0);&lt;br /&gt;
          }&lt;br /&gt;
          etatSonnar = 0 ;&lt;br /&gt;
          lastMillis = currentMillis;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        else if (etatTsop == 1){&lt;br /&gt;
          if (etatRotation == 0){&lt;br /&gt;
            etatRotation = random(1,3);&lt;br /&gt;
          }&lt;br /&gt;
          &lt;br /&gt;
          if(etatRotation == 1){&lt;br /&gt;
            servo1.write(180);&lt;br /&gt;
            servo2.write(180);&lt;br /&gt;
          }&lt;br /&gt;
          else{&lt;br /&gt;
            servo1.write(0);&lt;br /&gt;
            servo2.write(0);&lt;br /&gt;
          }&lt;br /&gt;
          &lt;br /&gt;
          if (currentMillis - lastMillis &amp;gt;= intervalTsop){&lt;br /&gt;
            etatTsop = 0;&lt;br /&gt;
            lastMillis = currentMillis;&lt;br /&gt;
          }&lt;br /&gt;
        }   &lt;br /&gt;
        &lt;br /&gt;
        else{&lt;br /&gt;
          etatRotation = 0;&lt;br /&gt;
          if (currentMillis - lastMillis &amp;lt; intervalMouvement1){&lt;br /&gt;
            servo1.write(180);&lt;br /&gt;
            servo2.write(70);&lt;br /&gt;
          }&lt;br /&gt;
          else if ((currentMillis - lastMillis &amp;gt;= intervalMouvement2) &amp;amp;&amp;amp;  (currentMillis - lastMillis &amp;lt;= intervalMouvement3)){&lt;br /&gt;
            servo1.write(98);&lt;br /&gt;
            servo2.write(0);&lt;br /&gt;
          }&lt;br /&gt;
          else{&lt;br /&gt;
            servo1.write(180);&lt;br /&gt;
            servo2.write(0);&lt;br /&gt;
            if (currentMillis - lastMillis &amp;gt;= intervalMouvement4){&lt;br /&gt;
              lastMillis = currentMillis;&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;br /&gt;
  Mouv servo(SERVO1,SERVO2);&lt;br /&gt;
  &lt;br /&gt;
  //varibable pour le sonnar&lt;br /&gt;
  &lt;br /&gt;
  long lectureEcho;&lt;br /&gt;
  long distance;&lt;br /&gt;
  const float SOUND_SPEED = 340.0 / 1000;&lt;br /&gt;
  &lt;br /&gt;
  //varibable pour la sonde de hall&lt;br /&gt;
  &lt;br /&gt;
  int* attraper;&lt;br /&gt;
  &lt;br /&gt;
  //varibable pour les tsop&lt;br /&gt;
  &lt;br /&gt;
  unsigned long last_millis = 0; &lt;br /&gt;
  long interval = 500;&lt;br /&gt;
  &lt;br /&gt;
  int broche_reception1 = VCCIR1;&lt;br /&gt;
  IRrecv reception_ir1(broche_reception1);&lt;br /&gt;
  decode_results decode_ir1;&lt;br /&gt;
  &lt;br /&gt;
  int broche_reception2 = VCCIR2;&lt;br /&gt;
  IRrecv reception_ir2(broche_reception2);&lt;br /&gt;
  decode_results decode_ir2; &lt;br /&gt;
  &lt;br /&gt;
  //instance pour l'emmission infra-rouge&lt;br /&gt;
  &lt;br /&gt;
  IRsend emission_ir; &lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  void setup() {&lt;br /&gt;
    pinMode(TRIGG,OUTPUT);&lt;br /&gt;
    digitalWrite(TRIGG,0);&lt;br /&gt;
    pinMode(ECHO,INPUT); &lt;br /&gt;
    pinMode(IR,OUTPUT);&lt;br /&gt;
    digitalWrite(IR,1);&lt;br /&gt;
  &lt;br /&gt;
    servo.attacher();&lt;br /&gt;
    &lt;br /&gt;
    reception_ir1.enableIRIn(); // démarre la réception&lt;br /&gt;
    reception_ir2.enableIRIn();&lt;br /&gt;
    &lt;br /&gt;
    attraper = malloc(sizeof(int));&lt;br /&gt;
    *attraper = 0;&lt;br /&gt;
    &lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  void loop() {&lt;br /&gt;
    servo.deplacementNormal(sonnar(),tsop(attraper),hall(),attraper);  &lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  int sonnar() {&lt;br /&gt;
    digitalWrite(TRIGG, 1);&lt;br /&gt;
    delayMicroseconds(10);&lt;br /&gt;
    digitalWrite(TRIGG,0);&lt;br /&gt;
    long measure = pulseIn(ECHO, HIGH);&lt;br /&gt;
    &lt;br /&gt;
    float distance_mm = measure / 2.0 * SOUND_SPEED;&lt;br /&gt;
    return distance_mm; &lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  int tsop(int * attraper ){&lt;br /&gt;
    unsigned long current_millis = millis();&lt;br /&gt;
    int etatTsop = 0;&lt;br /&gt;
    if ((current_millis - last_millis &amp;gt;= interval)&amp;amp;&amp;amp;(*attraper == 0)){&lt;br /&gt;
       emission_ir.sendNEC(1, 32); &lt;br /&gt;
       last_millis = current_millis; &lt;br /&gt;
       reception_ir1.enableIRIn();&lt;br /&gt;
       reception_ir2.enableIRIn();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    if (reception_ir1.decode(&amp;amp;decode_ir1)) &lt;br /&gt;
    { &lt;br /&gt;
      if(decode_ir1.value == 1){&lt;br /&gt;
        etatTsop = 1;&lt;br /&gt;
      }&lt;br /&gt;
  &lt;br /&gt;
      reception_ir1.resume();&lt;br /&gt;
      reception_ir2.enableIRIn();&lt;br /&gt;
    }&lt;br /&gt;
    if (reception_ir2.decode(&amp;amp;decode_ir2)) &lt;br /&gt;
    { &lt;br /&gt;
      if(decode_ir2.value == 1){&lt;br /&gt;
        etatTsop = 1;&lt;br /&gt;
      } &lt;br /&gt;
      reception_ir2.resume();  &lt;br /&gt;
      reception_ir1.enableIRIn();&lt;br /&gt;
    }&lt;br /&gt;
    return etatTsop;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  int hall(){&lt;br /&gt;
    int etatHall = 0;&lt;br /&gt;
    if(digitalRead(HALL) == 0){&lt;br /&gt;
      etatHall = 1;&lt;br /&gt;
    }&lt;br /&gt;
    return etatHall;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
=== Description de la structure du code ===&lt;/div&gt;</summary>
		<author><name>Dtillaux</name></author>	</entry>

	<entry>
		<id>https://peip-ima.plil.fr/mediawiki/index.php?title=Binome2017-9&amp;diff=9222</id>
		<title>Binome2017-9</title>
		<link rel="alternate" type="text/html" href="https://peip-ima.plil.fr/mediawiki/index.php?title=Binome2017-9&amp;diff=9222"/>
				<updated>2018-04-16T08:21:54Z</updated>
		
		<summary type="html">&lt;p&gt;Dtillaux : /* Réalisation de PCB */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Binôme 9 saison 8: Raphaël Bonvalet, Damien Tillaux.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Projet Quireekoo =&lt;br /&gt;
&lt;br /&gt;
Le but du projet Quireekoo est de créer un robot communiquant avec d'autre via infra-rouge. Ce projet à eu lieux lors des bureaux d'étude de PEIP en IMA au S4 2018 de notre cursus pour devenir ingénieur. Voici la transcription phonétique de Quireekoo: /Kirikou/.&lt;br /&gt;
&lt;br /&gt;
= Cahier des charges =&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Kiki.jpg|middle]]&lt;br /&gt;
&lt;br /&gt;
Quireekoo sera un robot fait de A à Z. Le circuit imprimé sera totalement revu et sera guidé grâce à une ATMEGA-328. Le physique sera totalement design par nous même et son programme sera totalement autonome.&lt;br /&gt;
&lt;br /&gt;
Quireekoo étant petit et vaillant est un véhicule de petite taille. A la défaut de jambe, Quireekoo ce déplace avec 2 servos moteurs continue. A la place des yeux, un sonar pour éviter ses obstacles et ne pas trébucher. Pour ses oreilles nous avons prévu 2 Tsop38238 pour pouvoir repérer et fuir ses ennemis.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Réalisation du projet =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Voici les différentes étapes par lesquels nous sommes passer lors de la création de Quireekoo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Réalisation de PCB ==&lt;br /&gt;
&lt;br /&gt;
=== Idée principale ===&lt;br /&gt;
&lt;br /&gt;
Nous voulions refaire nous même le PCB de Quireekoo mais nous n'avions pratiquement aucune base sur comment créer un circuit imprimé pour ce genre de projet. Du coups nous avons pris comme modèle, le modèle donnée sur la page principale du projet. ([https://peip-ima.plil.fr/mediawiki/index.php/BE_2017-2018 BE 2017-2018])&lt;br /&gt;
&lt;br /&gt;
Voici le schématique sur lequel nous nous sommes basé.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:RobotPCB schem.png|500px|thumb||left|Schématique original]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Notre PCB ===&lt;br /&gt;
&lt;br /&gt;
Notre PCB a été réalisé sur Fritzing. Nous avons créer ce circuit imprimé à notre image pour notre véhicule. Nous avons enlevé le driver de moteur et les sorties moteurs car nous voulions un robot de petite taille. Donc le moyen de déplacement choisi a alors été le servo-moteur. Pour les réceptions infra-rouge nous n'avons prévu que deux sorties pour des Tsop pour pouvoir laisser un plus grande chance au chasseur de ne pas être repéré, pour une approche plus vrai que nature. Pour savoir si un chasseur nous a attrapé, nous utilisons une sonde de Hall.&lt;br /&gt;
&lt;br /&gt;
De plus, en cas de problème nous avons créé toutes les sorties du microcontrôleur. Si un problème apparaît sur une des pins utilisées, nous pourrons la relocaliser sur une autre sortie.&lt;br /&gt;
&lt;br /&gt;
Un objectif supplémentaire était de réaliser un PCB le plus petit possible pour que le véhicule le soit aussi. Ce fut presque un succès, la carte est d'une taille environ de 5cm*5cm. Elle aurait pu être encore plus petite avec plus de travail mais nous ne pouvions pas nous le permettre si nous voulions tout faire.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Voici le schématique et le PCB de Quireekoo.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Quireekoo schem.png|500px|thumb|left|Schématique de Quireekoo]]&lt;br /&gt;
[[Fichier:Quireekoo pcb.png|500px|thumb|right|PCB de Quireekoo]]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Réalisation de la partie mécanique du véhicule ==&lt;br /&gt;
&lt;br /&gt;
Pour la partie mécanique de Quireekoo on a choisi de le faire sur inkscape afin de pouvoir effectuer une découpe laser. Le robot est composé de deux plaques de plexiglas, une pour le châssis où il y a les servos moteur, la bille et le bloc de pile, et une pour placer le sonar, le circuit imprimée, les Tsop et la sonde de hall. &lt;br /&gt;
&lt;br /&gt;
Voici à quoi ressemble la partie du bas sur inkscape : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Partie bas.jpg|700px|]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour la partie du haut c'était un peu plus compliqué car il fallait trouver comment placer les tsop, la sonde de hall et le sonar. Pour pouvoir fixer ceux-ci on a choisi de faire des trous en forme de rectangles avec une taille égale à la taille des pins de chaque capteurs différents. Après il fallait aussi mettre les trous pour fixer le circuit imprimé au même endroit que ceux qui se trouve sur celui-ci. Pour ce faire, on a utilisé le fichier .svg donné par Fritzing. On a également mis des trous en forme de rectangle sur les côtés pour pouvoir laisser passer les fils.&lt;br /&gt;
&lt;br /&gt;
Voici à quoi ressemble la partie du haut sur inkscape :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Partie haut.png|700px|]]&lt;br /&gt;
&lt;br /&gt;
Pour finir il nous restait les roues à faire. On a opté pour garder les roues données avec les servos moteurs en y rajoutant des partie en plexiglas au pistolet à colle pour rendre celles-ci plus grandes.&lt;br /&gt;
&lt;br /&gt;
Voici à quoi cela ressemble sur inkscape : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Roue.png|200px|]]&lt;br /&gt;
&lt;br /&gt;
Le problème avec cette solution c'est que les roues ne sont pas adhérentes. De ce fait là, on a ajouté une partie d'élastique autour avec de la colle glue.&lt;br /&gt;
&lt;br /&gt;
Voici a quoi le robot ressemble à la fin :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Quireekoo.jpg|200px|]]&lt;br /&gt;
&lt;br /&gt;
== Réalisation du code Arduino ==&lt;br /&gt;
&lt;br /&gt;
Cette partie fut l'une des parties des plus fastidieuses. Elle nous a pris le plus de temps et différents problèmes ont été rencontrés et seront décrit.&lt;br /&gt;
&lt;br /&gt;
=== Structure du code ===&lt;/div&gt;</summary>
		<author><name>Dtillaux</name></author>	</entry>

	<entry>
		<id>https://peip-ima.plil.fr/mediawiki/index.php?title=Fichier:Quireekoo_pcb.png&amp;diff=9220</id>
		<title>Fichier:Quireekoo pcb.png</title>
		<link rel="alternate" type="text/html" href="https://peip-ima.plil.fr/mediawiki/index.php?title=Fichier:Quireekoo_pcb.png&amp;diff=9220"/>
				<updated>2018-04-16T08:20:36Z</updated>
		
		<summary type="html">&lt;p&gt;Dtillaux : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Dtillaux</name></author>	</entry>

	<entry>
		<id>https://peip-ima.plil.fr/mediawiki/index.php?title=Binome2017-9&amp;diff=9204</id>
		<title>Binome2017-9</title>
		<link rel="alternate" type="text/html" href="https://peip-ima.plil.fr/mediawiki/index.php?title=Binome2017-9&amp;diff=9204"/>
				<updated>2018-04-16T07:43:26Z</updated>
		
		<summary type="html">&lt;p&gt;Dtillaux : /* Notre PCB */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Binôme 9 saison 8: Raphaël Bonvalet, Damien Tillaux.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Projet Quireekoo =&lt;br /&gt;
&lt;br /&gt;
Le but du projet Quireekoo est de créer un robot communiquant avec d'autre via infra-rouge. Ce projet à eu lieux lors des bureaux d'étude de PEIP en IMA au S4 2018 de notre cursus pour devenir ingénieur. Voici la transcription phonétique de Quireekoo: /Kirikou/.&lt;br /&gt;
&lt;br /&gt;
= Cahier des charges =&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Kiki.jpg|middle]]&lt;br /&gt;
&lt;br /&gt;
Quireekoo sera un robot fait de A à Z. Le circuit imprimé sera totalement revu et sera guidé grâce à une ATMEGA-328. Le physique sera totalement design par nous même et son programme sera totalement autonome.&lt;br /&gt;
&lt;br /&gt;
Quireekoo étant petit et vaillant est un véhicule de petite taille. A la défaut de jambe, Quireekoo ce déplace avec 2 servos moteurs continue. A la place des yeux, un sonar pour éviter ses obstacles et ne pas trébucher. Pour ses oreilles nous avons prévu 2 Tsop38238 pour pouvoir repérer et fuir ses ennemis.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Réalisation du projet =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Voici les différentes étapes par lesquels nous sommes passer lors de la création de Quireekoo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Réalisation de PCB ==&lt;br /&gt;
&lt;br /&gt;
=== Idée principale ===&lt;br /&gt;
&lt;br /&gt;
Nous voulions refaire nous même le PCB de Quireekoo mais nous n'avions pratiquement aucune base sur comment créer un circuit imprimé pour ce genre de projet. Du coups nous avons pris comme modèle, le modèle donnée sur la page principale du projet. ([https://peip-ima.plil.fr/mediawiki/index.php/BE_2017-2018 BE 2017-2018])&lt;br /&gt;
&lt;br /&gt;
Voici le schématique sur lequel nous nous sommes basé.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:RobotPCB schem.png|500px|thumb||left|Schématique original]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Notre PCB ===&lt;br /&gt;
&lt;br /&gt;
Notre PCB a été réalisé sur Fritzing. Nous avons créer ce circuit imprimé à notre image pour notre véhicule. Nous avons enlevé le driver de moteur et les sorties moteurs car nous voulions un robot de petite taille. Donc le moyen de déplacement choisi a alors été le servo-moteur. Pour les réceptions infra-rouge nous n'avons prévu que deux sorties pour des Tsop pour pouvoir laisser un plus grande chance au chasseur de ne pas être repéré, pour une approche plus vrai que nature. Pour savoir si un chasseur nous a attrapé, nous utilisons une sonde de Hall.&lt;br /&gt;
&lt;br /&gt;
De plus, en cas de problème nous avons créé toutes les sorties du microcontrôleur. Si un problème apparaît sur une des pins utilisées, nous pourrons la relocaliser sur une autre sortie.&lt;br /&gt;
&lt;br /&gt;
Un objectif supplémentaire était de réaliser un PCB le plus petit possible pour que le véhicule le soit aussi. Ce fut presque un succès, la carte est d'une taille environ de 5cm*5cm. Elle aurait pu être encore plus petite avec plus de travail mais nous ne pouvions pas nous le permettre si nous voulions tout faire.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Voici le schématique et le PCB de Quireekoo.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Quireekoo schem.png|500px|Schématique de Quireekoo]]&lt;br /&gt;
&lt;br /&gt;
=== oublie pas les images ===&lt;br /&gt;
=== oublie pas les images ===&lt;br /&gt;
=== oublie pas les images ===&lt;br /&gt;
=== oublie pas les images ===&lt;br /&gt;
&lt;br /&gt;
== Réalisation de la partie mécanique du véhicule ==&lt;br /&gt;
&lt;br /&gt;
Pour la partie mécanique de Quireekoo on a choisi de le faire sur inkscape afin de pouvoir effectuer une découpe laser. Le robot est composé de deux plaques de plexiglas, une pour le châssis où il y a les servos moteur, la bille et le bloc de pile, et une pour placer le sonar, le circuit imprimée, les Tsop et la sonde de hall. &lt;br /&gt;
&lt;br /&gt;
Voici à quoi ressemble la partie du bas sur inkscape : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Partie bas.jpg|700px|]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour la partie du haut c'était un peu plus compliqué car il fallait trouver comment placer les tsop, la sonde de hall et le sonar. Pour pouvoir fixer ceux-ci on a choisi de faire des trous en forme de rectangles avec une taille égale à la taille des pins de chaque capteurs différents. Après il fallait aussi mettre les trous pour fixer le circuit imprimé au même endroit que ceux qui se trouve sur celui-ci. Pour ce faire, on a utilisé le fichier .svg donné par Fritzing. On a également mis des trous en forme de rectangle sur les côtés pour pouvoir laisser passer les fils.&lt;br /&gt;
&lt;br /&gt;
Voici à quoi ressemble la partie du haut sur inkscape :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Partie haut.png|700px|]]&lt;br /&gt;
&lt;br /&gt;
Pour finir il nous restait les roues à faire. On a opté pour garder les roues données avec les servos moteurs en y rajoutant des partie en plexiglas au pistolet à colle pour rendre celles-ci plus grandes.&lt;br /&gt;
&lt;br /&gt;
Voici à quoi cela ressemble sur inkscape : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Roue.png|200px|]]&lt;br /&gt;
&lt;br /&gt;
Le problème avec cette solution c'est que les roues ne sont pas adhérentes. De ce fait là, on a ajouté une partie d'élastique autour avec de la colle glue.&lt;br /&gt;
&lt;br /&gt;
Voici a quoi le robot ressemble à la fin :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Quireekoo.jpg|200px|]]&lt;br /&gt;
&lt;br /&gt;
== Réalisation du code Arduino ==&lt;br /&gt;
&lt;br /&gt;
Cette partie fut l'une des parties des plus fastidieuses. Elle nous a pris le plus de temps et différents problèmes ont été rencontrés et seront décrit.&lt;br /&gt;
&lt;br /&gt;
=== Structure du code ===&lt;/div&gt;</summary>
		<author><name>Dtillaux</name></author>	</entry>

	<entry>
		<id>https://peip-ima.plil.fr/mediawiki/index.php?title=Binome2017-9&amp;diff=9203</id>
		<title>Binome2017-9</title>
		<link rel="alternate" type="text/html" href="https://peip-ima.plil.fr/mediawiki/index.php?title=Binome2017-9&amp;diff=9203"/>
				<updated>2018-04-16T07:43:04Z</updated>
		
		<summary type="html">&lt;p&gt;Dtillaux : /* Réalisation de PCB */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Binôme 9 saison 8: Raphaël Bonvalet, Damien Tillaux.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Projet Quireekoo =&lt;br /&gt;
&lt;br /&gt;
Le but du projet Quireekoo est de créer un robot communiquant avec d'autre via infra-rouge. Ce projet à eu lieux lors des bureaux d'étude de PEIP en IMA au S4 2018 de notre cursus pour devenir ingénieur. Voici la transcription phonétique de Quireekoo: /Kirikou/.&lt;br /&gt;
&lt;br /&gt;
= Cahier des charges =&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Kiki.jpg|middle]]&lt;br /&gt;
&lt;br /&gt;
Quireekoo sera un robot fait de A à Z. Le circuit imprimé sera totalement revu et sera guidé grâce à une ATMEGA-328. Le physique sera totalement design par nous même et son programme sera totalement autonome.&lt;br /&gt;
&lt;br /&gt;
Quireekoo étant petit et vaillant est un véhicule de petite taille. A la défaut de jambe, Quireekoo ce déplace avec 2 servos moteurs continue. A la place des yeux, un sonar pour éviter ses obstacles et ne pas trébucher. Pour ses oreilles nous avons prévu 2 Tsop38238 pour pouvoir repérer et fuir ses ennemis.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Réalisation du projet =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Voici les différentes étapes par lesquels nous sommes passer lors de la création de Quireekoo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Réalisation de PCB ==&lt;br /&gt;
&lt;br /&gt;
=== Idée principale ===&lt;br /&gt;
&lt;br /&gt;
Nous voulions refaire nous même le PCB de Quireekoo mais nous n'avions pratiquement aucune base sur comment créer un circuit imprimé pour ce genre de projet. Du coups nous avons pris comme modèle, le modèle donnée sur la page principale du projet. ([https://peip-ima.plil.fr/mediawiki/index.php/BE_2017-2018 BE 2017-2018])&lt;br /&gt;
&lt;br /&gt;
Voici le schématique sur lequel nous nous sommes basé.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:RobotPCB schem.png|500px|thumb||left|Schématique original]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Notre PCB ===&lt;br /&gt;
&lt;br /&gt;
Notre PCB a été réalisé sur Fritzing. Nous avons créer ce circuit imprimé à notre image pour notre véhicule. Nous avons enlevé le driver de moteur et les sorties moteurs car nous voulions un robot de petite taille. Donc le moyen de déplacement choisi a alors été le servo-moteur. Pour les réceptions infra-rouge nous n'avons prévu que deux sorties pour des Tsop pour pouvoir laisser un plus grande chance au chasseur de ne pas être repéré, pour une approche plus vrai que nature. Pour savoir si un chasseur nous a attrapé, nous utilisons une sonde de Hall.&lt;br /&gt;
&lt;br /&gt;
De plus, en cas de problème nous avons créé toutes les sorties du microcontrôleur. Si un problème apparaît sur une des pins utilisées, nous pourrons la relocaliser sur une autre sortie.&lt;br /&gt;
&lt;br /&gt;
Un objectif supplémentaire était de réaliser un PCB le plus petit possible pour que le véhicule le soit aussi. Ce fut presque un succès, la carte est d'une taille environ de 5cm*5cm. Elle aurait pu être encore plus petite avec plus de travail mais nous ne pouvions pas nous le permettre si nous voulions tout faire.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Voici le schématique et le PCB de Quireekoo.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Quireekoo schem.png|500px|thumb||left|Schématique de Quireekoo]]&lt;br /&gt;
&lt;br /&gt;
=== oublie pas les images ===&lt;br /&gt;
=== oublie pas les images ===&lt;br /&gt;
=== oublie pas les images ===&lt;br /&gt;
=== oublie pas les images ===&lt;br /&gt;
&lt;br /&gt;
== Réalisation de la partie mécanique du véhicule ==&lt;br /&gt;
&lt;br /&gt;
Pour la partie mécanique de Quireekoo on a choisi de le faire sur inkscape afin de pouvoir effectuer une découpe laser. Le robot est composé de deux plaques de plexiglas, une pour le châssis où il y a les servos moteur, la bille et le bloc de pile, et une pour placer le sonar, le circuit imprimée, les Tsop et la sonde de hall. &lt;br /&gt;
&lt;br /&gt;
Voici à quoi ressemble la partie du bas sur inkscape : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Partie bas.jpg|700px|]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour la partie du haut c'était un peu plus compliqué car il fallait trouver comment placer les tsop, la sonde de hall et le sonar. Pour pouvoir fixer ceux-ci on a choisi de faire des trous en forme de rectangles avec une taille égale à la taille des pins de chaque capteurs différents. Après il fallait aussi mettre les trous pour fixer le circuit imprimé au même endroit que ceux qui se trouve sur celui-ci. Pour ce faire, on a utilisé le fichier .svg donné par Fritzing. On a également mis des trous en forme de rectangle sur les côtés pour pouvoir laisser passer les fils.&lt;br /&gt;
&lt;br /&gt;
Voici à quoi ressemble la partie du haut sur inkscape :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Partie haut.png|700px|]]&lt;br /&gt;
&lt;br /&gt;
Pour finir il nous restait les roues à faire. On a opté pour garder les roues données avec les servos moteurs en y rajoutant des partie en plexiglas au pistolet à colle pour rendre celles-ci plus grandes.&lt;br /&gt;
&lt;br /&gt;
Voici à quoi cela ressemble sur inkscape : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Roue.png|200px|]]&lt;br /&gt;
&lt;br /&gt;
Le problème avec cette solution c'est que les roues ne sont pas adhérentes. De ce fait là, on a ajouté une partie d'élastique autour avec de la colle glue.&lt;br /&gt;
&lt;br /&gt;
Voici a quoi le robot ressemble à la fin :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Quireekoo.jpg|200px|]]&lt;br /&gt;
&lt;br /&gt;
== Réalisation du code Arduino ==&lt;br /&gt;
&lt;br /&gt;
Cette partie fut l'une des parties des plus fastidieuses. Elle nous a pris le plus de temps et différents problèmes ont été rencontrés et seront décrit.&lt;br /&gt;
&lt;br /&gt;
=== Structure du code ===&lt;/div&gt;</summary>
		<author><name>Dtillaux</name></author>	</entry>

	<entry>
		<id>https://peip-ima.plil.fr/mediawiki/index.php?title=Binome2017-9&amp;diff=9202</id>
		<title>Binome2017-9</title>
		<link rel="alternate" type="text/html" href="https://peip-ima.plil.fr/mediawiki/index.php?title=Binome2017-9&amp;diff=9202"/>
				<updated>2018-04-16T07:42:34Z</updated>
		
		<summary type="html">&lt;p&gt;Dtillaux : /* Réalisation de PCB */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Binôme 9 saison 8: Raphaël Bonvalet, Damien Tillaux.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Projet Quireekoo =&lt;br /&gt;
&lt;br /&gt;
Le but du projet Quireekoo est de créer un robot communiquant avec d'autre via infra-rouge. Ce projet à eu lieux lors des bureaux d'étude de PEIP en IMA au S4 2018 de notre cursus pour devenir ingénieur. Voici la transcription phonétique de Quireekoo: /Kirikou/.&lt;br /&gt;
&lt;br /&gt;
= Cahier des charges =&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Kiki.jpg|middle]]&lt;br /&gt;
&lt;br /&gt;
Quireekoo sera un robot fait de A à Z. Le circuit imprimé sera totalement revu et sera guidé grâce à une ATMEGA-328. Le physique sera totalement design par nous même et son programme sera totalement autonome.&lt;br /&gt;
&lt;br /&gt;
Quireekoo étant petit et vaillant est un véhicule de petite taille. A la défaut de jambe, Quireekoo ce déplace avec 2 servos moteurs continue. A la place des yeux, un sonar pour éviter ses obstacles et ne pas trébucher. Pour ses oreilles nous avons prévu 2 Tsop38238 pour pouvoir repérer et fuir ses ennemis.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Réalisation du projet =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Voici les différentes étapes par lesquels nous sommes passer lors de la création de Quireekoo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Réalisation de PCB ==&lt;br /&gt;
&lt;br /&gt;
=== Idée principale ===&lt;br /&gt;
&lt;br /&gt;
Nous voulions refaire nous même le PCB de Quireekoo mais nous n'avions pratiquement aucune base sur comment créer un circuit imprimé pour ce genre de projet. Du coups nous avons pris comme modèle, le modèle donnée sur la page principale du projet. ([https://peip-ima.plil.fr/mediawiki/index.php/BE_2017-2018 BE 2017-2018])&lt;br /&gt;
&lt;br /&gt;
Voici le schématique sur lequel nous nous sommes basé.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:RobotPCB schem.png|500px|thumb||left|Schématique original]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Notre PCB ===&lt;br /&gt;
&lt;br /&gt;
Notre PCB a été réalisé sur Fritzing. Nous avons créer ce circuit imprimé à notre image pour notre véhicule. Nous avons enlevé le driver de moteur et les sorties moteurs car nous voulions un robot de petite taille. Donc le moyen de déplacement choisi a alors été le servo-moteur. Pour les réceptions infra-rouge nous n'avons prévu que deux sorties pour des Tsop pour pouvoir laisser un plus grande chance au chasseur de ne pas être repéré, pour une approche plus vrai que nature. Pour savoir si un chasseur nous a attrapé, nous utilisons une sonde de Hall.&lt;br /&gt;
&lt;br /&gt;
De plus, en cas de problème nous avons créé toutes les sorties du microcontrôleur. Si un problème apparaît sur une des pins utilisées, nous pourrons la relocaliser sur une autre sortie.&lt;br /&gt;
&lt;br /&gt;
Un objectif supplémentaire était de réaliser un PCB le plus petit possible pour que le véhicule le soit aussi. Ce fut presque un succès, la carte est d'une taille environ de 5cm*5cm. Elle aurait pu être encore plus petite avec plus de travail mais nous ne pouvions pas nous le permettre si nous voulions tout faire.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Voici le schématique et le PCB de Quireekoo.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Quireekoo schem.png500px|thumb|]]&lt;br /&gt;
&lt;br /&gt;
=== oublie pas les images ===&lt;br /&gt;
=== oublie pas les images ===&lt;br /&gt;
=== oublie pas les images ===&lt;br /&gt;
=== oublie pas les images ===&lt;br /&gt;
&lt;br /&gt;
== Réalisation de la partie mécanique du véhicule ==&lt;br /&gt;
&lt;br /&gt;
Pour la partie mécanique de Quireekoo on a choisi de le faire sur inkscape afin de pouvoir effectuer une découpe laser. Le robot est composé de deux plaques de plexiglas, une pour le châssis où il y a les servos moteur, la bille et le bloc de pile, et une pour placer le sonar, le circuit imprimée, les Tsop et la sonde de hall. &lt;br /&gt;
&lt;br /&gt;
Voici à quoi ressemble la partie du bas sur inkscape : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Partie bas.jpg|700px|]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour la partie du haut c'était un peu plus compliqué car il fallait trouver comment placer les tsop, la sonde de hall et le sonar. Pour pouvoir fixer ceux-ci on a choisi de faire des trous en forme de rectangles avec une taille égale à la taille des pins de chaque capteurs différents. Après il fallait aussi mettre les trous pour fixer le circuit imprimé au même endroit que ceux qui se trouve sur celui-ci. Pour ce faire, on a utilisé le fichier .svg donné par Fritzing. On a également mis des trous en forme de rectangle sur les côtés pour pouvoir laisser passer les fils.&lt;br /&gt;
&lt;br /&gt;
Voici à quoi ressemble la partie du haut sur inkscape :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Partie haut.png|700px|]]&lt;br /&gt;
&lt;br /&gt;
Pour finir il nous restait les roues à faire. On a opté pour garder les roues données avec les servos moteurs en y rajoutant des partie en plexiglas au pistolet à colle pour rendre celles-ci plus grandes.&lt;br /&gt;
&lt;br /&gt;
Voici à quoi cela ressemble sur inkscape : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Roue.png|200px|]]&lt;br /&gt;
&lt;br /&gt;
Le problème avec cette solution c'est que les roues ne sont pas adhérentes. De ce fait là, on a ajouté une partie d'élastique autour avec de la colle glue.&lt;br /&gt;
&lt;br /&gt;
Voici a quoi le robot ressemble à la fin :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Quireekoo.jpg|200px|]]&lt;br /&gt;
&lt;br /&gt;
== Réalisation du code Arduino ==&lt;br /&gt;
&lt;br /&gt;
Cette partie fut l'une des parties des plus fastidieuses. Elle nous a pris le plus de temps et différents problèmes ont été rencontrés et seront décrit.&lt;br /&gt;
&lt;br /&gt;
=== Structure du code ===&lt;/div&gt;</summary>
		<author><name>Dtillaux</name></author>	</entry>

	<entry>
		<id>https://peip-ima.plil.fr/mediawiki/index.php?title=Binome2017-9&amp;diff=9201</id>
		<title>Binome2017-9</title>
		<link rel="alternate" type="text/html" href="https://peip-ima.plil.fr/mediawiki/index.php?title=Binome2017-9&amp;diff=9201"/>
				<updated>2018-04-16T07:42:01Z</updated>
		
		<summary type="html">&lt;p&gt;Dtillaux : /* Réalisation de PCB */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Binôme 9 saison 8: Raphaël Bonvalet, Damien Tillaux.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Projet Quireekoo =&lt;br /&gt;
&lt;br /&gt;
Le but du projet Quireekoo est de créer un robot communiquant avec d'autre via infra-rouge. Ce projet à eu lieux lors des bureaux d'étude de PEIP en IMA au S4 2018 de notre cursus pour devenir ingénieur. Voici la transcription phonétique de Quireekoo: /Kirikou/.&lt;br /&gt;
&lt;br /&gt;
= Cahier des charges =&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Kiki.jpg|middle]]&lt;br /&gt;
&lt;br /&gt;
Quireekoo sera un robot fait de A à Z. Le circuit imprimé sera totalement revu et sera guidé grâce à une ATMEGA-328. Le physique sera totalement design par nous même et son programme sera totalement autonome.&lt;br /&gt;
&lt;br /&gt;
Quireekoo étant petit et vaillant est un véhicule de petite taille. A la défaut de jambe, Quireekoo ce déplace avec 2 servos moteurs continue. A la place des yeux, un sonar pour éviter ses obstacles et ne pas trébucher. Pour ses oreilles nous avons prévu 2 Tsop38238 pour pouvoir repérer et fuir ses ennemis.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Réalisation du projet =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Voici les différentes étapes par lesquels nous sommes passer lors de la création de Quireekoo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Réalisation de PCB ==&lt;br /&gt;
&lt;br /&gt;
=== Idée principale ===&lt;br /&gt;
&lt;br /&gt;
Nous voulions refaire nous même le PCB de Quireekoo mais nous n'avions pratiquement aucune base sur comment créer un circuit imprimé pour ce genre de projet. Du coups nous avons pris comme modèle, le modèle donnée sur la page principale du projet. ([https://peip-ima.plil.fr/mediawiki/index.php/BE_2017-2018 BE 2017-2018])&lt;br /&gt;
&lt;br /&gt;
Voici le schématique sur lequel nous nous sommes basé.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:RobotPCB schem.png|500px|thumb||left|Schématique original]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Notre PCB ===&lt;br /&gt;
&lt;br /&gt;
Notre PCB a été réalisé sur Fritzing. Nous avons créer ce circuit imprimé à notre image pour notre véhicule. Nous avons enlevé le driver de moteur et les sorties moteurs car nous voulions un robot de petite taille. Donc le moyen de déplacement choisi a alors été le servo-moteur. Pour les réceptions infra-rouge nous n'avons prévu que deux sorties pour des Tsop pour pouvoir laisser un plus grande chance au chasseur de ne pas être repéré, pour une approche plus vrai que nature. Pour savoir si un chasseur nous a attrapé, nous utilisons une sonde de Hall.&lt;br /&gt;
&lt;br /&gt;
De plus, en cas de problème nous avons créé toutes les sorties du microcontrôleur. Si un problème apparaît sur une des pins utilisées, nous pourrons la relocaliser sur une autre sortie.&lt;br /&gt;
&lt;br /&gt;
Un objectif supplémentaire était de réaliser un PCB le plus petit possible pour que le véhicule le soit aussi. Ce fut presque un succès, la carte est d'une taille environ de 5cm*5cm. Elle aurait pu être encore plus petite avec plus de travail mais nous ne pouvions pas nous le permettre si nous voulions tout faire.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Voici le schématique et le PCB de Quireekoo.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Quireekoo schem.png500px|thumb||left|Schématique de Quireekoo|]]&lt;br /&gt;
&lt;br /&gt;
=== oublie pas les images ===&lt;br /&gt;
=== oublie pas les images ===&lt;br /&gt;
=== oublie pas les images ===&lt;br /&gt;
=== oublie pas les images ===&lt;br /&gt;
&lt;br /&gt;
== Réalisation de la partie mécanique du véhicule ==&lt;br /&gt;
&lt;br /&gt;
Pour la partie mécanique de Quireekoo on a choisi de le faire sur inkscape afin de pouvoir effectuer une découpe laser. Le robot est composé de deux plaques de plexiglas, une pour le châssis où il y a les servos moteur, la bille et le bloc de pile, et une pour placer le sonar, le circuit imprimée, les Tsop et la sonde de hall. &lt;br /&gt;
&lt;br /&gt;
Voici à quoi ressemble la partie du bas sur inkscape : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Partie bas.jpg|700px|]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour la partie du haut c'était un peu plus compliqué car il fallait trouver comment placer les tsop, la sonde de hall et le sonar. Pour pouvoir fixer ceux-ci on a choisi de faire des trous en forme de rectangles avec une taille égale à la taille des pins de chaque capteurs différents. Après il fallait aussi mettre les trous pour fixer le circuit imprimé au même endroit que ceux qui se trouve sur celui-ci. Pour ce faire, on a utilisé le fichier .svg donné par Fritzing. On a également mis des trous en forme de rectangle sur les côtés pour pouvoir laisser passer les fils.&lt;br /&gt;
&lt;br /&gt;
Voici à quoi ressemble la partie du haut sur inkscape :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Partie haut.png|700px|]]&lt;br /&gt;
&lt;br /&gt;
Pour finir il nous restait les roues à faire. On a opté pour garder les roues données avec les servos moteurs en y rajoutant des partie en plexiglas au pistolet à colle pour rendre celles-ci plus grandes.&lt;br /&gt;
&lt;br /&gt;
Voici à quoi cela ressemble sur inkscape : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Roue.png|200px|]]&lt;br /&gt;
&lt;br /&gt;
Le problème avec cette solution c'est que les roues ne sont pas adhérentes. De ce fait là, on a ajouté une partie d'élastique autour avec de la colle glue.&lt;br /&gt;
&lt;br /&gt;
Voici a quoi le robot ressemble à la fin :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Quireekoo.jpg|200px|]]&lt;br /&gt;
&lt;br /&gt;
== Réalisation du code Arduino ==&lt;br /&gt;
&lt;br /&gt;
Cette partie fut l'une des parties des plus fastidieuses. Elle nous a pris le plus de temps et différents problèmes ont été rencontrés et seront décrit.&lt;br /&gt;
&lt;br /&gt;
=== Structure du code ===&lt;/div&gt;</summary>
		<author><name>Dtillaux</name></author>	</entry>

	<entry>
		<id>https://peip-ima.plil.fr/mediawiki/index.php?title=Binome2017-9&amp;diff=9200</id>
		<title>Binome2017-9</title>
		<link rel="alternate" type="text/html" href="https://peip-ima.plil.fr/mediawiki/index.php?title=Binome2017-9&amp;diff=9200"/>
				<updated>2018-04-16T07:40:07Z</updated>
		
		<summary type="html">&lt;p&gt;Dtillaux : /* Notre PCB */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Binôme 9 saison 8: Raphaël Bonvalet, Damien Tillaux.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Projet Quireekoo =&lt;br /&gt;
&lt;br /&gt;
Le but du projet Quireekoo est de créer un robot communiquant avec d'autre via infra-rouge. Ce projet à eu lieux lors des bureaux d'étude de PEIP en IMA au S4 2018 de notre cursus pour devenir ingénieur. Voici la transcription phonétique de Quireekoo: /Kirikou/.&lt;br /&gt;
&lt;br /&gt;
= Cahier des charges =&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Kiki.jpg|middle]]&lt;br /&gt;
&lt;br /&gt;
Quireekoo sera un robot fait de A à Z. Le circuit imprimé sera totalement revu et sera guidé grâce à une ATMEGA-328. Le physique sera totalement design par nous même et son programme sera totalement autonome.&lt;br /&gt;
&lt;br /&gt;
Quireekoo étant petit et vaillant est un véhicule de petite taille. A la défaut de jambe, Quireekoo ce déplace avec 2 servos moteurs continue. A la place des yeux, un sonar pour éviter ses obstacles et ne pas trébucher. Pour ses oreilles nous avons prévu 2 Tsop38238 pour pouvoir repérer et fuir ses ennemis.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Réalisation du projet =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Voici les différentes étapes par lesquels nous sommes passer lors de la création de Quireekoo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Réalisation de PCB ==&lt;br /&gt;
&lt;br /&gt;
=== Idée principale ===&lt;br /&gt;
&lt;br /&gt;
Nous voulions refaire nous même le PCB de Quireekoo mais nous n'avions pratiquement aucune base sur comment créer un circuit imprimé pour ce genre de projet. Du coups nous avons pris comme modèle, le modèle donnée sur la page principale du projet. ([https://peip-ima.plil.fr/mediawiki/index.php/BE_2017-2018 BE 2017-2018])&lt;br /&gt;
&lt;br /&gt;
Voici le schématique sur lequel nous nous sommes basé.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:RobotPCB schem.png|500px|thumb||left|Schématique original]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Notre PCB ===&lt;br /&gt;
&lt;br /&gt;
Notre PCB a été réalisé sur Fritzing. Nous avons créer ce circuit imprimé à notre image pour notre véhicule. Nous avons enlevé le driver de moteur et les sorties moteurs car nous voulions un robot de petite taille. Donc le moyen de déplacement choisi a alors été le servo-moteur. Pour les réceptions infra-rouge nous n'avons prévu que deux sorties pour des Tsop pour pouvoir laisser un plus grande chance au chasseur de ne pas être repéré, pour une approche plus vrai que nature. Pour savoir si un chasseur nous a attrapé, nous utilisons une sonde de Hall.&lt;br /&gt;
&lt;br /&gt;
De plus, en cas de problème nous avons créé toutes les sorties du microcontrôleur. Si un problème apparaît sur une des pins utilisées, nous pourrons la relocaliser sur une autre sortie.&lt;br /&gt;
&lt;br /&gt;
Un objectif supplémentaire était de réaliser un PCB le plus petit possible pour que le véhicule le soit aussi. Ce fut presque un succès, la carte est d'une taille environ de 5cm*5cm. Elle aurait pu être encore plus petite avec plus de travail mais nous ne pouvions pas nous le permettre si nous voulions tout faire.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Voici le schématique et le PCB de Quireekoo.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Quireekoo schem.png]]&lt;br /&gt;
&lt;br /&gt;
=== oublie pas les images ===&lt;br /&gt;
=== oublie pas les images ===&lt;br /&gt;
=== oublie pas les images ===&lt;br /&gt;
=== oublie pas les images ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Réalisation de la partie mécanique du véhicule ==&lt;br /&gt;
&lt;br /&gt;
Pour la partie mécanique de Quireekoo on a choisi de le faire sur inkscape afin de pouvoir effectuer une découpe laser. Le robot est composé de deux plaques de plexiglas, une pour le châssis où il y a les servos moteur, la bille et le bloc de pile, et une pour placer le sonar, le circuit imprimée, les Tsop et la sonde de hall. &lt;br /&gt;
&lt;br /&gt;
Voici à quoi ressemble la partie du bas sur inkscape : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Partie bas.jpg|700px|]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour la partie du haut c'était un peu plus compliqué car il fallait trouver comment placer les tsop, la sonde de hall et le sonar. Pour pouvoir fixer ceux-ci on a choisi de faire des trous en forme de rectangles avec une taille égale à la taille des pins de chaque capteurs différents. Après il fallait aussi mettre les trous pour fixer le circuit imprimé au même endroit que ceux qui se trouve sur celui-ci. Pour ce faire, on a utilisé le fichier .svg donné par Fritzing. On a également mis des trous en forme de rectangle sur les côtés pour pouvoir laisser passer les fils.&lt;br /&gt;
&lt;br /&gt;
Voici à quoi ressemble la partie du haut sur inkscape :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Partie haut.png|700px|]]&lt;br /&gt;
&lt;br /&gt;
Pour finir il nous restait les roues à faire. On a opté pour garder les roues données avec les servos moteurs en y rajoutant des partie en plexiglas au pistolet à colle pour rendre celles-ci plus grandes.&lt;br /&gt;
&lt;br /&gt;
Voici à quoi cela ressemble sur inkscape : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Roue.png|200px|]]&lt;br /&gt;
&lt;br /&gt;
Le problème avec cette solution c'est que les roues ne sont pas adhérentes. De ce fait là, on a ajouté une partie d'élastique autour avec de la colle glue.&lt;br /&gt;
&lt;br /&gt;
Voici a quoi le robot ressemble à la fin :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Quireekoo.jpg|200px|]]&lt;br /&gt;
&lt;br /&gt;
== Réalisation du code Arduino ==&lt;br /&gt;
&lt;br /&gt;
Cette partie fut l'une des parties des plus fastidieuses. Elle nous a pris le plus de temps et différents problèmes ont été rencontrés et seront décrit.&lt;br /&gt;
&lt;br /&gt;
=== Structure du code ===&lt;/div&gt;</summary>
		<author><name>Dtillaux</name></author>	</entry>

	<entry>
		<id>https://peip-ima.plil.fr/mediawiki/index.php?title=Fichier:Quireekoo_schem.png&amp;diff=9198</id>
		<title>Fichier:Quireekoo schem.png</title>
		<link rel="alternate" type="text/html" href="https://peip-ima.plil.fr/mediawiki/index.php?title=Fichier:Quireekoo_schem.png&amp;diff=9198"/>
				<updated>2018-04-16T07:39:21Z</updated>
		
		<summary type="html">&lt;p&gt;Dtillaux : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Dtillaux</name></author>	</entry>

	<entry>
		<id>https://peip-ima.plil.fr/mediawiki/index.php?title=Binome2017-9&amp;diff=8921</id>
		<title>Binome2017-9</title>
		<link rel="alternate" type="text/html" href="https://peip-ima.plil.fr/mediawiki/index.php?title=Binome2017-9&amp;diff=8921"/>
				<updated>2018-03-08T17:51:23Z</updated>
		
		<summary type="html">&lt;p&gt;Dtillaux : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Binôme 9 saison 8: Raphaël Bonvalet, Damien Tillaux.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Projet Quireekoo =&lt;br /&gt;
&lt;br /&gt;
Le but du projet Quireekoo est de créer un robot communiquant avec d'autre via infra-rouge. Ce projet à eu lieux lors des bureaux d'étude de PEIP en IMA au S4 2018 de notre cursus pour devenir ingénieur. Voici la transcription phonétique de Quireekoo: /Kirikou/.&lt;br /&gt;
&lt;br /&gt;
= Cahier des charges =&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Kiki.jpg|middle]]&lt;br /&gt;
&lt;br /&gt;
Quireekoo sera un robot fait de A à Z. Le circuit imprimé sera totalement revu et sera guidé grâce à une ATMEGA-328. Le physique sera totalement design par nous même et son programme sera totalement autonome.&lt;br /&gt;
&lt;br /&gt;
Quireekoo étant petit et vaillant est un véhicule de petite taille. A la défaut de jambe, Quireekoo ce déplace avec 2 servos moteurs continue. A la place des yeux, un sonar pour éviter ses obstacles et ne pas trébucher. Pour ses oreilles nous avons prévu 2 Tsop38238 pour pouvoir repérer et fuir ses ennemis.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Réalisation du projet =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Voici les différentes étapes par lesquels nous sommes passer lors de la création de Quireekoo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Réalisation de PCB ==&lt;br /&gt;
&lt;br /&gt;
=== Idée principale ===&lt;br /&gt;
&lt;br /&gt;
Nous voulions refaire nous même le PCB de Quireekoo mais nous n'avions pratiquement aucune base sur comment créer un circuit imprimé pour ce genre de projet. Du coups nous avons pris comme modèle, le modèle donnée sur la page principale du projet. ([https://peip-ima.plil.fr/mediawiki/index.php/BE_2017-2018 BE 2017-2018])&lt;br /&gt;
&lt;br /&gt;
Voici le schématique sur lequel nous nous sommes basé.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:RobotPCB schem.png|500px|thumb||left|Schématique original]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Notre PCB ===&lt;br /&gt;
&lt;br /&gt;
Notre PCB a été réaliser sur Fritzing. Nous avons créer ce circuit imprimer à notre image pour notre véhicule. Nous avons enlevé le driver de moteur et les sortie moteur car nous voulions un robot de petite taille. Donc le moyen de déplacement choisi a alors été le servo-moteur. Pour les réceptions infra-rouge nous n'avons prévu que deux sortie pour des Tsop pour pouvoir laisser un plus grande chance au chasseur de ne pas être repéré, pour une  approche plus vrai que nature. Pour savoir si un chasseur nous a attrapé, nous utilisons une sonde de Hall.&lt;br /&gt;
&lt;br /&gt;
De plus, en cas de problème nous avons créé toutes les sorties du microcontrôleur. Si un problème apparaît sur une des pins utilisées, nous pourrons la relocaliser sur une autre sortie.&lt;br /&gt;
&lt;br /&gt;
Un objectif supplémentaire était de réaliser un PCB le plus petit possible pour que le véhicule le soit aussi. Ce fut presque un succès, la carte est d'une taille environ de 5cm*5cm. Elle aurait pu être encore plus petite avec plus de travail mais nous ne pouvions pas nous le permettre si nous voulions tout faire.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Voici le schématique et le PCB de Quireekoo.&lt;br /&gt;
&lt;br /&gt;
=== oublie pas les images ===&lt;br /&gt;
=== oublie pas les images ===&lt;br /&gt;
=== oublie pas les images ===&lt;br /&gt;
=== oublie pas les images ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Réalisation de la partie mécanique du véhicule ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Réalisation du code Arduino ==&lt;br /&gt;
&lt;br /&gt;
Cette partie fut l'une des parties des plus fastidieuses. Elle nous a pris le plus de temps et différent problème ont été rencontré et seront décrit.&lt;br /&gt;
&lt;br /&gt;
=== Structure du code ===&lt;/div&gt;</summary>
		<author><name>Dtillaux</name></author>	</entry>

	<entry>
		<id>https://peip-ima.plil.fr/mediawiki/index.php?title=Binome2017-9&amp;diff=8917</id>
		<title>Binome2017-9</title>
		<link rel="alternate" type="text/html" href="https://peip-ima.plil.fr/mediawiki/index.php?title=Binome2017-9&amp;diff=8917"/>
				<updated>2018-03-08T17:27:55Z</updated>
		
		<summary type="html">&lt;p&gt;Dtillaux : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Binôme 9 saison 8: Raphaël Bonvalet, Damien Tillaux.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Projet Quireekoo =&lt;br /&gt;
&lt;br /&gt;
Le but du projet Quireekoo est de créer un robot communiquant avec d'autre via infra-rouge. Ce projet à eu lieux lors des bureaux d'étude de PEIP en IMA au S4 2018 de notre cursus pour devenir ingénieur. Voici la transcription phonétique de Quireekoo: /Kirikou/.&lt;br /&gt;
&lt;br /&gt;
= Cahier des charges =&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Kiki.jpg|middle]]&lt;br /&gt;
&lt;br /&gt;
Quireekoo sera un robot fait de A à Z. Le circuit imprimé sera totalement revu et sera guidé grâce à une ATMEGA-328. Le physique sera totalement design par nous même et son programme sera totalement autonome.&lt;br /&gt;
&lt;br /&gt;
Quireekoo étant petit et vaillant est un véhicule de petite taille. A la défaut de jambe, Quireekoo ce déplace avec 2 servos moteurs continue. A la place des yeux, un sonar pour éviter ses obstacles et ne pas trébucher. Pour ses oreilles nous avons prévu 2 Tsop38238 pour pouvoir repérer et fuir ses ennemis.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Réalisation du projet =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Voici les différentes étapes par lesquels nous sommes passer lors de la création de Quireekoo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Réalisation de PCB ==&lt;br /&gt;
&lt;br /&gt;
=== Idée principale ===&lt;br /&gt;
&lt;br /&gt;
Nous voulions refaire nous même le PCB de Quireekoo mais nous n'avions pratiquement aucune base sur comment créer un circuit imprimé pour ce genre de projet. Du coups nous avons pris comme modèle, le modèle donnée sur la page principale du projet. ([https://peip-ima.plil.fr/mediawiki/index.php/BE_2017-2018 BE 2017-2018])&lt;br /&gt;
&lt;br /&gt;
Voici le schématique sur lequel nous nous sommes basé.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:RobotPCB schem.png|500px|thumb||left|Schématique original]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Notre PCB ===&lt;br /&gt;
&lt;br /&gt;
Notre PCB a été réaliser sur Fritzing. Nous avons créer ce circuit imprimer à notre image pour notre véhicule. Nous avons enlevé le driver de moteur et les sortie moteur car nous voulions un robot de petite taille. Donc le moyen de déplacement choisi a alors été le servo-moteur. Pour les réceptions infra-rouge nous n'avons prévu que deux sortie pour des Tsop pour pouvoir laisser un plus grande chance au chasseur de ne pas être repéré, pour une  approche plus vrai que nature. Pour savoir si un chasseur nous a attrapé, nous utilisons une sonde de Hall.&lt;br /&gt;
&lt;br /&gt;
De plus, en cas de problème nous avons créé toutes les sorties du microcontrôleur. Si un problème apparaît sur une des pins utilisées, nous pourrons la relocaliser sur une autre sortie.&lt;br /&gt;
&lt;br /&gt;
Un objectif supplémentaire était de réaliser un PCB le plus petit possible pour que le véhicule le soit aussi. Ce fut presque un succès, la carte est d'une taille environ de 5cm*5cm. Elle aurait pu être encore plus petite avec plus de travail mais nous ne pouvions pas nous le permettre si nous voulions tout faire.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Voici le schématique et le PCB de Quireekoo.&lt;br /&gt;
&lt;br /&gt;
=== oublie pas les images ===&lt;br /&gt;
=== oublie pas les images ===&lt;br /&gt;
=== oublie pas les images ===&lt;br /&gt;
=== oublie pas les images ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Réalisation de la partie mécanique du véhicule ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Réalisation du code Arduino ==&lt;br /&gt;
&lt;br /&gt;
Cette partie fut l'une des parties des plus fastidieuses. Elle nous a pris le plus de temps et différent problème ont été rencontré et seront décrit.&lt;br /&gt;
&lt;br /&gt;
= Structure du code =&lt;/div&gt;</summary>
		<author><name>Dtillaux</name></author>	</entry>

	<entry>
		<id>https://peip-ima.plil.fr/mediawiki/index.php?title=Binome2017-9&amp;diff=8916</id>
		<title>Binome2017-9</title>
		<link rel="alternate" type="text/html" href="https://peip-ima.plil.fr/mediawiki/index.php?title=Binome2017-9&amp;diff=8916"/>
				<updated>2018-03-08T17:24:40Z</updated>
		
		<summary type="html">&lt;p&gt;Dtillaux : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Binôme 9 saison 8: Raphaël Bonvalet, Damien Tillaux.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Projet Quireekoo =&lt;br /&gt;
&lt;br /&gt;
Le but du projet Quireekoo est de créer un robot communiquant avec d'autre via infra-rouge. Ce projet à eu lieux lors des bureaux d'étude de PEIP en IMA au S4 2018 de notre cursus pour devenir ingénieur. Voici la transcription phonétique de Quireekoo: /Kirikou/.&lt;br /&gt;
&lt;br /&gt;
= Cahier des charges =&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Kiki.jpg|middle]]&lt;br /&gt;
&lt;br /&gt;
Quireekoo sera un robot fait de A à Z. Le circuit imprimé sera totalement revu et sera guidé grâce à une ATMEGA-328. Le physique sera totalement design par nous même et son programme sera totalement autonome.&lt;br /&gt;
&lt;br /&gt;
Quireekoo étant petit et vaillant est un véhicule de petite taille. A la défaut de jambe, Quireekoo ce déplace avec 2 servos moteurs continue. A la place des yeux, un sonar pour éviter ses obstacles et ne pas trébucher. Pour ses oreilles nous avons prévu 2 Tsop38238 pour pouvoir repérer et fuir ses ennemis.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Réalisation du projet =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Voici les différentes étapes par lesquels nous sommes passer lors de la création de Quireekoo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Réalisation de PCB ==&lt;br /&gt;
&lt;br /&gt;
=== Idée principale ===&lt;br /&gt;
&lt;br /&gt;
Nous voulions refaire nous même le PCB de Quireekoo mais nous n'avions pratiquement aucune base sur comment créer un circuit imprimé pour ce genre de projet. Du coups nous avons pris comme modèle, le modèle donnée sur la page principale du projet. ([https://peip-ima.plil.fr/mediawiki/index.php/BE_2017-2018 BE 2017-2018])&lt;br /&gt;
&lt;br /&gt;
Voici le schématique sur lequel nous nous sommes basé.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:RobotPCB schem.png|500px|thumb||left|Schématique original]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Notre PCB ===&lt;br /&gt;
&lt;br /&gt;
Notre PCB a été réaliser sur Fritzing. Nous avons créer ce circuit imprimer à notre image pour notre véhicule. Nous avons enlevé le driver de moteur et les sortie moteur car nous voulions un robot de petite taille. Donc le moyen de déplacement choisi a alors été le servo-moteur. Pour les réceptions infra-rouge nous n'avons prévu que deux sortie pour des Tsop pour pouvoir laisser un plus grande chance au chasseur de ne pas être repéré, pour une  approche plus vrai que nature. Pour savoir si un chasseur nous a attrapé, nous utilisons une sonde de Hall.&lt;br /&gt;
&lt;br /&gt;
De plus, en cas de problème nous avons créé toutes les sorties du microcontrôleur. Si un problème apparaît sur une des pins utilisées, nous pourrons la relocaliser sur une autre sortie.&lt;br /&gt;
&lt;br /&gt;
Un objectif supplémentaire était de réaliser un PCB le plus petit possible pour que le véhicule le soit aussi. Ce fut presque un succès, la carte est d'une taille environ de 5cm*5cm. Elle aurait pu être encore plus petite avec plus de travail mais nous ne pouvions pas nous le permettre si nous voulions tout faire.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Voici le schématique et le PCB de Quireekoo.&lt;br /&gt;
&lt;br /&gt;
=== oublie pas les images ===&lt;br /&gt;
=== oublie pas les images ===&lt;br /&gt;
=== oublie pas les images ===&lt;br /&gt;
=== oublie pas les images ===&lt;/div&gt;</summary>
		<author><name>Dtillaux</name></author>	</entry>

	<entry>
		<id>https://peip-ima.plil.fr/mediawiki/index.php?title=Binome2017-9&amp;diff=8915</id>
		<title>Binome2017-9</title>
		<link rel="alternate" type="text/html" href="https://peip-ima.plil.fr/mediawiki/index.php?title=Binome2017-9&amp;diff=8915"/>
				<updated>2018-03-08T17:24:08Z</updated>
		
		<summary type="html">&lt;p&gt;Dtillaux : /* Notre PCB */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Binôme 9 saison 8: Raphaël Bonvalet, Damien Tillaux.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Projet Quireekoo =&lt;br /&gt;
&lt;br /&gt;
Le but du projet Quireekoo est de créer un robot communiquant avec d'autre via infra-rouge. Ce projet à eu lieux lors des bureaux d'étude de PEIP en IMA au S4 2018 de notre cursus pour devenir ingénieur. Voici la transcription phonétique de Quireekoo: /Kirikou/.&lt;br /&gt;
&lt;br /&gt;
= Cahier des charges =&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Kiki.jpg|middle]]&lt;br /&gt;
&lt;br /&gt;
Quireekoo sera un robot fait de A à Z. Le circuit imprimé sera totalement revu et sera guidé grâce à une ATMEGA-328. Le physique sera totalement design par nous même et son programme sera totalement autonome.&lt;br /&gt;
&lt;br /&gt;
Quireekoo étant petit et vaillant est un véhicule de petite taille. A la défaut de jambe, Quireekoo ce déplace avec 2 servos moteurs continue. A la place des yeux, un sonar pour éviter ses obstacles et ne pas trébucher. Pour ses oreilles nous avons prévu 2 Tsop38238 pour pouvoir repérer et fuir ses ennemis.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Réalisation du projet =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Voici les différentes étapes par lesquels nous sommes passer lors de la création de Quireekoo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Réalisation de PCB ==&lt;br /&gt;
&lt;br /&gt;
=== Idée principale ===&lt;br /&gt;
&lt;br /&gt;
Nous voulions refaire nous même le PCB de Quireekoo mais nous n'avions pratiquement aucune base sur comment créer un circuit imprimé pour ce genre de projet. Du coups nous avons pris comme modèle, le modèle donnée sur la page principale du projet. ([https://peip-ima.plil.fr/mediawiki/index.php/BE_2017-2018 BE 2017-2018])&lt;br /&gt;
&lt;br /&gt;
Voici le schématique sur lequel nous nous sommes basé.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:RobotPCB schem.png|500px|thumb||left|Schématique original]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Notre PCB ===&lt;br /&gt;
&lt;br /&gt;
Notre PCB a été réaliser sur Fritzing. Nous avons créer ce circuit imprimer à notre image pour notre véhicule. Nous avons enlevé le driver de moteur et les sortie moteur car nous voulions un robot de petite taille. Donc le moyen de déplacement choisi a alors été le servo-moteur. Pour les réceptions infra-rouge nous n'avons prévu que deux sortie pour des Tsop pour pouvoir laisser un plus grande chance au chasseur de ne pas être repéré, pour une  approche plus vrai que nature. Pour savoir si un chasseur nous a attrapé, nous utilisons une sonde de Hall.&lt;br /&gt;
&lt;br /&gt;
De plus, en cas de problème nous avons créé toutes les sorties du microcontrôleur. Si un problème apparaît sur une des pins utilisées, nous pourrons la relocaliser sur une autre sortie.&lt;br /&gt;
&lt;br /&gt;
Un objectif supplémentaire était de réaliser un PCB le plus petit possible pour que le véhicule le soit aussi. Ce fut presque un succès, la carte est d'une taille environ de 5cm*5cm. Elle aurait pu être encore plus petite avec plus de travail mais nous ne pouvions pas nous le permettre si nous voulions tout faire.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Voici le schématique et le PCB de Quireekoo.&lt;br /&gt;
&lt;br /&gt;
== oublie pas les images ==&lt;br /&gt;
&lt;br /&gt;
== &lt;br /&gt;
== Texte du titre ==&lt;br /&gt;
&lt;br /&gt;
== &lt;br /&gt;
== Texte du titre ==&lt;br /&gt;
 ==&lt;br /&gt;
 ==&lt;br /&gt;
 ==&lt;/div&gt;</summary>
		<author><name>Dtillaux</name></author>	</entry>

	<entry>
		<id>https://peip-ima.plil.fr/mediawiki/index.php?title=Binome2017-9&amp;diff=8914</id>
		<title>Binome2017-9</title>
		<link rel="alternate" type="text/html" href="https://peip-ima.plil.fr/mediawiki/index.php?title=Binome2017-9&amp;diff=8914"/>
				<updated>2018-03-08T17:23:51Z</updated>
		
		<summary type="html">&lt;p&gt;Dtillaux : /* Réalisation de PCB */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Binôme 9 saison 8: Raphaël Bonvalet, Damien Tillaux.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Projet Quireekoo =&lt;br /&gt;
&lt;br /&gt;
Le but du projet Quireekoo est de créer un robot communiquant avec d'autre via infra-rouge. Ce projet à eu lieux lors des bureaux d'étude de PEIP en IMA au S4 2018 de notre cursus pour devenir ingénieur. Voici la transcription phonétique de Quireekoo: /Kirikou/.&lt;br /&gt;
&lt;br /&gt;
= Cahier des charges =&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Kiki.jpg|middle]]&lt;br /&gt;
&lt;br /&gt;
Quireekoo sera un robot fait de A à Z. Le circuit imprimé sera totalement revu et sera guidé grâce à une ATMEGA-328. Le physique sera totalement design par nous même et son programme sera totalement autonome.&lt;br /&gt;
&lt;br /&gt;
Quireekoo étant petit et vaillant est un véhicule de petite taille. A la défaut de jambe, Quireekoo ce déplace avec 2 servos moteurs continue. A la place des yeux, un sonar pour éviter ses obstacles et ne pas trébucher. Pour ses oreilles nous avons prévu 2 Tsop38238 pour pouvoir repérer et fuir ses ennemis.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Réalisation du projet =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Voici les différentes étapes par lesquels nous sommes passer lors de la création de Quireekoo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Réalisation de PCB ==&lt;br /&gt;
&lt;br /&gt;
=== Idée principale ===&lt;br /&gt;
&lt;br /&gt;
Nous voulions refaire nous même le PCB de Quireekoo mais nous n'avions pratiquement aucune base sur comment créer un circuit imprimé pour ce genre de projet. Du coups nous avons pris comme modèle, le modèle donnée sur la page principale du projet. ([https://peip-ima.plil.fr/mediawiki/index.php/BE_2017-2018 BE 2017-2018])&lt;br /&gt;
&lt;br /&gt;
Voici le schématique sur lequel nous nous sommes basé.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:RobotPCB schem.png|500px|thumb||left|Schématique original]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Notre PCB ===&lt;br /&gt;
&lt;br /&gt;
Notre PCB a été réaliser sur Fritzing. Nous avons créer ce circuit imprimer à notre image pour notre véhicule. Nous avons enlevé le driver de moteur et les sortie moteur car nous voulions un robot de petite taille. Donc le moyen de déplacement choisi a alors été le servo-moteur. Pour les réceptions infra-rouge nous n'avons prévu que deux sortie pour des Tsop pour pouvoir laisser un plus grande chance au chasseur de ne pas être repéré, pour une  approche plus vrai que nature. Pour savoir si un chasseur nous a attrapé, nous utilisons une sonde de Hall.&lt;br /&gt;
&lt;br /&gt;
De plus, en cas de problème nous avons créé toutes les sorties du microcontrôleur. Si un problème apparaît sur une des pins utilisées, nous pourrons la relocaliser sur une autre sortie.&lt;br /&gt;
&lt;br /&gt;
Un objectif supplémentaire était de réaliser un PCB le plus petit possible pour que le véhicule le soit aussi. Ce fut presque un succès, la carte est d'une taille environ de 5cm*5cm. Elle aurait pu être encore plus petite avec plus de travail mais nous ne pouvions pas nous le permettre si nous voulions tout faire.&lt;br /&gt;
&lt;br /&gt;
Voici le schématique et le PCB de Quireekoo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &lt;br /&gt;
== oublie pas les images ==&lt;br /&gt;
&lt;br /&gt;
== &lt;br /&gt;
== Texte du titre ==&lt;br /&gt;
&lt;br /&gt;
== &lt;br /&gt;
== Texte du titre ==&lt;br /&gt;
 ==&lt;br /&gt;
 ==&lt;br /&gt;
 ==&lt;/div&gt;</summary>
		<author><name>Dtillaux</name></author>	</entry>

	<entry>
		<id>https://peip-ima.plil.fr/mediawiki/index.php?title=Binome2017-9&amp;diff=8913</id>
		<title>Binome2017-9</title>
		<link rel="alternate" type="text/html" href="https://peip-ima.plil.fr/mediawiki/index.php?title=Binome2017-9&amp;diff=8913"/>
				<updated>2018-03-08T17:14:07Z</updated>
		
		<summary type="html">&lt;p&gt;Dtillaux : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Binôme 9 saison 8: Raphaël Bonvalet, Damien Tillaux.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Projet Quireekoo =&lt;br /&gt;
&lt;br /&gt;
Le but du projet Quireekoo est de créer un robot communiquant avec d'autre via infra-rouge. Ce projet à eu lieux lors des bureaux d'étude de PEIP en IMA au S4 2018 de notre cursus pour devenir ingénieur. Voici la transcription phonétique de Quireekoo: /Kirikou/.&lt;br /&gt;
&lt;br /&gt;
= Cahier des charges =&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Kiki.jpg|middle]]&lt;br /&gt;
&lt;br /&gt;
Quireekoo sera un robot fait de A à Z. Le circuit imprimé sera totalement revu et sera guidé grâce à une ATMEGA-328. Le physique sera totalement design par nous même et son programme sera totalement autonome.&lt;br /&gt;
&lt;br /&gt;
Quireekoo étant petit et vaillant est un véhicule de petite taille. A la défaut de jambe, Quireekoo ce déplace avec 2 servos moteurs continue. A la place des yeux, un sonar pour éviter ses obstacles et ne pas trébucher. Pour ses oreilles nous avons prévu 2 Tsop38238 pour pouvoir repérer et fuir ses ennemis.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Réalisation du projet =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Voici les différentes étapes par lesquels nous sommes passer lors de la création de Quireekoo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Réalisation de PCB ==&lt;br /&gt;
&lt;br /&gt;
=== Idée principale ===&lt;br /&gt;
&lt;br /&gt;
Nous voulions refaire nous même le PCB de Quireekoo mais nous n'avions pratiquement aucune base sur comment créer un circuit imprimé pour ce genre de projet. Du coups nous avons pris comme modèle, le modèle donnée sur la page principale du projet. ([https://peip-ima.plil.fr/mediawiki/index.php/BE_2017-2018 BE 2017-2018])&lt;br /&gt;
&lt;br /&gt;
Voici le schématique sur lequel nous nous sommes basé.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:RobotPCB schem.png|500px|thumb||left|Schématique original]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Notre PCB ===&lt;br /&gt;
&lt;br /&gt;
Notre PCB a été réaliser sur Fritzing. Nous avons créer ce circuit imprimer à notre image pour notre véhicule. Nous avons enlevé le driver de moteur et les sortie moteur car nous voulions un robot de petite taille. Donc le moyen de déplacement choisi a alors été le servo-moteur. Pour les réceptions infra-rouge nous n'avons prévu que deux sortie pour des Tsop pour pouvoir laisser un plus grande chance au chasseur de ne pas être repéré, pour une  approche plus vrai que nature. Pour savoir si un chasseur nous a attrapé, nous utilisons une sonde de Hall.&lt;/div&gt;</summary>
		<author><name>Dtillaux</name></author>	</entry>

	<entry>
		<id>https://peip-ima.plil.fr/mediawiki/index.php?title=Binome2017-9&amp;diff=8912</id>
		<title>Binome2017-9</title>
		<link rel="alternate" type="text/html" href="https://peip-ima.plil.fr/mediawiki/index.php?title=Binome2017-9&amp;diff=8912"/>
				<updated>2018-03-08T17:12:43Z</updated>
		
		<summary type="html">&lt;p&gt;Dtillaux : /* Réalisation de PCB */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Binôme 9 saison 8: Raphaël Bonvalet, Damien Tillaux.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Projet Quireekoo =&lt;br /&gt;
&lt;br /&gt;
Le but du projet Quireekoo est de créer un robot communiquant avec d'autre via infra-rouge. Ce projet à eu lieux lors des bureaux d'étude de PEIP en IMA au S4 2018 de notre cursus pour devenir ingénieur. Voici la transcription phonétique de Quireekoo: /Kirikou/.&lt;br /&gt;
&lt;br /&gt;
= Cahier des charges =&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Kiki.jpg]]&lt;br /&gt;
&lt;br /&gt;
Quireekoo sera un robot fait de A à Z. Le circuit imprimé sera totalement revu et sera guidé grâce à une ATMEGA-328. Le physique sera totalement design par nous même et son programme sera totalement autonome.&lt;br /&gt;
&lt;br /&gt;
Quireekoo étant petit et vaillant est un véhicule de petite taille. A la défaut de jambe, Quireekoo ce déplace avec 2 servos moteurs continue. A la place des yeux, un sonar pour éviter ses obstacles et ne pas trébucher. Pour ses oreilles nous avons prévu 2 Tsop38238 pour pouvoir repérer et fuir ses ennemis.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Réalisation du projet =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Voici les différentes étapes par lesquels nous sommes passer lors de la création de Quireekoo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Réalisation de PCB ==&lt;br /&gt;
&lt;br /&gt;
=== Idée principale ===&lt;br /&gt;
&lt;br /&gt;
Nous voulions refaire nous même le PCB de Quireekoo mais nous n'avions pratiquement aucune base sur comment créer un circuit imprimé pour ce genre de projet. Du coups nous avons pris comme modèle, le modèle donnée sur la page principale du projet. ([https://peip-ima.plil.fr/mediawiki/index.php/BE_2017-2018 BE 2017-2018])&lt;br /&gt;
&lt;br /&gt;
Voici le schématique sur lequel nous nous sommes basé.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:RobotPCB schem.png|500px|thumb||left|Schématique original]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Notre PCB ===&lt;br /&gt;
&lt;br /&gt;
Notre PCB a été réaliser sur Fritzing. Nous avons créer ce circuit imprimer à notre image pour notre véhicule. Nous avons enlevé le driver de moteur et les sortie moteur car nous voulions un robot de petite taille. Donc le moyen de déplacement choisi a alors été le servo-moteur. Pour les réceptions infra-rouge nous n'avons prévu que deux sortie pour des Tsop pour pouvoir laisser un plus grande chance au chasseur de ne pas être repéré, pour une  approche plus vrai que nature. Pour savoir si un chasseur nous a attrapé, nous utilisons une sonde de Hall.&lt;/div&gt;</summary>
		<author><name>Dtillaux</name></author>	</entry>

	<entry>
		<id>https://peip-ima.plil.fr/mediawiki/index.php?title=Binome2017-9&amp;diff=8911</id>
		<title>Binome2017-9</title>
		<link rel="alternate" type="text/html" href="https://peip-ima.plil.fr/mediawiki/index.php?title=Binome2017-9&amp;diff=8911"/>
				<updated>2018-03-08T17:09:10Z</updated>
		
		<summary type="html">&lt;p&gt;Dtillaux : /* Réalisation de PCB */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Binôme 9 saison 8: Raphaël Bonvalet, Damien Tillaux.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Projet Quireekoo =&lt;br /&gt;
&lt;br /&gt;
Le but du projet Quireekoo est de créer un robot communiquant avec d'autre via infra-rouge. Ce projet à eu lieux lors des bureaux d'étude de PEIP en IMA au S4 2018 de notre cursus pour devenir ingénieur. Voici la transcription phonétique de Quireekoo: /Kirikou/.&lt;br /&gt;
&lt;br /&gt;
= Cahier des charges =&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Kiki.jpg]]&lt;br /&gt;
&lt;br /&gt;
Quireekoo sera un robot fait de A à Z. Le circuit imprimé sera totalement revu et sera guidé grâce à une ATMEGA-328. Le physique sera totalement design par nous même et son programme sera totalement autonome.&lt;br /&gt;
&lt;br /&gt;
Quireekoo étant petit et vaillant est un véhicule de petite taille. A la défaut de jambe, Quireekoo ce déplace avec 2 servos moteurs continue. A la place des yeux, un sonar pour éviter ses obstacles et ne pas trébucher. Pour ses oreilles nous avons prévu 2 Tsop38238 pour pouvoir repérer et fuir ses ennemis.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Réalisation du projet =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Voici les différentes étapes par lesquels nous sommes passer lors de la création de Quireekoo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Réalisation de PCB ==&lt;br /&gt;
&lt;br /&gt;
=== Idée principale ===&lt;br /&gt;
&lt;br /&gt;
Nous voulions refaire nous même le PCB de Quireekoo mais nous n'avions pratiquement aucune base sur comment créer un circuit imprimé pour ce genre de projet. Du coups nous avons pris comme modèle, le modèle donnée sur la page principale du projet. ([https://peip-ima.plil.fr/mediawiki/index.php/BE_2017-2018 BE 2017-2018])&lt;br /&gt;
&lt;br /&gt;
Voici le schématique sur lequel nous nous sommes basé.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:RobotPCB schem.png|500px|thumb|Schématique original]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Notre PCB ===&lt;br /&gt;
&lt;br /&gt;
Notre PCB a été réaliser sur Fritzing. Nous avons créer ce circuit imprimer à notre image pour notre véhicule. Nous avons enlevé le driver de moteur et les sortie moteur car nous voulions un robot de petite taille. Donc le moyen de déplacement choisi a alors été le servo-moteur. Pour les réceptions infra-rouge nous n'avons prévu que deux sortie pour des Tsop pour pouvoir laisser un plus grande chance au chasseur de ne pas être repéré, pour une  approche plus vrai que nature. Pour savoir si un chasseur nous a attrapé, nous utilisons une sonde de Hall.&lt;/div&gt;</summary>
		<author><name>Dtillaux</name></author>	</entry>

	<entry>
		<id>https://peip-ima.plil.fr/mediawiki/index.php?title=Binome2017-9&amp;diff=8910</id>
		<title>Binome2017-9</title>
		<link rel="alternate" type="text/html" href="https://peip-ima.plil.fr/mediawiki/index.php?title=Binome2017-9&amp;diff=8910"/>
				<updated>2018-03-08T17:08:18Z</updated>
		
		<summary type="html">&lt;p&gt;Dtillaux : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Binôme 9 saison 8: Raphaël Bonvalet, Damien Tillaux.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Projet Quireekoo =&lt;br /&gt;
&lt;br /&gt;
Le but du projet Quireekoo est de créer un robot communiquant avec d'autre via infra-rouge. Ce projet à eu lieux lors des bureaux d'étude de PEIP en IMA au S4 2018 de notre cursus pour devenir ingénieur. Voici la transcription phonétique de Quireekoo: /Kirikou/.&lt;br /&gt;
&lt;br /&gt;
= Cahier des charges =&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Kiki.jpg]]&lt;br /&gt;
&lt;br /&gt;
Quireekoo sera un robot fait de A à Z. Le circuit imprimé sera totalement revu et sera guidé grâce à une ATMEGA-328. Le physique sera totalement design par nous même et son programme sera totalement autonome.&lt;br /&gt;
&lt;br /&gt;
Quireekoo étant petit et vaillant est un véhicule de petite taille. A la défaut de jambe, Quireekoo ce déplace avec 2 servos moteurs continue. A la place des yeux, un sonar pour éviter ses obstacles et ne pas trébucher. Pour ses oreilles nous avons prévu 2 Tsop38238 pour pouvoir repérer et fuir ses ennemis.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Réalisation du projet =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Voici les différentes étapes par lesquels nous sommes passer lors de la création de Quireekoo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Réalisation de PCB ==&lt;br /&gt;
&lt;br /&gt;
=== Idée principale ===&lt;br /&gt;
&lt;br /&gt;
Nous voulions refaire nous même le PCB de Quireekoo mais nous n'avions pratiquement aucune base sur comment créer un circuit imprimé pour ce genre de projet. Du coups nous avons pris comme modèle, le modèle donnée sur la page principale du projet. ([https://peip-ima.plil.fr/mediawiki/index.php/BE_2017-2018 BE 2017-2018])&lt;br /&gt;
&lt;br /&gt;
Voici le schématique sur lequel nous nous sommes basé.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:RobotPCB schem.png|500px|left|thumb|Schématique original]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Notre PCB ===&lt;br /&gt;
&lt;br /&gt;
Notre PCB a été réaliser sur Fritzing. Nous avons créer ce circuit imprimer à notre image pour notre véhicule. Nous avons enlevé le driver de moteur et les sortie moteur car nous voulions un robot de petite taille. Donc le moyen de déplacement choisi a alors été le servo-moteur. Pour les réceptions infra-rouge nous n'avons prévu que deux sortie pour des Tsop pour pouvoir laisser un plus grande chance au chasseur de ne pas être repéré, pour une  approche plus vrai que nature. Pour savoir si un chasseur nous a attrapé, nous utilisons une sonde de Hall.&lt;/div&gt;</summary>
		<author><name>Dtillaux</name></author>	</entry>

	<entry>
		<id>https://peip-ima.plil.fr/mediawiki/index.php?title=Binome2017-9&amp;diff=8906</id>
		<title>Binome2017-9</title>
		<link rel="alternate" type="text/html" href="https://peip-ima.plil.fr/mediawiki/index.php?title=Binome2017-9&amp;diff=8906"/>
				<updated>2018-03-08T16:58:44Z</updated>
		
		<summary type="html">&lt;p&gt;Dtillaux : /* Idée principale */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Binôme 9 saison 8: Raphaël Bonvalet, Damien Tillaux.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Projet Quireekoo =&lt;br /&gt;
&lt;br /&gt;
Le but du projet Quireekoo est de créer un robot communiquant avec d'autre via infra-rouge. Ce projet à eu lieux lors des bureaux d'étude de PEIP en IMA au S4 2018 de notre cursus pour devenir ingénieur. Voici la transcription phonétique de Quireekoo: /Kirikou/.&lt;br /&gt;
&lt;br /&gt;
= Cahier des charges =&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Kiki.jpg]]&lt;br /&gt;
&lt;br /&gt;
Quireekoo sera un robot fait de A à Z. Le circuit imprimé sera totalement revu et sera guidé grâce à une ATMEGA-328. Le physique sera totalement design par nous même et son programme sera totalement autonome.&lt;br /&gt;
&lt;br /&gt;
Quireekoo étant petit et vaillant est un véhicule de petite taille. A la défaut de jambe, Quireekoo ce déplace avec 2 servos moteurs continue. A la place des yeux, un sonar pour éviter ses obstacles et ne pas trébucher. Pour ses oreilles nous avons prévu 2 Tsop38238 pour pouvoir repérer et fuir ses ennemis.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Réalisation du projet =&lt;br /&gt;
&lt;br /&gt;
Voici les différentes étapes par lesquels nous sommes passer lors de la création de Quireekoo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Réalisation de PCB ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Idée principale ===&lt;br /&gt;
Nous voulions refaire nous même le PCB de Quireekoo mais nous n'avions pratiquement aucune base sur comment créer un circuit imprimé pour ce genre de projet. Du coups nous avons pris comme modèle, le modèle donnée sur la page principale du projet. ([https://peip-ima.plil.fr/mediawiki/index.php/BE_2017-2018 BE 2017-2018])&lt;br /&gt;
&lt;br /&gt;
Voici le schématique sur lequel nous nous sommes basé.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:RobotPCB schem.png|500px|left|thumb|Schématique original]]&lt;/div&gt;</summary>
		<author><name>Dtillaux</name></author>	</entry>

	<entry>
		<id>https://peip-ima.plil.fr/mediawiki/index.php?title=Binome2017-9&amp;diff=8904</id>
		<title>Binome2017-9</title>
		<link rel="alternate" type="text/html" href="https://peip-ima.plil.fr/mediawiki/index.php?title=Binome2017-9&amp;diff=8904"/>
				<updated>2018-03-08T16:57:15Z</updated>
		
		<summary type="html">&lt;p&gt;Dtillaux : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Binôme 9 saison 8: Raphaël Bonvalet, Damien Tillaux.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Projet Quireekoo =&lt;br /&gt;
&lt;br /&gt;
Le but du projet Quireekoo est de créer un robot communiquant avec d'autre via infra-rouge. Ce projet à eu lieux lors des bureaux d'étude de PEIP en IMA au S4 2018 de notre cursus pour devenir ingénieur. Voici la transcription phonétique de Quireekoo: /Kirikou/.&lt;br /&gt;
&lt;br /&gt;
= Cahier des charges =&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Kiki.jpg]]&lt;br /&gt;
&lt;br /&gt;
Quireekoo sera un robot fait de A à Z. Le circuit imprimé sera totalement revu et sera guidé grâce à une ATMEGA-328. Le physique sera totalement design par nous même et son programme sera totalement autonome.&lt;br /&gt;
&lt;br /&gt;
Quireekoo étant petit et vaillant est un véhicule de petite taille. A la défaut de jambe, Quireekoo ce déplace avec 2 servos moteurs continue. A la place des yeux, un sonar pour éviter ses obstacles et ne pas trébucher. Pour ses oreilles nous avons prévu 2 Tsop38238 pour pouvoir repérer et fuir ses ennemis.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Réalisation du projet =&lt;br /&gt;
&lt;br /&gt;
Voici les différentes étapes par lesquels nous sommes passer lors de la création de Quireekoo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Réalisation de PCB ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Idée principale ===&lt;br /&gt;
Nous voulions refaire nous même le PCB de Quireekoo mais nous n'avions pratiquement aucune base sur comment créer un circuit imprimé pour ce genre de projet. Du coups nous avons pris comme modèle, le modèle donnée sur la page principale du projet. ([https://peip-ima.plil.fr/mediawiki/index.php/BE_2017-2018 BE 2017-2018])&lt;br /&gt;
&lt;br /&gt;
Voici le schématique sur lequel nous nous sommes basé.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:RobotPCB schem.png|500px|Schématique original]]&lt;/div&gt;</summary>
		<author><name>Dtillaux</name></author>	</entry>

	<entry>
		<id>https://peip-ima.plil.fr/mediawiki/index.php?title=Binome2017-9&amp;diff=8902</id>
		<title>Binome2017-9</title>
		<link rel="alternate" type="text/html" href="https://peip-ima.plil.fr/mediawiki/index.php?title=Binome2017-9&amp;diff=8902"/>
				<updated>2018-03-08T16:56:08Z</updated>
		
		<summary type="html">&lt;p&gt;Dtillaux : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Binôme 9 saison 8: Raphaël Bonvalet, Damien Tillaux.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Projet Quireekoo =&lt;br /&gt;
&lt;br /&gt;
Le but du projet Quireekoo est de créer un robot communiquant avec d'autre via infra-rouge. Ce projet à eu lieux lors des bureaux d'étude de PEIP en IMA au S4 2018 de notre cursus pour devenir ingénieur. Voici la transcription phonétique de Quireekoo: /Kirikou/.&lt;br /&gt;
&lt;br /&gt;
= Cahier des charges =&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Kiki.jpg]]&lt;br /&gt;
&lt;br /&gt;
Quireekoo sera un robot fait de A à Z. Le circuit imprimé sera totalement revu et sera guidé grâce à une ATMEGA-328. Le physique sera totalement design par nous même et son programme sera totalement autonome.&lt;br /&gt;
&lt;br /&gt;
Quireekoo étant petit et vaillant est un véhicule de petite taille. A la défaut de jambe, Quireekoo ce déplace avec 2 servos moteurs continue. A la place des yeux, un sonar pour éviter ses obstacles et ne pas trébucher. Pour ses oreilles nous avons prévu 2 Tsop38238 pour pouvoir repérer et fuir ses ennemis.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Réalisation du projet =&lt;br /&gt;
&lt;br /&gt;
Voici les différentes étapes par lesquels nous sommes passer lors de la création de Quireekoo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Réalisation de PCB ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Idée principale ===&lt;br /&gt;
Nous voulions refaire nous même le PCB de Quireekoo mais nous n'avions pratiquement aucune base sur comment créer un circuit imprimé pour ce genre de projet. Du coups nous avons pris comme modèle, le modèle donnée sur la page principale du projet. ([https://peip-ima.plil.fr/mediawiki/index.php/BE_2017-2018 BE 2017-2018])&lt;br /&gt;
&lt;br /&gt;
Voici le schématique sur lequel nous nous sommes basé.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:RobotPCB schem.png|500px|, Schématique original]]&lt;/div&gt;</summary>
		<author><name>Dtillaux</name></author>	</entry>

	<entry>
		<id>https://peip-ima.plil.fr/mediawiki/index.php?title=Binome2017-9&amp;diff=8901</id>
		<title>Binome2017-9</title>
		<link rel="alternate" type="text/html" href="https://peip-ima.plil.fr/mediawiki/index.php?title=Binome2017-9&amp;diff=8901"/>
				<updated>2018-03-08T16:55:16Z</updated>
		
		<summary type="html">&lt;p&gt;Dtillaux : /* Idée principale */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Binôme 9 saison 8: Raphaël Bonvalet, Damien Tillaux.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Projet Quireekoo =&lt;br /&gt;
&lt;br /&gt;
Le but du projet Quireekoo est de créer un robot communiquant avec d'autre via infra-rouge. Ce projet à eu lieux lors des bureaux d'étude de PEIP en IMA au S4 2018 de notre cursus pour devenir ingénieur. Voici la transcription phonétique de Quireekoo: /Kirikou/.&lt;br /&gt;
&lt;br /&gt;
= Cahier des charges =&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Kiki.jpg]]&lt;br /&gt;
&lt;br /&gt;
Quireekoo sera un robot fait de A à Z. Le circuit imprimé sera totalement revu et sera guidé grâce à une ATMEGA-328. Le physique sera totalement design par nous même et son programme sera totalement autonome.&lt;br /&gt;
&lt;br /&gt;
Quireekoo étant petit et vaillant est un véhicule de petite taille. A la défaut de jambe, Quireekoo ce déplace avec 2 servos moteurs continue. A la place des yeux, un sonar pour éviter ses obstacles et ne pas trébucher. Pour ses oreilles nous avons prévu 2 Tsop38238 pour pouvoir repérer et fuir ses ennemis.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Réalisation du projet =&lt;br /&gt;
&lt;br /&gt;
Voici les différentes étapes par lesquels nous sommes passer lors de la création de Quireekoo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Réalisation de PCB ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Idée principale ===&lt;br /&gt;
Nous voulions refaire nous même le PCB de Quireekoo mais nous n'avions pratiquement aucune base sur comment créer un circuit imprimé pour ce genre de projet. Du coups nous avons pris comme modèle, le modèle donnée sur la page principale du projet. ([https://peip-ima.plil.fr/mediawiki/index.php/BE_2017-2018 BE 2017-2018])&lt;br /&gt;
&lt;br /&gt;
Voici le schématique sur lequel nous nous sommes basé.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:RobotPCB schem.png|500px|,Schématique original]]&lt;/div&gt;</summary>
		<author><name>Dtillaux</name></author>	</entry>

	<entry>
		<id>https://peip-ima.plil.fr/mediawiki/index.php?title=Binome2017-9&amp;diff=8900</id>
		<title>Binome2017-9</title>
		<link rel="alternate" type="text/html" href="https://peip-ima.plil.fr/mediawiki/index.php?title=Binome2017-9&amp;diff=8900"/>
				<updated>2018-03-08T16:53:46Z</updated>
		
		<summary type="html">&lt;p&gt;Dtillaux : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Binôme 9 saison 8: Raphaël Bonvalet, Damien Tillaux.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Projet Quireekoo =&lt;br /&gt;
&lt;br /&gt;
Le but du projet Quireekoo est de créer un robot communiquant avec d'autre via infra-rouge. Ce projet à eu lieux lors des bureaux d'étude de PEIP en IMA au S4 2018 de notre cursus pour devenir ingénieur. Voici la transcription phonétique de Quireekoo: /Kirikou/.&lt;br /&gt;
&lt;br /&gt;
= Cahier des charges =&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Kiki.jpg]]&lt;br /&gt;
&lt;br /&gt;
Quireekoo sera un robot fait de A à Z. Le circuit imprimé sera totalement revu et sera guidé grâce à une ATMEGA-328. Le physique sera totalement design par nous même et son programme sera totalement autonome.&lt;br /&gt;
&lt;br /&gt;
Quireekoo étant petit et vaillant est un véhicule de petite taille. A la défaut de jambe, Quireekoo ce déplace avec 2 servos moteurs continue. A la place des yeux, un sonar pour éviter ses obstacles et ne pas trébucher. Pour ses oreilles nous avons prévu 2 Tsop38238 pour pouvoir repérer et fuir ses ennemis.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Réalisation du projet =&lt;br /&gt;
&lt;br /&gt;
Voici les différentes étapes par lesquels nous sommes passer lors de la création de Quireekoo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Réalisation de PCB ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Idée principale ===&lt;br /&gt;
Nous voulions refaire nous même le PCB de Quireekoo mais nous n'avions pratiquement aucune base sur comment créer un circuit imprimé pour ce genre de projet. Du coups nous avons pris comme modèle, le modèle donnée sur la page principale du projet. ([https://peip-ima.plil.fr/mediawiki/index.php/BE_2017-2018 BE 2017-2018])&lt;br /&gt;
&lt;br /&gt;
Voici le schématique sur lequel nous nous sommes basé.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:RobotPCB schem.png|300px|]]&lt;/div&gt;</summary>
		<author><name>Dtillaux</name></author>	</entry>

	<entry>
		<id>https://peip-ima.plil.fr/mediawiki/index.php?title=Binome2017-9&amp;diff=8897</id>
		<title>Binome2017-9</title>
		<link rel="alternate" type="text/html" href="https://peip-ima.plil.fr/mediawiki/index.php?title=Binome2017-9&amp;diff=8897"/>
				<updated>2018-03-08T16:52:37Z</updated>
		
		<summary type="html">&lt;p&gt;Dtillaux : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Binôme 9 saison 8: Raphaël Bonvalet, Damien Tillaux.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Projet Quireekoo =&lt;br /&gt;
&lt;br /&gt;
Le but du projet Quireekoo est de créer un robot communiquant avec d'autre via infra-rouge. Ce projet à eu lieux lors des bureaux d'étude de PEIP en IMA au S4 2018 de notre cursus pour devenir ingénieur. Voici la transcription phonétique de Quireekoo: /Kirikou/.&lt;br /&gt;
&lt;br /&gt;
= Cahier des charges =&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Kiki.jpg]]&lt;br /&gt;
&lt;br /&gt;
Quireekoo sera un robot fait de A à Z. Le circuit imprimé sera totalement revu et sera guidé grâce à une ATMEGA-328. Le physique sera totalement design par nous même et son programme sera totalement autonome.&lt;br /&gt;
&lt;br /&gt;
Quireekoo étant petit et vaillant est un véhicule de petite taille. A la défaut de jambe, Quireekoo ce déplace avec 2 servos moteurs continue. A la place des yeux, un sonar pour éviter ses obstacles et ne pas trébucher. Pour ses oreilles nous avons prévu 2 Tsop38238 pour pouvoir repérer et fuir ses ennemis.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Réalisation du projet =&lt;br /&gt;
&lt;br /&gt;
Voici les différentes étapes par lesquels nous sommes passer lors de la création de Quireekoo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Réalisation de PCB ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Idée principale ===&lt;br /&gt;
Nous voulions refaire nous même le PCB de Quireekoo mais nous n'avions pratiquement aucune base sur comment créer un circuit imprimé pour ce genre de projet. Du coups nous avons pris comme modèle, le modèle donnée sur la page principale du projet. ([https://peip-ima.plil.fr/mediawiki/index.php/BE_2017-2018 BE 2017-2018])&lt;br /&gt;
&lt;br /&gt;
Voici le schématique sur lequel nous nous sommes basé.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:RobotPCB schem.png]]&lt;/div&gt;</summary>
		<author><name>Dtillaux</name></author>	</entry>

	<entry>
		<id>https://peip-ima.plil.fr/mediawiki/index.php?title=Binome2017-9&amp;diff=8896</id>
		<title>Binome2017-9</title>
		<link rel="alternate" type="text/html" href="https://peip-ima.plil.fr/mediawiki/index.php?title=Binome2017-9&amp;diff=8896"/>
				<updated>2018-03-08T16:51:07Z</updated>
		
		<summary type="html">&lt;p&gt;Dtillaux : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Binôme 9 saison 8: Raphaël Bonvalet, Damien Tillaux.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Projet Quireekoo =&lt;br /&gt;
&lt;br /&gt;
Le but du projet Quireekoo est de créer un robot communiquant avec d'autre via infra-rouge. Ce projet à eu lieux lors des bureaux d'étude de PEIP en IMA au S4 2018 de notre cursus pour devenir ingénieur. Voici la transcription phonétique de Quireekoo: /Kirikou/.&lt;br /&gt;
&lt;br /&gt;
= Cahier des charges =&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Kiki.jpg]]&lt;br /&gt;
&lt;br /&gt;
Quireekoo sera un robot fait de A à Z. Le circuit imprimé sera totalement revu et sera guidé grâce à une ATMEGA-328. Le physique sera totalement design par nous même et son programme sera totalement autonome.&lt;br /&gt;
&lt;br /&gt;
Quireekoo étant petit et vaillant est un véhicule de petite taille. A la défaut de jambe, Quireekoo ce déplace avec 2 servos moteurs continue. A la place des yeux, un sonar pour éviter ses obstacles et ne pas trébucher. Pour ses oreilles nous avons prévu 2 Tsop38238 pour pouvoir repérer et fuir ses ennemis.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Réalisation du projet =&lt;br /&gt;
&lt;br /&gt;
Voici les différentes étapes par lesquels nous sommes passer lors de la création de Quireekoo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Réalisation de PCB ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Idée principale ===&lt;br /&gt;
Nous voulions refaire nous même le PCB de Quireekoo mais nous n'avions pratiquement aucune base sur comment créer un circuit imprimé pour ce genre de projet. Du coups nous avons pris comme modèle, le modèle donnée sur la page principale du projet. ([https://peip-ima.plil.fr/mediawiki/index.php/BE_2017-2018 BE 2017-2018]&lt;/div&gt;</summary>
		<author><name>Dtillaux</name></author>	</entry>

	<entry>
		<id>https://peip-ima.plil.fr/mediawiki/index.php?title=Binome2017-9&amp;diff=8893</id>
		<title>Binome2017-9</title>
		<link rel="alternate" type="text/html" href="https://peip-ima.plil.fr/mediawiki/index.php?title=Binome2017-9&amp;diff=8893"/>
				<updated>2018-03-08T16:42:11Z</updated>
		
		<summary type="html">&lt;p&gt;Dtillaux : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Binôme 9 saison 8: Raphaël Bonvalet, Damien Tillaux.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Projet Quireekoo =&lt;br /&gt;
&lt;br /&gt;
Le but du projet Quireekoo est de créer un robot communiquant avec d'autre via infra-rouge. Ce projet à eu lieux lors des bureaux d'étude de PEIP en IMA au S4 2018 de notre cursus pour devenir ingénieur. Voici la transcription phonétique de Quireekoo: /Kirikou/.&lt;br /&gt;
&lt;br /&gt;
= Cahier des charges =&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Kiki.jpg]]&lt;br /&gt;
&lt;br /&gt;
Quireekoo sera un robot fait de A à Z. Le circuit imprimé sera totalement revu et sera guidé grâce à une ATMEGA-328. Le physique sera totalement design par nous même et son programme sera totalement autonome.&lt;br /&gt;
&lt;br /&gt;
Quireekoo étant petit et vaillant est un véhicule de petite taille. A la défaut de jambe, Quireekoo ce déplace avec 2 servos moteurs continue. A la place des yeux, un sonar pour éviter ses obstacles et ne pas trébucher. Pour ses oreilles nous avons prévu 2 Tsop38238 pour pouvoir repérer et fuir ses ennemis.  &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Kiki.jpg]]&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Réalisation du projet =&lt;br /&gt;
&lt;br /&gt;
Voici les différentes étapes par lesquels nous sommes passer lors de la création de Quireekoo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Réalisation de PCB ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Idée principale ===&lt;/div&gt;</summary>
		<author><name>Dtillaux</name></author>	</entry>

	<entry>
		<id>https://peip-ima.plil.fr/mediawiki/index.php?title=Fichier:Kiki.jpg&amp;diff=8891</id>
		<title>Fichier:Kiki.jpg</title>
		<link rel="alternate" type="text/html" href="https://peip-ima.plil.fr/mediawiki/index.php?title=Fichier:Kiki.jpg&amp;diff=8891"/>
				<updated>2018-03-08T16:40:03Z</updated>
		
		<summary type="html">&lt;p&gt;Dtillaux : Kirikou&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Kirikou&lt;/div&gt;</summary>
		<author><name>Dtillaux</name></author>	</entry>

	<entry>
		<id>https://peip-ima.plil.fr/mediawiki/index.php?title=Binome2017-9&amp;diff=8888</id>
		<title>Binome2017-9</title>
		<link rel="alternate" type="text/html" href="https://peip-ima.plil.fr/mediawiki/index.php?title=Binome2017-9&amp;diff=8888"/>
				<updated>2018-03-08T16:17:13Z</updated>
		
		<summary type="html">&lt;p&gt;Dtillaux : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Binôme 9 saison 8: Raphaël Bonvalet, Damien Tillaux.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Projet Chouchou =&lt;br /&gt;
&lt;br /&gt;
Le but du projet ChouChou est de créer un robot communiquant avec d'autre via infra-rouge. Ce projet à eu lieux lors des bureaux d'étude de PEIP en IMA au S4 2018 de notre cursus pour devenir ingénieur.&lt;br /&gt;
&lt;br /&gt;
= Cahier des charges =&lt;br /&gt;
&lt;br /&gt;
Comme vous avez pu le remarquer mais Chouchou est le nom de chien de grand-mère et voici ça photo.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:802604317_small.jpg]]&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Texte du titre ===&lt;/div&gt;</summary>
		<author><name>Dtillaux</name></author>	</entry>

	<entry>
		<id>https://peip-ima.plil.fr/mediawiki/index.php?title=Fichier:802604317_small.jpg&amp;diff=8886</id>
		<title>Fichier:802604317 small.jpg</title>
		<link rel="alternate" type="text/html" href="https://peip-ima.plil.fr/mediawiki/index.php?title=Fichier:802604317_small.jpg&amp;diff=8886"/>
				<updated>2018-03-08T16:16:16Z</updated>
		
		<summary type="html">&lt;p&gt;Dtillaux : Voici Chouchou&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Voici Chouchou&lt;/div&gt;</summary>
		<author><name>Dtillaux</name></author>	</entry>

	<entry>
		<id>https://peip-ima.plil.fr/mediawiki/index.php?title=Binome2017-9&amp;diff=8884</id>
		<title>Binome2017-9</title>
		<link rel="alternate" type="text/html" href="https://peip-ima.plil.fr/mediawiki/index.php?title=Binome2017-9&amp;diff=8884"/>
				<updated>2018-03-08T16:15:13Z</updated>
		
		<summary type="html">&lt;p&gt;Dtillaux : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Binôme 9 saison 8: Raphaël Bonvalet, Damien Tillaux.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Projet Chouchou =&lt;br /&gt;
&lt;br /&gt;
Le but du projet ChouChou est de créer un robot communiquant avec d'autre via infra-rouge. Ce projet à eu lieux lors des bureaux d'étude de PEIP en IMA au S4 2018 de notre cursus pour devenir ingénieur.&lt;br /&gt;
&lt;br /&gt;
= Cahier des charges =&lt;br /&gt;
&lt;br /&gt;
Comme vous avez pu le remarquer mais Chouchou est le nom de chien de grand-mère et voici ça photo.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Texte du titre ===&lt;/div&gt;</summary>
		<author><name>Dtillaux</name></author>	</entry>

	<entry>
		<id>https://peip-ima.plil.fr/mediawiki/index.php?title=Binome2017-9&amp;diff=8883</id>
		<title>Binome2017-9</title>
		<link rel="alternate" type="text/html" href="https://peip-ima.plil.fr/mediawiki/index.php?title=Binome2017-9&amp;diff=8883"/>
				<updated>2018-03-08T16:07:54Z</updated>
		
		<summary type="html">&lt;p&gt;Dtillaux : Contenu remplacé par « Binôme 9 saison 8: Raphaël Bonvalet, Damien Tillaux.    = Texte du titre =  == Texte du titre ==  === Texte du titre === »&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Binôme 9 saison 8: Raphaël Bonvalet, Damien Tillaux.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Texte du titre =&lt;br /&gt;
&lt;br /&gt;
== Texte du titre ==&lt;br /&gt;
&lt;br /&gt;
=== Texte du titre ===&lt;/div&gt;</summary>
		<author><name>Dtillaux</name></author>	</entry>

	<entry>
		<id>https://peip-ima.plil.fr/mediawiki/index.php?title=Binome2017-9&amp;diff=8609</id>
		<title>Binome2017-9</title>
		<link rel="alternate" type="text/html" href="https://peip-ima.plil.fr/mediawiki/index.php?title=Binome2017-9&amp;diff=8609"/>
				<updated>2018-01-15T09:54:59Z</updated>
		
		<summary type="html">&lt;p&gt;Dtillaux : /* Journal de bord */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Binôme 9 saison 8: Raphaël Bonvalet, Damien Tillaux.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Cahier des charges ==&lt;br /&gt;
&lt;br /&gt;
Nous allons créer pour ce BE un véhicule communiquant sous le type de &amp;quot;proie&amp;quot;. Pour ce robot nous allons principalement travailler sur la création d'un circuit imprimé et d'un bouclier fait maison. Nous allons aussi travailler sur la programmation du micro contrôleur.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Journal de bord ==&lt;br /&gt;
 &lt;br /&gt;
== Jour 1  ==&lt;br /&gt;
&lt;br /&gt;
Nous avons pris connaissance du sujet. Nous commençons à créer notre circuit. Nous avons également lu la doc du micro contrôleur.&lt;/div&gt;</summary>
		<author><name>Dtillaux</name></author>	</entry>

	<entry>
		<id>https://peip-ima.plil.fr/mediawiki/index.php?title=Binome2017-9&amp;diff=8608</id>
		<title>Binome2017-9</title>
		<link rel="alternate" type="text/html" href="https://peip-ima.plil.fr/mediawiki/index.php?title=Binome2017-9&amp;diff=8608"/>
				<updated>2018-01-15T09:54:24Z</updated>
		
		<summary type="html">&lt;p&gt;Dtillaux : /* Cahier des charges */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Binôme 9 saison 8: Raphaël Bonvalet, Damien Tillaux.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Cahier des charges ==&lt;br /&gt;
&lt;br /&gt;
Nous allons créer pour ce BE un véhicule communiquant sous le type de &amp;quot;proie&amp;quot;. Pour ce robot nous allons principalement travailler sur la création d'un circuit imprimé et d'un bouclier fait maison. Nous allons aussi travailler sur la programmation du micro contrôleur.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Journal de bord ==&lt;br /&gt;
 [[Jour 1 ]]&lt;br /&gt;
Nous avons pris connaissance du sujet. Nous commençons à créer notre circuit. Nous avons également lu la doc du micro contrôleur.&lt;/div&gt;</summary>
		<author><name>Dtillaux</name></author>	</entry>

	<entry>
		<id>https://peip-ima.plil.fr/mediawiki/index.php?title=Binome2017-9&amp;diff=8582</id>
		<title>Binome2017-9</title>
		<link rel="alternate" type="text/html" href="https://peip-ima.plil.fr/mediawiki/index.php?title=Binome2017-9&amp;diff=8582"/>
				<updated>2018-01-15T09:00:12Z</updated>
		
		<summary type="html">&lt;p&gt;Dtillaux : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Binôme 9 saison 8: Raphaël Bonvalet, Damien Tillaux.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Cahier des charges ==&lt;br /&gt;
&lt;br /&gt;
Nous allons créer pour ce BE un véhicule communiquant sous le type de &amp;quot;proie&amp;quot;. Pour ce robot nous allons principalement travailler sur la création d'un circuit imprimé et d'un bouclier fait maison. Nous allons aussi travailler sur la programmation du micro contrôleur.&lt;/div&gt;</summary>
		<author><name>Dtillaux</name></author>	</entry>

	<entry>
		<id>https://peip-ima.plil.fr/mediawiki/index.php?title=BE_2017-2018&amp;diff=8576</id>
		<title>BE 2017-2018</title>
		<link rel="alternate" type="text/html" href="https://peip-ima.plil.fr/mediawiki/index.php?title=BE_2017-2018&amp;diff=8576"/>
				<updated>2018-01-15T08:56:02Z</updated>
		
		<summary type="html">&lt;p&gt;Dtillaux : /* Réalisations des binômes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Objectif à atteindre =&lt;br /&gt;
&lt;br /&gt;
Le thème de la saison 8 est la réalisation de robots communicant sur le modèle proies et prédateurs.&lt;br /&gt;
&lt;br /&gt;
Les prédateurs doivent repérer et rattraper des proies. Pour toute la partie identification et poursuite, une interaction par signal infra-rouge modulé est préconisée. Les proies émettent un signal propre à leur condition et sont ainsi identifiées par les prédateurs. Les prédateurs possèdent un système de réception infra-rouge directionnel permettant de s'orienter dans la phase de poursuite. Les prédateurs émettent aussi un signal infra-rouge permettant ainsi aux proies de savoir qu'elles sont prises en chasse. Pour simuler la capture de la proie, la conception d'un système de communication à très faible distance est laissé à la sagacité des élèves.&lt;br /&gt;
&lt;br /&gt;
Les proies comme les prédateurs peuvent être autonomes ou télécommandés. Pour le mode de télécommande deux solutions sont envisagées : utilisation d'une télécommande infra-rouge ou utilisation d'un téléphone intelligent. Pour la dernière solution, il est nécessaire d'embarquer une Raspberry Pi 3 sur le robot.&lt;br /&gt;
&lt;br /&gt;
La taille du robot n'est pas fixé. Vous pouvez envisager des robots miniatures d'une dizaine de centimètres de coté.&lt;br /&gt;
 &lt;br /&gt;
= Matériel à votre disposition pour les robots =&lt;br /&gt;
&lt;br /&gt;
Votre robot doit pouvoir réaliser les actions suivantes :&lt;br /&gt;
* avancer et reculer le tout en tournant éventuellement ;&lt;br /&gt;
* émettre des signaux infra-rouges pulsés ;&lt;br /&gt;
* décoder des signaux infra-rouges pulsés ;&lt;br /&gt;
* détecter des obstacles sur son chemin.&lt;br /&gt;
&lt;br /&gt;
Nous vous imposons de construire ce robot à base de micro-contrôleur ATMega. Par contre nous vous laissons le choix de la variante. Les possibilités sont classées de la plus simple à la plus complexe.&lt;br /&gt;
* Vous pouvez partir d'un des robots construits lors des saisons précédentes. Ces robots ne sont pas forcément totalement fonctionnels mais les parties déjà réalisées peuvent vous faire gagner du temps que vous pourrez consacrer à la programmation du robot.&lt;br /&gt;
* Vous pouvez construire un robot à partir d'un des deux chassis proposés, utiliser un Arduino Mega et concevoir un bouclier pour cet Arduino comportant des emplacements pour les divers composants nécessaires (contrôleur moteur, détecteur ultrason, LED infra-rouge, récepteur infra-rouge TSOP, etc).&lt;br /&gt;
* Vous pouvez aussi fabriquer votre propre chassis avec deux plaques de plexiglass produites par la découpeuse laser ou avec une structure imprimée en 3D. Il ne reste plus qu'à intégrer à ce chassis deux moto-réducteurs et leurs roues ainsi qu'une roue folle. Pour le micro-contrôleur vous pouvez aussi vous passer de l'Arduino Mega et concevoir votre propre circuit intégré à base de micro-contrôleur ATMega328p et d'un contrôleur moteurs TB6612FNG. Seul le sonar ultrason est trop complexe pour être conçu à partir des composants de base.&lt;br /&gt;
* Si vous aimez les défis vous pouvez aussi construire un robot avec un moto-réducteur de meilleure qualité ou avec une carte électronique réalisée uniquement avec des composants électroniques de surface. Vous pouvez même construire un robot miniature.&lt;br /&gt;
&lt;br /&gt;
Les montages photographiques ci-dessous présentent les éléments permettant de construire un robot sans trop souffrir et les composants de base pour construire un robot plus optimisé et personnalisé.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:robot-kit-2018.jpg|300px|thumb|left|Chassis, Arduino Mega, récepteur infra-rouge, sonar, contrôleur moteurs]]&lt;br /&gt;
[[Fichier:robot-composant-2018.jpg|300px|thumb|right|Moto-réducteurs et roues, micro-contrôleurs ATMega328p et quartz, contrôleur de moteurs TB6612FNG, LED infra-rouge]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Des robots miniatures peuvent être réalisés en utilisant des servo-moteurs continus et des pièces en plexiglas ou en contreplaqué découpées à l'aide de la découpeuse laser du [http://www.fabricarium.fr/mediawiki-1.23.5/index.php?title=Accueil Fabricarium]. Certaines formes plus complexes peuvent éventuellement être réalisées à l'aide des imprimantes 3D du [http://www.fabricarium.fr/mediawiki-1.23.5/index.php?title=Accueil Fabricarium]. Il est possible d'imprimer des pneus avec du PLA flexible.&lt;br /&gt;
Pour les fixations vous avez de la visserie (vis, écrous, entretoises).&lt;br /&gt;
&lt;br /&gt;
= Logiciels à utiliser =&lt;br /&gt;
&lt;br /&gt;
Pour concevoir un schéma propre du câblage de votre robot vous pouvez utiliser [http://fritzing.org/home/ fritzing]. Tous les composants de votre robot ne sont pas modélisés dans fritzing. Voici une liste de composants supplémentaires mis au points par des élèves IMA de la promotion 2017 (Julie Debock, Hugo Vandenbunder et Sylvain Verdonck) et revus par les encadrants du bureau d'études :&lt;br /&gt;
* détecteur ultrason : [[Fichier:UltrasonicSensor_HCSR04.zip]]&lt;br /&gt;
* contrôleur de moteurs : [[Fichier:MotorDriver_Pololu_md08a.zip]]&lt;br /&gt;
&lt;br /&gt;
Pour la conception de circuits imprimés nous vous recommandons le logiciel [http://www.cadsoftusa.com/download-eagle/freeware/ eagle] ou le précédent.&lt;br /&gt;
&lt;br /&gt;
Pour la découpe laser de nombreux utilisateurs utilisent [https://inkscape.org/fr/ inkscape].&lt;br /&gt;
&lt;br /&gt;
Pour la conception 3D solidwork est très utilisé. Vous pouvez tenter [http://www.freecadweb.org/?lang=fr_FR freeCAD] si vous cherchez un logiciel plus libre. Une solution en ligne existe : [https://www.onshape.com/ onshape].&lt;br /&gt;
&lt;br /&gt;
Pour le développement avec les plateformes Arduino, utilisez l'environnement du même nom. Si la programmation C++ vous fait peur, n'hésitez pas à ajouter l'outil [http://sourceforge.net/projects/ardublock/ ardublock] à cet environnement.&lt;br /&gt;
&lt;br /&gt;
Pour vous aider dans la conception des circuits imprimés nous vous proposons des circuits modélisés avec fritzing que vous pourrez adapter à vos robots. Ces circuits ont été ébauchés par des élèves IMA et retouchés par les encadrants du bureau d'études.&lt;br /&gt;
&lt;br /&gt;
Un premier circuit de type bouclier Arduino permet d'éviter tous les câbles entre l'Arduino et les contrôleurs de moteurs : [[Fichier:robot_bouclier.zip]]. Ce circuit est prévu pour 4 moteurs, les binômes avec des chassis bi-moteurs devront le simplifier. Après téléchargement, prenez soin de modifier le suffixe &amp;lt;code&amp;gt;.zip&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;.fzz&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;gallery style=&amp;quot;margin: 0 auto;&amp;quot;&amp;gt;&lt;br /&gt;
Fichier:robot_bouclier_bb.png|Bouclier : plaque d'essai&lt;br /&gt;
Fichier:robot_bouclier_schem.png|Bouclier : schéma&lt;br /&gt;
Fichier:robot_bouclier_pcb.png|Bouclier : circuit imprimé&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Un second circuit permet de se passer totalement d'un Arduino : [[Fichier:RobotPCB.zip]]. Le coeur de la carte est un micro-contrôleur ATMega328p comme sur l'Arduino. La plupart des capteurs et actionneurs nécessaires à vos robots sont présents sur la carte. Après téléchargement, prenez soin de modifier le suffixe &amp;lt;code&amp;gt;.zip&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;.fzz&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;gallery style=&amp;quot;margin: 0 auto;&amp;quot;&amp;gt;&lt;br /&gt;
Fichier:RobotPCB_bb.png|Contrôleur : plaque d'essai&lt;br /&gt;
Fichier:RobotPCB_schem.png|Contrôleur : schéma&lt;br /&gt;
Fichier:RobotPCB_pcb.png|Contrôleur : circuit imprimé&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Configuration du système embarqué =&lt;br /&gt;
&lt;br /&gt;
Pour contrôler les robots télécommandés vous utiliserez un ordinateur miniature Raspberry Pi 3. Cet ordinateur doit être configuré comme un point d'accès WiFi pour permettre une connexion à partir d'un téléphone intelligent.&lt;br /&gt;
&lt;br /&gt;
Il existe au moins deux méthode de se connecter sur la Raspberry PI 3 pour la configurer. La première méthode est la méthode &amp;quot;grand public&amp;quot; en utilisant la carte graphique intégrée sur la Raspberry et en lui connectant écran, clavier et souris. La seconde méthode est plus spartiate et traditionnellement utilisée dans le monde des systèmes embarqués : la connexion par liaison série.&lt;br /&gt;
&lt;br /&gt;
== Connexion série ==&lt;br /&gt;
&lt;br /&gt;
Vous êtes de futurs ingénieurs, la méthode &amp;quot;liaison série&amp;quot; est à votre portée et vous pourrez l'employer pour d'autres dispositifs. Vous allez commencer par récupérer la dernière version de la distribution Linux pour Raspberry Pi. Comme nous n'avons pas besoin de l'interface graphique, il est préférable de choisir la distribution &amp;quot;Raspbian Jessie Lite&amp;quot; plus légère en terme d'espace disque. La configuration décrite ci-après a été effectuée sur la version du 2017-01-11.&lt;br /&gt;
&lt;br /&gt;
Une fois l'archive zippée de la distribution récupérée vous pouvez l'installer sur la carte SD après l'avoir décompressée en utilisant la commande &amp;lt;code&amp;gt;dd&amp;lt;/code&amp;gt; :&lt;br /&gt;
 dd if=2017-01-11-raspbian-jessie-lite.img of=/dev/sdb&lt;br /&gt;
Le nom du périphérique &amp;lt;code&amp;gt;/dev/sdb&amp;lt;/code&amp;gt; peut varier suivant votre machine, vous pouvez lister les noms des périphériques blocs avec la commande &amp;lt;code&amp;gt;lsblk&amp;lt;/code&amp;gt;. Exécutez cette commande avant et après l'insertion de votre carte SD et vous aurez le nom utilisé par votre système.&lt;br /&gt;
&lt;br /&gt;
Avant de démarrer la Raspberry Pi 3 sur cette carte SD, vous devez modifier quelques paramètres de démarrage. En effet sur les dernières version de la distribution raspbian, la connexion série a été laissée de coté. Plusieurs explications à cela : la Raspberry vise plus le marché du jouet grand public que celui du système embarqué, de plus la Raspberry Pi 3 intégre maintenant une interface bluetooth disponible via le port série principal. Il est cependant possible d'utiliser le second port série désigné sous le nom de périphérique &amp;lt;code&amp;gt;/dev/serial0&amp;lt;/code&amp;gt;. Montez la première partition de votre carte SD Raspian Lite avec la commande&lt;br /&gt;
 mount /dev/sdb1 /mnt&lt;br /&gt;
puis examinez les fichiers &amp;lt;code&amp;gt;cmdline.txt&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;config.txt&amp;lt;/code&amp;gt;. Attention le nom de la partition n'est pas forcément &amp;lt;code&amp;gt;/dev/sdb1&amp;lt;/code&amp;gt;, utilisez &amp;lt;code&amp;gt;lsblk&amp;lt;/code&amp;gt; pour déterminer le nom de la première partition de votre carte SD sur votre machine. Vérifiez que l'option &amp;lt;code&amp;gt;console=serial0,115200&amp;lt;/code&amp;gt; est bien présente dans la ligne du fichier &amp;lt;code&amp;gt;cmdline.txt&amp;lt;/code&amp;gt; et ajoutez &amp;lt;code&amp;gt;enable_uart=1&amp;lt;/code&amp;gt; à la fin du fichier &amp;lt;code&amp;gt;config.txt&amp;lt;/code&amp;gt;. N'oubliez pas de libérer votre carte SD par la commande&lt;br /&gt;
 umount /mnt&lt;br /&gt;
&lt;br /&gt;
Vous pouvez ensuite insérer la carte SD dans la Raspberry Pi. Utilisez le câble USB/série pour connecter votre Raspberry à votre PC. Il faut enficher les câbles noir, blanc et vert du câble USB/série [https://www.adafruit.com/product/954] sur les entrées/sorties correspondantes de la Raspberry [https://pinout.xyz/]. Le câble noir doit être sur la broche 6, le câble blanc sur la broche 8 et le câble vert sur la broche 10. Alimentez votre Raspberry Pi et lancez la commande suivante sur votre PC &lt;br /&gt;
 minicom -o -8 -b 115200 -D /dev/ttyUSB0&lt;br /&gt;
Vous devez obtenir, in fine, l'invite de connexion de la Raspberry&lt;br /&gt;
 Raspbian GNU/Linux 8 raspberrypi ttyS0&lt;br /&gt;
  &lt;br /&gt;
 raspberrypi login:&lt;br /&gt;
Vous pouvez vous connecter avec l'identifiant &amp;lt;code&amp;gt;pi&amp;lt;/code&amp;gt; et le mot de passe &amp;lt;code&amp;gt;raspberry&amp;lt;/code&amp;gt;. Pour passer administrateur utilisez la commande &amp;lt;code&amp;gt;sudo su&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Mise à jour de la distribution ==&lt;br /&gt;
&lt;br /&gt;
La distribution Raspbian vient avec le système de démarrage &amp;lt;code&amp;gt;systemd&amp;lt;/code&amp;gt;. Ce système n'est pas forcément adapté à l'usage que nous souhaitons faire de la Raspberry : utilisation en tant que système embarqué et manipulation en mode texte. Il est assez simple de supprimer, en tant qu'administrateur, le paquetage &amp;lt;code&amp;gt;systemd&amp;lt;/code&amp;gt; ainsi que deux autres paquetages qui tentent de gérer automatiquement la configuration réseau &amp;lt;code&amp;gt;dhcpcd5&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;openresolv&amp;lt;/code&amp;gt; :&lt;br /&gt;
 apt-get purge dhcpcd5 openresolv &lt;br /&gt;
 apt-get purge systemd &lt;br /&gt;
Attention pour que la seconde commande fonctionne, il faut que la Raspberry Pi puisse récupérer des paquetages, donc soit connectée au réseau. En salle E304, vous pouvez connecter votre Raspberry sur la seconde interface réseau d'une Zabeth. Dans le fichier &amp;lt;code&amp;gt;/etc/network/interface&amp;lt;/code&amp;gt; vous pouvez écrire la configuration ci-dessous :&lt;br /&gt;
 auto eth0&lt;br /&gt;
 iface eth0 inet static&lt;br /&gt;
   address 172.26.79.1XX&lt;br /&gt;
   netmask 255.255.240.0&lt;br /&gt;
   gateway 172.26.79.254&lt;br /&gt;
avec &amp;lt;code&amp;gt;XX&amp;lt;/code&amp;gt; le numéro de votre Zabeth. Il faut aussi mettre une adresse de serveur de noms dans le fichier &amp;lt;code&amp;gt;/etc/resolv.conf&amp;lt;/code&amp;gt; :&lt;br /&gt;
 nameserver 193.48.57.34&lt;br /&gt;
Enfin pour que la Raspberry accède aux dépôts de paquetage sur Internet, il faut lui indiquer d'utiliser les serveurs mandataires Web de l'école :&lt;br /&gt;
 export http_proxy=http://proxy.polytech-lille.fr:3128&lt;br /&gt;
Il est normal que la suppression de &amp;lt;code&amp;gt;systemd&amp;lt;/code&amp;gt; retourne une erreur, il faudra relancer la Raspberry pour l'enlever définitivement. Avant cela modifiez le fichier &amp;lt;code&amp;gt;/etc/inittab&amp;lt;/code&amp;gt; et remplacez la ligne&lt;br /&gt;
 #T0:23:respawn:/sbin/getty -L ttyS0 9600 vt100&lt;br /&gt;
par la ligne&lt;br /&gt;
 T0:23:respawn:/sbin/getty -L serial0 115200 vt100&lt;br /&gt;
Après le redémarrage de la Raspberry enlevez définitivement &amp;lt;code&amp;gt;systemd&amp;lt;/code&amp;gt; en tapant à nouveau la commande&lt;br /&gt;
 apt-get purge systemd &lt;br /&gt;
&lt;br /&gt;
== Connexion sur la Raspberry par &amp;lt;code&amp;gt;ssh&amp;lt;/code&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
La connexion sur la Raspberry par série a ses limites : le terminal texte est assez mal géré et à terme la connexion série sera dédié à la communication avec le micro-contrôleur. Maintenant que la Raspberry est configurée sur le réseau, il est souhaitable de s'y connecter en utilisant la commande &amp;lt;code&amp;gt;ssh&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Pour activer le serveur &amp;lt;code&amp;gt;ssh&amp;lt;/code&amp;gt; sur la Raspberry, utilisez les commandes suivantes :&lt;br /&gt;
 update-rc.d ssh enable&lt;br /&gt;
 invoke-rc.d ssh start &lt;br /&gt;
&lt;br /&gt;
Vous pouvez alors vous connecter sur la Raspberry avec la commande :&lt;br /&gt;
 ssh pi@172.26.79.1XX&lt;br /&gt;
Si le message d'erreur à la connexion vous énerve, il vous suffit de rajouter un &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt; devant l'appel de fonction &amp;lt;code&amp;gt;check_hash&amp;lt;/code&amp;gt; à l'avant-dernière ligne du fichier &amp;lt;code&amp;gt;/etc/profile.d/sshpasswd.sh&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Configuration en point d'accès ==&lt;br /&gt;
&lt;br /&gt;
Pour que votre Raspberry Pi 3 devienne un point d'accès, installez le paquetage &amp;lt;code&amp;gt;hostapd&amp;lt;/code&amp;gt; :&lt;br /&gt;
  apt-get install hostapd&lt;br /&gt;
&lt;br /&gt;
Copiez le fichier de configuration de &amp;lt;code&amp;gt;hostapd&amp;lt;/code&amp;gt; qui se trouve dans le répertoire &amp;lt;code&amp;gt;/usr/share/doc/hostapd/examples/&amp;lt;/code&amp;gt; dans le répertoire &amp;lt;code&amp;gt;/etc/hostapd&amp;lt;/code&amp;gt; :&lt;br /&gt;
  cp /usr/share/doc/hostapd/examples/hostapd.conf.gz /etc/hostapd&lt;br /&gt;
  gunzip /etc/hostapd/hostapd.conf.gz&lt;br /&gt;
Examinez le fichier &amp;lt;code&amp;gt;/etc/hostapd/hostapd.conf&amp;lt;/code&amp;gt; à la recherche des mots-clefs suivants :&lt;br /&gt;
* &amp;lt;code&amp;gt;ssid&amp;lt;/code&amp;gt;, indiquez votre nom de réseau WiFi ;&lt;br /&gt;
* &amp;lt;code&amp;gt;country_code&amp;lt;/code&amp;gt;, mettez le code de la France &amp;lt;code&amp;gt;FR&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* &amp;lt;code&amp;gt;channel&amp;lt;/code&amp;gt;, faites en sorte que les Raspberry n'écoutent pas toutes sur le même canal ;&lt;br /&gt;
* &amp;lt;code&amp;gt;wpa&amp;lt;/code&amp;gt;, activez l'option (mettre à 1) ;&lt;br /&gt;
* &amp;lt;code&amp;gt;wpa_passphrase&amp;lt;/code&amp;gt;, donnez le mot de passe de votre réseau (au moins 8 caractères) ;&lt;br /&gt;
* &amp;lt;code&amp;gt;wpa_key_mgmt&amp;lt;/code&amp;gt;, à configurer à la valeur &amp;lt;code&amp;gt;WPA-PSK&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Enfin dans le fichier &amp;lt;code&amp;gt;/etc/default/hostapd&amp;lt;/code&amp;gt;, définissez le chemin du fichier de configuration :&lt;br /&gt;
 DAEMON_CONF=/etc/hostapd/hostapd.conf&lt;br /&gt;
Relancez le service par la commande :&lt;br /&gt;
 service hostapd restart&lt;br /&gt;
&lt;br /&gt;
Vous pouvez vérifier avec votre téléphone que votre réseau WiFi est bien visible.&lt;br /&gt;
&lt;br /&gt;
== Configuration IP des clients WiFi ==&lt;br /&gt;
&lt;br /&gt;
Pour que les clients WiFi puissent obtenir une adresse IP et autres coordonnées réseau, installez le paquetage &amp;lt;code&amp;gt;isc-dhcp-server&amp;lt;/code&amp;gt; :&lt;br /&gt;
  apt-get install isc-dhcp-server&lt;br /&gt;
&lt;br /&gt;
Tout d'abord choisir un réseau IPv4, par exemple &amp;lt;code&amp;gt;192.168.100.0/24&amp;lt;/code&amp;gt; et affecter à la Raspberry une adresse de ce réseau, par exemple &amp;lt;code&amp;gt;192.168.100.1&amp;lt;/code&amp;gt;. Pour cela ajoutez le bloc ci-dessous à la fin du fichier &amp;lt;code&amp;gt;/etc/network/interfaces&amp;lt;/code&amp;gt; :&lt;br /&gt;
 auto wlan0&lt;br /&gt;
 iface wlan0 inet static&lt;br /&gt;
   address 192.168.100.1&lt;br /&gt;
   netmask 255.255.255.0&lt;br /&gt;
&lt;br /&gt;
Il est alors possible de configurer le serveur DHCP au travers de son fichier de configuration &amp;lt;code&amp;gt;/etc/dhcp/dhcpd.conf&amp;lt;/code&amp;gt;. Les directives à modifier sont les suivantes :&lt;br /&gt;
* &amp;lt;code&amp;gt;option domain-name&amp;lt;/code&amp;gt;, spécifiez un nom de domaine de votre choix (&amp;lt;code&amp;gt;monrobot.org&amp;lt;/code&amp;gt; par exemple) ;&lt;br /&gt;
* &amp;lt;code&amp;gt;option domain-name-servers&amp;lt;/code&amp;gt;, spécifiez l'adresse &amp;lt;code&amp;gt;192.168.100.1&amp;lt;/code&amp;gt; comme serveur DNS ;&lt;br /&gt;
* &amp;lt;code&amp;gt;authoritative&amp;lt;/code&amp;gt;, déclarez votre serveur DHCP comme légitime.&lt;br /&gt;
Il faut aussi ajouter un bloc réseau comme celui-ci :&lt;br /&gt;
 subnet 192.168.100.0 netmask 255.255.255.0 {&lt;br /&gt;
   range 192.168.100.100 192.168.100.200;&lt;br /&gt;
   option routers 192.168.100.1;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Relancez le service par la commande :&lt;br /&gt;
 service isc-dhcp-server restart&lt;br /&gt;
Vous devez maintenant pouvoir connecter votre téléphone sur votre réseau WiFi. La bonne connexion au réseau WiFi doit se voir dans le fichier de contrôle &amp;lt;code&amp;gt;/var/log/daemon.log&amp;lt;/code&amp;gt; et l'obtention d'une adresse IP doit se lire dans le fichier &amp;lt;code&amp;gt;/var/log/syslog&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Ajout d'un nom réseau pour la Raspberry Pi ==&lt;br /&gt;
&lt;br /&gt;
A ce point votre téléphone peut contacter la Raspberry par son adresse IP. Pour pouvoir faire de même avec un nom significatif installez le paquetage &amp;lt;code&amp;gt;bind9&amp;lt;/code&amp;gt; :&lt;br /&gt;
  apt-get install bind9&lt;br /&gt;
&lt;br /&gt;
Ajoutez un bloc dans le fichier de configuration &amp;lt;code&amp;gt;/etc/bind/named.conf&amp;lt;/code&amp;gt; :&lt;br /&gt;
 zone &amp;quot;monrobot.org&amp;quot;  {&lt;br /&gt;
   type master;&lt;br /&gt;
   file &amp;quot;/etc/bind/db.monrobot&amp;quot;;&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
Créez le fichier &amp;lt;code&amp;gt;/etc/bind/db.monrobot&amp;lt;/code&amp;gt; avec un contenu de ce type :&lt;br /&gt;
 $TTL    604800&lt;br /&gt;
 @       IN      SOA     localhost. root.localhost. (&lt;br /&gt;
                              2         ; Serial&lt;br /&gt;
                         604800         ; Refresh&lt;br /&gt;
                          86400         ; Retry&lt;br /&gt;
                        2419200         ; Expire&lt;br /&gt;
                         604800 )       ; Negative Cache TTL&lt;br /&gt;
 @       IN      NS      localhost.&lt;br /&gt;
 robot   IN      A       192.168.100.1&lt;br /&gt;
&lt;br /&gt;
Enfin ajoutez en tête du fichier &amp;lt;code&amp;gt;/etc/resolv.conf&amp;lt;/code&amp;gt; la ligne&lt;br /&gt;
 domain monrobot.org&lt;br /&gt;
&lt;br /&gt;
Vous pouvez vérifier le bon fonctionnement du résolveur de nom en tapant &lt;br /&gt;
  host -t any robot 192.168.100.1&lt;br /&gt;
&lt;br /&gt;
== Installation d'un serveur Web ==&lt;br /&gt;
&lt;br /&gt;
La commande du robot doit se faire via une interface Web. Il faut donc installer un serveur Web sur la Raspberry Pi avec un système de page dynamiques pour exécuter du code sur la Raspberry. Il suffit pour cela d'installer les paquetages &amp;lt;code&amp;gt;apache2&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;php5&amp;lt;/code&amp;gt; :&lt;br /&gt;
 apt-get install apache2 php5&lt;br /&gt;
&lt;br /&gt;
Un premier test consiste à donner &amp;lt;code&amp;gt;robot&amp;lt;/code&amp;gt; dans la barre d'adresses du navigateur Web de votre téléphone. La page de test du serveur Web &amp;lt;code&amp;gt;apache2&amp;lt;/code&amp;gt; doit s'afficher.&lt;br /&gt;
&lt;br /&gt;
Vous pouvez aussi écrire une petite page permettant d'effectuer une action comme l'arrêt de la Raspberry Pi. Cette page est à mettre dans le répertoire &amp;lt;code&amp;gt;/var/www/html&amp;lt;/code&amp;gt;. Voila un exemple de page PHP, nommez la &amp;lt;code&amp;gt;index.php&amp;lt;/code&amp;gt; et supprimez le fichier &amp;lt;code&amp;gt;index.html&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;?php&lt;br /&gt;
 if(array_key_exists('stop',$_POST)){ &lt;br /&gt;
   system('super halt');&lt;br /&gt;
   die('halting ...');&lt;br /&gt;
   }&lt;br /&gt;
 ?&amp;gt;&lt;br /&gt;
 &amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
 &amp;lt;html&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
   &amp;lt;meta http-equiv=&amp;quot;Content-Type&amp;quot; content=&amp;quot;text/html; charset=UTF-8&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;title&amp;gt;Contrôle Web&amp;lt;/title&amp;gt;&lt;br /&gt;
  &amp;lt;/head&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;&lt;br /&gt;
   &amp;lt;form method=&amp;quot;POST&amp;quot; action=&amp;quot;&amp;lt;?php echo $_SERVER['PHP_SELF']; ?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;stop&amp;quot; value=&amp;quot;Arrêter&amp;quot;/&amp;gt;&lt;br /&gt;
   &amp;lt;/form&amp;gt;&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
 &amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notez l'appel de fonction &amp;lt;code&amp;gt;system('super halt')&amp;lt;/code&amp;gt;. Pour que cet appel ait l'effet désiré, c'est à dire l'arrêt propre de la Raspberry Pi, il faut que le serveur Web puisse déclencher cet arrêt. De base, ce n'est pas possible pour une raison de droits : l'utilisateur &amp;lt;code&amp;gt;www-data&amp;lt;/code&amp;gt; sous lequel tourne le serveur &amp;lt;code&amp;gt;apache2&amp;lt;/code&amp;gt; n'a pas le privilège de lancer la commande &amp;lt;code&amp;gt;halt&amp;lt;/code&amp;gt;. Nous allons donc utiliser l'utilitaire &amp;lt;code&amp;gt;super&amp;lt;/code&amp;gt; pour autoriser le serveur Web à lancer la commande :&lt;br /&gt;
  apt-get install super&lt;br /&gt;
Ajoutez ensuite la ligne ci-dessous à la fin fichier de configuration de &amp;lt;code&amp;gt;super&amp;lt;/code&amp;gt; qui se nomme &amp;lt;code&amp;gt;/etc/super.tab&amp;lt;/code&amp;gt; :&lt;br /&gt;
 halt    /sbin/halt      uid=root        www-data&lt;br /&gt;
&lt;br /&gt;
Voila, vous devriez pouvoir arrêter votre Raspberry Pi en cliquant sur le bouton &amp;quot;Arrêter&amp;quot; de votre page Web.&lt;br /&gt;
&lt;br /&gt;
== Communication série ==&lt;br /&gt;
&lt;br /&gt;
Votre Raspberry Pi va probablement devoir communiquer avec un micro-contrôleur. Le plus simple est d'établir une communication série. Par contre les pages Web dynamiques peuvent difficilement utiliser le port série étant donné leur durée de vie, c'est à dire d'exécution, limitée. La solution propre pour permettre à des pages Web d'utiliser un port série est de passer par un serveur websocket. Ce type de processus est lancé au démarrage de la machine et accapare le port série. L'intérêt est que le serveur websocket est facilement contactable par un programma javascript tournant sur le navigateur.&lt;br /&gt;
&lt;br /&gt;
Sur votre Raspberry, vous devez installer le paquetage &amp;lt;code&amp;gt;libwebsockets-dev&amp;lt;/code&amp;gt; :&lt;br /&gt;
 apt-get install libwebsockets-dev&lt;br /&gt;
Récupérez ensuite le programme C stocké sur ce Wiki [[Fichier:Webserial.zip‎]]. Décompressez-le et compilez-le avec la commande :&lt;br /&gt;
  gcc -Wall webserial.c -o webserial -lwebsockets&lt;br /&gt;
Vous pouvez faire en sorte que ce programme soit lancé dès le démarrage de la Raspberry Pi en modifiant le fichier &amp;lt;code&amp;gt;/etc/rc.local&amp;lt;/code&amp;gt;. Pensez à préciser le chemin complet du programme et à suffixer par un &amp;amp; pour que le programme soit lancé en tâche de fond.&lt;br /&gt;
&lt;br /&gt;
Avec notre serveur websocket nous pouvons implanter des protocoles simples. L'exemple qui suit permet d'allumer et d'éteindre des LEDs connectées à un Arduino et à savoir quels boutons sont pressés. Pour les LEDs, le numéro de la LED à gérer est donné par les 7 bits de poids faible et le bit de poids fort permet de savoir s'il faut l'allumer ou l'éteindre. Pour les boutons, un octet est envoyé par l'Arduino dont chaque bit indique si le bouton est appuyé ou non.&lt;br /&gt;
&lt;br /&gt;
Le programme de l'Arduino est très court :&lt;br /&gt;
 #define LED1       8&lt;br /&gt;
 #define Bouton1    2&lt;br /&gt;
 #define Bouton2    3&lt;br /&gt;
 &lt;br /&gt;
 void setup(void){&lt;br /&gt;
 Serial.begin(9600);&lt;br /&gt;
 for(int i=0;i&amp;lt;6;i++) pinMode(LED1+i,OUTPUT);&lt;br /&gt;
 pinMode(Bouton1,INPUT);&lt;br /&gt;
 pinMode(Bouton2,INPUT);&lt;br /&gt;
 digitalWrite(Bouton1,HIGH);&lt;br /&gt;
 digitalWrite(Bouton2,HIGH);&lt;br /&gt;
 for(int i=0;i&amp;lt;6;i++){&lt;br /&gt;
     digitalWrite(LED1+i,HIGH);&lt;br /&gt;
     delay(200);&lt;br /&gt;
     digitalWrite(LED1+i,LOW);&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void loop(void){&lt;br /&gt;
 if(Serial.available()&amp;gt;0){&lt;br /&gt;
   unsigned char actions=Serial.read();&lt;br /&gt;
   int led=LED1+actions&amp;amp;0x7f;&lt;br /&gt;
   if((actions&amp;amp;0x80)==0) digitalWrite(led,HIGH); else digitalWrite(led,LOW);&lt;br /&gt;
 }&lt;br /&gt;
 unsigned char capteurs=0;&lt;br /&gt;
 if(digitalRead(Bouton1)==LOW) capteurs |= 0x01;&lt;br /&gt;
 if(digitalRead(Bouton2)==LOW) capteurs |= 0x02;&lt;br /&gt;
 Serial.write(capteurs);&lt;br /&gt;
 delay(100);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
La page Web qui dialogue avec le serveur websocket encore plus courte est disponible sur ce Wiki [[Fichier:Jsserial.zip]].&lt;br /&gt;
&lt;br /&gt;
= Répartition des tâches =&lt;br /&gt;
&lt;br /&gt;
Nous n'imposons pas de répartition rigide des tâches. Pour qu'une démonstration puisse se faire en fin de bureau d'étude il faut au moins un robot proie et un robot prédateur.&lt;br /&gt;
&lt;br /&gt;
== Robot proie ==&lt;br /&gt;
&lt;br /&gt;
Un robot proie est constitué comme suit :&lt;br /&gt;
* un châssis roulant, un contrôleur pour chaque paire de moteurs, un Arduino Uno ou un circuit électronique maison à base de micro-contrôleur ATMega328p ;&lt;br /&gt;
* des détecteurs ultrason pour éviter les collisions ;&lt;br /&gt;
* un récepteur infra-rouge TSOP pour décoder les signaux infra-rouges modulés ;&lt;br /&gt;
* un émetteur infra-rouge pour émettre un signal signalant le robot comme une proie ;&lt;br /&gt;
* un dispositif récepteur à courte distance pour simuler la capture par un prédateur, vous pouvez partir sur l'idée d'un capteur à effet Hall.&lt;br /&gt;
&lt;br /&gt;
Dans son mode autonome, le robot se promène dans la pièce en évitant les obstacles de façon tranquille et prévisible. Quand il repère un prédateur à son signal infra-rouge, la proie se déplace plus vivement avec de brusques changements de direction. Quand le détecteur à courte distance indique que le robot proie est à portée du prédateur, il s'arrête. Faire clignoter des LED rouges serait assez à propos. &lt;br /&gt;
&lt;br /&gt;
Vous pouvez ajouter un mode télécommande au robot. La modification la plus simple consiste à recevoir des ordres d'une télécommande infra-rouge. Le robot pourrait ainsi recevoir des ordres pour accélèrer ou décélérer, pour tourner tranquillement ou brusquement.&lt;br /&gt;
&lt;br /&gt;
Pour aller plus loin vous pouvez équiper votre robot d'une Raspberry PI 3 communiquant avec la carte de contrôle en série. Le robot peut alors être téléguidé par un téléphone.&lt;br /&gt;
&lt;br /&gt;
== Robot prédateur ==&lt;br /&gt;
&lt;br /&gt;
Un robot prédateur est constitué comme suit :&lt;br /&gt;
* un châssis roulant, un contrôleur pour chaque paire de moteurs, un Arduino Uno ou un circuit électronique maison à base de micro-contrôleur ATMega328p ;&lt;br /&gt;
* un détecteur ultrason pour ne pas rentrer dans les obstacles ;&lt;br /&gt;
* des récepteurs infra-rouges TSOP pour décoder les signaux infra-rouges modulés ;&lt;br /&gt;
* un émetteur infra-rouge pour émettre un signal signalant le robot comme un prédateur ;&lt;br /&gt;
* un dispositif émetteur à courte distance pour simuler la capture d'une proie, par exemple un électro-aimant.&lt;br /&gt;
&lt;br /&gt;
Dans son mode autonome, le robot tourne en rond à la recherche d'une proie. Dès qu'il en repère une, il se précipite vers elle en se calant sur son signal infra-rouge. Quand le prédateur pense être à porté de la proie, il active la communication à faible portée. Cette activation est temporaire pour donner une chance à la proie de s'échapper.&lt;br /&gt;
&lt;br /&gt;
Vous pouvez ajouter un mode télécommande au robot. La modification la plus simple consiste à recevoir des ordres d'une télécommande infra-rouge. Le robot pourrait ainsi recevoir des ordres de direction, de vitesse et d'activation de la communication &amp;quot;capture&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Pour aller plus loin vous pouvez équiper votre robot d'une Raspberry PI 3 communiquant avec la carte de contrôle en série. Le robot peut alors être téléguidé par un téléphone.&lt;br /&gt;
&lt;br /&gt;
== Réalisations des binômes ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Numéro !! Elèves !! Type de robot !! Page&lt;br /&gt;
|-&lt;br /&gt;
| Binôme 1&lt;br /&gt;
| Prénom Nom / Prénom Nom&lt;br /&gt;
| &lt;br /&gt;
| [[Binome2017-1|Binôme 1 2017/2018]]&lt;br /&gt;
|-&lt;br /&gt;
| Binôme 2&lt;br /&gt;
| Prénom Nom / Prénom Nom&lt;br /&gt;
| &lt;br /&gt;
| [[Binome2017-2|Binôme 2 2017/2018]]&lt;br /&gt;
|-&lt;br /&gt;
| Binôme 3&lt;br /&gt;
| Prénom Nom / Prénom Nom&lt;br /&gt;
| &lt;br /&gt;
| [[Binome2017-3|Binôme 3 2017/2018]]&lt;br /&gt;
|-&lt;br /&gt;
| Binôme 4&lt;br /&gt;
| Prénom Nom / Prénom Nom&lt;br /&gt;
| &lt;br /&gt;
| [[Binome2017-4|Binôme 4 2017/2018]]&lt;br /&gt;
|-&lt;br /&gt;
| Binôme 5&lt;br /&gt;
| Prénom Nom / Prénom Nom&lt;br /&gt;
| &lt;br /&gt;
| [[Binome2017-5|Binôme 5 2017/2018]]&lt;br /&gt;
|-&lt;br /&gt;
| Binôme 6&lt;br /&gt;
| Prénom Nom / Prénom Nom&lt;br /&gt;
| &lt;br /&gt;
| [[Binome2017-6|Binôme 6 2017/2018]]&lt;br /&gt;
|-&lt;br /&gt;
| Binôme 7&lt;br /&gt;
| Prénom Nom / Prénom Nom&lt;br /&gt;
| &lt;br /&gt;
| [[Binome2017-7|Binôme 7 2017/2018]]&lt;br /&gt;
|-&lt;br /&gt;
| Binôme 8&lt;br /&gt;
| Prénom Nom / Prénom Nom&lt;br /&gt;
| &lt;br /&gt;
| [[Binome2017-8|Binôme 8 2017/2018]]&lt;br /&gt;
|-&lt;br /&gt;
| Binôme 9&lt;br /&gt;
| Raphaël Bonvalet / Damien Tillaux&lt;br /&gt;
| Proie&lt;br /&gt;
| [[Binome2017-9|Binôme 9 2017/2018]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Dtillaux</name></author>	</entry>

	<entry>
		<id>https://peip-ima.plil.fr/mediawiki/index.php?title=BE_2017-2018&amp;diff=8575</id>
		<title>BE 2017-2018</title>
		<link rel="alternate" type="text/html" href="https://peip-ima.plil.fr/mediawiki/index.php?title=BE_2017-2018&amp;diff=8575"/>
				<updated>2018-01-15T08:55:13Z</updated>
		
		<summary type="html">&lt;p&gt;Dtillaux : /* Réalisations des binômes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Objectif à atteindre =&lt;br /&gt;
&lt;br /&gt;
Le thème de la saison 8 est la réalisation de robots communicant sur le modèle proies et prédateurs.&lt;br /&gt;
&lt;br /&gt;
Les prédateurs doivent repérer et rattraper des proies. Pour toute la partie identification et poursuite, une interaction par signal infra-rouge modulé est préconisée. Les proies émettent un signal propre à leur condition et sont ainsi identifiées par les prédateurs. Les prédateurs possèdent un système de réception infra-rouge directionnel permettant de s'orienter dans la phase de poursuite. Les prédateurs émettent aussi un signal infra-rouge permettant ainsi aux proies de savoir qu'elles sont prises en chasse. Pour simuler la capture de la proie, la conception d'un système de communication à très faible distance est laissé à la sagacité des élèves.&lt;br /&gt;
&lt;br /&gt;
Les proies comme les prédateurs peuvent être autonomes ou télécommandés. Pour le mode de télécommande deux solutions sont envisagées : utilisation d'une télécommande infra-rouge ou utilisation d'un téléphone intelligent. Pour la dernière solution, il est nécessaire d'embarquer une Raspberry Pi 3 sur le robot.&lt;br /&gt;
&lt;br /&gt;
La taille du robot n'est pas fixé. Vous pouvez envisager des robots miniatures d'une dizaine de centimètres de coté.&lt;br /&gt;
 &lt;br /&gt;
= Matériel à votre disposition pour les robots =&lt;br /&gt;
&lt;br /&gt;
Votre robot doit pouvoir réaliser les actions suivantes :&lt;br /&gt;
* avancer et reculer le tout en tournant éventuellement ;&lt;br /&gt;
* émettre des signaux infra-rouges pulsés ;&lt;br /&gt;
* décoder des signaux infra-rouges pulsés ;&lt;br /&gt;
* détecter des obstacles sur son chemin.&lt;br /&gt;
&lt;br /&gt;
Nous vous imposons de construire ce robot à base de micro-contrôleur ATMega. Par contre nous vous laissons le choix de la variante. Les possibilités sont classées de la plus simple à la plus complexe.&lt;br /&gt;
* Vous pouvez partir d'un des robots construits lors des saisons précédentes. Ces robots ne sont pas forcément totalement fonctionnels mais les parties déjà réalisées peuvent vous faire gagner du temps que vous pourrez consacrer à la programmation du robot.&lt;br /&gt;
* Vous pouvez construire un robot à partir d'un des deux chassis proposés, utiliser un Arduino Mega et concevoir un bouclier pour cet Arduino comportant des emplacements pour les divers composants nécessaires (contrôleur moteur, détecteur ultrason, LED infra-rouge, récepteur infra-rouge TSOP, etc).&lt;br /&gt;
* Vous pouvez aussi fabriquer votre propre chassis avec deux plaques de plexiglass produites par la découpeuse laser ou avec une structure imprimée en 3D. Il ne reste plus qu'à intégrer à ce chassis deux moto-réducteurs et leurs roues ainsi qu'une roue folle. Pour le micro-contrôleur vous pouvez aussi vous passer de l'Arduino Mega et concevoir votre propre circuit intégré à base de micro-contrôleur ATMega328p et d'un contrôleur moteurs TB6612FNG. Seul le sonar ultrason est trop complexe pour être conçu à partir des composants de base.&lt;br /&gt;
* Si vous aimez les défis vous pouvez aussi construire un robot avec un moto-réducteur de meilleure qualité ou avec une carte électronique réalisée uniquement avec des composants électroniques de surface. Vous pouvez même construire un robot miniature.&lt;br /&gt;
&lt;br /&gt;
Les montages photographiques ci-dessous présentent les éléments permettant de construire un robot sans trop souffrir et les composants de base pour construire un robot plus optimisé et personnalisé.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:robot-kit-2018.jpg|300px|thumb|left|Chassis, Arduino Mega, récepteur infra-rouge, sonar, contrôleur moteurs]]&lt;br /&gt;
[[Fichier:robot-composant-2018.jpg|300px|thumb|right|Moto-réducteurs et roues, micro-contrôleurs ATMega328p et quartz, contrôleur de moteurs TB6612FNG, LED infra-rouge]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Des robots miniatures peuvent être réalisés en utilisant des servo-moteurs continus et des pièces en plexiglas ou en contreplaqué découpées à l'aide de la découpeuse laser du [http://www.fabricarium.fr/mediawiki-1.23.5/index.php?title=Accueil Fabricarium]. Certaines formes plus complexes peuvent éventuellement être réalisées à l'aide des imprimantes 3D du [http://www.fabricarium.fr/mediawiki-1.23.5/index.php?title=Accueil Fabricarium]. Il est possible d'imprimer des pneus avec du PLA flexible.&lt;br /&gt;
Pour les fixations vous avez de la visserie (vis, écrous, entretoises).&lt;br /&gt;
&lt;br /&gt;
= Logiciels à utiliser =&lt;br /&gt;
&lt;br /&gt;
Pour concevoir un schéma propre du câblage de votre robot vous pouvez utiliser [http://fritzing.org/home/ fritzing]. Tous les composants de votre robot ne sont pas modélisés dans fritzing. Voici une liste de composants supplémentaires mis au points par des élèves IMA de la promotion 2017 (Julie Debock, Hugo Vandenbunder et Sylvain Verdonck) et revus par les encadrants du bureau d'études :&lt;br /&gt;
* détecteur ultrason : [[Fichier:UltrasonicSensor_HCSR04.zip]]&lt;br /&gt;
* contrôleur de moteurs : [[Fichier:MotorDriver_Pololu_md08a.zip]]&lt;br /&gt;
&lt;br /&gt;
Pour la conception de circuits imprimés nous vous recommandons le logiciel [http://www.cadsoftusa.com/download-eagle/freeware/ eagle] ou le précédent.&lt;br /&gt;
&lt;br /&gt;
Pour la découpe laser de nombreux utilisateurs utilisent [https://inkscape.org/fr/ inkscape].&lt;br /&gt;
&lt;br /&gt;
Pour la conception 3D solidwork est très utilisé. Vous pouvez tenter [http://www.freecadweb.org/?lang=fr_FR freeCAD] si vous cherchez un logiciel plus libre. Une solution en ligne existe : [https://www.onshape.com/ onshape].&lt;br /&gt;
&lt;br /&gt;
Pour le développement avec les plateformes Arduino, utilisez l'environnement du même nom. Si la programmation C++ vous fait peur, n'hésitez pas à ajouter l'outil [http://sourceforge.net/projects/ardublock/ ardublock] à cet environnement.&lt;br /&gt;
&lt;br /&gt;
Pour vous aider dans la conception des circuits imprimés nous vous proposons des circuits modélisés avec fritzing que vous pourrez adapter à vos robots. Ces circuits ont été ébauchés par des élèves IMA et retouchés par les encadrants du bureau d'études.&lt;br /&gt;
&lt;br /&gt;
Un premier circuit de type bouclier Arduino permet d'éviter tous les câbles entre l'Arduino et les contrôleurs de moteurs : [[Fichier:robot_bouclier.zip]]. Ce circuit est prévu pour 4 moteurs, les binômes avec des chassis bi-moteurs devront le simplifier. Après téléchargement, prenez soin de modifier le suffixe &amp;lt;code&amp;gt;.zip&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;.fzz&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;gallery style=&amp;quot;margin: 0 auto;&amp;quot;&amp;gt;&lt;br /&gt;
Fichier:robot_bouclier_bb.png|Bouclier : plaque d'essai&lt;br /&gt;
Fichier:robot_bouclier_schem.png|Bouclier : schéma&lt;br /&gt;
Fichier:robot_bouclier_pcb.png|Bouclier : circuit imprimé&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Un second circuit permet de se passer totalement d'un Arduino : [[Fichier:RobotPCB.zip]]. Le coeur de la carte est un micro-contrôleur ATMega328p comme sur l'Arduino. La plupart des capteurs et actionneurs nécessaires à vos robots sont présents sur la carte. Après téléchargement, prenez soin de modifier le suffixe &amp;lt;code&amp;gt;.zip&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;.fzz&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;gallery style=&amp;quot;margin: 0 auto;&amp;quot;&amp;gt;&lt;br /&gt;
Fichier:RobotPCB_bb.png|Contrôleur : plaque d'essai&lt;br /&gt;
Fichier:RobotPCB_schem.png|Contrôleur : schéma&lt;br /&gt;
Fichier:RobotPCB_pcb.png|Contrôleur : circuit imprimé&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Configuration du système embarqué =&lt;br /&gt;
&lt;br /&gt;
Pour contrôler les robots télécommandés vous utiliserez un ordinateur miniature Raspberry Pi 3. Cet ordinateur doit être configuré comme un point d'accès WiFi pour permettre une connexion à partir d'un téléphone intelligent.&lt;br /&gt;
&lt;br /&gt;
Il existe au moins deux méthode de se connecter sur la Raspberry PI 3 pour la configurer. La première méthode est la méthode &amp;quot;grand public&amp;quot; en utilisant la carte graphique intégrée sur la Raspberry et en lui connectant écran, clavier et souris. La seconde méthode est plus spartiate et traditionnellement utilisée dans le monde des systèmes embarqués : la connexion par liaison série.&lt;br /&gt;
&lt;br /&gt;
== Connexion série ==&lt;br /&gt;
&lt;br /&gt;
Vous êtes de futurs ingénieurs, la méthode &amp;quot;liaison série&amp;quot; est à votre portée et vous pourrez l'employer pour d'autres dispositifs. Vous allez commencer par récupérer la dernière version de la distribution Linux pour Raspberry Pi. Comme nous n'avons pas besoin de l'interface graphique, il est préférable de choisir la distribution &amp;quot;Raspbian Jessie Lite&amp;quot; plus légère en terme d'espace disque. La configuration décrite ci-après a été effectuée sur la version du 2017-01-11.&lt;br /&gt;
&lt;br /&gt;
Une fois l'archive zippée de la distribution récupérée vous pouvez l'installer sur la carte SD après l'avoir décompressée en utilisant la commande &amp;lt;code&amp;gt;dd&amp;lt;/code&amp;gt; :&lt;br /&gt;
 dd if=2017-01-11-raspbian-jessie-lite.img of=/dev/sdb&lt;br /&gt;
Le nom du périphérique &amp;lt;code&amp;gt;/dev/sdb&amp;lt;/code&amp;gt; peut varier suivant votre machine, vous pouvez lister les noms des périphériques blocs avec la commande &amp;lt;code&amp;gt;lsblk&amp;lt;/code&amp;gt;. Exécutez cette commande avant et après l'insertion de votre carte SD et vous aurez le nom utilisé par votre système.&lt;br /&gt;
&lt;br /&gt;
Avant de démarrer la Raspberry Pi 3 sur cette carte SD, vous devez modifier quelques paramètres de démarrage. En effet sur les dernières version de la distribution raspbian, la connexion série a été laissée de coté. Plusieurs explications à cela : la Raspberry vise plus le marché du jouet grand public que celui du système embarqué, de plus la Raspberry Pi 3 intégre maintenant une interface bluetooth disponible via le port série principal. Il est cependant possible d'utiliser le second port série désigné sous le nom de périphérique &amp;lt;code&amp;gt;/dev/serial0&amp;lt;/code&amp;gt;. Montez la première partition de votre carte SD Raspian Lite avec la commande&lt;br /&gt;
 mount /dev/sdb1 /mnt&lt;br /&gt;
puis examinez les fichiers &amp;lt;code&amp;gt;cmdline.txt&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;config.txt&amp;lt;/code&amp;gt;. Attention le nom de la partition n'est pas forcément &amp;lt;code&amp;gt;/dev/sdb1&amp;lt;/code&amp;gt;, utilisez &amp;lt;code&amp;gt;lsblk&amp;lt;/code&amp;gt; pour déterminer le nom de la première partition de votre carte SD sur votre machine. Vérifiez que l'option &amp;lt;code&amp;gt;console=serial0,115200&amp;lt;/code&amp;gt; est bien présente dans la ligne du fichier &amp;lt;code&amp;gt;cmdline.txt&amp;lt;/code&amp;gt; et ajoutez &amp;lt;code&amp;gt;enable_uart=1&amp;lt;/code&amp;gt; à la fin du fichier &amp;lt;code&amp;gt;config.txt&amp;lt;/code&amp;gt;. N'oubliez pas de libérer votre carte SD par la commande&lt;br /&gt;
 umount /mnt&lt;br /&gt;
&lt;br /&gt;
Vous pouvez ensuite insérer la carte SD dans la Raspberry Pi. Utilisez le câble USB/série pour connecter votre Raspberry à votre PC. Il faut enficher les câbles noir, blanc et vert du câble USB/série [https://www.adafruit.com/product/954] sur les entrées/sorties correspondantes de la Raspberry [https://pinout.xyz/]. Le câble noir doit être sur la broche 6, le câble blanc sur la broche 8 et le câble vert sur la broche 10. Alimentez votre Raspberry Pi et lancez la commande suivante sur votre PC &lt;br /&gt;
 minicom -o -8 -b 115200 -D /dev/ttyUSB0&lt;br /&gt;
Vous devez obtenir, in fine, l'invite de connexion de la Raspberry&lt;br /&gt;
 Raspbian GNU/Linux 8 raspberrypi ttyS0&lt;br /&gt;
  &lt;br /&gt;
 raspberrypi login:&lt;br /&gt;
Vous pouvez vous connecter avec l'identifiant &amp;lt;code&amp;gt;pi&amp;lt;/code&amp;gt; et le mot de passe &amp;lt;code&amp;gt;raspberry&amp;lt;/code&amp;gt;. Pour passer administrateur utilisez la commande &amp;lt;code&amp;gt;sudo su&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Mise à jour de la distribution ==&lt;br /&gt;
&lt;br /&gt;
La distribution Raspbian vient avec le système de démarrage &amp;lt;code&amp;gt;systemd&amp;lt;/code&amp;gt;. Ce système n'est pas forcément adapté à l'usage que nous souhaitons faire de la Raspberry : utilisation en tant que système embarqué et manipulation en mode texte. Il est assez simple de supprimer, en tant qu'administrateur, le paquetage &amp;lt;code&amp;gt;systemd&amp;lt;/code&amp;gt; ainsi que deux autres paquetages qui tentent de gérer automatiquement la configuration réseau &amp;lt;code&amp;gt;dhcpcd5&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;openresolv&amp;lt;/code&amp;gt; :&lt;br /&gt;
 apt-get purge dhcpcd5 openresolv &lt;br /&gt;
 apt-get purge systemd &lt;br /&gt;
Attention pour que la seconde commande fonctionne, il faut que la Raspberry Pi puisse récupérer des paquetages, donc soit connectée au réseau. En salle E304, vous pouvez connecter votre Raspberry sur la seconde interface réseau d'une Zabeth. Dans le fichier &amp;lt;code&amp;gt;/etc/network/interface&amp;lt;/code&amp;gt; vous pouvez écrire la configuration ci-dessous :&lt;br /&gt;
 auto eth0&lt;br /&gt;
 iface eth0 inet static&lt;br /&gt;
   address 172.26.79.1XX&lt;br /&gt;
   netmask 255.255.240.0&lt;br /&gt;
   gateway 172.26.79.254&lt;br /&gt;
avec &amp;lt;code&amp;gt;XX&amp;lt;/code&amp;gt; le numéro de votre Zabeth. Il faut aussi mettre une adresse de serveur de noms dans le fichier &amp;lt;code&amp;gt;/etc/resolv.conf&amp;lt;/code&amp;gt; :&lt;br /&gt;
 nameserver 193.48.57.34&lt;br /&gt;
Enfin pour que la Raspberry accède aux dépôts de paquetage sur Internet, il faut lui indiquer d'utiliser les serveurs mandataires Web de l'école :&lt;br /&gt;
 export http_proxy=http://proxy.polytech-lille.fr:3128&lt;br /&gt;
Il est normal que la suppression de &amp;lt;code&amp;gt;systemd&amp;lt;/code&amp;gt; retourne une erreur, il faudra relancer la Raspberry pour l'enlever définitivement. Avant cela modifiez le fichier &amp;lt;code&amp;gt;/etc/inittab&amp;lt;/code&amp;gt; et remplacez la ligne&lt;br /&gt;
 #T0:23:respawn:/sbin/getty -L ttyS0 9600 vt100&lt;br /&gt;
par la ligne&lt;br /&gt;
 T0:23:respawn:/sbin/getty -L serial0 115200 vt100&lt;br /&gt;
Après le redémarrage de la Raspberry enlevez définitivement &amp;lt;code&amp;gt;systemd&amp;lt;/code&amp;gt; en tapant à nouveau la commande&lt;br /&gt;
 apt-get purge systemd &lt;br /&gt;
&lt;br /&gt;
== Connexion sur la Raspberry par &amp;lt;code&amp;gt;ssh&amp;lt;/code&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
La connexion sur la Raspberry par série a ses limites : le terminal texte est assez mal géré et à terme la connexion série sera dédié à la communication avec le micro-contrôleur. Maintenant que la Raspberry est configurée sur le réseau, il est souhaitable de s'y connecter en utilisant la commande &amp;lt;code&amp;gt;ssh&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Pour activer le serveur &amp;lt;code&amp;gt;ssh&amp;lt;/code&amp;gt; sur la Raspberry, utilisez les commandes suivantes :&lt;br /&gt;
 update-rc.d ssh enable&lt;br /&gt;
 invoke-rc.d ssh start &lt;br /&gt;
&lt;br /&gt;
Vous pouvez alors vous connecter sur la Raspberry avec la commande :&lt;br /&gt;
 ssh pi@172.26.79.1XX&lt;br /&gt;
Si le message d'erreur à la connexion vous énerve, il vous suffit de rajouter un &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt; devant l'appel de fonction &amp;lt;code&amp;gt;check_hash&amp;lt;/code&amp;gt; à l'avant-dernière ligne du fichier &amp;lt;code&amp;gt;/etc/profile.d/sshpasswd.sh&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Configuration en point d'accès ==&lt;br /&gt;
&lt;br /&gt;
Pour que votre Raspberry Pi 3 devienne un point d'accès, installez le paquetage &amp;lt;code&amp;gt;hostapd&amp;lt;/code&amp;gt; :&lt;br /&gt;
  apt-get install hostapd&lt;br /&gt;
&lt;br /&gt;
Copiez le fichier de configuration de &amp;lt;code&amp;gt;hostapd&amp;lt;/code&amp;gt; qui se trouve dans le répertoire &amp;lt;code&amp;gt;/usr/share/doc/hostapd/examples/&amp;lt;/code&amp;gt; dans le répertoire &amp;lt;code&amp;gt;/etc/hostapd&amp;lt;/code&amp;gt; :&lt;br /&gt;
  cp /usr/share/doc/hostapd/examples/hostapd.conf.gz /etc/hostapd&lt;br /&gt;
  gunzip /etc/hostapd/hostapd.conf.gz&lt;br /&gt;
Examinez le fichier &amp;lt;code&amp;gt;/etc/hostapd/hostapd.conf&amp;lt;/code&amp;gt; à la recherche des mots-clefs suivants :&lt;br /&gt;
* &amp;lt;code&amp;gt;ssid&amp;lt;/code&amp;gt;, indiquez votre nom de réseau WiFi ;&lt;br /&gt;
* &amp;lt;code&amp;gt;country_code&amp;lt;/code&amp;gt;, mettez le code de la France &amp;lt;code&amp;gt;FR&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* &amp;lt;code&amp;gt;channel&amp;lt;/code&amp;gt;, faites en sorte que les Raspberry n'écoutent pas toutes sur le même canal ;&lt;br /&gt;
* &amp;lt;code&amp;gt;wpa&amp;lt;/code&amp;gt;, activez l'option (mettre à 1) ;&lt;br /&gt;
* &amp;lt;code&amp;gt;wpa_passphrase&amp;lt;/code&amp;gt;, donnez le mot de passe de votre réseau (au moins 8 caractères) ;&lt;br /&gt;
* &amp;lt;code&amp;gt;wpa_key_mgmt&amp;lt;/code&amp;gt;, à configurer à la valeur &amp;lt;code&amp;gt;WPA-PSK&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Enfin dans le fichier &amp;lt;code&amp;gt;/etc/default/hostapd&amp;lt;/code&amp;gt;, définissez le chemin du fichier de configuration :&lt;br /&gt;
 DAEMON_CONF=/etc/hostapd/hostapd.conf&lt;br /&gt;
Relancez le service par la commande :&lt;br /&gt;
 service hostapd restart&lt;br /&gt;
&lt;br /&gt;
Vous pouvez vérifier avec votre téléphone que votre réseau WiFi est bien visible.&lt;br /&gt;
&lt;br /&gt;
== Configuration IP des clients WiFi ==&lt;br /&gt;
&lt;br /&gt;
Pour que les clients WiFi puissent obtenir une adresse IP et autres coordonnées réseau, installez le paquetage &amp;lt;code&amp;gt;isc-dhcp-server&amp;lt;/code&amp;gt; :&lt;br /&gt;
  apt-get install isc-dhcp-server&lt;br /&gt;
&lt;br /&gt;
Tout d'abord choisir un réseau IPv4, par exemple &amp;lt;code&amp;gt;192.168.100.0/24&amp;lt;/code&amp;gt; et affecter à la Raspberry une adresse de ce réseau, par exemple &amp;lt;code&amp;gt;192.168.100.1&amp;lt;/code&amp;gt;. Pour cela ajoutez le bloc ci-dessous à la fin du fichier &amp;lt;code&amp;gt;/etc/network/interfaces&amp;lt;/code&amp;gt; :&lt;br /&gt;
 auto wlan0&lt;br /&gt;
 iface wlan0 inet static&lt;br /&gt;
   address 192.168.100.1&lt;br /&gt;
   netmask 255.255.255.0&lt;br /&gt;
&lt;br /&gt;
Il est alors possible de configurer le serveur DHCP au travers de son fichier de configuration &amp;lt;code&amp;gt;/etc/dhcp/dhcpd.conf&amp;lt;/code&amp;gt;. Les directives à modifier sont les suivantes :&lt;br /&gt;
* &amp;lt;code&amp;gt;option domain-name&amp;lt;/code&amp;gt;, spécifiez un nom de domaine de votre choix (&amp;lt;code&amp;gt;monrobot.org&amp;lt;/code&amp;gt; par exemple) ;&lt;br /&gt;
* &amp;lt;code&amp;gt;option domain-name-servers&amp;lt;/code&amp;gt;, spécifiez l'adresse &amp;lt;code&amp;gt;192.168.100.1&amp;lt;/code&amp;gt; comme serveur DNS ;&lt;br /&gt;
* &amp;lt;code&amp;gt;authoritative&amp;lt;/code&amp;gt;, déclarez votre serveur DHCP comme légitime.&lt;br /&gt;
Il faut aussi ajouter un bloc réseau comme celui-ci :&lt;br /&gt;
 subnet 192.168.100.0 netmask 255.255.255.0 {&lt;br /&gt;
   range 192.168.100.100 192.168.100.200;&lt;br /&gt;
   option routers 192.168.100.1;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Relancez le service par la commande :&lt;br /&gt;
 service isc-dhcp-server restart&lt;br /&gt;
Vous devez maintenant pouvoir connecter votre téléphone sur votre réseau WiFi. La bonne connexion au réseau WiFi doit se voir dans le fichier de contrôle &amp;lt;code&amp;gt;/var/log/daemon.log&amp;lt;/code&amp;gt; et l'obtention d'une adresse IP doit se lire dans le fichier &amp;lt;code&amp;gt;/var/log/syslog&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Ajout d'un nom réseau pour la Raspberry Pi ==&lt;br /&gt;
&lt;br /&gt;
A ce point votre téléphone peut contacter la Raspberry par son adresse IP. Pour pouvoir faire de même avec un nom significatif installez le paquetage &amp;lt;code&amp;gt;bind9&amp;lt;/code&amp;gt; :&lt;br /&gt;
  apt-get install bind9&lt;br /&gt;
&lt;br /&gt;
Ajoutez un bloc dans le fichier de configuration &amp;lt;code&amp;gt;/etc/bind/named.conf&amp;lt;/code&amp;gt; :&lt;br /&gt;
 zone &amp;quot;monrobot.org&amp;quot;  {&lt;br /&gt;
   type master;&lt;br /&gt;
   file &amp;quot;/etc/bind/db.monrobot&amp;quot;;&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
Créez le fichier &amp;lt;code&amp;gt;/etc/bind/db.monrobot&amp;lt;/code&amp;gt; avec un contenu de ce type :&lt;br /&gt;
 $TTL    604800&lt;br /&gt;
 @       IN      SOA     localhost. root.localhost. (&lt;br /&gt;
                              2         ; Serial&lt;br /&gt;
                         604800         ; Refresh&lt;br /&gt;
                          86400         ; Retry&lt;br /&gt;
                        2419200         ; Expire&lt;br /&gt;
                         604800 )       ; Negative Cache TTL&lt;br /&gt;
 @       IN      NS      localhost.&lt;br /&gt;
 robot   IN      A       192.168.100.1&lt;br /&gt;
&lt;br /&gt;
Enfin ajoutez en tête du fichier &amp;lt;code&amp;gt;/etc/resolv.conf&amp;lt;/code&amp;gt; la ligne&lt;br /&gt;
 domain monrobot.org&lt;br /&gt;
&lt;br /&gt;
Vous pouvez vérifier le bon fonctionnement du résolveur de nom en tapant &lt;br /&gt;
  host -t any robot 192.168.100.1&lt;br /&gt;
&lt;br /&gt;
== Installation d'un serveur Web ==&lt;br /&gt;
&lt;br /&gt;
La commande du robot doit se faire via une interface Web. Il faut donc installer un serveur Web sur la Raspberry Pi avec un système de page dynamiques pour exécuter du code sur la Raspberry. Il suffit pour cela d'installer les paquetages &amp;lt;code&amp;gt;apache2&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;php5&amp;lt;/code&amp;gt; :&lt;br /&gt;
 apt-get install apache2 php5&lt;br /&gt;
&lt;br /&gt;
Un premier test consiste à donner &amp;lt;code&amp;gt;robot&amp;lt;/code&amp;gt; dans la barre d'adresses du navigateur Web de votre téléphone. La page de test du serveur Web &amp;lt;code&amp;gt;apache2&amp;lt;/code&amp;gt; doit s'afficher.&lt;br /&gt;
&lt;br /&gt;
Vous pouvez aussi écrire une petite page permettant d'effectuer une action comme l'arrêt de la Raspberry Pi. Cette page est à mettre dans le répertoire &amp;lt;code&amp;gt;/var/www/html&amp;lt;/code&amp;gt;. Voila un exemple de page PHP, nommez la &amp;lt;code&amp;gt;index.php&amp;lt;/code&amp;gt; et supprimez le fichier &amp;lt;code&amp;gt;index.html&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;?php&lt;br /&gt;
 if(array_key_exists('stop',$_POST)){ &lt;br /&gt;
   system('super halt');&lt;br /&gt;
   die('halting ...');&lt;br /&gt;
   }&lt;br /&gt;
 ?&amp;gt;&lt;br /&gt;
 &amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
 &amp;lt;html&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
   &amp;lt;meta http-equiv=&amp;quot;Content-Type&amp;quot; content=&amp;quot;text/html; charset=UTF-8&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;title&amp;gt;Contrôle Web&amp;lt;/title&amp;gt;&lt;br /&gt;
  &amp;lt;/head&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;&lt;br /&gt;
   &amp;lt;form method=&amp;quot;POST&amp;quot; action=&amp;quot;&amp;lt;?php echo $_SERVER['PHP_SELF']; ?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;stop&amp;quot; value=&amp;quot;Arrêter&amp;quot;/&amp;gt;&lt;br /&gt;
   &amp;lt;/form&amp;gt;&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
 &amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notez l'appel de fonction &amp;lt;code&amp;gt;system('super halt')&amp;lt;/code&amp;gt;. Pour que cet appel ait l'effet désiré, c'est à dire l'arrêt propre de la Raspberry Pi, il faut que le serveur Web puisse déclencher cet arrêt. De base, ce n'est pas possible pour une raison de droits : l'utilisateur &amp;lt;code&amp;gt;www-data&amp;lt;/code&amp;gt; sous lequel tourne le serveur &amp;lt;code&amp;gt;apache2&amp;lt;/code&amp;gt; n'a pas le privilège de lancer la commande &amp;lt;code&amp;gt;halt&amp;lt;/code&amp;gt;. Nous allons donc utiliser l'utilitaire &amp;lt;code&amp;gt;super&amp;lt;/code&amp;gt; pour autoriser le serveur Web à lancer la commande :&lt;br /&gt;
  apt-get install super&lt;br /&gt;
Ajoutez ensuite la ligne ci-dessous à la fin fichier de configuration de &amp;lt;code&amp;gt;super&amp;lt;/code&amp;gt; qui se nomme &amp;lt;code&amp;gt;/etc/super.tab&amp;lt;/code&amp;gt; :&lt;br /&gt;
 halt    /sbin/halt      uid=root        www-data&lt;br /&gt;
&lt;br /&gt;
Voila, vous devriez pouvoir arrêter votre Raspberry Pi en cliquant sur le bouton &amp;quot;Arrêter&amp;quot; de votre page Web.&lt;br /&gt;
&lt;br /&gt;
== Communication série ==&lt;br /&gt;
&lt;br /&gt;
Votre Raspberry Pi va probablement devoir communiquer avec un micro-contrôleur. Le plus simple est d'établir une communication série. Par contre les pages Web dynamiques peuvent difficilement utiliser le port série étant donné leur durée de vie, c'est à dire d'exécution, limitée. La solution propre pour permettre à des pages Web d'utiliser un port série est de passer par un serveur websocket. Ce type de processus est lancé au démarrage de la machine et accapare le port série. L'intérêt est que le serveur websocket est facilement contactable par un programma javascript tournant sur le navigateur.&lt;br /&gt;
&lt;br /&gt;
Sur votre Raspberry, vous devez installer le paquetage &amp;lt;code&amp;gt;libwebsockets-dev&amp;lt;/code&amp;gt; :&lt;br /&gt;
 apt-get install libwebsockets-dev&lt;br /&gt;
Récupérez ensuite le programme C stocké sur ce Wiki [[Fichier:Webserial.zip‎]]. Décompressez-le et compilez-le avec la commande :&lt;br /&gt;
  gcc -Wall webserial.c -o webserial -lwebsockets&lt;br /&gt;
Vous pouvez faire en sorte que ce programme soit lancé dès le démarrage de la Raspberry Pi en modifiant le fichier &amp;lt;code&amp;gt;/etc/rc.local&amp;lt;/code&amp;gt;. Pensez à préciser le chemin complet du programme et à suffixer par un &amp;amp; pour que le programme soit lancé en tâche de fond.&lt;br /&gt;
&lt;br /&gt;
Avec notre serveur websocket nous pouvons implanter des protocoles simples. L'exemple qui suit permet d'allumer et d'éteindre des LEDs connectées à un Arduino et à savoir quels boutons sont pressés. Pour les LEDs, le numéro de la LED à gérer est donné par les 7 bits de poids faible et le bit de poids fort permet de savoir s'il faut l'allumer ou l'éteindre. Pour les boutons, un octet est envoyé par l'Arduino dont chaque bit indique si le bouton est appuyé ou non.&lt;br /&gt;
&lt;br /&gt;
Le programme de l'Arduino est très court :&lt;br /&gt;
 #define LED1       8&lt;br /&gt;
 #define Bouton1    2&lt;br /&gt;
 #define Bouton2    3&lt;br /&gt;
 &lt;br /&gt;
 void setup(void){&lt;br /&gt;
 Serial.begin(9600);&lt;br /&gt;
 for(int i=0;i&amp;lt;6;i++) pinMode(LED1+i,OUTPUT);&lt;br /&gt;
 pinMode(Bouton1,INPUT);&lt;br /&gt;
 pinMode(Bouton2,INPUT);&lt;br /&gt;
 digitalWrite(Bouton1,HIGH);&lt;br /&gt;
 digitalWrite(Bouton2,HIGH);&lt;br /&gt;
 for(int i=0;i&amp;lt;6;i++){&lt;br /&gt;
     digitalWrite(LED1+i,HIGH);&lt;br /&gt;
     delay(200);&lt;br /&gt;
     digitalWrite(LED1+i,LOW);&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void loop(void){&lt;br /&gt;
 if(Serial.available()&amp;gt;0){&lt;br /&gt;
   unsigned char actions=Serial.read();&lt;br /&gt;
   int led=LED1+actions&amp;amp;0x7f;&lt;br /&gt;
   if((actions&amp;amp;0x80)==0) digitalWrite(led,HIGH); else digitalWrite(led,LOW);&lt;br /&gt;
 }&lt;br /&gt;
 unsigned char capteurs=0;&lt;br /&gt;
 if(digitalRead(Bouton1)==LOW) capteurs |= 0x01;&lt;br /&gt;
 if(digitalRead(Bouton2)==LOW) capteurs |= 0x02;&lt;br /&gt;
 Serial.write(capteurs);&lt;br /&gt;
 delay(100);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
La page Web qui dialogue avec le serveur websocket encore plus courte est disponible sur ce Wiki [[Fichier:Jsserial.zip]].&lt;br /&gt;
&lt;br /&gt;
= Répartition des tâches =&lt;br /&gt;
&lt;br /&gt;
Nous n'imposons pas de répartition rigide des tâches. Pour qu'une démonstration puisse se faire en fin de bureau d'étude il faut au moins un robot proie et un robot prédateur.&lt;br /&gt;
&lt;br /&gt;
== Robot proie ==&lt;br /&gt;
&lt;br /&gt;
Un robot proie est constitué comme suit :&lt;br /&gt;
* un châssis roulant, un contrôleur pour chaque paire de moteurs, un Arduino Uno ou un circuit électronique maison à base de micro-contrôleur ATMega328p ;&lt;br /&gt;
* des détecteurs ultrason pour éviter les collisions ;&lt;br /&gt;
* un récepteur infra-rouge TSOP pour décoder les signaux infra-rouges modulés ;&lt;br /&gt;
* un émetteur infra-rouge pour émettre un signal signalant le robot comme une proie ;&lt;br /&gt;
* un dispositif récepteur à courte distance pour simuler la capture par un prédateur, vous pouvez partir sur l'idée d'un capteur à effet Hall.&lt;br /&gt;
&lt;br /&gt;
Dans son mode autonome, le robot se promène dans la pièce en évitant les obstacles de façon tranquille et prévisible. Quand il repère un prédateur à son signal infra-rouge, la proie se déplace plus vivement avec de brusques changements de direction. Quand le détecteur à courte distance indique que le robot proie est à portée du prédateur, il s'arrête. Faire clignoter des LED rouges serait assez à propos. &lt;br /&gt;
&lt;br /&gt;
Vous pouvez ajouter un mode télécommande au robot. La modification la plus simple consiste à recevoir des ordres d'une télécommande infra-rouge. Le robot pourrait ainsi recevoir des ordres pour accélèrer ou décélérer, pour tourner tranquillement ou brusquement.&lt;br /&gt;
&lt;br /&gt;
Pour aller plus loin vous pouvez équiper votre robot d'une Raspberry PI 3 communiquant avec la carte de contrôle en série. Le robot peut alors être téléguidé par un téléphone.&lt;br /&gt;
&lt;br /&gt;
== Robot prédateur ==&lt;br /&gt;
&lt;br /&gt;
Un robot prédateur est constitué comme suit :&lt;br /&gt;
* un châssis roulant, un contrôleur pour chaque paire de moteurs, un Arduino Uno ou un circuit électronique maison à base de micro-contrôleur ATMega328p ;&lt;br /&gt;
* un détecteur ultrason pour ne pas rentrer dans les obstacles ;&lt;br /&gt;
* des récepteurs infra-rouges TSOP pour décoder les signaux infra-rouges modulés ;&lt;br /&gt;
* un émetteur infra-rouge pour émettre un signal signalant le robot comme un prédateur ;&lt;br /&gt;
* un dispositif émetteur à courte distance pour simuler la capture d'une proie, par exemple un électro-aimant.&lt;br /&gt;
&lt;br /&gt;
Dans son mode autonome, le robot tourne en rond à la recherche d'une proie. Dès qu'il en repère une, il se précipite vers elle en se calant sur son signal infra-rouge. Quand le prédateur pense être à porté de la proie, il active la communication à faible portée. Cette activation est temporaire pour donner une chance à la proie de s'échapper.&lt;br /&gt;
&lt;br /&gt;
Vous pouvez ajouter un mode télécommande au robot. La modification la plus simple consiste à recevoir des ordres d'une télécommande infra-rouge. Le robot pourrait ainsi recevoir des ordres de direction, de vitesse et d'activation de la communication &amp;quot;capture&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Pour aller plus loin vous pouvez équiper votre robot d'une Raspberry PI 3 communiquant avec la carte de contrôle en série. Le robot peut alors être téléguidé par un téléphone.&lt;br /&gt;
&lt;br /&gt;
== Réalisations des binômes ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Numéro !! Elèves !! Type de robot !! Page&lt;br /&gt;
|-&lt;br /&gt;
| Binôme 1&lt;br /&gt;
| Prénom Nom / Prénom Nom&lt;br /&gt;
| &lt;br /&gt;
| [[Binome2017-1|Binôme 1 2017/2018]]&lt;br /&gt;
|-&lt;br /&gt;
| Binôme 2&lt;br /&gt;
| Prénom Nom / Prénom Nom&lt;br /&gt;
| &lt;br /&gt;
| [[Binome2017-2|Binôme 2 2017/2018]]&lt;br /&gt;
|-&lt;br /&gt;
| Binôme 3&lt;br /&gt;
| Prénom Nom / Prénom Nom&lt;br /&gt;
| &lt;br /&gt;
| [[Binome2017-3|Binôme 3 2017/2018]]&lt;br /&gt;
|-&lt;br /&gt;
| Binôme 4&lt;br /&gt;
| Prénom Nom / Prénom Nom&lt;br /&gt;
| &lt;br /&gt;
| [[Binome2017-4|Binôme 4 2017/2018]]&lt;br /&gt;
|-&lt;br /&gt;
| Binôme 5&lt;br /&gt;
| Prénom Nom / Prénom Nom&lt;br /&gt;
| &lt;br /&gt;
| [[Binome2017-5|Binôme 5 2017/2018]]&lt;br /&gt;
|-&lt;br /&gt;
| Binôme 6&lt;br /&gt;
| Prénom Nom / Prénom Nom&lt;br /&gt;
| &lt;br /&gt;
| [[Binome2017-6|Binôme 6 2017/2018]]&lt;br /&gt;
|-&lt;br /&gt;
| Binôme 7&lt;br /&gt;
| Prénom Nom / Prénom Nom&lt;br /&gt;
| &lt;br /&gt;
| [[Binome2017-7|Binôme 7 2017/2018]]&lt;br /&gt;
|-&lt;br /&gt;
| Binôme 8&lt;br /&gt;
| Prénom Nom / Prénom Nom&lt;br /&gt;
| &lt;br /&gt;
| [[Binome2017-8|Binôme 8 2017/2018]]&lt;br /&gt;
|-&lt;br /&gt;
| Binôme 9&lt;br /&gt;
| Raphaël Bonvalet / Damien Tillaux&lt;br /&gt;
| &lt;br /&gt;
| [[Binome2017-9|Binôme 9 2017/2018]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Dtillaux</name></author>	</entry>

	<entry>
		<id>https://peip-ima.plil.fr/mediawiki/index.php?title=Binome2017-9&amp;diff=8574</id>
		<title>Binome2017-9</title>
		<link rel="alternate" type="text/html" href="https://peip-ima.plil.fr/mediawiki/index.php?title=Binome2017-9&amp;diff=8574"/>
				<updated>2018-01-15T08:54:31Z</updated>
		
		<summary type="html">&lt;p&gt;Dtillaux : Page créée avec « Binôme 9 saison 8: Raphaël Bonvalet, Damien Tillaux. »&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Binôme 9 saison 8: Raphaël Bonvalet, Damien Tillaux.&lt;/div&gt;</summary>
		<author><name>Dtillaux</name></author>	</entry>

	</feed>