Aller au contenu


Photo
- - - - -

Robot suiveur de ligne contrôlé par bluetooth.


2 réponses à ce sujet

#1 Axel Aube

Axel Aube

    Nouveau membre

  • Membres
  • 2 messages
  • Gender:Male

Posté 08 janvier 2016 - 02:23

Bonjour à tous!

Cette année je suis en première SSI et moi et mon groupe avons un TPE a faire. Nous avons voulu nous lancer sur un robot suiveur de ligne contrôle par bluetooth. C'est a dire qu'à partir d'une application sur un téléphone on envoie un code a un module HC-06 connecté a un arduino qui a partir de la doit définir un itinéraire pour le trajet du robot.

Le robot fini est prêt: nous avons 4 capteur IR reflect de pollulu, 2 moteurs DC, un module L298 qui sert de pont en H, un arduino UNO et le module HC-06.

La structure vient d'un kit de robot déjà existant et est donc parfaitement adaptable.

L'application android est elle aussi prête et fonctionnel on arrive en effet a recevoir et afficher sur un arduino les donnée envoyée.

le seul problème reste la partit du code arduino censé suivre la ligne. Je me suis longtemps inspiré du code fourni sur cette page:

http://www.bricobidules.com/index.php?post/2012/02/21/Un-suiveur-de-lignes-(encore-avec-Arduino)#c9

Mais manque de résultat, j'en ai refait un:

//capteur
int capteurGgauche = A0;
int capteurGauche = A1;
int capteurDroite = A2;
int capteurDdroite = A3;
//moteur
int moteurAvG = 9;
int moteurArG = 10;
int moteurAvD = 11;
int moteurArD = 12;
//variable
int droite = 0; 
int gauche = 0;
int ddroite = 0;
int ggauche = 0;

int seuil = 450;
char gg = '0';
char g = '0';
char d = '0';
char dd = '0';
int afficheur = 0;
int code;
int capt;
void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
pinMode(moteurArG, OUTPUT);
pinMode(moteurAvG, OUTPUT);
pinMode(moteurArD, OUTPUT);
pinMode(moteurAvD, OUTPUT);
digitalWrite(moteurArG, LOW);
digitalWrite(moteurAvG, LOW);
digitalWrite(moteurArD, LOW);
digitalWrite(moteurAvD, LOW);
lecture();
delay(2000);
}

void loop() {
  // put your main code here, to run repeatedly:
  capt = lecture();
  switch(capt){
    case 6:
    avancer();
   // Serial.println("avancer");
    break;
    case 4:
    pvirageG();
    //Serial.println("pvirageG");
    break;
    case 2:
    pvirageD();
    //Serial.println("pvirageD"); 
    break;
    case 12:
    virageG();
    //Serial.println("virageG");
    case 3:
    virageD();
    //Serial.println("virageD"); 
    case 1:
    virageD();
    case 8:
    virageG();
    default:
    arreter();
    //Serial.println("arreter");
    break;
  }
  
}
int lecture(){
  /* La methode lecture est de type String 
   *  pour permettre de renvoyer un "code" 
   *  sous forme binaire afin de connaitre 
   *  l'etat de cha cun des capteur (Noir ou Blanc)
   *  on les determine un a un puis les rassemble dans le String
   */
  String cpt = "";
  code = 0;
  ggauche = analogRead(capteurGgauche);
  droite = analogRead(capteurDroite); 
  gauche = analogRead(capteurGauche);
  ddroite = analogRead(capteurDdroite);
  if( analogRead(capteurGgauche)>seuil){
    code = code+8;
    gg = '1';
    }
  else{gg = '0';}
  
  if(analogRead(capteurGauche)>seuil){
    code = code+4;
    g = '1';
    }
  else{g = '0';}
  
  if(analogRead(capteurDroite)>seuil){
    code = code+2;
    d = '1';
    }
  else{d = '0';}
  
  if(analogRead(capteurDdroite)>seuil){
    code = code+1;
    dd = '1';
    }
  else{dd = '0';}
  
 cpt += gg;
 cpt += g;
 cpt += d;
 cpt += dd;
 afficheur++;
 if( afficheur == 1){
  afficheur = 0;
  Serial.print(cpt);
  Serial.print("\t");
  Serial.print(ggauche);
  Serial.print("\t");
  Serial.print(gauche);
  Serial.print("\t");
  Serial.print(droite);
  Serial.print("\t");
  Serial.print(ddroite);
  Serial.print("\t");
  Serial.print("\t");
  Serial.println(code);
}
  delay(20);
  return(code);
  
}
void avancer(){
  digitalWrite(moteurAvG,HIGH);
  digitalWrite(moteurAvD,HIGH);
  digitalWrite(moteurArG,LOW);
  digitalWrite(moteurArD,LOW);
  delay(20);
}
void arreter(){
  digitalWrite(moteurAvG,LOW);
  digitalWrite(moteurAvD,LOW);
  digitalWrite(moteurArG,LOW);
  digitalWrite(moteurArD,LOW);
  delay(20);
}
void virageG(){
  digitalWrite(moteurAvG,LOW);
  digitalWrite(moteurAvD,HIGH);
  digitalWrite(moteurArG,HIGH);
  digitalWrite(moteurArD,LOW);
  delay(20);
}
void virageD(){
  digitalWrite(moteurAvG,HIGH);
  digitalWrite(moteurAvD,LOW);
  digitalWrite(moteurArG,LOW);
  digitalWrite(moteurArD,HIGH);
  delay(20);
}
void pvirageG(){
  digitalWrite(moteurAvG,LOW);
  digitalWrite(moteurAvD,HIGH);
  digitalWrite(moteurArG,LOW);
  digitalWrite(moteurArD,LOW);
  delay(20);
}
void pvirageD(){
  digitalWrite(moteurAvG,HIGH);
  digitalWrite(moteurAvD,LOW);
  digitalWrite(moteurArG,LOW);
  digitalWrite(moteurArD,LOW);
  delay(20);
} 

Cependant en testant la réaction de moteurs en les remplaçant par des leds j'obtient des réactions très étrange dans tous les cas ou un des capteurs extrême est sur la ligne (case 12,8,3,1 ) les leds se mettent a clignoter dans certains de ces cas on observe une différence de fréquence correspondante aux diodes qui devraient être allumé.

En espérant que quelqu'un pourra m'aider! Merci d'avance.

 



#2 cocothebo

cocothebo

    Membre passionné

  • Membres
  • PipPipPip
  • 341 messages
  • Gender:Male

Posté 11 janvier 2016 - 10:29

Salut,

 

J'ai pas regardé en détails, mais a priori déjà dans ton switch, tu as oublié les "break" pour les derniers cas (12,8,3,1) donc ça doit surement venir de la.

Si le break n'est pas la, une fois par exemple que le cas 12 est exécuté, on continue par le cas 3 puis le 1 puis le 8 et on arrête tout ça avant de refaire un tour (lecture puis réaction).

 

Bonne continuation.



#3 Axel Aube

Axel Aube

    Nouveau membre

  • Membres
  • 2 messages
  • Gender:Male

Posté 11 janvier 2016 - 06:46

Parfait! Merci beaucoup il fonctionne à merveille maintenant! Je passe à la suite!



Répondre à ce sujet



  


0 utilisateur(s) li(sen)t ce sujet

0 members, 0 guests, 0 anonymous users