CageBut2014-4

De Wiki de bureau d'études PeiP
Révision datée du 25 mai 2015 à 12:28 par Pknockae (discussion | contributions) (La cage)

Introduction

Le bureau d'étude est une initiation pédagogique nous mettant en situation concrète avec des objectifs précis à remplir, précurseurs de projets professionnels tels que nous en aurons plus tard en tant qu'ingénieur au sein d'une équipe. Nous avons choisi le Bureau d'Etude ima par curiosité des domaines de l'informatique et de l'électronique et pour conforter ou non nos choix dans les spécialités que propose le réseau Polytech.

Ce bureau d'étude a pour objectif final de faire jouer une partie de football à des robots LEGO Mindstorm™. Les rôles des robots sont répartis selon différents binômes, chaque binôme étant amené à échanger avec les autres afin que la coordination entre les robots soit la plus parfaite possible. Chaque binôme aura donc pour tâche de s'occuper soit :

  • d'un robot ramasseur de balle (2 au total)
  • d'une cage de buts (2 au total)
  • de robots de compétition (4 au total)

Il y a aussi un neuvième "robot" qui joue le rôle d'arbitre. Il s'agit d'un ordinateur relié en Bluetooth avec tous les autres robots permettant le bon déroulement du match (exemple, après un but, l'arbitre demande à la cage concernée de libérer la balle).


Nous avons choisi de réaliser une cage de but, nos principales lignes directrices pour ce projet sont :

  • Un but correctement dimensionné de largeur 50 cm en accord avec le but adverse (DELANOY et CLEMENT) pour permettre de meilleures chances à la balle de rentrer au vu de son diamètre ( 75 mm ).
  • Une balise infrarouge capable d'émettre tout en étant différentiable de l'autre cage et de la balle, cette balise doit pouvoir être paramétrable.
  • Un système de détection ( capteur ultrasons ) et d'expulsion de la balle ( impliquant un capteur de contact).
  • Une programmation pour communiquer avec les autres intervenants ( robots joueurs, ramasseur de balle, arbitre ).

Nous avons choisi ce rôle car il est très polyvalent, alliant programmation, création d'un PCB, fabrication de la cage via une découpeuse laser.

Le Mécanisme du but

1er prototype du mécanisme
Nous avons d'abord eu l'idée d'un robot fonctionnant avec un seul moteur, le faire tourner dans un sens bloquant la balle et dans l'autre, avec une vitesse supérieure, la libérant. Ce projet a fini par être abandonné suite à de nombreuses complications techniques liées au moteur. En effet il était particulièrement difficile de faire revenir le moteur à sa position initiale, même en ajoutant des capteurs de contact l'armature ne revenait jamais exactement à sa place. Les LEGO du prototype étant moins lourds que l'armature finale en bois ou plastique.Nous nous sommes dis que le projet était perfectible. De plus le système n'était pas assez rigide pour supporter le poids de la cage. Le système de blocage étant à améliorer mais il fallait ajouter un autre moteur pour expulser la balle.



Mécanisme final




Le nouveau robot ainsi réalisé comporte deux moteurs, le premier s'occupe de bloquer la balle, le second ne fait que la renvoyer. Le premier constitue une sorte de crochet se rabattant sur la balle après qu'elle soit détectée par le capteur ultrason (situé sur la ligne du but). La balle est ainsi bloqué au fond du but contre un système fixe prévu à cet effet. La balle immobilisée, le crochet se relève jusqu'à rencontrer le capteur de contact qui déclenche sa remise en position initiale. Pendant cela, le deuxième moteur chargé du fonctionnement du percuteur se met en marche et permet l'expulsion de la balle hors du but. Nous avons réalisé des tests, le percuteur expulse la balle assez rapidement pour un franchissement de quelques millimètres en raccord avec l'épaisseur du terrain. Le percuteur se remet alors en place sans problème car le moteur réalise un angle faible.


Media:Robot final.mp4--Media:Bascule contact final.mp4




Le programme

Ci-dessous le programme du robot NXT. Ce programme que nous avons écrit permet à notre but de remplir différentes tâches: détecter la balle, la bloquer dans la cage et l'en éjecter. Une fois connecté à l'arbitre par bluetooth, l'arbitre lui demande de s'identifier, ce qu'il fait en lui envoyant le code correspondant aux cages. LA balle pouvant se trouver dans un but au début d'une partie la première instruction de l'arbitre à la cage et d'éjecter ce que notre robot réalise qu'il ait a balle ou non. Lorsque la balle rentre dans notre but, elle est détecté par le capteur infrarouge et notre robot la bloque et averti le robot arbitre d'un but. La balle ne sera éjectée que lorsque l'arbitre le lui aura demandé. Puis le jeu peut reprendre.

