RobotGEII Roue Codeuse

De troyesGEII
Aller à : navigation, rechercher


Roue Codeuse

I-Introduction :

Afin de connaitre la position des roues et de savoir le nombre de tours elles ont tournés nous avons utilise un codeur rotatif. C’est un type de capteurs permettant de délivrer des informations des deux roues en mesurant la rotation effectuée autour d’un axe. L'information de vitesse peut alors être traduite par la variation de la position en fonction du temps.


II-Fabrication de la roue :

Nous avons pris les mesures du moteur afin de fabriquer notre roue codeuse, puis on a utilise un logiciel de création Charly robot pour la fabriquer.

                                 Calcul.PNG
                               Procedure.PNG
                                  Roue.JPG


III-Composants utilisés :

                                 Composant.PNG

Le composant TCUT 1300 nous permet de compter les numéros d’encoche parcouru et savoir le sens de rotation grace aux 2 phototransistors .

Suite à un problème au niveau du microprocesseur, on a décidé d'utiliser la carte Arduino pour programmer en utilisant les 6 ports pareils que précédemment. On a fabriqué la carte avec Eagle :


                                 Routage.png

Voici la carte :

                                 Carte rc.PNG


IV-Principe de fonctionnement :

En comptant le nombre d’encoches passés en utilisant les photo-transistors de TUCT1300 et en déterminant le sens de rotation des roues, on peut ensuite déterminer la vitesse de mouvement du robot et finalement savoir sa position par rapport au point de départ.

                                 Pr fon.PNG

D'après le chronogramme, on voit qu'on peut déterminer le sens de rotation grâce aux états des deux photo-transistors. On incrémente ou décrémente le nombre d'encoches selon leur états.

                                 Chro re.PNG

Finalement, on peut essayer de coder pour déterminer la distance du mouvement effectuée pour chaque période de calcul. (Pour plus de détail sur le principe de calcul : http://manubatbat.free.fr/doc/positionning/node5.html

                                 Posi rc.PNG


Code complet pour afficher les sens de rotations de deux roues:

#define Avt 0
#define Arr 1

int AIA=3;
int AIB=6;
int BIA=4;
int BIB=5;
int d,v;
void setup(){
  pinMode(AIA,  OUTPUT);
  pinMode(AIB,  OUTPUT);
  pinMode(BIA, OUTPUT);
  pinMode(BIB, OUTPUT);
  maz();
  Serial.begin(115200);
}

void maz()
{
      digitalWrite( BIB, LOW );
      digitalWrite( BIA, LOW );
      digitalWrite( AIA, LOW );
      digitalWrite( AIB, LOW );
      delay(150);
}

void gch(int d,int v)
{
  if (d==Avt){
    digitalWrite(AIB, LOW);
    analogWrite(AIA,v);
  }

  else if (d==Arr){
    digitalWrite(AIB, HIGH);
    analogWrite(AIA,255-v);
  }
}

void drt(int d,int v)
{
  if (d==Avt){
    digitalWrite(BIB, HIGH);
    analogWrite(BIA,255-v);
  }

  else if (d==Arr){
    digitalWrite(BIB, LOW);
    analogWrite(BIA,v);
  }
}

void mgd(int d, int v)
{
  drt(d,v);
  gch(d,v);
}


void loop()
{
  boolean isValidInput;
  // draw a menu on the serial port
  Serial.println( "-----------------------------" );
  Serial.println( "MENU:" );
  Serial.println( "1) Moteur A avant" );
  Serial.println( "2) Moteur A arriere" );
  Serial.println( "3) Moteur B avant" );
  Serial.println( "4) Moteur B arriere" );
  Serial.println( "5) Deux moteurs avant" );
  Serial.println( "6) Deux moteurs arriere" );
  Serial.println( "-----------------------------" );
  do
  {
    byte c;
    Serial.print( "?" );
    while( !Serial.available() )
      ;
    c = Serial.read();
    switch( c )
    {
    case '1':
      Serial.println( "Moteur A avant..." );
      maz();
      gch(Avt, 200);
      isValidInput = true;
      break;

    case '2':
      Serial.println( "Moteur A arriere..." );
      maz();
      gch(Arr,200);
      isValidInput = true;
      break;

    case '3': // 1) Fast forward
      Serial.println( "Moteur B avant..." );
      maz();
      drt(Avt,200);
      isValidInput = true;
      break;

    case '4':
      Serial.println( "Moteur B arriere...");
      maz();
      drt(Arr,200);
      isValidInput = true;
      break;

      case '5':
      Serial.println( "Deux moteurs avant...");
      maz();
      mgd(Avt, 200);
      isValidInput = true;
      break;

      case '6':
      Serial.println( "Deux moteurs arriere...");
      maz();
      mgd(Arr, 200);
      isValidInput = true;
      break;

    default:
      // wrong character! display the menu again!
      isValidInput = false;
      break;
    }
  }
  while( isValidInput == true );
}



Ancien code pour compter le nombre d'encoches :

volatile long cptRoueD, cptRoueG;

void setup()
{
  pinMode(13,OUTPUT);
  attachInterrupt(1,codeurD,CHANGE);
  attachInterrupt(0,codeurG,CHANGE);
  Serial.begin(9600);
  cptRoueD=0;
  cptRoueG=0;
}

void codeurD()
{
  uint8_t etat=PIND&0b00101000;
  switch(etat){
  case 0b00000000:
    cptRoueD--;
    break;
  case 0b00101000:
    cptRoueD--;
    break;
  case 0b00001000:
    cptRoueD++;
    break;
  case 0b00100000:
    cptRoueD++;
    break;
  }
}

void codeurG()
{
  uint8_t etat=PIND&0b00010100;
  switch(etat){
  case 0b00000000:
    cptRoueG--;
    break;
  case 0b00010000:
    cptRoueG++;
    break;
  case 0b00000100:
    cptRoueG++;
    break;
  case 0b00010100:
    cptRoueG--;
    break;
  }
}


void loop()
{

  delay(500);
  Serial.print("Droite = ");
  Serial.println(cptRoueD,DEC);
  Serial.print("Gauche = ");
  Serial.println(cptRoueG,DEC);
}