Projet 11 Voiture Intelligente Suiveuse de Ligne

eff7a15e697e8b78bde391f806ea024d

1.Description

Basé sur le principe de fonctionnement du capteur suiveur de ligne, nous réalisons une voiture intelligente suiveuse de ligne.

Dans ce projet, nous détectons s’il y a une ligne noire sous la voiture intelligente grâce à un capteur suiveur de ligne, puis contrôlons la rotation des deux groupes de moteurs selon les résultats de détection de manière à faire suivre à la voiture intelligente la ligne noire.

2.Diagramme de Flux

img

Img

3.Schéma de Câblage

88422b5f1464ad447e28ccbb8c39a8d4

G, V, S1, S2 et S3 du capteur suiveur de ligne sont connectés respectivement à G (GND), V (VCC), D11, D7 et D8 de la carte d’extension capteur.

L’alimentation est connectée au port BAT.

4.Code de Test

//*************************************************************************
/*
 keyestudio 4wd BT Car
 lesson 11
 Tracking Car
 http://www.keyestudio.com
*/ 
//Données du motif sourire obtenues depuis l'outil tactile
unsigned char start01[] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01};
#define SDA_Pin  A4  //Définir la broche de données sur A4
#define SCL_Pin  A5  //Définir la broche d'horloge sur A5

int left_ctrl = 2;//définir les broches de contrôle de direction du moteur groupe B
int left_pwm = 5;//définir les broches de contrôle PWM du moteur groupe B
int right_ctrl = 4;//définir les broches de contrôle de direction du moteur groupe A
int right_pwm = 6;//définir les broches de contrôle PWM du moteur groupe A
int sensor_L = 11;//définir la broche du capteur suiveur de ligne gauche
int sensor_M = 7;//définir la broche du capteur suiveur de ligne milieu
int sensor_R = 8;//définir la broche du capteur suiveur de ligne droite
int L_val,M_val,R_val;//définir ces variables

void setup() {
  Serial.begin(9600);//démarrer le moniteur série et définir le débit à 9600
  pinMode(left_ctrl,OUTPUT);//définir les broches de contrôle de direction du moteur groupe B en sortie
  pinMode(left_pwm,OUTPUT);//définir les broches de contrôle PWM du moteur groupe B en sortie
  pinMode(right_ctrl,OUTPUT);//définir les broches de contrôle de direction du moteur groupe A en sortie
  pinMode(right_pwm,OUTPUT);//définir les broches de contrôle PWM du moteur groupe A en sortie
  pinMode(sensor_L,INPUT);//définir les broches du capteur suiveur de ligne gauche en entrée
  pinMode(sensor_M,INPUT);//définir les broches du capteur suiveur de ligne milieu en entrée
  pinMode(sensor_R,INPUT);//définir les broches du capteur suiveur de ligne droite en entrée
  //Définir les broches en sortie
  pinMode(SCL_Pin, OUTPUT);
  pinMode(SDA_Pin, OUTPUT);
  matrix_display(start01);//Afficher le motif de démarrage
}

void loop() 
{
  tracking(); //exécuter le programme principal
}

