Robotique2 1 : Différence entre versions

De troyesGEII
Aller à : navigation, rechercher
(Travaux à finir)
(Partie 2: Recherche)
Ligne 155 : Ligne 155 :
  
 
*Pour déplacer le robot, 2 moteurs MA 970D sont imposés. Pour chaque moteur on utilise un pilote de Moteur MD13S. Pour tester le fonctionnement des moteurs nous avons utilisé un potentiomètre pour simuler les capteurs de ligne et la boussole.
 
*Pour déplacer le robot, 2 moteurs MA 970D sont imposés. Pour chaque moteur on utilise un pilote de Moteur MD13S. Pour tester le fonctionnement des moteurs nous avons utilisé un potentiomètre pour simuler les capteurs de ligne et la boussole.
*Problème rencontré: les 2 moteurs ne tournes pas à la même vitesse pour la même consigne
+
*Problème rencontré: les 2 moteurs ne tournent pas à la même vitesse pour la même consigne.
  
 
===Partie 3: Solution adoptée===
 
===Partie 3: Solution adoptée===

Version du 31 mars 2021 à 17:23



Présentation du projet

Le projet à pour objectif de réalisé un match entre 2 robots. Ceux-ci devront envoyé depuis leur terrain le plus de balle de tennis possible sans aller sur le terrain adverse.
Le terrain mesure 8 mètres par 4 et est séparé en 2 parties par une ligne médiane donc chaque robot aura un terrain d'approximativement 16m² pour se déplacé.

Une partie dure 90s,avant la fin du temps impartie le robot devra être immobile au niveau de la ligne médiane et avoir éclaté un ballon qu'il aura emporté avec lui au début du match
Le vainqueur sera le robot avec le moins de balle sur son terrain.


Objectif du Projet

  • Réalisé un Robot capable de se déplacer dans son terrain.
  • Renvoyé des balles depuis son terrain jusqu'au terrain adverse.
  • Crever le ballon que l'on a emporté à l'arrêt devant la ligne médiane avant la fin du temps imparti.


Règlement

Voici ci-joint le règlement ainsi que les contraintes associé à la création du Projet.

   * règlement de la coupe de robotique

Contraintes et Caractéristiques imposées

Schéma du terrain.png

