#define ENABLE 5 // Master du controle du moteur
#define DIRA 4 // Tourne dans un sens
#define DIRB 3 // Tourne dans l'autre
#include <Servo.h>
Servo roues; // Servo des roues
Servo capt; // Servo des capteurs
const int trigPin = 6; // Pin Trig attache la broche 6
const int echoPin = 7; // Pin Echo attache la broche 7
const int neutre = 90; // Les servos reviennent neutres 90 degrs
int pTurnL = 20; // Petit tourne gauche
int pTurnR = 160; // Petit tourne droite
int gTurnL = 50; // Gros tourne gauche
int gTurnR = 130; // Gros tourne droite
void setup() {
Serial.begin(9600);
roues.attach(9); // Servo des roues attach la pin 9
roues.write(neutre);
capt.attach(10); // Servo du capteur attach la pin 10
capt.write(neutre);
pinMode(ENABLE, OUTPUT);
pinMode(DIRA, OUTPUT);
pinMode(DIRB, OUTPUT);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
}
void loop() {
long duration, distance;
long dureUn, distaUn;
long dureDeux, distaDeux;
digitalWrite(trigPin, LOW); // Calcule la distance entre l'avant de la voiture et les obstacles.
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(echoPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance = (duration / 2) / 29.1;
if(distance > 30) {
Serial.print(distance);
Serial.println(" cm, Avance"); // Si la distance est plus grande que 30cm, la voiture avance.
digitalWrite(ENABLE, HIGH);
digitalWrite(DIRA, HIGH);
digitalWrite(DIRB, LOW);
}
if(distance < 15){
Serial.print(distance);
Serial.println(" cm, Recule"); // Si la distance est plus petite que 15cm, la voiture recule.
digitalWrite(ENABLE, HIGH); // Recule durant 0,5 seconde.
digitalWrite(DIRA, LOW);
digitalWrite(DIRB, HIGH);
delay(500);
digitalWrite(ENABLE, HIGH); // Arrêt.
digitalWrite(DIRA, LOW);
digitalWrite(DIRB, LOW);
Serial.print(distance);
Serial.println(" cm, Stop");
delay(1000);
capt.write(pTurnL); // Petit servo tourne vers la gauche
delay(500);
digitalWrite(trigPin, LOW); // Mesure de la distance de gauche.
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(echoPin, LOW);
dureUn = pulseIn(echoPin, HIGH);
distaUn = (dureUn / 2) / 29.1;
Serial.print(distaUn);
Serial.println(" cm, Gauche");
delay(500);
capt.write(pTurnR); // Petit servo tourne droite.
delay(500);
digitalWrite(trigPin, LOW); // Mesure de la distance de droite.
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(echoPin, LOW);
dureDeux = pulseIn(echoPin, HIGH);
distaDeux = (dureDeux / 2) / 29.1;
Serial.print(distaDeux);
Serial.println(" cm, Droite");
delay(500);
capt.write(neutre); // Petit servo revient 90 degrs
if(distaUn < distaDeux){ // Se déroule si le ct gauche est plus petit que le cot droit.
roues.write(gTurnR); // Gros servo tourne gauche.
delay(500);
digitalWrite(ENABLE, HIGH); // Avance 0,5 seconde.
digitalWrite(DIRA, HIGH);
digitalWrite(DIRB, LOW);
delay(500);
digitalWrite(ENABLE, HIGH); // Arrêt
digitalWrite(DIRA, LOW);
digitalWrite(DIRB, LOW);
roues.write(neutre); // Gros servo revient 90 degrs
}
if(distaDeux < distaUn){ // Se déroule si le ct droit est plus petit que le ct gauche.
roues.write(gTurnL); // Gros servo tourne gauche.
delay(500);
digitalWrite(ENABLE, HIGH); // Avance 0,5 secondes.
digitalWrite(DIRA, HIGH);
digitalWrite(DIRB, LOW);
delay(500);
digitalWrite(ENABLE, HIGH); // Arrêt
digitalWrite(DIRA, LOW);
digitalWrite(DIRB, LOW);
roues.write(neutre); // Gros servo revient 90 degrs.
}
}
if(distance < 30 ){ // Se déroules si la distance est plus petite que 30cm et plus grande que 15cm.
delay(1000);
capt.write(pTurnL); // Petit servo tourne gauche.
delay(500);
digitalWrite(trigPin, LOW); // Calcul la distance de gauche.
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(echoPin, LOW);
dureUn = pulseIn(echoPin, HIGH);
distaUn = (dureUn / 2) / 29.1;
Serial.print(distaUn);
Serial.println(" cm, Gauche");
delay(500);
capt.write(pTurnR); // Petit servo tourne droite.
delay(500);
digitalWrite(trigPin, LOW); // Calcul de la distance de droite.
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(echoPin, LOW);
dureDeux = pulseIn(echoPin, HIGH);
distaDeux = (dureDeux / 2) / 29.1;
Serial.print(distaDeux);
Serial.println(" cm, Droite");
delay(500);
capt.write(neutre); // Petit servo revient 90 degrés
if(distaUn < distaDeux){ // Se droule si le ct gauche est plus petit que le ct droit.
roues.write(gTurnR); // Gros servo tourne gauche.
delay(500);
digitalWrite(ENABLE, HIGH); // Avance 0,5 seconde.
digitalWrite(DIRA, HIGH);
digitalWrite(DIRB, LOW);
delay(500);
digitalWrite(ENABLE, HIGH); // Arrêt
digitalWrite(DIRA, LOW);
digitalWrite(DIRB, LOW);
roues.write(neutre); // Gros servo revient 90 degrs.
}
if(distaDeux < distaUn){ // Se déroule si le ct droit est plus petit que le ct gauche.
roues.write(gTurnL); //Gros servo tourne gauche.
delay(500);
digitalWrite(ENABLE, HIGH); // Avance 0,5 seconde.
digitalWrite(DIRA, HIGH);
digitalWrite(DIRB, LOW);
delay(500);
digitalWrite(ENABLE, HIGH); // Arrêt
digitalWrite(DIRA, LOW);
digitalWrite(DIRB, LOW);
roues.write(neutre); // Gros servo revient 90 degrés.
}
}
}
Comments