« Codage » : différence entre les versions
Aucun résumé des modifications |
Aucun résumé des modifications |
||
| (Une version intermédiaire par le même utilisateur non affichée) | |||
| Ligne 2 : | Ligne 2 : | ||
#define IN1 7 | #define IN1 7 | ||
#define IN2 8 | #define IN2 8 | ||
#define ENA 5 // ENA | #define ENA 5 // pin ENA | ||
#define FRONT 90 // | #define FRONT 90 //degré lorsque la direction est alignée droit devant | ||
int SHARP_RIGHT=FRONT+33; | int SHARP_RIGHT=FRONT+33; | ||
int SHARP_LEFT=FRONT-40; | int SHARP_LEFT=FRONT-40; | ||
| Ligne 21 : | Ligne 21 : | ||
#define FAST_SPEED 200 | #define FAST_SPEED 200 | ||
#define MID_SPEED 170 | #define MID_SPEED 170 | ||
#define SERVO_STEER 9 // | #define SERVO_STEER 9 //Servo de direction connecté à D9 | ||
#define SERVO_SENSOR 10 // | #define SERVO_SENSOR 10 //Capteur ultrasonore servo connecté à D10 | ||
#define Echo_PIN 2 // | #define Echo_PIN 2 // La broche Echo de l'ultrason est connectée à D11 | ||
#define Trig_PIN 3 // | #define Trig_PIN 3 // La broche Trig de l'ultrason est connectée à D12 | ||
PWMServo head; | PWMServo head; | ||
PWMServo head_steer; | PWMServo head_steer; | ||
int leftscanval, centerscanval, rightscanval, ldiagonalscanval, rdiagonalscanval; | int leftscanval, centerscanval, rightscanval, ldiagonalscanval, rdiagonalscanval; | ||
const int distancelimit = 30; //distance | const int distancelimit = 30; //Limite de distance pour les obstacles devant | ||
const int sidedistancelimit = 30; // | 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 distance; | ||
int numcycles = 0; | int numcycles = 0; | ||
const int forwardtime = 600; // | const int forwardtime = 600; //Temps que le robot passe à tourner (en millisecondes) | ||
const int turntime = 900; // | const int turntime = 900; //Temps que le robot passe à tourner (en millisecondes) | ||
const int backtime = 900; // | const int backtime = 900; //Temps passé par le robot à tourner (en millisecondes) | ||
#define LPT 2 // | #define LPT 2 // Compteur de boucles de balayage. | ||
int thereis; | int thereis; | ||
/*motor control*/ | /*motor control*/ | ||
void go_Back(int speed) // | void go_Back(int speed) //Avancer | ||
{ | { | ||
| Ligne 48 : | Ligne 48 : | ||
} | } | ||
void go_Advance(int speed) // | void go_Advance(int speed) //Avancer | ||
{ | { | ||
| Ligne 105 : | Ligne 105 : | ||
digitalWrite(Trig_PIN,LOW); | digitalWrite(Trig_PIN,LOW); | ||
echo_distance=pulseIn(Echo_PIN,HIGH); | echo_distance=pulseIn(Echo_PIN,HIGH); | ||
echo_distance=echo_distance*0.01657; // | echo_distance=echo_distance*0.01657; //À quelle distance se trouve l'objet en centimètres | ||
//Serial.println((int)echo_distance); | //Serial.println((int)echo_distance); | ||
return round(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 | //leftscanval, centerscanval, ldiagonalscanval et rdiagonalscanval (il y a 5 points pour le test de distance) | ||
String watchsurrounding(){ | String watchsurrounding(){ | ||
int obstacle_status =B100000; | int obstacle_status =B100000; | ||
| Ligne 131 : | Ligne 129 : | ||
obstacle_status =obstacle_status | B1000; | obstacle_status =obstacle_status | B1000; | ||
} | } | ||
head.write(SENSOR_FAR_LEFT); // | 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); | delay(300); | ||
leftscanval = watch(); | leftscanval = watch(); | ||
| Ligne 140 : | Ligne 138 : | ||
} | } | ||
head.write(SENSOR_FRONT); // | head.write(SENSOR_FRONT); //Utilisez 90 degrés si vous faites tourner votre servo sur les 180 degrés complets. | ||
delay(100); | delay(100); | ||
centerscanval = watch(); | centerscanval = watch(); | ||
| Ligne 164 : | Ligne 162 : | ||
obstacle_status =obstacle_status | 1; | obstacle_status =obstacle_status | 1; | ||
} | } | ||
head.write(SENSOR_FRONT); // | head.write(SENSOR_FRONT); //Terminer de regarder autour (regarder à nouveau vers l'avant). | ||
delay(300); | delay(300); | ||
String obstacle_str= String(obstacle_status,BIN); | String obstacle_str= String(obstacle_status,BIN); | ||
obstacle_str= obstacle_str.substring(1,6); | obstacle_str= obstacle_str.substring(1,6); | ||
return obstacle_str; // | return obstacle_str; //Retourner une chaîne de 5 caractères représentant l'état des obstacles dans 5 directions | ||
} | } | ||
| Ligne 175 : | Ligne 173 : | ||
++numcycles; | ++numcycles; | ||
if(numcycles>=LPT){ // | if(numcycles>=LPT){ //Surveillez si quelque chose se trouve autour à chaque boucle LPT tout en avançant. | ||
stop_Stop(); | stop_Stop(); | ||
String obstacle_sign=watchsurrounding(); // 5 | 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.print("begin str="); | ||
Serial.println(obstacle_sign); | Serial.println(obstacle_sign); | ||
| Ligne 236 : | Ligne 234 : | ||
//else Serial.println(numcycles); | //else Serial.println(numcycles); | ||
distance = watch(); // | 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){ // | 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"); | Serial.println("final go back"); | ||
turn(SHARP_RIGHT); | turn(SHARP_RIGHT); | ||
| Ligne 245 : | Ligne 243 : | ||
++thereis;} | ++thereis;} | ||
if (distance>distancelimit){ | if (distance>distancelimit){ | ||
thereis=0;} // | thereis=0;} //Le compteur est réinitialisé | ||
if (thereis > 25){ | if (thereis > 25){ | ||
Serial.println("final stop"); | Serial.println("final stop"); | ||
stop_Stop(); // | stop_Stop(); // Puisqu'il y a quelque chose devant, arrêtez de bouger. | ||
thereis=0; | thereis=0; | ||
} | } | ||
} | } <br> | ||
<br> | |||
Cliquez ici pour retourner sur la page de la [[Voiture autonome mignature]] | Cliquez ici pour retourner sur la page de la [[Voiture autonome mignature]] | ||
Version actuelle datée du 26 avril 2024 à 16:29
- 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