#define NEAR 50 //cm
//Actors
#define TYPE  0
//#define SEEKER
//#ifdef SEEKER
//#define TYPE  2
#define TYPE_BUT       0
//Mailboxes
#define MAILBOX_ACTEUR 1
#define MAILBOX_ARBITRE 2
//Messages
#define CODE_REQTYPE  0 
#define CODE_EJECTER  1
#define CODE_BUT      3 
task main()
{   
    int result;
    string buffer;
    SetSensorTouch(IN_2);
    SetSensorLowspeed(IN_4);
    while(true)
    {
      result=ReceiveMessage(MAILBOX_ACTEUR,true,buffer);
     
      if(result==0)
      {
      int requete=StrToNum(buffer);
      if(requete==CODE_REQTYPE)
        {
        TextOut(0,LCD_LINE1,"TYPE SENT");
        string type;
        type=NumToStr(TYPE_BUT);
        SendMessage(MAILBOX_ARBITRE+10,type);
        }
      if(requete==CODE_EJECTER)
        {
        TextOut(0,LCD_LINE2,"EJECT BALL");
        OnRev (OUT_C,100);
      Wait (150);
      OnFwd (OUT_C,100); 
      Wait (150);
      Off (OUT_C);
      Wait (1000);
      OnFwd(OUT_A, 50); 
      Wait(250);
      Off (OUT_A); 
      while(SensorUS(IN_4)>NEAR);
      string type1;
      type1=NumToStr(CODE_BUT);
      SendMessage(MAILBOX_ARBITRE+10,type1);
      Wait (200) ; //petite pause le tps que la balle arrive
      OnFwd (OUT_A,50); //moteur sup. se rabaisse pour bloquer balle
      Wait (150);
      Off (OUT_A);
      Wait (1000);
      OnRev(OUT_A, 20); // moteur sup. se relève, balle libre de partir
      while (Sensor(IN_2) != 1) {}
      }
      }
     
    }
}

La Balise infrarouge

Une fois notre robot terminé nous nous sommes attelés à la conception de la balise infrarouge. Nous avons réalisé la balise en s'inspirant du modèle suivant, en y rajoutant un bouton poussoir et une LED rouge qui va nous permettre de savoir "où" nous nous situerons par rapport au réglage de la fréquence des LED infra-rouges. C'est simple, une pression sur le bouton fait clignoter la LED rouge une fois, un appui prolongé sur le bouton (3 secondes dans notre cas) fait clignoter la LED 4 fois: on entre dans un "menu" dans lequel on peut alors configurer la période de fonctionnement des LED infrarouges. Pour refermer ce "menu" il faut à nouveau appuyer 3 secondes sur le bouton, la LED va à nouveau clignoter mais cette fois autant de fois que le bouton a été enfoncé. Pour configurer la période des infrarouges il faut appuyer un certain nombre de fois. Par exemple: 5 appuis, les infrarouges vont fonctionner à 1200Hz pendant 2,5s puis s'interrompre pendant 1s et recommencer jusqu'à ce que ce paramètre soit modifié. A noter que la pause d'une seconde n'est pas paramétrable avec le bouton.

Schéma du circuit de la plaque sans la LED rouge
Photographie de la plaque d'essais avec ces différents voyants d'activité. La LED verte correspond à la mise sous tension de la plaque et la LED rouge nous indique quelles actions ont été entraînées suite à nos appuis sur le bouton.















Les programmes

Notre programme doit permettre à la balise d'être paramétrable, à l'aide du seul bouton poussoir on doit pouvoir paramétrer le temps d'émission des LED infrarouges. Nous avons d'abord programmés notre balise en utilisant une carte arduino. En y allant étape par étape nous avons fini par réaliser le code suivant:

#define NORMAL  100
#define BUTTONPIN  10
#define IRPIN 11
#define LEDPIN  12
#define BEAUCOUP 2000
#define PERIODE 500
int duree=4;
void setup() 
{
  pinMode(LEDPIN, OUTPUT);
  digitalWrite(LEDPIN,HIGH);
  delay(100);
  digitalWrite(LEDPIN,LOW);
  pinMode(BUTTONPIN, INPUT_PULLUP);     
}

void clignote (int duree) //la led clignote 4 fois la première fois que l'on rentre dans le menu
{
      int i;
      for(i=0;i<duree;i++)
        {
        digitalWrite(LEDPIN,HIGH);
        delay(300);
        digitalWrite(LEDPIN,LOW);
        delay(200);
        }
}
void menu() //code du menu, entrée sortie et led, on sort avec le nombre d'appui, on entre la fois suivante avec le nombre entré auparavant
{
  long t = millis();
  long deltat;
  while(digitalRead(BUTTONPIN)==LOW && ((deltat=millis()-t)<=BEAUCOUP)) //rien SI durée appui trop courte
    delay(25);
  if (deltat>=BEAUCOUP) 
  { // durée appui assez longue -> on fait clignoter 4x
       clignote (duree);
       long appui = 0;
       while (digitalRead(BUTTONPIN)==LOW) delay(25);
       while (1) 
         {
           while (digitalRead(BUTTONPIN)==HIGH) delay(25); // chgt + compteur
           t=millis();
           digitalWrite(LEDPIN,HIGH);
           while(digitalRead(BUTTONPIN)==LOW && ((deltat=millis()-t)<BEAUCOUP)) delay(25);
           digitalWrite(LEDPIN,LOW);
           if (deltat>BEAUCOUP) 
              { 
                duree = appui; 
                clignote (duree);
                break;
              }
           else
              {
                appui = appui + 1;
              }
         }
  }
}
void loop() 
{
  delay(1000);
  if (digitalRead(BUTTONPIN)==LOW) menu ();
  digitalWrite(LEDPIN,HIGH);
  unsigned long d=duree*PERIODE;
  tone(IRPIN,1200,d);
  delay(d);
  digitalWrite(LEDPIN,LOW);
}


