Projet 11 Voiture Intelligente Suiveuse de Ligne

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


3.Schéma de Câblage

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.