RobotCompetition2014-2 : Différence entre versions

De Wiki de bureau d'études PeiP
Ligne 32 : Ligne 32 :
 
Côté programmation :
 
Côté programmation :
 
Initialisation grâce à la commande :
 
Initialisation grâce à la commande :
''SetSensorColorFull(IN_1); // IN_1 indique que le port auquel il est branché est numéroté 1''
+
''SetSensorColorFull(IN_1); // IN_1 indique que le port auquel il est branché est numéroté 1''
 
Lecture :
 
Lecture :
 
  ''SV = ReadSensorColorEx(IN_1, cval, rawData, normData, scaledData); // Cette formule bien complète n'est pas si compliquée. A notre niveau, nous //n'utilisons que la variable cval, un int qui va contenir un chiffre entre 0 et 5. Ce chiffre signifie tout simplement une certaine couleur entre Blanc, //Bleu, Rouge, Jaune, Vert et Noir. Nul besoin d'apprendre leur correspondance, un simple test du type "if (cval == INPUT_REDCOLOR)" par exemple suffit.''
 
  ''SV = ReadSensorColorEx(IN_1, cval, rawData, normData, scaledData); // Cette formule bien complète n'est pas si compliquée. A notre niveau, nous //n'utilisons que la variable cval, un int qui va contenir un chiffre entre 0 et 5. Ce chiffre signifie tout simplement une certaine couleur entre Blanc, //Bleu, Rouge, Jaune, Vert et Noir. Nul besoin d'apprendre leur correspondance, un simple test du type "if (cval == INPUT_REDCOLOR)" par exemple suffit.''

Version du 9 mai 2015 à 22:21

Introduction

Durant le bureau d'étude IMA de cette année, nous avons pour rôle la réalisation d'un robot d'attaque et de défense. Pour la bonne compréhension de ce que nous allons faire au cours de cet enseignement de spécialité nous allons reporter sur cette page tout ce qui sera fait pour atteindre la conception finale de ce robot. Ce twiki expliquera en détail nos manières de procéder pour atteindre nos objectifs, présentant également des lignes de codes. Ces dernières seront copiées en italique, les phrases écrites après un double slash (//) signifiant que c'est un commentaire, en langage C.


Le Robot Mindstorm NXC

Il y a deux moyens de programmer ce robot : en utilisant le logiciel de programmation par blocs fourni avec la machine, ou en langage de programmation pur. Nous avons choisi cette dernière option, l'éditeur et compilateur NxcEditor permet d'écrire en NXC, dérivé du langage C.


Le montage

Voila la seconde version du robot NXC que nous avons réalisé

vue 1
vue 2
vue 3


Les capteurs

Ils sont l'essence même de notre robot, et ce sont eux qui vont nous permettre de faire ce projet. Leur utilisation via un programme NXC requiert : - Une initialisation, dans laquelle on indique au robot à quel port ils sont branchés. - Une lecture. C'est-à-dire que le robot ne les utilise pas à tout instant. Il faut déclencher une lecture à un instant t, et à cet instant nous pouvons utiliser les valeurs que nous fournissent ces capteurs.

Le capteur de couleur

Ce capteur permet de différencier les couleurs : il peut reconnaître du blanc, du noir, du rouge, du vert, du bleu. Nous le plaçons sous notre robot (pour une détection correcte, il doit être placé à au moins 1 cm du sol) et il servira à deux buts : - Se replacer sur le garage en suivant les lignes de couleur. - Ne jamais sortir du terrain.

Côté programmation : Initialisation grâce à la commande :

SetSensorColorFull(IN_1); // IN_1 indique que le port auquel il est branché est numéroté 1

Lecture :

SV = ReadSensorColorEx(IN_1, cval, rawData, normData, scaledData); // Cette formule bien complète n'est pas si compliquée. A notre niveau, nous //n'utilisons que la variable cval, un int qui va contenir un chiffre entre 0 et 5. Ce chiffre signifie tout simplement une certaine couleur entre Blanc, //Bleu, Rouge, Jaune, Vert et Noir. Nul besoin d'apprendre leur correspondance, un simple test du type "if (cval == INPUT_REDCOLOR)" par exemple suffit.


Le capteur ultrason

Ce capteur détecte la présence d'éventuels obstacles et même la distance à laquelle ils se trouvent. Il nous servira pour remplir la condition du cahier des charges "ne jamais percuter l'adversaire", ainsi que pour détecter la balle.

Initialisation : SetSensorUltrasonic(IN_3); Lecture : dist = SensorUS(IN_3); // dist est un byte (octet) contenant une valeur allant de 0 à 255. Cette valeur correspond à une distance. Plus le nombre est //grand, plus l'obstacle est loin.

Le capteur infrarouge

Il nous sera utile pour détecter la balle et les buts.

Son fonctionnement : 5 capteurs y sont intégrés. Un capteur scanne devant lui, les quatre autres permettent au robot de "voir" sur 180°. Nous avons accès librement à la valeur de chaque capteur. Il peut être réglé pour recevoir plus spécifiquement des ondes de fréquence 600 Hz ou 1200 Hz.



Le capteur de contact

Lorsque le robot rencontre un obstacle, le bouton est enfoncé. Nous pensions que ce capteur aurait pu nous être utile pour vérifier la bonne capture de la balle. Mais son enclenchement était bien trop aléatoire pour être utilisé avec notre configuration. Nous avons donc opté pour le capteur ultrason.

