Robot

De troyesGEII
Aller à : navigation, rechercher
Coupe robotique

Compte-rendu et explications concernant le projet de robotique de GEII 2ème année de TR.

Le robot que nous allons concevoir a pour but de participer à un concours à Vierzon.

Pour cela, nous utiliserons en général des cartes Arduino qui facilitent la conception du robot et notamment des différentes parties délicates tel que les capteurs :

Liaison arduino/pc

Voici la liste du matériel que nous utiliserons pour construre notre robot :

  1. Carter
  2. Moteurs
  3. Capteurs fourche
  4. Roues codeuses
  5. Cartes Arduino

Première partie : conception des moteurs

Caractéristiques générales des roues codeuses

La première partie de la concetion consiste à programmer les cartes pour permettre au robot, dans un premier temps, d'avancer en ligne droite. Pour cela, nous avons recherchés:

  1. le nombre de crans de l'engrenage de la roue : 60 au total ; 30 blancs et 30 noirs
  2. le diamètre de la roue codeuse : 55mm
  3. le nombre de cran de l'engrenage de la sortie du moteur : 12
  4. le rapport de réduction : Z1/Z2 = 60/12 = 5 ; 5/60 = 0,08
  5. le Diamètre de la roue du moteur : 52,6mm
  6. le nombre de crans de roues codeuses : 60
  7. la distance entre les deux roues est de 20 cm

Caractéristiques techniques de l'opto-coupleur

Un optocoupleur

