Bonjour,
je fais encore une fois appel au forum car je suis vraiment bloqué et n'arrive plus à avancer. J'ai déjà demander de l'aide, mais a ne fonctionne toujours pas. Voici mon problème :
J'ai un robot qui possède 6 capteurs infrarouges et 4 moteurs. Selon ce qu'il détecte, il doit avancer, reculer...
Par exemple, si il y'a un trou devant lui, il doit reculer pendant admettons 5 secondes. Le problème est qu'en utilisant un delay, si pendant ces 5 secondes en reculant il y a un trou derrière, il ne réagira pas car le delay bloque le programme et l'empêche de vérifier les capteurs. J'ai essayé d'utiliser la fonction millis, mais aucun résultat satisfaisant. Je fais donc appel à vous. Pour que cela soit plus compréhensible, voici une partie du code :
Déclaration des varaibles et constantes
int sens1AVD=13; //sens 1 avant droit (en avant)
int sens2AVD=12; //sens 2 avant droit (en arriere)
int sens1AVG=11; //sens 1 avant gauche (en avant)
int sens2AVG=10; //sens 2 avant gauche (en arriere)
int sens1ARD=7; //sens 1 arriere droit (en avant)
int sens2ARD=6; //sens 2 arriere droit (en arriere)
int sens1ARG=9; //sens 1 arriere gauche (en avant)
int sens2ARG=8; //sens 2 arriere gauche (en arriere)
const unsigned long periode1 = 3000;
const unsigned long periode2 = 3000;
unsigned long chrono1;
unsigned long chrono2;
int infra0=A0; //capteur infrarouge 0
int infra1=A1; //capteur infrarouge 1
int infra2=A2; //capteur infrarouge 2
int infra3=A3; //capteur infrarouge 3
int infra4=A4; //capteur infrarouge 4
int infra5=A5; //capteur infrarouge 5
les chronos dans le setup()
chrono1 = millis();
chrono2 = millis();
fonctions avancer et reculer
void avancer(){
if (millis() - chrono1 < periode1){
chrono1 = millis();
analogWrite(sens1AVD,ValVitesse); //roue avant droite tourne en avant (valVitesse est analogique,
pas important)
digitalWrite(sens2AVD,LOW);
analogWrite(sens1AVG,ValVitesse); //roue avant gauche tourne en avant
digitalWrite(sens2AVG,LOW);
analogWrite(sens1ARD,ValVitesse); //roue arriere droite tourne en avant
digitalWrite(sens2ARD,LOW);
analogWrite(sens1ARG,ValVitesse); //roue arriere gauche tourne en avant
digitalWrite(sens2ARG,LOW);
}
}
//pour faire reculer
void reculer(){
if (millis() - chrono2 < periode2){
chrono2 = millis();
Serial.println(chrono2);
digitalWrite(sens1AVD,LOW); //roue avant droite tourne en arriere
analogWrite(sens2AVD,ValVitesse);
digitalWrite(sens1AVG,LOW); //roue avant gauche tourne en arriere
analogWrite(sens2AVG,ValVitesse);
digitalWrite(sens1ARD,LOW); //roue arriere droite tourne en arriere
analogWrite(sens2ARD,ValVitesse);
digitalWrite(sens1ARG,LOW); //roue arriere gauche tourne en arriere
analogWrite(sens2ARG,ValVitesse);
}
}
Enfin la boucle principale :
void loop(){
avancer();
while(analogRead(infra0)>600&&analogRead(infra1)>600&&analogRead(infra2)>600&&analogRead(infra3)<600&&analogRead(infra4)<600&&analogRead(infra5)<600){
reculer();
}
}
Le 600 pour les capteurs représentent une valeur arbitraire
Je pense que pas grand chose ne va dans ce programme, c'est pourquoi je demande votre aide.
Je ne suis pas sur que la fonction millis soit au bon endroit, et je ne sais pas quoi mettre dans la loop.
Merci.