Hardrobot : Différence entre versions

De troyesGEII
Aller à : navigation, rechercher
(Détection de blocage)
(1 ere Étape moteur)
 
(21 révisions intermédiaires par le même utilisateur non affichées)
Ligne 1 : Ligne 1 :
 
=1 ere Étape moteur =
 
=1 ere Étape moteur =
 +
présentation du robot en vidéo http://www.youtube.com/watch?v=qjyGY_saNkU
 +
 +
petite vidéo du fonctionnement très rudimentaire http://www.youtube.com/watch?v=RFTtGAS0Rkk
 +
==Soudage des composants==
 +
[http://www.sparkfun.com/tutorials/183 Présentation en ligne]
 
==programme arduino ==
 
==programme arduino ==
[http://www.sparkfun.com/tutorials/183 Présentation en ligne]
+
<source lang=c>
  
<source lang=c>
+
inttesttimer=0;
int pwm_a = 10;  
+
const intledhaut=8;
//PWM control for motor outputs 1 and 2 is on digital pin 10  
+
const int ledpinv=5;
int pwm_b = 11;  
+
const int ledpinj=6;
//PWM control for motor outputs 3 and 4 is on digital pin 11  
+
const int ledpinr=7;
int Pindir_a = 12;
+
int pwm_a = 10;  
int dir_a=0;
+
//PWM control for motor outputs 1and 2 is on digital pin 10  
//PWM control for motor outputs 1 and 2 is on digital pin 12  
+
int pwm_b = 11;  
int Pindir_b = 13;
+
//PWM control for motor outputs 3and 4 is on digital pin 11  
int dir_b=0;
+
int Pindir_a = 12;
//PWM control for motor outputs 3 and 4 is on digital pin 13  
+
int dir_a=1;
  int val;
+
//PWM control for motor outputs 1and 2 is on digital pin 12  
  int compteur;
+
int Pindir_b = 13;
  int entreePin=4;
+
int dir_b=1;
  int entreePin2=2;
+
//PWM control for motor outputs 3and 4 is on digital pin 13  
  char c;
+
int val0=0;//valuersur1024 de capteur0
 +
intval1=0;//valuer sur1024 de capteur1
 +
intval2=0;//valuer sur1024 de capteur2
 +
intariv=0;//capteur d'arrivé
 +
intanalogPin0 = 0;//capteur0(millieu) broche0
 +
intanalogPin1 = 1;//capteur1(gauche) broche1
 +
intanalogPin2 = 2;//capteur2(droit) broche2
 +
intanalogPin4 =5;//capteur d'arrivé
 +
intcompteura=20;
 +
intcompteurb=20;
 +
int anciencompteura ;
 +
intanciencompteurb;
 +
char c;
 +
int zero;
 +
intafaire=0;
 +
int tim=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
 +
  //capteur optique
 +
  attachInterrupt (0,test , CHANGE);//patte 2,moteur a
 +
  attachInterrupt (1,test2 , CHANGE);//patte 3,moteur b
 +
  pinMode(ledpinv, OUTPUT);
 +
    pinMode(ledpinj, OUTPUT);
 +
      pinMode(ledpinr, OUTPUT);
 +
  //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
 +
 +
// TCCR1A = 0;                  //Reset control registers
 +
// TCCR1B = 0;                  //Reset control registers
 +
// TCCR1B |= (1 << WGM12);    // Clear Timer on Compare Match (CTC) Mode
 +
// TCCR1B |= (1 << CS10);      // Prescaler x1
 +
// OCR1A = 255;                //Set compared value
 +
// TIMSK1 = 0;                  //Reset Timer/Counter2 Interrupt Mask Register
 +
TIMSK1 |= (1 << OCIE1A);    // Enable Output Compare Match A Interrupt*/
 +
 +
sei();//allow interrupts
 +
 +
 +
}
 +
 +
 +
ISR(TIMER1_COMPA_vect)  {//timer1 interrupt 1Hz toggles pin 13 (LED)
 +
 +
testtimer++;
 +
 +
if (testtimer==2000)
 +
{
 +
 +
testtimer=0;
 +
  afaire=1;
 +
   
 +
 +
}
 +
}
 +
 +
 +
void test(){
 +
tim=tim+1;
 +
  compteura=anciencompteura ;
 +
  if (dir_a==1){
 +
    compteura=compteura+1;
 +
  }
 +
  else{
 +
    compteura=compteura-1;
 +
  }
 
   
 
   
void setup() {
+
}
Serial.begin(115200); // ouvre le port série, fixe le débit à 9600 bauds
 
pinMode(pwm_a, OUTPUT);  //Set control pins to be outputs
 
pinMode(pwm_b, OUTPUT);
 
pinMode(Pindir_a, OUTPUT);
 
pinMode(dir_b, OUTPUT);
 
pinMode(Pindir_b, OUTPUT);
 
//capteur optique
 
attachInterrupt (0,test , CHANGE);//patte 2, moteur a
 
attachInterrupt (1,test2 , CHANGE);//patte 3, moteur b
 
//sens du moteur
 
dir_a=1;//si 0 recule,si 1 avance
 
digitalWrite(Pindir_a, dir_a);
 
dir_b=1;//si 0 recule,si 1 avance
 
digitalWrite(Pindir_b, dir_b);
 
}  
 
 
   
 
   
void test()
+
void test2(){
  {
+
  if (dir_b==1){
  if (dir_a==1){
+
  compteurb=compteurb+1;
  compteur=compteur+1;
 
 
   }
 
   }
 
   else{
 
   else{
  compteur=compteur-1;
+
    compteurb=compteurb-1;
 
   }
 
   }
   Serial.println(compteur);
+
 +
}
 +
 +
void loop(){
 +
    anciencompteura=compteura;//compteur a
 +
    anciencompteurb=compteurb;//compteur b
 +
 
 +
 
 +
   
 +
  /* Serial.print('a');
 +
  Serial.println(compteura);
 +
  Serial.print('b');
 +
  Serial.println(compteurb);*/
 +
  val0 = analogRead (analogPin0); // lecture dela broche d'entrée0
 +
  val1 = analogRead (analogPin1); // lecture dela broche d'entrée1
 +
  val2 = analogRead (analogPin2); // lecture dela broche d'entrée2 
 +
  ariv = analogRead (analogPin4);
 +
    Serial.print('m');
 +
    Serial.println (ariv); // valeurs d'arrivé
 +
   /* Serial.print('g');
 +
  Serial.println (val1); // debug valeur
 +
  Serial.print('d');
 +
  Serial.println (val2); // debug valeur
 +
  */
 +
 +
if(val0>=200||val1>=100||val2>=100)//detetion d'obstacle etesquive
 +
  {
 +
 +
  digitalWrite(ledpinv, LOW);
 +
    digitalWrite(ledpinj, HIGH);
 +
    digitalWrite(ledpinr, LOW);
 +
 +
  dir_a=0;
 +
  dir_b=0;
 +
    //compteura=0;
 +
    //compteurb=0;
 +
    digitalWrite(Pindir_a, dir_a);
 +
    digitalWrite(Pindir_b, dir_b);
 +
  //if(compteura<=-40&compteurb<=-40){
 +
    analogWrite(pwm_b,200);
 +
    analogWrite(pwm_a,80);
 +
  delay(500);
 
  }
 
  }
 
   
 
   
  void test2(){
+
  else //condition normal
  Serial.println("change2");
+
{
}
+
    digitalWrite(ledpinj, LOW);
 +
    digitalWrite(ledpinv, HIGH);
 +
      digitalWrite(ledpinr, LOW);
 +
   
 +
  analogWrite(pwm_b,100);
 +
  analogWrite(pwm_a,114);
 +
  dir_a=1;
 +
  dir_b=1;
 
   
 
   
void loop(){
+
  digitalWrite(Pindir_a, dir_a);
c = Serial.read();
+
  digitalWrite(Pindir_b, dir_b);
      if(compteur<=5000){
+
  delay(200);
              analogWrite(pwm_a, 100);
+
  }
              analogWrite(pwm_b, 100);
+
      if(afaire=1){// si dection de blocagealors déblocage du robots
 +
  digitalWrite(ledpinv, LOW);
 +
  digitalWrite(ledpinj, LOW);
 +
  digitalWrite(ledpinr, HIGH);
 +
   
 +
  if(compteura==anciencompteura&compteurb==anciencompteurb){
 +
    dir_a=0;
 +
  dir_b=0;
 +
  digitalWrite(Pindir_a, dir_a);
 +
  digitalWrite(Pindir_b, dir_b);
 +
  analogWrite(pwm_b,80);
 +
    analogWrite(pwm_a,200);
 +
    delay(500); //afficher les valeurs
 +
  }
 +
    if(ariv>=1000)// detection d'une couleurnoir sur le dessous alors on s'arrete
 +
   
 +
 
 +
  {
 +
  digitalWrite(ledpinv, LOW);
 +
  digitalWrite(ledpinj, HIGH);
 +
  digitalWrite(ledpinr, HIGH);
 +
 
 +
      analogWrite(pwm_b,0);
 +
  analogWrite(pwm_a, 0);
 +
    delay(10000);
 +
 
 
       }
 
       }
        if(compteur>=5000){
+
          analogWrite(pwm_a, 0);
+
              analogWrite(pwm_b, 0);
+
}
             
 
         
 
  }     
 
             
 
}
 
 
</source>
 
</source>
 +
 +
==carte ARDUINO==
 +
Lors de la conception nous nous sommes aperçu que le robots s’arrêtait tout seul au bout de quelque seconde, en faite le convertisseur 12v - 5v prévue dans la carte arduino chauffait de trop pour cela 2 transistors de conversion on été rajouter sur le composants pour aider la carte arduino a gérer ces tensions
 +
[[Fichier:M0.jpg|vignette]]
 +
 +
 +
 +
 +
  
 
==roue codeuse et capteur optique==
 
==roue codeuse et capteur optique==
Ligne 78 : Ligne 216 :
  
 
3.Mise en place des capteur, puis test petit problème du à l'alignement des capteurs optiques et à la position qui créaient des frottement sur le moteur. Réparation du et remise en place des composants. Mise en place de la batterie.
 
3.Mise en place des capteur, puis test petit problème du à l'alignement des capteurs optiques et à la position qui créaient des frottement sur le moteur. Réparation du et remise en place des composants. Mise en place de la batterie.
 +
 +
 +
 +
 +
===Visualisation===
 +
[[Fichier:M1234.jpg|vignette]]
 +
<br />
 +
<br />
 +
<br />
 +
<br />
 +
<br />
 +
<br />
  
 
= 2 ème étape l'esquive =
 
= 2 ème étape l'esquive =
Ligne 89 : Ligne 239 :
 
Schéma de principe:
 
Schéma de principe:
  
 
+
[[Fichier:Detec obstacle.JPG|500px]]
 
 
 
 
  
 
== Détection de blocage ==
 
== Détection de blocage ==
Ligne 105 : Ligne 253 :
 
  // Prescaler x1 //  OCR1A = 255;                 
 
  // Prescaler x1 //  OCR1A = 255;                 
 
  // Set compared value //  TIMSK1 = 0;                   
 
  // Set compared value //  TIMSK1 = 0;                   
  // Reset Timer/Counter2 Interrupt Mask Register TIMSK1 |= (1 << OCIE1A);                           // Enable Output Compare Match A Interrupt */  sei();
+
  // Reset Timer/Counter2 Interrupt Mask Register TIMSK1 |= (1 << OCIE1A);                             // Enable Output Compare Match A Interrupt */  sei();
 
  //allow interrupts  }  ISR(TIMER1_COMPA_vect)  {
 
  //allow interrupts  }  ISR(TIMER1_COMPA_vect)  {
  //timer1 interrupt 1Hz toggles pin 13 (LED) testtimer++; if (testtimer==2000) {  testtimer=0; afaire=1;  } }
+
  //timer1 interrupt 1Hz toggles pin 13 (LED) testtimer++;  
 +
if (testtimer==2000) {  
 +
  testtimer=0; afaire=1;  } }
 +
 
 +
= 3 Détection de l'arrivée =
 +
On utilise un capteur optique pour détecter le changement de couleur du sol ainsi on détectera la zone d'arrivée du robot.
 +
Voici le schéma du cablage du capteur optique:
 +
 
 +
[[Fichier:Detect_arrive.JPG|500px]]
 +
 
 +
 
 +
 
 +
[[Fichier:m123.jpg|vignette]]

Version actuelle datée du 27 mars 2013 à 15:58

1 ere Étape moteur

présentation du robot en vidéo http://www.youtube.com/watch?v=qjyGY_saNkU

petite vidéo du fonctionnement très rudimentaire http://www.youtube.com/watch?v=RFTtGAS0Rkk

Soudage des composants

Présentation en ligne

programme arduino

inttesttimer=0;
const intledhaut=8;
const int ledpinv=5;
const int ledpinj=6;
const int ledpinr=7;
int pwm_a = 10; 
//PWM control for motor outputs 1and 2 is on digital pin 10 
int pwm_b = 11; 
//PWM control for motor outputs 3and 4 is on digital pin 11 
int Pindir_a = 12;
int dir_a=1;
//PWM control for motor outputs 1and 2 is on digital pin 12 
int Pindir_b = 13;
int dir_b=1;
//PWM control for motor outputs 3and 4 is on digital pin 13 
int val0=0;//valuersur1024 de capteur0
intval1=0;//valuer sur1024 de capteur1
intval2=0;//valuer sur1024 de capteur2
intariv=0;//capteur d'arrivé
intanalogPin0 = 0;//capteur0(millieu) broche0
intanalogPin1 = 1;//capteur1(gauche) broche1
intanalogPin2 = 2;//capteur2(droit) broche2
intanalogPin4 =5;//capteur d'arrivé
intcompteura=20;
intcompteurb=20;
int  anciencompteura ;
intanciencompteurb;
char c;
int zero;
intafaire=0;
int tim=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
  //capteur optique
  attachInterrupt (0,test , CHANGE);//patte 2,moteur a
  attachInterrupt (1,test2 , CHANGE);//patte 3,moteur b
  pinMode(ledpinv, OUTPUT);
    pinMode(ledpinj, OUTPUT);
      pinMode(ledpinr, OUTPUT);
  //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
 
// TCCR1A = 0;                  //Reset control registers
// TCCR1B = 0;                  //Reset control registers
// TCCR1B |= (1 << WGM12);     // Clear Timer on Compare Match (CTC) Mode
// TCCR1B |= (1 << CS10);      // Prescaler x1
// OCR1A = 255;                 //Set compared value
// TIMSK1 = 0;                  //Reset Timer/Counter2 Interrupt Mask Register
TIMSK1 |= (1 << OCIE1A);     // Enable Output Compare Match A Interrupt*/ 
 
 sei();//allow interrupts
 
 
} 
 
 
ISR(TIMER1_COMPA_vect)  {//timer1 interrupt 1Hz toggles pin 13 (LED)
 
testtimer++;
 
if (testtimer==2000)
{
 
 testtimer=0;
 afaire=1;
 
 
 }
}
 
 
void test(){
 tim=tim+1;
 compteura=anciencompteura ;
  if (dir_a==1){
    compteura=compteura+1;
  }
  else{
    compteura=compteura-1;
  }
 
}
 
