Robot

De troyesGEII
Aller à : navigation, rechercher

Voici les explications concernant le projet de robotique de Blaise Barré, Julien Santa-Comba et Kévin Bruno. 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.

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

Caractéristiques techniques de l'opto-coupleur

Pour la détection des crans des roues codeuses(passage du noir au transparent, nous utiliserons des opto-coupleurs fixés sur la "carcasse" du robot, ce qui permettra de définir la vitesse du robot. Nous avons fait un montage temporaire dans lequel une led d'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 recheché le programme pour mettre ce montage pull-up sur la carte Arduino.

Programme des opto-coupleurs

Après plusieurs essais, nous avons établis le programme suivant

[Programme]


A partir de cet instant, le robot pouvait avancer à une vitesse établie (en faisant varier de 0 à 255) et établir un parcours prédéfini.

Deuxième partie : les capteurs

La deuxième partie de la réalisation est consacrée aux capteurs. Pour cela, nous utiliserons des photodiodes de type BPW50

http://www.datasheetarchive.com/photodiode%20BPW50-datasheet.html mais aussi des diodes infrarouges CQY89 http://www.datasheetarchive.com/cqy89-datasheet.html. 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.
  Le schéma utilisé pour un capteur est :
  Après calcul nous avons déterminés qu'ils nous fallaient une résistance de 2.2kΩ branchée à la patte "base" du transistor et une résistance de 10Ω cablé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

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);
  }*/


}