Problèmes

Le premier problème rencontré avec ce capteur est le fait qu'il n'a pas de phase intermédiaire entre le moment où il touche quelque chose et celui où il ne touche rien. Les valeurs de ce capteur passe de 0 (il ne touche rien) à 33 (valeur maximale atteinte quand le bouton du capteur est enfoncé au maximum).

Le deuxième problème rencontré est que le bouton ne s'enfonce pas assez pour activer le moteur quand le robot entre en contact avec la balle. Il faut que la balle soit en mouvement rapide vers le robot pour que le bouton s'enfonce. De plus si la balle arrive sur le côté, bien qu'elle soit entrée dans la pince, elle n'est pas détectée puisque l'enclenchement n'est pas systématique dans ce cas.


Résolution des problèmes

Nous avons opté pour un remaniement du robot. Pour détecter et attraper la balle, nous avons utilisé l'action simultanée du capteur ultrason et du capteur infrarouge; nous avons dû modifier notre programme afin de faire une distinction entre balle et adversaire puisque que le capteur ultrason est aussi utilisé pour détecter les éventuels obstacles. Voici notre programme pour attraper la balle :


Le dispositif de capture de la balle

Nous utilisons une pince articulée pour capturer la balle. Cette pince, lorsqu'elle s'ouvre, pousse également la balle en avant; c'est une pince à double action. En plus de cette pince nous avons installé une pince rigide horizontale pour tenir la balle correctement sur les côtés, et permettre une capture plus précise.


Nous installons dans la zone de capture le capteur ultrason. Il sert à détecter la balle et l'adversaire. Lorsque le robot détecte la balle assez prêt, il abaisse la pince. Ensuite il vérifie si la balle qui est présente. Dans le cas contraire il rouvre la pince.

Le jeu

Les limites du terrain

Les robots joueurs n'ont pas le droit de sortir du terrain. Le bord de celui-ci étant matérialisé par une ligne rouge, nous utiliserons le capteur de couleur, pour détecter la couleur en temps réel et faire faire demi-tour au robot lorsqu'il atteint cette ligne.


Fichier:Arrête.mp4

Le robot s'arrête quand il voit une ligne rouge avec son capteur de couleur, ce qui va l'empêcher de sortir du terrain de foot.

Fichier:Demi tour.mp4

Nous avons modifié le programme qui fait s'arrêter le robot et l'avons retravaillé afin qu'il puisse faire demi-tour toujours lorsqu'il voit une ligne rouge. C'est ce que montre la vidéo demi-tour.


Ne pas percuter l'adversaire

Il est interdit aux deux joueurs de se rentrer dedans. Le capteur ultrason, placé bien en évidence sur le robot, détecte les obstacles. Lorsqu'il voit quelque chose de très près, nous ordonnons à notre robot l'arrêt.


La Balle

Le but du jeu est que le robot attrape la balle pour ensuite marquer des points.


Chercher la balle

La difficulté majeure de notre projet est ici. La balle que nous utilisons émet un rayonnement infrarouge en continu. Les buts, pour qu'ils soient détectés par le robot, émettent un signal qui est intermittent. C'est à partir de ça que le robot doit différencier la balle des buts.

Deux solutions furent proposées. Nous avons opté sur le changement de fréquence : Le rayonnement infrarouge se fait à une fréquence : elle peut être de 600 ou de 1200 Hz. Justement, le capteur infrarouge du robot peut être réglé pour recevoir plutôt du 600 Hz, ou du 1200 Hz. Nous utiliserons cette fonctionnalité pour distnguer la balle des buts.

Après avoir effectué des tests avec un autre groupe, nous avons trouvé que le robot détecte mieux les ondes sur le mode 600 Hz. C'est ce mode qui sera utilisé pour la balle. Nous demanderons donc aux constructeurs de buts de régler leur fréquence à 1200 HZ.


Lorsque le robot est en recherche de balle, il se placera en mode 600 Hz. Une fois la balle attrapée (condition vérifiée par l'activation du capteur ultrason), le robot passe en mode 1200 Hz pour les buts.

Attraper la balle / Lancer la balle

Le principe pour trouver la balle est de regarder la valeur de chaque capteur : le robot comprendra où la balle peut se trouver. Son but est que le capteur central soit le seul à avoir une valeur significative (supérieur à une valeur précise). Une fois positionné face à la balle, il avance vers elle, tout en corrigeant sa trajectoire de manière à rester bien en face de celle-ci : son objectif est de l'attraper.


Une fois arrivé proche de la balle, (le capteur ultrason indique une présence proche), la pince s'abaisse grâce au servomoteur dédié. Si ce capteur voit une faible valeur alors la balle est bien emprisonnée et le robot continue son jeu. Sinon, il relève la pince et réessaie.

Le dispositif de tir consiste à ouvrir la pince avec une certaine vitesse. La bout arrière de notre mécanisme pousse la balle à la vitesse souhaitée, et celle-ci se dirige tout droit. Pour peu que le robot soit correctement dirigé, elle avance vers le but.

Après plusieurs tests voilà les premiers résultats obtenus dans cette vidéo :Fichier:Attrape.mp4

Detecter les buts

Se replacer

Lorsque l'arbitre le lui ordonne, le robot se replace sur son garage. Il suit l'algorithme précisé dans la partie "Robot de compétition" du twiki.


Obéir à l'arbitre