Bonjour, dans le cadre de mes études je réalise un projet qui consiste à modéliser un régulateur adaptatif de vitesse. Etant débutant je me confronte à pas mal d'erreurs. tout d'abord excusez mon manque de rigueur dans le code ...
Voila mon soucis, je souhaite calculer la distance séparant les deux véhicules (robots) pendant que mon robot roule, lorsqu'il y a un obstacle devant le capteur, le programme agit comme je le souhaite, cependant quand j'enlève l'obstacle devant, le calcul de la distance prend beaucoup de temps, ce qui interrompt les moteurs pendant une certaine durée (moins d'une seconde) mais empeche mon robot de continuer son mouvement.
Je voulais donc essayer de filtrer ces calculs de grandes distances puisque dans mon cas celles-ci ne m'intéressent pas, cependant ceci ne résout pas mon problème.
Si vous pouviez m'apportez des pistes de reflexions, parceque la je bloque
//Codeur: dfrobot SEN0038
long coder = 0;
int lastSpeed = 0;
int front = 2; // pin sur laquelle est le signal. Attention sur UNO, la fonction ATTACHINTERRUPT n'est possible que sur 2 & 3
unsigned long timer = 0;//c'est le temps écoulé en ms depuis lancement du programme
float N = 0;
float V = 0;
//Arduino PWM Speed Control:
int E1 = 5;
int M1 = 4;
//récepteur IR
const int PIN_IR = 11;
IRrecv irRecv(PIN_IR);
decode_results results;
//capteur us
int trig = 5;
int echo = 3;
long lecture_echo;
long cm;
void setup() {
Serial.begin(9600); //initialise la com série à 9600 bds
pinMode(M1, OUTPUT); //pin sortie moteur
pinMode(E1, OUTPUT);
pinMode(front,INPUT); //codeur_roue
attachInterrupt(digitalPinToInterrupt(front), LwheelSpeed, CHANGE); //initialise le "Interrupt mode" pour la pin 2. Mode "CHANGE": compte tous les fronts
irRecv.enableIRIn();
pinMode(trig, OUTPUT); //US
digitalWrite(trig, LOW);
pinMode(echo, INPUT);
}
void loop() {
int value1 = 255; // valeur de 0 à 255, codé donc sur un octet (Byte)
digitalWrite(M1,HIGH);
analogWrite(E1,value1); //Le fait d'utiliser la cde analogwrite définie la sortie E1 (pin 5) en sortie PWM (variation)
delay(100);
codeur() ;
distance();
/* if (irRecv.decode(&results)){ //si un message est reçu
int key = results.value; //touche pressée
Serial.println(key, DEC);
if (key == TEL_POWER) {
} else if (key == TEL_5) { //touche d'arrêt de l'action en cours
Serial.println("Touche 5 pressée");
arreterMoteurs();
}
}*/
}
//*****************Fonctions************
int distance() { //calcul distance entre les deux véhicules
digitalWrite(trig, HIGH);
delayMicroseconds(10);
digitalWrite(trig, LOW);
lecture_echo = pulseIn(echo,HIGH);
if (lecture_echo<8000){
Serial.print(lecture_echo);
cm = lecture_echo /58;
Serial.print("Distance en cm :");
Serial.println(cm);
//delay(1500);
return (cm);}
else {
Serial.println("distance trop importante");
}
}
/*
void RegulMot() { //\\ ajouter un PID
int value1 = 255; // valeur de 0 à 255, codé donc sur un octet (Byte)
digitalWrite(M1,HIGH);
analogWrite(E1, value1); //Le fait d'utiliser la cde analogwrite définie la sortie E1 (pin 5) en sortie PWM (variation)
}
void arreterMoteurs() { //arrête les deux moteurs
digitalWrite(E1, LOW);
}
*/
void codeur(){
//Serial.print("Coder value: ");
//Serial.println(coder);
Serial.print("Vitesse m/s: ");
Serial.println(vit((coder)));
lastSpeed = coder; //enregistre la dernière valeur de CODER
coder = 0; //écrase la mémoire
//delay(100);
}
void LwheelSpeed(){
coder ++; //compte les interruptions donc les fronts du capteur roue
}
int vit(int coder){
N=coder*600/11;
V=N*20*0.032*M_PI/60;
return V;
}