Pour la détection des crans des roues codeuses (passage du noir au transparent, nous utiliserons des optocoupleurs fixés sur la châssis du robot, ce qui permettra de définir la vitesse du robot.

Montage temporaire

Le schéma d'un optocoupleur
Nous avons fait un montage temporaire dans lequel une led s'allume lorsque l'opto-coupleur n'est pas saturé, c'est-à-dire lorsque aucun objet n'entre entre l'émetteur et le récepteur. Nous avons donc mis une résistance de 100 Ohms en série avec la led de l'opto-coupleur. Nous avons par ailleurs recherché le programme pour mettre ce montage pull-up sur la carte Arduino.

Montage final

Après plusieurs essais réussi sur le montage temporaire, nous avons finalement mis en place le montage définitif permettant de gérer le robot à l'aide des opto-coupleurs et d'un programme associé (voir programme plus bas). Nous avons établis le programme permettant au robot d'avancer à une vitesse établie (en faisant varier de 0 à 255) et établir un parcours prédéfini.

Deuxième partie : les capteurs

Caractéristiques générales des capteurs

La deuxième partie de la réalisation est consacrée aux capteurs infrarouge. Pour cela, nous utiliserons des photodiode de type BPW50 mais aussi des diodes infrarouges CQY89. Au total, 3 capteurs seront utilisés (1 sur chaque côté du robot et 1 sur la face avant) ce qui lui permettra de détecter les obstacles.

Caractéristiques techniques des capteurs

Le schéma utilisé pour un capteur est : Après calcul nous avons déterminé qu'ils nous fallait une résistance de 2.2kΩ branchée à la patte "base" du transistor et une résistance de 10Ω câblée en série avec la diode à la patte "collectrice". La patte "émettrice" est reliée à la masse. Après plusieurs essais, nous arrivons, au maximum, à détecter un obstacle à partir d'environ 15 cm.


Programme final

int testtimer=0;

int pwm_a = 3; 
//PWM control for motor outputs 1 and 2 is on digital pin 10 
int pwm_b = 11; 
//PWM control for motor outputs 3 and 4 is on digital pin 11 
int Pindir_a = 12;
int dir_a=0;
//PWM control for motor outputs 1 and 2 is on digital pin 12 
int Pindir_b = 13;
int dir_b=1;
//PWM control for motor outputs 3 and 4 is on digital pin 13 
int val0=0;//valuer sur1024 de capteur0 de la diode infrarouge
int val1=0;//valuer sur1024 de capteur1
int val2=0;//valuer sur1024 de capteur2
int analogPin0 = 3;//capteur1(droite) broche5
int analogPin1 = 4;//capteur0(millieu) broche5
int analogPin2 = 5;//capteur2(gauche) broche5
int on_InfraD = 9; //transistor droit
int on_InfraC = 8; //transistor milieu
int on_InfraG = 7; //transistor gauche
int on_Bip = 10; //allume le bipper
int L=23;

int compteura=20;
int compteurb=20;
int compteurPositionA=0;
int compteurPositionB=0;
int DeltaMoyN = 0 ;
int DeltaTetaN = 0 ;
int DeltaDiF=0 ;
int anciencompteura ;
char c;
int zero;

void setup() {
  Serial.begin(115200);	// ouvre le port série, fixe le débit à 115200 bauds

  pinMode(pwm_a, OUTPUT);  //vitesse
  pinMode(pwm_b, OUTPUT);  //vitesse
  pinMode(Pindir_a, OUTPUT); //sens
  pinMode(Pindir_b, OUTPUT); //sens
  pinMode(on_InfraG, OUTPUT); //transistor
  pinMode(on_InfraC, OUTPUT); 
  pinMode(on_InfraD, OUTPUT); 
  pinMode(on_Bip, OUTPUT); 
  //capteur optique
  attachInterrupt (0,test , CHANGE);//patte 2, moteur a
  attachInterrupt (1,test2 , CHANGE);//patte 3, moteur b

  //sens du moteur
  //si 0 recule,si 1 avance
  digitalWrite(Pindir_a, dir_a);
  //si 0 recule,si 1 avance
  digitalWrite(Pindir_b, dir_b);
  cli();//stop interrupts

  /* //set timer0 interrupt at 2kHz
   TCCR0A = 0;// set entire TCCR2A register to 0
   TCCR0B = 0;// same for TCCR2B
   TCNT0  = 0;//initialize counter value to 0
   // set compare match register for 2khz increments
   OCR0A = 124;// = (16*10^6) / (2000*64) - 1 (must be <256)
   // turn on CTC mode
   TCCR0A |= (1 << WGM01);
   // Set CS11 and CS10 bits for 64 prescaler
   TCCR0B |= (1 << CS11) | (1 << CS10);   
   // enable timer compare interrupt
   TIMSK0 |= (1 << OCIE0A);
   */
  sei();//allow interrupts

} 
ISR(TIMER0_COMPA_vect){//timer1 interrupt 1Hz toggles pin 13 (LED)

  testtimer++;
  if (testtimer==5000)
  {



    if( compteura=anciencompteura){
      dir_a=1;
      dir_b=0;
      analogWrite(pwm_b,200);
      analogWrite(pwm_a,100);
      delay(500); 
    }
  }
}


void test(){
  compteura=anciencompteura ;
  if (dir_a==0){
    compteura=compteura+1;
  }
  else{
    compteura=compteura-1;
  }

}

void test2(){
  if (dir_b==1){
    compteurb=compteurb+1;
  }
  else{
    compteurb=compteurb-1;
  }

}

void loop(){


  digitalWrite(on_InfraG, 1);
  digitalWrite(on_InfraC, 1);
  digitalWrite(on_InfraD, 1);
  digitalWrite(on_Bip, 0);
  //afficher les valeurs


  val0 = analogRead (analogPin0); // lecture de la broche d'entrée0
  val1 = analogRead (analogPin1); // lecture de la broche d'entrée1
  val2 = analogRead (analogPin2); // lecture de la broche d'entrée2  
  Serial.print("val 1 Milieu ");
  Serial.print(val1); 
  Serial.print(" val 2  Gauche ");
  Serial.print(val2);
  Serial.print(" val 0 Droite "); 
  Serial.println(val0); 
  /*   Serial.print('m');
   Serial.println (val0); // debug valeur
   Serial.print('g'); 
   Serial.println (val1); // debug valeur
   Serial.print('d');
   Serial.println (val2); // debug valeur 
   */

  if(val0>=350||val1>=300||val2>=350)
  {

    dir_a=1;
    dir_b=0;
    compteurPositionA=compteurPositionA+compteura;
    compteurPositionB=compteurPositionB+compteurb;
    compteura=0;
    compteurb=0;
    digitalWrite(Pindir_a, dir_a);
    digitalWrite(Pindir_b, dir_b);
    analogWrite(pwm_b,200);
    analogWrite(pwm_a,100);
    digitalWrite(on_Bip, 1);
    delay(500);

  }

  else 
  {
    analogWrite(pwm_b,200);
    analogWrite(pwm_a,200);
    dir_a=0;
    dir_b=1;

    digitalWrite(Pindir_a, dir_a);
    digitalWrite(Pindir_b, dir_b);
    /*    delay(2000); //
     if( compteura=anciencompteura){
     dir_a=0;
     dir_b=0;
     analogWrite(pwm_b,200);
     analogWrite(pwm_a,80);
     delay(500); } */
  }
  //}

  //if(compteura>=-40&compteurb>=-40){ 
  // analogWrite(pwm_b,100);
  // analogWrite(pwm_a,0);
  // }
  //  if(compteura>=-50&compteurb>=-50){ 
  //  compteura=20;
  //    compteurb=20;
  // } 




  //aller tout droit
  /*   if(compteura<=5000){
   analogWrite(pwm_a,113);//attention toujours faire fonctionné le moteur >60   //bon commpromis a=113  b=100
   }
   if(compteurb<=5000){         
   analogWrite(pwm_b,100);
   }
   //Tourner à droite
   if(compteura>=5000&compteura<=5500){
   analogWrite(pwm_a, 0);}
   if(compteurb>=5000&compteurb<=5500){  
   analogWrite(pwm_b, 0);   
   }
   
   //Aller tout droit
   if(compteurb>=5999&compteurb<=7000){
   
   analogWrite(pwm_a,113);
   analogWrite(pwm_b, 100);
   }
   
   //tourner a gauche 
   if(compteurb>=7000&compteura>=7000&compteurb<=7500&compteura<=7500){   
   analogWrite(pwm_a, 0);
   analogWrite(pwm_b, 100);
   }
   if(compteurb>=7500&compteurb<=9999){
   
   analogWrite(pwm_a, 113);
   analogWrite(pwm_b, 100);   
   }
   //S"arreter
   if(compteura>=10000){
   analogWrite(pwm_a, 0); 
   }
   if(compteurb>=10000){
   analogWrite(pwm_b, 0);
   }*/



}

Troisième partie : prédéfinition du parcours du robot

Grace aux roues codeuses, nous allons désormais coder un programmer qui nous permettra de définir un emplacement de destination au robot et auquel le robot se rendra.






int testtimer=0;
 
int pwm_a = 3; 
//PWM control for motor outputs 1 and 2 is on digital pin 10 
int pwm_b = 11; 
//PWM control for motor outputs 3 and 4 is on digital pin 11 
int Pindir_a = 12;
int dir_a=0;
//PWM control for motor outputs 1 and 2 is on digital pin 12 
int Pindir_b = 13;
int dir_b=1;
//PWM control for motor outputs 3 and 4 is on digital pin 13 
int val0=0;//valuer sur1024 de capteur0 de la diode infrarouge
int val1=0;//valuer sur1024 de capteur1
int val2=0;//valuer sur1024 de capteur2
int analogPin0 = 3;//capteur1(droite) broche5
int analogPin1 = 4;//capteur0(millieu) broche5
int analogPin2 = 5;//capteur2(gauche) broche5
int on_InfraD = 9; //transistor droit
int on_InfraC = 8; //transistor milieu
int on_InfraG = 7; //transistor gauche
int on_Bip = 10; //allume le bipper
int L=23;
 
int compteura=20;
int compteurb=20;
int compteurPositionA=0;
int compteurPositionB=0;
int DeltaMoyN = 0 ;
int DeltaTetaN = 0 ;
int DeltaDiF=0 ;
int anciencompteura ;
char c;
int zero;




int compteurmoy = 0 ;
int compteurteta = 0 ;
int compteurdiff =0 ;
int deltaX = 0 ;
int deltaY = 0 ;


 
void setup() {
  Serial.begin(115200);	// ouvre le port série, fixe le débit à 115200 bauds
 
  pinMode(pwm_a, OUTPUT);  //vitesse
  pinMode(pwm_b, OUTPUT);  //vitesse
  pinMode(Pindir_a, OUTPUT); //sens
  pinMode(Pindir_b, OUTPUT); //sens
  pinMode(on_InfraG, OUTPUT); //transistor
  pinMode(on_InfraC, OUTPUT); 
  pinMode(on_InfraD, OUTPUT); 
  pinMode(on_Bip, OUTPUT); 
  //capteur optique
  attachInterrupt (0,test , CHANGE);//patte 2, moteur a
  attachInterrupt (1,test2 , CHANGE);//patte 3, moteur b
 
  //sens du moteur
  //si 0 recule,si 1 avance
  digitalWrite(Pindir_a, dir_a);
  //si 0 recule,si 1 avance
  digitalWrite(Pindir_b, dir_b);
  cli();//stop interrupts
 
   // Configuration Timer 2
  TCCR2A=B010;
  // Mode CTC (Clear Timer On Compare)
  OCR2A=700;
  // Registre de comparaison A = 156
  TCCR2B=B111;
  // Prescaler 1024 (Clock/1024)
  TIMSK2=B010;
  // IT Timer2 Quand TCNT2=OCR2A

  sei();//allow interrupts
 
} 
ISR(TIMER0_COMPA_vect){//timer1 interrupt 1Hz toggles pin 13 (LED)
 
  testtimer++;
  if (testtimer==5000)
  {
 
 
 
    if( compteura=anciencompteura){
      dir_a=1;
      dir_b=0;
      analogWrite(pwm_b,200);
      analogWrite(pwm_a,100);
      delay(500); 
    }
  }
}

ISR(TIMER2_COMPA_vect){
       Serial.print("a = ");     
       Serial.print(compteura); 
       Serial.print(" b = ");
       Serial.println(compteurb);
       compteurmoy = ((compteura+compteurb)/2);
       compteurdiff= compteura-compteurb;
       deltaX = compteurmoy*cos(compteurteta) ;
       deltaY = compteurmoy*sin(compteurteta) ;
       compteurteta=compteurdiff/20 ;
       Serial.print(deltaX);
       Serial.print("deltaX");
       Serial.print(deltaY);
       Serial.print("deltaY");
       Serial.print(compteurmoy);
       Serial.print("compteurmoy");
       Serial.print(compteurteta);
       Serial.println("compteurteta");
}
 
 
void test(){
  compteura=anciencompteura ;
  if (dir_a==0){
    compteura=compteura+1;
  }
  else{
    compteura=compteura-1;
  }
 
}
 
void test2(){
  if (dir_b==1){
    compteurb=compteurb+1;
  }
  else{
    compteurb=compteurb-1;
  }
 
}
 
void loop(){
 
 
  digitalWrite(on_InfraG, 1);
  digitalWrite(on_InfraC, 1);
  digitalWrite(on_InfraD, 1);
  digitalWrite(on_Bip, 0);
  //afficher les valeurs
 
 
  val0 = analogRead (analogPin0); // lecture de la broche d'entrée0
  val1 = analogRead (analogPin1); // lecture de la broche d'entrée1
  val2 = analogRead (analogPin2); // lecture de la broche d'entrée2  
  Serial.print("val 1 Milieu ");
  Serial.print(val1); 
  Serial.print(" val 2  Gauche ");
  Serial.print(val2);
  Serial.print(" val 0 Droite "); 
  Serial.println(val0); 
  /*   Serial.print('m');
   Serial.println (val0); // debug valeur
   Serial.print('g'); 
   Serial.println (val1); // debug valeur
   Serial.print('d');
   Serial.println (val2); // debug valeur 
   */
 
  if(val0>=350||val1>=300||val2>=350)
  {
 
    dir_a=1;
    dir_b=0;
    compteurPositionA=compteurPositionA+compteura;
    compteurPositionB=compteurPositionB+compteurb;
    compteura=0;
    compteurb=0;
    digitalWrite(Pindir_a, dir_a);
    digitalWrite(Pindir_b, dir_b);
    analogWrite(pwm_b,200);
    analogWrite(pwm_a,100);
    digitalWrite(on_Bip, 1);
    delay(500);
 
  }
 
  else 
  {
    analogWrite(pwm_b,200);
    analogWrite(pwm_a,200);
    dir_a=0;
    dir_b=1;
 
    digitalWrite(Pindir_a, dir_a);
    digitalWrite(Pindir_b, dir_b);
    /*    delay(2000); //
     if( compteura=anciencompteura){
     dir_a=0;
     dir_b=0;
     analogWrite(pwm_b,200);
     analogWrite(pwm_a,80);
     delay(500); } */
  }
  
  
  if(compteurteta >= 0) 
  {
        analogWrite(pwm_b,200);
        analogWrite(pwm_a,255);
        delay(100);
  }
 else if(compteurteta >= 0)
  {
       analogWrite(pwm_b,255);
    analogWrite(pwm_a,200);
    delay(100);
  } 
  
  
  
  //}
 
  //if(compteura>=-40&compteurb>=-40){ 
  // analogWrite(pwm_b,100);
  // analogWrite(pwm_a,0);
  // }
  //  if(compteura>=-50&compteurb>=-50){ 
  //  compteura=20;
  //    compteurb=20;
  // } 
 
 
 
 
  //aller tout droit
  /*   if(compteura<=5000){
   analogWrite(pwm_a,113);//attention toujours faire fonctionné le moteur >60   //bon commpromis a=113  b=100
   }
   if(compteurb<=5000){         
   analogWrite(pwm_b,100);
   }
   //Tourner à droite
   if(compteura>=5000&compteura<=5500){
   analogWrite(pwm_a, 0);}
   if(compteurb>=5000&compteurb<=5500){  
   analogWrite(pwm_b, 0);   
   }
 
   //Aller tout droit
   if(compteurb>=5999&compteurb<=7000){
 
   analogWrite(pwm_a,113);
   analogWrite(pwm_b, 100);
   }
 
   //tourner a gauche 
   if(compteurb>=7000&compteura>=7000&compteurb<=7500&compteura<=7500){   
   analogWrite(pwm_a, 0);
   analogWrite(pwm_b, 100);
   }
   if(compteurb>=7500&compteurb<=9999){
 
   analogWrite(pwm_a, 113);
   analogWrite(pwm_b, 100);   
   }
   //S"arreter
   if(compteura>=10000){
   analogWrite(pwm_a, 0); 
   }
   if(compteurb>=10000){
   analogWrite(pwm_b, 0);
   }*/
 
 
 
}