Codage
- include <PWMServo.h>
- define IN1 7
- define IN2 8
- define ENA 5 // pin ENA
- define FRONT 90 //degré lorsque la direction est alignée droit devant
int SHARP_RIGHT=FRONT+33; int SHARP_LEFT=FRONT-40; int RIGHT=FRONT+17; int LEFT=FRONT-20;
- define SENSOR_FRONT 90
int SENSOR_LEFT=SENSOR_FRONT+25; int SENSOR_RIGHT=SENSOR_FRONT-25; int SENSOR_FAR_LEFT=SENSOR_FRONT+60; int SENSOR_FAR_RIGHT=SENSOR_FRONT-60;
- define DELAY_TIME 1000
- define SPEED 170
- define FAST_SPEED 200
- define MID_SPEED 170
- define SERVO_STEER 9 //Servo de direction connecté à D9
- define SERVO_SENSOR 10 //Capteur ultrasonore servo connecté à D10
- define Echo_PIN 2 // La broche Echo de l'ultrason est connectée à D11
- define Trig_PIN 3 // La broche Trig de l'ultrason est connectée à D12
PWMServo head; PWMServo head_steer; int leftscanval, centerscanval, rightscanval, ldiagonalscanval, rdiagonalscanval; const int distancelimit = 30; //Limite de distance pour les obstacles devant const int sidedistancelimit = 30; //Distance minimale en centimètres aux obstacles de chaque côté (la voiture permettra une distance latérale plus courte) int distance; int numcycles = 0; const int forwardtime = 600; //Temps que le robot passe à tourner (en millisecondes) const int turntime = 900; //Temps que le robot passe à tourner (en millisecondes) const int backtime = 900; //Temps passé par le robot à tourner (en millisecondes)
- define LPT 2 // Compteur de boucles de balayage.
int thereis; /*motor control*/ void go_Back(int speed) //Avancer {
digitalWrite(IN1, HIGH); digitalWrite(IN2,LOW); analogWrite(ENA,speed);
}
void go_Advance(int speed) //Avancer {
digitalWrite(IN1, LOW); digitalWrite(IN2,HIGH); analogWrite(ENA,speed);
}
void turn(int angle) {
head_steer.write(angle);
}
void stop_Stop() //Stop {
digitalWrite(IN1, LOW); digitalWrite(IN2,LOW); analogWrite(ENA,0);
}
void setup() {
pinMode(ENA, OUTPUT); pinMode(IN1, OUTPUT); pinMode(IN2, OUTPUT); pinMode(Trig_PIN, OUTPUT); pinMode(Echo_PIN,INPUT);
head_steer.attach(SERVO_STEER); head.attach(SERVO_SENSOR); head.write(90); turn(FRONT); stop_Stop(); delay(2000);
Serial.begin(9600);
}
void loop() {
auto_avoidance();
} /*detection of ultrasonic distance*/ int watch(){
long echo_distance; digitalWrite(Trig_PIN,LOW); delayMicroseconds(5); digitalWrite(Trig_PIN,HIGH); delayMicroseconds(15); digitalWrite(Trig_PIN,LOW); echo_distance=pulseIn(Echo_PIN,HIGH); echo_distance=echo_distance*0.01657; //À quelle distance se trouve l'objet en centimètres //Serial.println((int)echo_distance); return round(echo_distance);
} //Mesure les distances à droite, à gauche, devant, en diagonale à gauche, en diagonale à droite et assigne-les en centimètres aux variables rightscanval //leftscanval, centerscanval, ldiagonalscanval et rdiagonalscanval (il y a 5 points pour le test de distance) String watchsurrounding(){
int obstacle_status =B100000;
centerscanval = watch();
if(centerscanval<distancelimit){
stop_Stop();
obstacle_status =obstacle_status | B100;
}
head.write(SENSOR_LEFT);
delay(100);
ldiagonalscanval = watch();
if(ldiagonalscanval<distancelimit){
stop_Stop();
obstacle_status =obstacle_status | B1000;
}
head.write(SENSOR_FAR_LEFT); //Je n'ai pas utilisé 180 degrés car mon servo n'est pas capable de prendre cet angle
delay(300);
leftscanval = watch();
if(leftscanval<sidedistancelimit){
stop_Stop();
obstacle_status =obstacle_status | B10000;
}
head.write(SENSOR_FRONT); //Utilisez 90 degrés si vous faites tourner votre servo sur les 180 degrés complets.
delay(100);
centerscanval = watch();
if(centerscanval<distancelimit){
stop_Stop();
obstacle_status =obstacle_status | B100;
}
head.write(SENSOR_RIGHT);
delay(100);
rdiagonalscanval = watch();
if(rdiagonalscanval<distancelimit){
stop_Stop();
obstacle_status =obstacle_status | B10;
}
head.write(SENSOR_FAR_RIGHT);
delay(100);
rightscanval = watch();
if(rightscanval<sidedistancelimit){
stop_Stop();
obstacle_status =obstacle_status | 1;
}
head.write(SENSOR_FRONT); //Terminer de regarder autour (regarder à nouveau vers l'avant).
delay(300);
String obstacle_str= String(obstacle_status,BIN);
obstacle_str= obstacle_str.substring(1,6);
return obstacle_str; //Retourner une chaîne de 5 caractères représentant l'état des obstacles dans 5 directions
}
void auto_avoidance(){
++numcycles;
if(numcycles>=LPT){ //Surveillez si quelque chose se trouve autour à chaque boucle LPT tout en avançant.
stop_Stop();
String obstacle_sign=watchsurrounding(); // Les 5 chiffres de la valeur binaire obstacle_sign représentent l'état des obstacles dans les 5 directions
Serial.print("begin str=");
Serial.println(obstacle_sign);
if( obstacle_sign=="00000"){
Serial.println("FORWARD");
turn(FRONT);
go_Advance(SPEED);
delay(forwardtime);
stop_Stop();
}
else if( obstacle_sign=="01000" || obstacle_sign=="11000" || obstacle_sign=="10000" ){
Serial.println("hand right");
turn(SHARP_RIGHT);
go_Advance(FAST_SPEED);
delay(turntime);
stop_Stop();
turn(FRONT);
}
else if( obstacle_sign=="00010" ||obstacle_sign=="00011" ||obstacle_sign=="00001" ){
Serial.println("hand left");
turn(SHARP_LEFT);
go_Advance(FAST_SPEED);
delay(turntime);
stop_Stop();
turn(FRONT);
}
else if( obstacle_sign=="00111" || obstacle_sign=="01111" || obstacle_sign=="10111" || obstacle_sign=="11111" || obstacle_sign=="00110" || obstacle_sign=="01010" || obstacle_sign=="00101" ){
Serial.println("hand back right");
turn(RIGHT);
go_Back(FAST_SPEED);
delay(backtime);
stop_Stop();
turn(FRONT);
}
else if(obstacle_sign=="00100" || obstacle_sign=="10100" || obstacle_sign=="01100" || obstacle_sign=="11100" || obstacle_sign=="11011" || obstacle_sign=="11101" || obstacle_sign=="11110" || obstacle_sign=="01110" ){
Serial.println("hand back left");
turn(LEFT);
go_Back(FAST_SPEED);
delay(backtime);
stop_Stop();
turn(FRONT);
}
else Serial.println("no handle");
numcycles=0; //Restart count of cycles
} else {
turn(FRONT);
go_Advance(SPEED);
delay(backtime);
stop_Stop();
}
//else Serial.println(numcycles);
distance = watch(); // Utilisez la fonction watch() pour vérifier s'il y a quelque chose devant (lorsque le robot avance simplement sans regarder autour, il testera la distance devant).
if (distance<distancelimit){ // Le robot s'arrêtera simplement s'il est complètement sûr qu'il y a un obstacle devant (il doit tester 25 fois) (nécessaire pour ignorer les faux signaux du capteur ultrasonique)
Serial.println("final go back");
turn(SHARP_RIGHT);
go_Back(FAST_SPEED);
delay(backtime*3/2);
turn(FRONT);
++thereis;}
if (distance>distancelimit){
thereis=0;} //Le compteur est réinitialisé
if (thereis > 25){
Serial.println("final stop");
stop_Stop(); // Puisqu'il y a quelque chose devant, arrêtez de bouger.
thereis=0;
}
}
Cliquez ici pour retourner sur la page de la Voiture autonome mignature