Projet 12 Voiture intelligente à suivi ultrasonique

a3beaada39eb1471b7df6d9788e2bea3

1.Description

Dans ce projet, nous allons détecter la distance entre la voiture intelligente 4WD et les obstacles devant elle grâce à un capteur ultrasonique afin de piloter deux moteurs de manière à faire avancer la voiture et afficher un motif de visage souriant sur la matrice LED 8*8.

2.Diagramme de flux

img

Détection Distance mesurée des obstacles devant distance (unité : cm)
Réglage La matrice LED 8*16 affiche un motif souriant.
Positionner le servo à 90°
Condition distance≥20 et distance≤50
État Avancer
Condition distance>10 et distance<20
distance>50
Condition arrêt
Condition distance≤10
Condition Reculer

3.Schéma de câblage

568a66655a14dd34afd8cb1e6ae5951c

Câblage :

1). GND, VCC, SDA et SCL de la matrice LED 8*8 sont connectés à G (GND), V (VCC), A4 et A5 de la carte d’extension.

2). VCC, Trig, Echo et Gnd du capteur ultrasonique sont connectés à 5V (V), D12 (S), D13 (S) et Gnd (G).

3). Le servo est connecté à G, V et A3. Le fil marron est connecté à Gnd (G), le fil rouge à 5V (V) et le fil orange à A3.

4). L’alimentation est connectée au port BAT.

4.Code de test

//*******************************************************************************
/*
 keyestudio 4wd BT Car
 lesson 12
 Flowing Car
 http://www.keyestudio.com
*/ 
#define SCL_Pin  A5  //Définir la broche d'horloge sur A5
#define SDA_Pin  A4  //Définir la broche de données sur A4

//Tableau, utilisé pour stocker les données du motif, peut être calculé soi-même ou obtenu via l'outil de module
unsigned char smile[] = {0x00, 0x00, 0x1c, 0x02, 0x02, 0x02, 0x5c, 0x40, 0x40, 0x5c, 0x02, 0x02, 0x02, 0x1c, 0x00, 0x00};

const int servopin = A3;//Définir la broche du servo
 
#include "SR04.h" //définir la bibliothèque de fonctions du capteur ultrasonique
#define TRIG_PIN 12// définir la broche trig du capteur ultrasonique sur D12
#define ECHO_PIN 13// définir la broche echo du capteur ultrasonique sur D13
SR04 sr04 = SR04(ECHO_PIN,TRIG_PIN);
long distance;

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 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 PWM du moteur groupe A

void setup() {
  pinMode(left_ctrl,OUTPUT);//configurer les broches de contrôle de direction du moteur groupe B en sortie
  pinMode(left_pwm,OUTPUT);//configurer les broches PWM du moteur groupe B en sortie
  pinMode(right_ctrl,OUTPUT);//configurer les broches de contrôle de direction du moteur groupe A en sortie
  pinMode(right_pwm,OUTPUT);//configurer les broches PWM du moteur groupe A en sortie
  pinMode(TRIG_PIN, OUTPUT); //Configurer la broche trig en sortie
  pinMode(ECHO_PIN, INPUT); //Configurer la broche echo en entrée
  pinMode(SCL_Pin,OUTPUT);//Configurer la broche d'horloge en sortie
  pinMode(SDA_Pin,OUTPUT);//Configurer la broche de données en sortie
  servopulse(servopin,90);//Définir l'angle initial du servo à 90°
  delay(500); //attendre 500ms
  matrix_display(smile);  //afficher le motif de sourire  
}

void loop() {
  distance = sr04.Distance();//distance détectée par le capteur ultrasonique
   if(distance <= 10)//si la distance est inférieure à 10
  {
    back();//reculer
  }
  else if((distance > 10)&&(distance< 20 ))//si 10<distance<20
  {
    Stop();//arrêter
  }
  else if((distance >= 20)&&(distance <= 50))//si 20≤distance≤50  
{
    front();//avancer
  }
  else//sinon
  {
    Stop();//arrêter
  }
}

void front()//définir l'état d'avancement vers l'avant
{
  digitalWrite(left_ctrl,HIGH);
  analogWrite(left_pwm,100);
  digitalWrite(right_ctrl,HIGH);
  analogWrite(right_pwm,100);
}
void back()//définir l'état de recul
{
  digitalWrite(left_ctrl,LOW);
  analogWrite(left_pwm,150);
  digitalWrite(right_ctrl,LOW);
  analogWrite(right_pwm,150);
}
void left()//définir l'état de virage à gauche
{
  digitalWrite(left_ctrl, LOW);
  analogWrite(left_pwm, 100);  
  digitalWrite(right_ctrl, HIGH);
  analogWrite(right_pwm, 155);
}
void right()//définir l'état de virage à 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);
}

void servopulse(int servopin,int myangle)//Angle de fonctionnement du servo-moteur
{
  for(int i=0; i<30; i++)
  {
    int pulsewidth = (myangle*11)+500;
    digitalWrite(servopin,HIGH);
    delayMicroseconds(pulsewidth);
    digitalWrite(servopin,LOW);
    delay(20-pulsewidth/1000);
  }  
}

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

  for (int i = 0; i < 16; i++) //les données du motif sont de 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élection de la largeur d'impulsion 4/16
  IIC_end();
}
//Conditions sous lesquelles la transmission des 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 des 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 la broche d'horloge SCL_Pin à haut pour arrêter la transmission des données
    delayMicroseconds(3);
    digitalWrite(SCL_Pin, LOW); //met la broche 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 le commutateur DIP sur ON. Réglez le servo à 90°, la voiture intelligente se déplacera en évitant les obstacles et la carte LED 8X16 affichera « smile ».