void tracking()
{
  L_val = digitalRead(sensor_L);//lire la valeur du capteur suiveur de ligne gauche
  M_val = digitalRead(sensor_M);//lire la valeur du capteur suiveur de ligne milieu
  R_val = digitalRead(sensor_R);//lire la valeur du capteur suiveur de ligne droite

  if(M_val == 1){//si l'état du capteur du milieu est 1, ce qui signifie détection de la ligne noire

     if (L_val == 1 && R_val == 0) { //Si une ligne noire est détectée à gauche, mais pas à droite, tourner à gauche
        left();
    }
     else if (L_val == 0 && R_val == 1) { //Sinon, si une ligne noire est détectée à droite et pas à gauche, tourner à droite
      right();
    }
     else { //Sinon, avancer
      front();
    }
  }
  else { //Aucune ligne noire détectée au milieu
    if (L_val == 1 && R_val == 0) { //Si une ligne noire est détectée à gauche, mais pas à droite, tourner à gauche
      left();
    }
    else if (L_val == 0 && R_val == 1) { //Sinon, si une ligne noire est détectée à droite et pas à gauche, tourner à droite
      right();
    }
    else { //Sinon, arrêter
      Stop();
    }
  }
}
void front()//définir l'état d'avancer
{
  digitalWrite(left_ctrl,HIGH);
  analogWrite(left_pwm,155);
  digitalWrite(right_ctrl,HIGH);
  analogWrite(right_pwm,155);
}
void back()//définir l'état de reculer
{
  digitalWrite(left_ctrl,LOW);
  analogWrite(left_pwm,100);
  digitalWrite(right_ctrl,LOW);
  analogWrite(right_pwm,100);
}
void left()//définir l'état de tourner à gauche
{
  digitalWrite(left_ctrl, LOW);
  analogWrite(left_pwm, 100);  
  digitalWrite(right_ctrl, HIGH);
  analogWrite(right_pwm, 155);
}
void right()//définir l'état de tourner à droite
{
  digitalWrite(left_ctrl, HIGH);
  analogWrite(left_pwm, 155);
  digitalWrite(right_ctrl, LOW);
  analogWrite(right_pwm, 100);
}
void Stop()//définir l'état d'arrêt
{
  digitalWrite(left_ctrl, LOW);
  analogWrite(left_pwm,0);
  digitalWrite(right_ctrl, LOW);
  analogWrite(right_pwm,0);
}

//cette fonction est utilisée pour l'affichage matriciel
void matrix_display(unsigned char matrix_value[])
{
  IIC_start();  //la fonction qui appelle la condition de début de transfert de données
  IIC_send(0xc0);  //sélectionner l'adresse

  for (int i = 0; i < 16; i++) //les données du motif sont 16 octets
  {
    IIC_send(matrix_value[i]); //Transmettre les données du motif
  }
  IIC_end();   //Fin de la transmission des données du motif
  IIC_start();
  IIC_send(0x8A);  //Contrôle d'affichage, sélectionner une largeur d'impulsion 4/16
  IIC_end();
}
//Conditions sous lesquelles la transmission de données commence
void IIC_start()
{
  digitalWrite(SDA_Pin, HIGH);
  digitalWrite(SCL_Pin, HIGH);
  delayMicroseconds(3);
  digitalWrite(SDA_Pin, LOW);
  delayMicroseconds(3);
  digitalWrite(SCL_Pin, LOW);
}
//Indique la fin de la transmission de données
void IIC_end()
{
  digitalWrite(SCL_Pin, LOW);
  digitalWrite(SDA_Pin, LOW);
  delayMicroseconds(3);
  digitalWrite(SCL_Pin, HIGH);
  delayMicroseconds(3);
  digitalWrite(SDA_Pin, HIGH);
  delayMicroseconds(3);
}
//transmettre les données
void IIC_send(unsigned char send_data)
{
  for (byte mask = 0x01; mask != 0; mask <<= 1) //Chaque octet a 8 bits et est vérifié bit par bit en commençant par le niveau le plus bas
  {
    if (send_data & mask) { //Définit les niveaux haut et bas de SDA_Pin selon que chaque bit de l'octet est un 1 ou un 0
      digitalWrite(SDA_Pin, HIGH);
    } else {
      digitalWrite(SDA_Pin, LOW);
    }
    delayMicroseconds(3);
    digitalWrite(SCL_Pin, HIGH); //Met le pin d'horloge SCL_Pin à haut pour arrêter la transmission des données
    delayMicroseconds(3);
    digitalWrite(SCL_Pin, LOW); //met le pin d'horloge SCL_Pin à bas pour changer le SIGNAL de SDA 
  }
}
//*************************************************************************

5. Résultat du test

Après avoir téléchargé avec succès le code sur la carte V4.0, connectez les câblages selon le schéma de câblage, alimentez l’alimentation externe puis mettez l’interrupteur DIP sur ON. Ensuite, la voiture intelligente suivra les lignes.