void test2(){
 if (dir_b==1){
   compteurb=compteurb+1;
  }
  else{
    compteurb=compteurb-1;
  }
 
}
 
void loop(){
    anciencompteura=compteura;//compteur a 
    anciencompteurb=compteurb;//compteur b 
  
   
    
  /* Serial.print('a');
   Serial.println(compteura); 
   Serial.print('b');
   Serial.println(compteurb);*/
  val0 = analogRead (analogPin0); // lecture dela broche d'entrée0
  val1 = analogRead (analogPin1); // lecture dela broche d'entrée1
  val2 = analogRead (analogPin2); // lecture dela broche d'entrée2  
  ariv = analogRead (analogPin4);
    Serial.print('m');
    Serial.println (ariv); // valeurs d'arrivé
  /* Serial.print('g'); 
   Serial.println (val1); // debug valeur
   Serial.print('d');
   Serial.println (val2); // debug valeur 
   */
 
 if(val0>=200||val1>=100||val2>=100)//detetion d'obstacle etesquive
  {
 
   digitalWrite(ledpinv, LOW);
    digitalWrite(ledpinj, HIGH);
     digitalWrite(ledpinr, LOW);
 
   dir_a=0;
   dir_b=0;
    //compteura=0;
    //compteurb=0;
    digitalWrite(Pindir_a, dir_a);
    digitalWrite(Pindir_b, dir_b);
   //if(compteura<=-40&compteurb<=-40){ 
    analogWrite(pwm_b,200);
    analogWrite(pwm_a,80);
   delay(500);
 }
 
 else //condition normal
 {
    digitalWrite(ledpinj, LOW);
     digitalWrite(ledpinv, HIGH);
       digitalWrite(ledpinr, LOW);
     
   analogWrite(pwm_b,100);
   analogWrite(pwm_a,114);
   dir_a=1;
   dir_b=1;
 
   digitalWrite(Pindir_a, dir_a);
   digitalWrite(Pindir_b, dir_b);
   delay(200);
  }
      if(afaire=1){// si dection de blocagealors déblocage du robots
  digitalWrite(ledpinv, LOW);
  digitalWrite(ledpinj, LOW);
   digitalWrite(ledpinr, HIGH);
     
   if(compteura==anciencompteura&compteurb==anciencompteurb){
    dir_a=0;
   dir_b=0;
   digitalWrite(Pindir_a, dir_a);
   digitalWrite(Pindir_b, dir_b);
   analogWrite(pwm_b,80);
    analogWrite(pwm_a,200);
    delay(500); //afficher les valeurs
  }
    if(ariv>=1000)// detection d'une couleurnoir sur le dessous alors on s'arrete
    
   
  {
   digitalWrite(ledpinv, LOW);
  digitalWrite(ledpinj, HIGH);
   digitalWrite(ledpinr, HIGH);
   
       analogWrite(pwm_b,0);
   analogWrite(pwm_a, 0);
    delay(10000);
  
      }
 
 
}

carte ARDUINO

Lors de la conception nous nous sommes aperçu que le robots s’arrêtait tout seul au bout de quelque seconde, en faite le convertisseur 12v - 5v prévue dans la carte arduino chauffait de trop pour cela 2 transistors de conversion on été rajouter sur le composants pour aider la carte arduino a gérer ces tensions

M0.jpg




roue codeuse et capteur optique

1.remplacement des nouvel roue codeuse 30 noir 30 blache 4 degret chacune

2.voici le shéma du cablage que nous avons réalisé Schema fourche optique.jpg

3.Mise en place des capteur, puis test petit problème du à l'alignement des capteurs optiques et à la position qui créaient des frottement sur le moteur. Réparation du et remise en place des composants. Mise en place de la batterie.



Visualisation

M1234.jpg







2 ème étape l'esquive

capteur de proximité

On a choisi de mettre 3 capteurs fait a base de photodiode et photo-transistor. L'émetteur d'entrée est alimenté sous un courant provocant une émission radiative puis récupérée par la base du photo-transistor pour donner à la sortie un courant collecteur. Listes des composants: - 1 photodiode LD271

                      - 1 photo-transistor BPW50
                      - 1 résistance de 19 Ohm
                      - 1 résistance de 220 KOhm 

Schéma de principe:

Detec obstacle.JPG

Détection de blocage

Grace a une commande interrupt on peut constater quand le robot est à l’arrêt.

cli();
//stop interrupts //  TCCR1A = 0;                  
// Reset control registers //  TCCR1B = 0;                  
// Reset control registers 
//  TCCR1B |= (1 << WGM12);      
// Clear Timer on Compare Match (CTC) Mode 
//  TCCR1B |= (1 << CS10);       
// Prescaler x1 //  OCR1A = 255;                 
// Set compared value //  TIMSK1 = 0;                  
// Reset Timer/Counter2 Interrupt Mask Register TIMSK1 |= (1 << OCIE1A);                              // Enable Output Compare Match A Interrupt */   sei();
//allow interrupts   }  ISR(TIMER1_COMPA_vect)  {
//timer1 interrupt 1Hz toggles pin 13 (LED) testtimer++; 
if (testtimer==2000) {   
testtimer=0; afaire=1;  } }

3 Détection de l'arrivée

On utilise un capteur optique pour détecter le changement de couleur du sol ainsi on détectera la zone d'arrivée du robot. Voici le schéma du cablage du capteur optique:

Detect arrive.JPG


M123.jpg