AT Tiny Programmer (en rouge)

Par la suite il a fallu rendre la balise totalement indépendante de l'ordinateur et donc remplacer la carte arduino par le microcontrôleur, pour cela on utilise un AT Tiny Programmer qui est une petite carte qui permet de compiler notre programme dans le microcontrôleur. Suite à une erreur de conception de la carte au niveau de la LED rouge il faut changer tous les digitalWrite(HIGH) en "LOW" pour cette LED. Puis il a juste fallu changer le numéro des PINS des composants:






#define NORMAL  100
#define BUTTONPIN 0
#define IRPIN 1
#define LEDPIN 2
#define BEAUCOUP 2000
#define PERIODE 500

Notre carte est maintenant fonctionnelle.

Circuit imprimé

Répartition des composants sur la carte
Une fois la partie programmation de la balise par arduino termminée nous avons dû réaliser le circuit imprimé de cette balise. A partir d'un schéma initial réalisé sur le logiciel Eagle que nous avons modifiée, afin d'obtenir une meilleure répartition des composants sur la carte, nous avons envoyé notre PCB au service de Polytech consacré à sa fabrication.
Répartition des composants sur la carte


L'étape suivante consista à souder les différents composants et à tester la carte, elle fonctionne, il faut maintenant programmer le microcontrôleur pour la balise devienne autonome avec un AT Tiny Programmer comme expliqué auparavant. La programmation de la balise étant terminée il faut maintenant fabriquer le PCB / circuit imprimé de celle-ci. Pour cela on utilise le logiciel EAGLE puis on l'envoie au service de polytech chargé de sa fabrication via un protocole.

Suite à problème rencontré avec les groupes précédents une résistance à été rajouté entre le microcontrôleur et le transformateur. Les lignes bleues correspondent aux fils de cuivre reliant les différents composants entre eux. Les cercles verts correspondent aux emplacements dans lesquelles seront soudés les pattes des composants sauf pour les 4 en bas à gauche qui sont en fait les trous pour viser le support de la pile au circuit.


Les angles que réalisent les fils sont de 45 degrés car ils offrent de meilleures performances que si ils étaient de 90. Le reste du circuit, le fond bleu, n'est autre que le plan de masse. Sur le plan et sur la carte on remarque que juste à gauche du microcontrôleur il reste un place libre pour un composant. En effet il a été prévu au départ d'ajouter un composant permettant à l'arbitre de communiquer avec la balise. Mais ce projet a finalement été laissé de côté, il sera sûrement exploité à la saison prochaine.

La cage

Tous les programmes terminés avec notre robot et notre balise prêts à l'emploi nous sommes donc passés à la dernière étape de notre projet: la conception de la cage.


La cage aura une largeur de 50 cm et une profondeur de 25 cm. L'armature sera fixée au robot par une plaque le traversant, plaque sur laquelle viendront se fixer également le boîtier NXT et la balise infrarouge. Nous avions initialement choisi le plexiglas comme matériau principal de la cage, apportant une véritable structure au but tout en laissant apercevoir le mécanisme, nous avons finalement utilisés une plaque de bois aggloméré de type MDF n'ayant pas de plexiglas à notre disposition. Concernant le mécanisme du robot, une première pièce longue sera fixé au premier moteur sur le crochet recouvrant ainsi toute la largeur du but. L'idée est la même pour le moteur de répulsion où une deuxième pièce sera fixé sur le percuteur obtenant ainsi un percuteur de 50 cm de large. On pourra également placer une mini-plaque sur la pièce du robot sur laquelle la balle vient se percuter.

La découpeuse laser mise à notre disposition au Fabricarium est un outil qui nous a permis de gagner énormément de temps sur cette étape de notre projet, il suffit de réaliser les plans 2D des pièces sous un logiciel tel que Inkscape ou FreeCAD, puis de configurer la machine par rapport au matériau à découper (nombre de passages, vitesse...).

Les pièces découpées il ne reste plus qu'à les percer puis les coller, amarrer le robot dessus. Notre but est terminé.

Média:Test final 1.mp4 Média:Test final 2.mp4