Projet 12 Voiture intelligente à suivi ultrasonique

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

| 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

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 ».