Oui si on parle d'arrondir mais dans le cas d'un stockage dans un type inapproprié, on a plutôt ceci, et dans le cas d'une condition d'égalité, on ne peut pas l'obtenir car très proche ne veux pas dire identique.
pas de soucis je travaille que sur des conditions d'encadrement.
sinon j'ai enfin mis au propre tout se que nous avions dit en voici le résultat
// INITIALISATION DES VARIABLEs
float tempjeu = 0.0;//temps réel
float tempprog = 0.0;// ?temps soustrayant les poses du aux arrets imprévus sur le parcour, permet le repére dans les etapes de parcours sans bug de saut d'étape
const float sud = (3*PI)/2000; // orientation primaire utile en milli radiant
const float nord = PI/2000;
const float est = 0.0;
const float ouest = PI/1000;
float oriente = 0.0;
int contact = 1; // varible on off coup d'envois
int danger = 0;// détection d'un obstacle imprévus arrêt du véicule
const int margesecu = 200.0;// distance maximal entre le robot et un obstacle inconu en mm
const int margemur = 100.0; // distance maximal entre le robot et un obstacle de l'environnement connue en mm
float ecartp = 0.0; //tempjeu-tempprog en milliseconde
const float finjeu = 100000.0; // temps de fin de jeux en mili seconde
float calcutemp = 0.0; //variable de comparaison du tempprograme pour déterminé l'étape
float temparduino = 0.0; //retard du milisse avant début du programe
float tempboucle = 0.0; // temp entre chaque boucle pour calculer la position à chaque boucle remis à O en sortent de la boucle pas danger (sinon cumul sur plusieur boucle et ereur de calcule de trajectoir)
int b = 0; //simple varible de conte
const float n = 1/30000; //marge de radiant minimal éxigé pour validé l'attainte d'une orientation demandé en radiant
const float vmaxrec = 0.25;// vitesse max sur sol plat en mm par milli seconde
const float vmaxcirc = PI/6;//vitesse max circulaire sur sol plat en milliradant par milliseconde
float parcour [2][7]{{5000.0,4000.0,6000.0,2000.0,4000.0}, // déterminé la distance en mm
{nord,sud,est,ouest,PI/4000}}; //déterminer la direction tableau servant d'interface pour stocker la trajectoire et les action à réaliser en dgrée
float x = 0.0; // position d'origine en x en mm (nb: verifier le set utilisé)
float y = 0.0; // position d'origine en y en mm
float degresReel = 0.0; //direction de la tête du robot dans le repére x y en mradiant radiant au démarage
//SETUP
void setup() {
Serial.begin(1200);
}
// BOUCLE
void loop() {
Serial.print ("x= ");
Serial.println(x);
Serial.print ("y= ");
Serial.println(y);
Serial.print ("degresReel= ");
Serial.println(degresReel);
Serial.print("millis = ");
Serial.println(millis());
Serial.print("tempjeu = ");
Serial.println(tempjeu);
Serial.print("oriente = ");
Serial.println(oriente);
Serial.print("tempprog = ");
Serial.println(tempprog);
Serial.print("ecart temp = ");
Serial.println(ecartp);
// detection du coup d'envois
//lire on off et assigner 1 à contact si ON ( à ajouté)
if ((contact == 1)&&(tempjeu == 0)){//si jeux tout juste lancé initialisé temparduino
temparduino = millis();
tempjeu =millis()-temparduino;
}
// aprés coup d'envois
if (temparduino != -1 ){
tempjeu = millis()-temparduino;
//prise valeur capteur..... (à ajouté)
// si x y proche murs alors réduire marge de sécurité sur côté concerné, variable(x,y,margemur; margesecu;non cpateur)
// si capteurs inférieur à marge alors danger = 1 sinon danger = 0
//si danger ou jeux fini
if ((danger == 1)||(tempjeu > finjeu)){ // si danger ou jeux fini
ecartp = ecartp+tempjeu-(millis()-temparduino);// commencer à calculer l'écart temporelle
//alor tout moteur = low (à ajouté)
tempboucle = 0; //réinitialise l'écart de temp entre chaque boucle ou il y a mouvement pour ne pas cumulé le temp quand le robot et arété
}
// lire étape de trajectoire en fonction du tempprog
calcutemp = 0;
tempprog = tempjeu-ecartp;
for (int i=1; calcutemp <= tempprog; i++){calcutemp = calcutemp + (parcour[1][i])/(vmaxrec); //tester les diférente étape
b = i;}
oriente = parcour [2][b]; //choisire l'orientation de l'étape trouvé
//si pas de danger
if (danger == 0){
//si direction changer
while (degresReel < 0){ degresReel += PI/500;} //rendre positif degresReel
while (degresReel >= PI/500){degresReel -= PI/500;} // le réduire sous PI/500
if(((oriente + n < degresReel)||(oriente + n - PI/500 < degresReel))&&((degresReel < oriente - n)||(degresReel < oriente - n + PI/500))){ //si degresReel ne convient pas à l'orientation demandé avec une marge n
tempboucle = tempboucle - millis();
if(((oriente - PI/1000 <= degresReel)||(oriente + PI/1000 <= degresReel))&&(degresReel < oriente)){ // si le chemine le plus cours et ds le sens horaire
// alumer les moteurs dans le sence horaire (à faire)
degresReel = degresReel - vmaxcirc * tempboucle;//calculer degresReel possiblement remplacé par un giroscope dans la cboucle principal
}
if((oriente <= degresReel)&&((degresReel < oriente + PI/1000)||(degresReel < oriente - PI/1000))){ // si le chemin le plus cour et dans le sens trigo
// alumer les moteurs dans le sence trigo (à faire)
degresReel = degresReel + vmaxcirc * tempboucle;//calculer degresReel possiblement remplacé par un giroscope dans la cboucle principal
ecartp = tempjeu - tempprog;//calcule ecart tp
}
tempboucle = millis();
}
tempprog = tempjeu - ecartp ;
if(((oriente + n >= degresReel)||(oriente + n - PI/500 >= degresReel))&&((degresReel >= oriente - n)||(degresReel >= oriente - n + PI/500))){
//alumer les moteurs pour avencer (à faire)
tempboucle = tempboucle - millis();
x = x + cos(degresReel * 1000) / 1000 * tempboucle * vmaxrec ;//calculé x y théorique en m m, possiblement remplacé par un accélérométre dans la boucle principal
y = y + sin(degresReel * 1000) / 1000 * tempboucle * vmaxrec ;
tempboucle = millis();
}
}
}
}
j'ai testé les résultat sur le moniteur série
le temps semble bien se déroulé mais la position reste fixe contrairement à se qui lui est demandé.