Les principales contraintes sont dues aux règles de la compétition.

  • Le robot doit être dimensionné selon 30x30x40cm.
  • moteurs
    • Vitesse de rotation entre 600 à 800 tr/min max.
    • Moteur MFA 970d (imposé par l'IUT)
  • Châssis imposé par l'IUT
  • Le mécanisme lanceur de balle ne doit dépasser que pour envoyé la balle, il devra se replier après.
  • La batterie doit être en lithium Li-ion.


  • Aucune tension sur le robot ne doit dépasser 24V.
  • Les dimensions du terrain sont données sur ce schéma :

Réalisation

Découpage fonctionnel

Schéma fonctionnel robot geii.png

Afin de commencer le projet, nous avons du séparé les parties essentielles du projet pour ensuite répartir les tâches.

  • On a séparé le travail en différent groupe fonctionnel
    • L'alimentation
    • Le Déplacement
    • Le système de renvoie des balles
    • Les capteurs pour trouver les balles
    • Les capteurs pour se repérer dans l'espace
    • Un support ballon
    • Un système de crevaison de ballon

Vous verrez ci-joint en vignette le schéma fonctionnel de notre robot.

Répartition des tâches

  • Nous nous sommes répartis les tâches de la façon suivante:
    • Jason Savouret a pour tâches de s'occuper du repérage dans l'espace grâce à des capteurs.
    • Aurelien Noirault gère le système de renvoie des balles ainsi que le moyen de les repérer et de les attraper, le montage du robot (pièces et composants), l'alimentation ainsi que la maintenance.
    • Aurelien Laurens a pour mission de crée le système pour supporter le ballon et du système de crevaison associé pour la fin de la partie, le montage du robot (pièces et composants), l'alimentation ainsi que la maintenance et le Site Web.
    • Cécile Forgeot s'oriente sur toute la partie mobilité du robot en gérant la partie déplacement ainsi que la maintenance du robot

Repérage dans l'espace

Partie 1: Objectif

Boussole(MPU9250°
  • Le robot ne doit dépasser sous aucun prétexte la ligne médiane.
  • Le robot doit pouvoir se placer face au terrain adverse et connaître sa position vis à vis de celui-ci

Partie 2: Recherche

Capteur SEN1010
Capteur CNY70
  • Afin de se repérer dans l'espace plusieurs choix ont été possible:
    • une boussole MPU9250 pour s’orienter vis à vis du camp adverse. Au démarrage le robot prendra en valeur initiale les coordonnées de la direction pour le camps adverses et ainsi il pourra connaître son orientation vis à vis du camp adverse.
    • un capteur de couleur SEN0101 afin de capter les couleurs du terrain, le but serait de connaître la couleur sous le capteur afin de savoir si il se situe au dessus d'une ligne blanche ou au dessus du sol bleu foncé du terrain. Avec ces information cela pourrait permettre au robot de se déplacé de manière autonome sur tout le terrain en analysants le terrain.
  • Dans le fonctionnement le capteur renvoie des valeurs pour connaître la composante de la couleur au dessus de laquelle il est. Grâce a une succession de test on renvoie un état logique 1 ou 0 .
    • 0 permet de dire que l'on est sur le terrain(bleu).
    • 1 permet de dire que l'on est sur une ligne blanche et donc possiblement la ligne médiane.

Néanmoins la multitude de ligne blanche ne permet pas d'être très efficace et vas d'avantage nuire au bon fonctionnement qu'être bénéfique car le robot pourrait confondre une ligne médiane et une autre ligne du terrain donc cette solution n'est pas optimal.

  • Des capteurs infrarouge CNY70 pour savoir si il est sur le terrain ou sur la ligne médiane.

Partie 3: Solution adoptée

  • La boussole MPU9250 renvoie des valeurs qui permettent de calculer un angle en fonction de la position du robot. Au démarrage elle enregistre une valeur initiale d'angle qui sera donc la direction dans laquelle le camp adverse se situe car le robot sera placer face à celui-ci pour le début du match.
    • La boussole aura 2 but:
      • Si il n'y a pas de balle devant le robot la boussole enregistrera l'angle actuel puis le robot fera un tour sur lui-même sur la gauche jusqu'à retrouvé sa position initiale en comparant son angle actuel à l'angle de début de tour et s'arrêtera de tourner si il trouve une balle pour aller l'attraper.
      • Si le robot attrape une balle, la boussole comparera son angle avec celui du camps adverse, si le robot n'est pas dans la bonne direction il tournera sur la gauche jusqu'à se situé face au terrain adverse.
  • Nous adopterons aussi la solution d'utiliser 2 capteur CNY70 placé à l'avant du robot dans les "mandibules" et 1 capteur juste derrière le système de lancer de balle. Les capteurs renverront chacun une valeur entre 0(clair) et 1023(foncée). En analysant en permanence les 3 capteurs et leurs valeurs , on établira une condition qui dira que si 2 capteurs renvoient un état logique 1 sachant que le robot pendant ce temps se déplace, cela reviendrais à dire que nous sommes sur la ligne médiane car les autres lignes sont assez fine donc on arrêtera le robot directement.

Gestion des balles

Partie 1: Objectif

  • Le robot doit être capable de repéré la balle
  • L'attraper
  • La renvoyer

Partie 2: Recherche

  • Dans le but de repéré la balle 2 choix ont été trouvé:
    • L'utilisation d'un capteur de distance VL53L1X qui permet de balayer le terrain pour trouver des reliefs(balles) tout comme le système de sonar d'un sous marin.Seulement le capteur n'est pas du tout assez précis et un angle légèrement différent rend l'utilisation bien moins fiable de plus le capteur pouvait confondre un mur et les balles vu que il ne cherchais que un relief.
    • Une caméra pixy2 qui permettrais d'enregistrer des formes pour pouvoir les retrouver.
  • En vue de l'attraper:
    • La réalisation d'une partie supplémentaire à l'avant du robot pour l'attraper et la bloquer.
    • Un servomoteur possédant une barre permettant de bloquer la balle.
  • Dans l'intention de la renvoyer la balle:
    • L'emploie de 2 moteurs avec 1 mini roue chacun dans le principe d'un lanceur de tennis mais le soucis rencontré est la place disponible.Donc des modification comme le fait d'utiliser 1 seul moteur avec une rampe ont été essayé.Cependant le soucis de place toujours présent et de puissance est remarqué, l'idée de remplacé la mini roue par une pale avec ou sans rampe fut tester mais toujours sans réel réussite du au manque de place et de puissance.
    • L'emploie d'un moteur brushless avec un partie pour frapper la balle


Partie 3: Solution adoptée

  • Pour repéré la balle, la caméra pixy2 est un bon système. En lui faisant enregistrer la forme et la couleur d'une balle elle est capable sur un maximum de 1 mètre en face d'elle de repéré la dites balle et ses coordonnées. Ainsi le robot se dirigera vers elle peu à peu. Si le robot ne voit pas de balle face à lui il tournera sur lui même dans un premier temps pour observer autour de lui si il y a une balle ou non.
  • La partie pour attraper la balle sera composé d'une extension réalisé en modélisation 3D en forme d'entonnoir et d'un servomoteur avec une barre. Quand le robot repérera la balle il avancera dans sa direction, grâce aux extensions des mandibules la balle se logera à l'avant du robot et le servomoteur enfermera la balle ce qui empêchera la balle de partir et d'autre balle de rentrer.
  • Pour renvoyé la balle un moteur brushless possédant une extension dans le style d'une barre permettra de frapper la balle quand le moteur tournera.On alimentera et contrôlera le moteur avec un Roxxy Bl-control 712 BEC qui a été relié au moteur Brushless.

Crève ballon

Modélisation support-ballon

Partie 1: Objectif

  • Crée un support pour placer le ballon
  • Trouver un moyen pour crever le ballon

Partie 2: Recherche

Câblage arduino
  • Pour le support ballon il est nécessaire de trouver un moyen de fixer à minimum 30 cm du sol un ballon et une partie pour maintenir la pièce. La conception d'un modèle 3D fut donc nécessaire. Mais pour le maintenir une petite extension en haut de la colonne à tenté d'être faites mais quand le ballon bouge il y a des chances qu'il se détache et parte
  • Pour crever le ballon plusieurs idées ont été testé:
    • Un servomoteur HS-311 avec une extension en plastique afin d'y placé un moteur à courant continue avec une partie pointu seulement le moteur manque de couple pour crever le ballon donc cette solution n'est pas utilisable.
    • Un servomoteur HS-311 et une extension en plastique avec un servomoteur GS-9018 mais par volonté d'optimisation de ressources, de fil et de consommation on a pas choisis cette solution.
    • Un servomoteur GS-9018 qui par mouvement à 180° pourrait crever le ballon.

Partie 3: Solution adoptée

Système support et crève ballon
  • Une modélisation 3D d'une colonne a été réalisé à l'aide du logiciel Openscad, celle-ci possède 2 ouverture sur sa face afin de placer le servomoteur et l'autre permettant le câblage du servomoteur(schéma ci-contre de la modélisation). Un soucis a été rencontré en plus de maintenir le ballon durablement. Le ballon étant en plastique, il pouvait être poussé par le crève ballon et non être percé. Pour remédier au soucis lié au ballon, une pince a été placé au sommet de la colonne pour l'attraper et le garder maintenue et une barre à été ajouté sur le coté de la colonne pour bloquer le ballon.
  • Afin de percer le ballon, le servomoteur sera relié à un arduino (câblage ci-contre)et est équipé d'une extension réalisé en modélisation 3D afin de taper de coté le ballon en opposition à la barre qui sert à bloquer le ballon. Une pointe est placé au bout de cette extension, elle sera recouverte par un cache lors du transport pour ne représenté aucun danger et il sera enlevé une fois le robot sur le terrain.


Déplacement

Partie 1: Objectif

Moteur et MD13S.jpg

Comment brancher le moteur ?

Comment commander les moteurs grâce au shield L298P ?

Partie 2: Recherche

  • Pour déplacer le robot, 2 moteurs MA 970D sont imposés. Pour chaque moteur on utilise un pilote de Moteur MD13S. Pour tester le fonctionnement des moteurs nous avons utilisé un potentiomètre pour simuler les capteurs de ligne et la boussole.
  • Problème rencontré: les 2 moteurs ne tournent pas à la même vitesse pour la même consigne.

Partie 3: Solution adoptée

Les 2 moteurs sont piloté avec des MS13S, afin de remédier aux soucis de vitesse, nous avons remarqué que le problème était le manque de puissance donc avec une alimentation plus importante on a pu faire fonctionné les moteurs à semblablement la même vitesse.

Programmation

Le robot fonctionne à l'aide d'un Arduino uno sur lequel on a connecté tous les composants. Chaque membre du groupe avait le code de sa partie puis nous les avons rassemblés de manière à que toutes les fonctions fonctionnent ensemble. Un chronomètre est initialisé grâce à la fonction millis ainsi qu'une boussole pour connaitre la position du terrain ennemie au début du match dans l'Arduino. Si le temps est inférieur à 85 s alors le robot sera en mode recherche de balle. Le robot tournera sur lui même en regardant avec la caméra pixy si il voit une balle. Si le robot en trouve une, il ira la chercher puis la renvoyé dans le terrain adverse en se dirigeant grâce à la Boussole face au terrain adverse. Si il n'en trouve pas alors il se déplacera puis effectuera la même démarche jusqu'à en trouvé une. Si le temps est supérieur à 85s alors le robot montera à la ligne blanche et percera son ballon puis s'arrêtera de fonctionner.

Programme

#include<Pixy2.h>
#include<Servo.h>
#include <Wire.h>
#include <CytronMotorDriver.h>
#include <math.h>
#include <TimerOne.h>

#define ouvert 0
#define fermer 50

//boussole
#define	MPU9250_ADDRESS        	0x68
#define	MAG_ADDRESS            	0x0C

#define	GYRO_FULL_SCALE_250_DPS	0x00
#define	GYRO_FULL_SCALE_500_DPS	0x08
#define	GYRO_FULL_SCALE_1000_DPS   0x10
#define	GYRO_FULL_SCALE_2000_DPS   0x18

#define	ACC_FULL_SCALE_2_G    	0x00
#define	ACC_FULL_SCALE_4_G    	0x08
#define	ACC_FULL_SCALE_8_G    	0x10
#define	ACC_FULL_SCALE_16_G   	0x18

float AngleZ = 0;
int BonAngle = 1;
float AngleInit;
float AngleQuelconque = 0;

// Counter BOUSSOLE
long int cpt = 0;

//////////////////////////////////BOUSSOLE
// This function reads Nbytes bytes from I2C device at address Address.
// Put read bytes starting at register Register in the Data array.
void I2Cread(uint8_t Address, uint8_t Register, uint8_t Nbytes, uint8_t* Data)
{
  // Set register address
  Wire.beginTransmission(Address);
  Wire.write(Register);
  Wire.endTransmission();

  // Read Nbytes
  Wire.requestFrom(Address, Nbytes);
  uint8_t index = 0;
  while (Wire.available())
	Data[index++] = Wire.read();
}

// Write a byte (Data) in device (Address) at register (Register)
void I2CwriteByte(uint8_t Address, uint8_t Register, uint8_t Data)
{
  // Set register address
  Wire.beginTransmission(Address);
  Wire.write(Register);
  Wire.write(Data);
  Wire.endTransmission();
}
// Initial time
long int ti;
volatile bool intFlag = false;
////////////////////////////BOUSSOLE

//pixy
Pixy2 pixy;
double x;
double y;

//Moteur
CytronMD moteurG(PWM_DIR, 3, 4); // PWM = broche 3, DIR = broche 4 / moteur GAUCHE
CytronMD moteurD(PWM_DIR, 6, 7); //PWM = broche 6, DIR = broche 7 / moteur DROIT

double var_inter;
double consigneG;
double consigneD;

// Manipulation Balle
Servo esc;
Servo blockBalle;

// Perce Ballon
Servo perceBallon;

int pos;
int i;

// Mesure temps
int temps;
const int t_max;


// Prototype fonction
void propulseBalle();
void finPartie();
void callback();




void setup() {
  pos = 0;
  i = 0;

  pixy.init();

  // init servo
  // perce ballon
  perceBallon.attach(9);
  perceBallon.write(pos);

  // block balle
  blockBalle.attach(10);
  blockBalle.write(ouvert);

  esc.attach(11);

  ////////////////////////// BOUSSOLE
  // Arduino initializations
  Wire.begin();
  Serial.begin(9600);

  // Set accelerometers low pass filter at 5Hz
  I2CwriteByte(MPU9250_ADDRESS, 29, 0x06);
  // Set gyroscope low pass filter at 5Hz
  I2CwriteByte(MPU9250_ADDRESS, 26, 0x06);


  // Configure gyroscope range
  I2CwriteByte(MPU9250_ADDRESS, 27, GYRO_FULL_SCALE_1000_DPS);
  // Configure accelerometers range
  I2CwriteByte(MPU9250_ADDRESS, 28, ACC_FULL_SCALE_4_G);
  // Set by pass mode for the magnetometers
  I2CwriteByte(MPU9250_ADDRESS, 0x37, 0x02);

  // Request continuous magnetometer measurements in 16 bits
  I2CwriteByte(MAG_ADDRESS, 0x0A, 0x16);

  // pinMode(13, OUTPUT);
  //pinMode(1, INPUT);
  Timer1.initialize(10000);     	// initialize timer1, and set a 1/2 second period
  Timer1.attachInterrupt(callback);  // attaches callback() as a timer overflow interrupt


  // Store initial time
  ti = millis();
}
//////////////////////////////BOUSSOLE
// Counter
void callback()
{
  intFlag = true;
  digitalWrite(13, digitalRead(13) ^ 1);
}

void loop() {

  //////////////////////BOUSSOLE
  while (!intFlag);
  intFlag = false;

  // Display time
  Serial.print (millis() - ti, DEC);
  Serial.print ("\t");

  delay(10);

  // _______________
  // ::: Counter :::

  // Display data counter
  //  Serial.print (cpt++,DEC);
  //  Serial.print ("\t");


  // ____________________________________
  // :::  accelerometer and gyroscope :::

  // Read accelerometer and gyroscope
  uint8_t Buf[14];
  I2Cread(MPU9250_ADDRESS, 0x3B, 14, Buf);

  // Create 16 bits values from 8 bits data

  // Accelerometer
  int16_t ax = -(Buf[0] << 8 | Buf[1]);
  int16_t ay = -(Buf[2] << 8 | Buf[3]);
  int16_t az = Buf[4] << 8 | Buf[5];

  // Gyroscope
  int16_t gx = -(Buf[8] << 8 | Buf[9]);
  int16_t gy = -(Buf[10] << 8 | Buf[11]);
  int16_t gz = Buf[12] << 8 | Buf[13];



  // Display values

  // Accelerometer
  /*Serial.print ("ax");
	Serial.print (ax,DEC);
	Serial.print ("\t");
	Serial.print ("ay");
	Serial.print (ay,DEC);
	Serial.print ("\t");
	Serial.print ("az");
	Serial.print (az,DEC);
	Serial.print ("\t");

	// Gyroscope
	Serial.print ("gx");
	Serial.print (gx,DEC);
	Serial.print ("\t");
	Serial.print ("gy");
	Serial.print (gy,DEC);
	Serial.print ("\t");
	Serial.print ("gz");
	Serial.print (gz,DEC);
	Serial.print ("\t");*/


  // _____________________
  // :::  Magnetometer :::


  // Read register Status 1 and wait for the DRDY: Data Ready

  uint8_t ST1;
  do
  {
	I2Cread(MAG_ADDRESS, 0x02, 1, &ST1);
  }
  while (!(ST1 & 0x01));

  // Read magnetometer data
  uint8_t Mag[7];
  I2Cread(MAG_ADDRESS, 0x03, 7, Mag);


  // Create 16 bits values from 8 bits data

  // Magnetometer
  int16_t mx = -(Mag[3] << 8 | Mag[2]);
  int16_t my = -(Mag[1] << 8 | Mag[0]);
  int16_t mz = -(Mag[5] << 8 | Mag[4]);


  // Magnetometer
  /*Serial.print ("mx+200");
	Serial.print (mx+200,DEC);
	Serial.print ("\t");
	Serial.print ("my-70");
	Serial.print (my-70,DEC);
	Serial.print ("\t");
	Serial.print ("mz-700");
	Serial.print (mz-700,DEC);
	Serial.print ("\t");*/




  AngleZ = atan2(my, mx) * (180 / PI);
  //3.14159265);
  if (AngleZ < 0) {
	AngleZ = AngleZ + 360;
  }

  delay(10);

  Serial.print ("Angle Z : ");
  Serial.print (AngleZ);
  Serial.print ("\t");

  delay(10);

  //ValeurBouton = digitalRead(1);
  //Serial.print ("valeur bouton :");
  // Serial.print (ValeurBouton);
  // Serial.print ("\t");

  delay(10);

  //if (ValeurBouton == 1) {
  //  BonAngle = 1;
  // } else {
  //  BonAngle = 0;
  //}

  Serial.print("Bon angle : ");
  Serial.print(BonAngle);
  Serial.print("    	");
  delay(10);

  if (BonAngle == 1) {
	AngleInit = AngleZ;
	BonAngle = 0;
  }

  delay(10);

  if (AngleZ >= AngleInit - 15 && AngleZ <= AngleInit + 15) {
	//Code de lancé de balle
	Serial.print("on peut lancer la balle");
  }

  // End of line
  Serial.println("    	");
  delay(10);







  // récupère données pixy
  pixy.ccc.getBlocks();

  if (temps < t_max)
  {
	if (pixy.ccc.numBlocks)
	{
  	x = pixy.ccc.blocks[0].m_x;
  	y = pixy.ccc.blocks[0].m_y;
  	if (y < 190)
  	{
    	consigneD = x / 316 * (-100) + 100;
    	var_inter = x / 316, 0;
    	consigneG = var_inter * 100;
    	moteurD.setSpeed(consigneD);
    	moteurG.setSpeed(consigneG);
  	}
  	else
  	{
    	moteurG.setSpeed(90);
    	moteurD.setSpeed(90);
    	delay(100);
    	moteurG.setSpeed(0);
    	moteurD.setSpeed(0);

    	propulseBalle();
  	}
	}
	else
	{
  	//pas un tour complet
  	AngleQuelconque = AngleZ;
  	if (AngleQuelconque < 350) {
    	if (AngleZ < AngleQuelconque && AngleZ > AngleQuelconque + 10) {
      	moteurG.setSpeed (0);
      	moteurD.setSpeed(100);
    	} else {
      	moteurG.setSpeed(100);
      	moteurD.setSpeed(100);
      	delay(500);
      	moteurG.setSpeed(0);
      	moteurD.setSpeed(0);
    	}
  	} else { //au dessus de 350
    	if (AngleZ < AngleQuelconque && AngleZ > int(AngleQuelconque + 10) % 360) {
      	moteurG.setSpeed (0);
      	moteurD.setSpeed(100);
    	} else {
      	moteurG.setSpeed(100);
      	moteurD.setSpeed(100);
      	delay(500);
      	moteurG.setSpeed(0);
      	moteurD.setSpeed(0);
    	}
  	}
	}
  }
  else
  {
	finPartie();
  }
  //pas en face
  if (AngleInit >= 355) {
	while (AngleZ < AngleInit - 5 && AngleZ > int(AngleInit + 5) % 360) {
  	moteurG.setSpeed(0);
  	moteurD.setSpeed(100);
	}
  }
  else {
	if (AngleInit <= 5) {
  	while (AngleZ < int(AngleInit - 5) % 360 && AngleZ > AngleInit + 5) {
    	moteurG.setSpeed(0);
    	moteurD.setSpeed(100);
  	}
	} else {
  	if (AngleInit < 355 && AngleInit > 5) {
    	while (AngleZ < AngleInit - 5 && AngleZ > AngleInit + 5) {
      	moteurG.setSpeed(0);
      	moteurD.setSpeed(100);
    	}
  	}
	}
  }

  if (AngleZ >= int(AngleInit - 5) % 360 && AngleZ <= int(AngleInit + 5) % 360) {
	moteurG.setSpeed(100);
	moteurD.setSpeed(100);
	delay(500);
	moteurG.setSpeed(0);
	moteurD.setSpeed(0);
  } else {

	//pas en retour position précedente

	if (AngleQuelconque < 350) {
  	if (AngleZ < AngleQuelconque && AngleZ > AngleQuelconque + 10) {
    	moteurG.setSpeed (0);
    	moteurD.setSpeed(100);
  	}
	} else { //au dessus de 350
  	if (AngleZ < AngleQuelconque && AngleZ > int(AngleQuelconque + 10) % 360) {
    	moteurG.setSpeed (0);
    	moteurD.setSpeed(100);
  	}
	}
  }
}


// Fonctions

void propulseBalle()
{
  // ferme servo
  blockBalle.write(fermer);

  //pas tour complet
  AngleQuelconque = AngleZ;
  if (AngleQuelconque < 350) {
	if (AngleZ < AngleQuelconque && AngleZ > AngleQuelconque + 10) {
  	moteurG.setSpeed (0);
  	moteurD.setSpeed(100);
	}
  } else { //au dessus de 350
	if (AngleZ < AngleQuelconque && AngleZ > int(AngleQuelconque + 10) % 360) {
  	moteurG.setSpeed (0);
  	moteurD.setSpeed(100);
	}
  }
  // OUVRE SERVO
  blockBalle.write(ouvert);
  esc.write(0);
  delay(1000);
  esc.write(180);
  delay(1000);
  esc.write(0);
  // Tourne le moteur
  esc.write(20);
}

void finPartie()
{
  //partie servomoteur qui crève le ballon
  while (i < 3) {
	for (pos = 0; pos <= 180; pos += 1) { // goes from 0 degrees to 180 degrees
  	// in steps of 1 degree
  	perceBallon.write(pos);       	// tell servo to go to position in variable 'pos'
  	delay(5);                 	// waits 15ms for the servo to reach the position
	}
	for (pos = 180; pos >= 0; pos -= 1) { // goes from 180 degrees to 0 degrees
  	perceBallon.write(pos);       	// tell servo to go to position in variable 'pos'
  	delay(5);                 	// waits 15ms for the servo to reach the position
	}
	i++;

  }
}

Assemblage du Robot

Robot geii2.jpg
  • Le montage des différents systèmes et pièces du robot fut assemblé tout d'abord par les grosses parties qui représente la base du robot: comme le bloc d'alimentation
    • le bloc d'alimentation ainsi que les différents réseaux d'alimentation
    • Bouton d'arrêt d'urgence
    • Moteur MA 970D
  • Puis après avoir fixé ces pièces et câblé, nous avons assemblé puis fixé les parties supplémentaire du robot qui sont:
    • les supports des pilotes Moteurs MD13S auxquels nous les avons fixés.
    • Les différents capteurs comme les 3 CNY70 et la boussole MPU9250
    • le système de renvoie de balle
    • Le support du ballon et avec le système de perçage de ballon.

Quand tous les derniers systèmes fut installé nous les avons reliés, câblés et alimentés.

Travaux à finir

  • Afin d'avoir un robot fonctionnel pour la compétition il reste encore quelque travaux à faire:
    • Test et mise au point du programme sur la partie recherche de balle.
    • Test et mise au point sur la partie "renvoie de balle".
    • Réglages divers.
    • Essaie du robot en situation de match pour observer le fonctionnement de chaque partie et si celle-ci ne présente pas de défaut ou dysfonctionnement sur le terrain.

FORGEOT Cécile

LAURENS Aurélien

NOIRAULT Aurélien

SAVOURET Jason