Comment savoir quand une variable garde la même valeur un certain temps?

Bonsoir,
je suis en ce moment sur un projet de robot pour la robocup junior et je m'y prend sûrement tard mais en bossant sur mon code de suiveur de ligne, je me suis rendu compte que le robot n'était pas capable de retrouver la ligne après l'avoir perdu ailleurs que sur les côtés.
J'ai donc trouvé comme solution de détecter si le capteur garde la même valeur un certain temps, ce qui est impossible si la ligne est sous le robot car elle ne peut pas être parfaitement alignée en raison de la manière dont mon code est écrit.
Or je ne sais pas comment entreprendre ce procédé et j'écris ici dans l'espoir d'une réponse.
D'avance Merci
Cordialement
Bonne soirée.

Bonjour et bienvenue,

Merci de lire les bonnes pratiques du forum francophone et de les appliquer.

En particulier donne toute les infos nécessaires sur le matériel pour que l'on puisse te répondre.
Typiquement quel capteur(s) utilises-tu?
Comment l'exploites-tu, pour ton guidage?

@ginowww tu peux poster le code aussi (attention, entre les balises de code ) :slight_smile:

Excuse moi.
J'utilise un QTR8 de chez Polulu

Je le fais de ce pas.
Voici le code que j'ai entamé:

#include <QTRSensors.h>
#include <L298NX2.h>


#define NUM_SENSORS             8  // number of sensors used
#define NUM_SAMPLES_PER_SENSOR  4  // average 4 analog samples per sensor reading
#define EMITTER_PIN             2  // emitter is controlled by digital pin 2

// sensors 0 through 7 are connected to analog inputs 0 through 7, respectively
QTRSensorsAnalog qtra((unsigned char[]) {0, 1, 2, 3, 4, 5, 6, 7}, 
  NUM_SENSORS, NUM_SAMPLES_PER_SENSOR, EMITTER_PIN);
unsigned int sensorValues[NUM_SENSORS];

// Motors pin definition 
const unsigned int EN_A = 3;
const unsigned int IN1_A = 5;
const unsigned int IN2_A = 6;

const unsigned int IN1_B = 7;
const unsigned int IN2_B = 8;
const unsigned int EN_B = 9;

// Initialize both motors
L298NX2 motors(EN_A, IN1_A, IN2_A, EN_B, IN1_B, IN2_B);

void setup()
{
  delay(500);
  pinMode(13, OUTPUT);
  digitalWrite(13, HIGH);    
  for (int i = 0; i < 400; i++)  
  {
    qtra.calibrate();       
  }
  digitalWrite(13, LOW);     

  // print the calibration minimum values measured when emitters were on
  Serial.begin(9600);
  for (int i = 0; i < NUM_SENSORS; i++)
  {
    Serial.print(qtra.calibratedMinimumOn[i]);
    Serial.print(' ');
  }
  Serial.println();
  
  // print the calibration maximum values measured when emitters were on
  for (int i = 0; i < NUM_SENSORS; i++)
  {
    Serial.print(qtra.calibratedMaximumOn[i]);
    Serial.print(' ');
  }
  Serial.println();
  Serial.println();
  delay(1000);

    // Used to display information
  Serial.begin(9600);

  // Wait for Serial Monitor to be opened
  while (!Serial)
  {
    //do nothing
  }

  // Set initial speed for both motors
  motors.setSpeed(80);
}


void loop()
{
  // read calibrated sensor values and obtain a measure of the line position from 0 to 7000
 
  unsigned int position = qtra.readLine(sensorValues);
  
  // print the sensor values as numbers from 0 to 1000, where 0 means maximum reflectance and
  // 1000 means minimum reflectance, followed by the line position
  for (unsigned char i = 0; i < NUM_SENSORS; i++)
  {
    Serial.print(sensorValues[i]);
    Serial.print('\t');
  }
  
  Serial.println(position); 
  
  delay(250);

  motors.forward();

  if (position < 4000 && position > 3000) {  //starts to follow the line (speed not tested yet)
    motors.setSpeedA(80);
    motors.setSpeedA(80);    
  }
  else if (position < 3000 && position > 2000) {
    motors.setSpeedA(80);
    motors.setSpeedB(60);
  }
  else if (position < 2000 && position > 1000) {
    motors.setSpeedA(80);
    motors.setSpeedB(40);    
  }
  else if (position <1000 && position > 0) {
    motors.setSpeedA(80);
    motors.setSpeedB(20);
  }
  else if (position < 5000 && position > 4000) {
    motors.setSpeedA(60);
    motors.setSpeedB(80);
  }
  else if (position < 6000 && position > 5000) {
    motors.setSpeedA(40);
    motors.setSpeedB(80);
  }
  else if (position < 7000 && position > 6000) {
    motors.setSpeedA(20);
    motors.setSpeedB(80);
  }
  else if (position < 0) {
    motors.setSpeedA(80);
    motors.setSpeedB(0);
  }
  else if (position > 7000) {
    motors.setSpeedA(0);
    motors.setSpeedB(80);
  }
  
}

Il te faut deux variables, une pour la dernière valeur connu de la variable que tu veux espionner et une deuxième variable pour sauver le temps(résultat de la fonction millis) du changement de valeur de ta variable à espionner.

Donc tu regarde si la nouvelle valeur de ta variable est différent de sa sauvegarde, dans ce cas tu sauvegarde le temps.
si les deux valeurs sont égale, tu test si le temps passé depuis le changement de valeur est supérieur à une certaine valeur.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.