Mesurer une vitesse

Bonjour, je suis en seconde année de Prépa et nous avons un TIPE à préparer.
Le mien consiste à optimiser le décollage d'un aéronef à l'aide d'une catapulte.



L'un des objectifs principal est de comparer nos modèles théoriques à nos expérimentations, j'ai donc résolu mes équations pour trouver la vitesse de mon avion en sorti de catapulte.
Pour la mesurer, mon idée était de mettre un capteur à ultrason (voir l'image) et mesurer le temps de passage de mon aile. Comme je connais sa longueur je peux donc déterminer sa vitesse.
Le problème étant que mon programme ne fonctionne pas :confused:
Mon delta t est faux et je ne comprend pas pourquoi.
Merci d'avance pour votre aide ! :slight_smile:

#include <LiquidCrystal.h>


// Initalisation de la librairie
//LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
const int rs = 2, en = 3, d4 = 4, d5 = 5, d6 = 6, d7 = 7;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
/* Constantes pour les broches */
const byte TRIGGER_PIN = 8; // Broche TRIGGER
const byte ECHO_PIN = 9;    // Broche ECHO
 
/* Constantes pour le timeout */
const unsigned long MEASURE_TIMEOUT = 25000UL; // 25ms = ~8m à 340m/s

/* Vitesse du son dans l'air en mm/us */
const float SOUND_SPEED = 340.0 / 1000;
int passage = 0; //pour bloquer la loop
int passage2 = 0; //pour bloquer la loop
long temps1 = 0;
long temps2 = 0;
long tempst = 0;
long temps = 0;


void setup() {
  // set up the LCD's number of columns and rows: 
  lcd.begin(16, 2);
  analogWrite(8,15);
  Serial.begin(9600);
  /* Initialise les broches */
  pinMode(TRIGGER_PIN, OUTPUT);
  digitalWrite(TRIGGER_PIN, LOW); // La broche TRIGGER doit être à LOW au repos
  pinMode(ECHO_PIN, INPUT);
}

void loop() {
  if(passage == 0){
    tempst = millis();
    /* 1. Lance une mesure de distance en envoyant une impulsion HIGH de 10µs sur la broche TRIGGER */
    digitalWrite(TRIGGER_PIN, HIGH);
    delayMicroseconds(10);
    digitalWrite(TRIGGER_PIN, LOW);
    
    /* 2. Mesure le temps entre l'envoi de l'impulsion ultrasonique et son écho (si il existe) */
    long measure = pulseIn(ECHO_PIN, HIGH, MEASURE_TIMEOUT);
     
    /* 3. Calcul la distance à partir du temps mesuré */
    float distance_mm = measure / 2.0 * SOUND_SPEED;
    
    lcd.setCursor(0, 0);// place le curseur au 1er caractère de la 1ere ligne
    lcd.print("Distance");
    lcd.setCursor(0, 1);// place le curseur au 1er caractère de la 2nde ligne
    lcd.print(distance_mm);
    /* Délai d'attente pour éviter d'afficher trop de résultats à la seconde */
    delay(100);
    if(distance_mm <80){ //l'objet passe 
      lcd.print("Objet");
      temps1 = millis();
      passage2 = 1;
    }
    if(passage2 == 1 && distance_mm >200){ //l'objet n'est plus devant
      temps2=millis();
      temps = temps2-temps1;
      lcd.clear();
      lcd.print(temps);
      passage = 1;
    }
  }

}

Sujet déplacé en section générale

1 Like

hello

as tu fais les calculs ?
quelle est la vitesse de la catapulte?
en fonction de la largeur de l'aile, quel delta de t est attendu ?
quel est le temps de mesure de ton capteur pour une distance de 8 cm?

à mon avis, ton système ne pourras pas le faire.

il existe les interruptions qui te permettront de ne rien louper:

tu utilises INT 0 en RISING pour le passage du bord d'attaque de l'aile devant un capteur LDR ou photodiode
tu uilises INT 1 en FALLING, pour le bord de fuite de l'aile, en utilisant le meme capteur.

les routines d'interruption le plus courtes possible. simplement initialiser une variable avec micros();
puis dans la loop, tu fais le delta des deux variables

Bonjour
si c'est pour calculer la vitesse en sortie de catapulte, AMHA un capteur US n'est pas un capteur adapté (lenteur) , il faut faire du tout optique

Par certain qu'il soit nécessaire de se compliquer avec des interruptions
Le logiciel ne fera que déterminer la longueur d'une impulsion. Il n'y a à priori aucune tâche de fond à réaliser à ce que je comprends.
Le plus simple serais d'utiliser pulseIn().
Il serait, par exemple, possible d'utiliser un capteur optique utilisant la réflexion sur l'aile (comme proposé plus haut) et juste faire un pulsIn(HIGH) et immédiatement après lâcher la catapulte.

c'est vous qui voyez :grinning:

Oui c'est fait ! Je suis censé être dans les 5 à 10 m/s grand max !
Mon aile fais 8cm de largeur, donc on serait proche des 16ms on va dire pour notre delta t.

Pour moi le capteur à ultrason (https://boutique.semageek.com/953-thickbox_default/capteur-de-distance-ultrason-hc-sr04.jpg) me semblait assez performant.
Je pensais que mon soucis venait de mon programme, en testant il m'affichait un delta t de 16 (ms) alors que je restais 4s devant mon capteur (pour tester le programme)...
Et peu importe le temps que je restais devant, le delta t affiché restait le même à peu de chose près. :frowning:

Bonjour,
Si je met un capteur optique, il va falloir que je mettre un récepteur sur mon aile ? Ou je me trompe ?
Merci

J'ai peut être mal expliqué :slight_smile:
L'algorithme général serait celui-ci :
1 - Lancement de l'avion (je lâche le ressort)
2- L'avion suivra mon coulisseau (le truc imprimé en noir)
3- il arrive au bout de la catapulte et le capteur détecte un changement de distance
--> JE prend le premier temps
4- L'aile entière est passée (le capteur le sait comme la distance est redevenu plus grande)
--> Je prend le second temps

Puis j'en fais la différence pour connaitre le temps de passage de mon aile, comme je sais sa longueur j'en déduis ma vitesse.

Mais il y à forcément un problème quelque part. Sûrement mon programme ou comme vous le dites sûrement la rapidité de mon capteur
Merci pour votre aide !

Bonsoir
il existe des capteurs dit "reflectifs" qui utilise la réflexion de la lumière
exemple

hello
ton code de depart fonctionnel
attention moniteur sur 115200

#include <LiquidCrystal.h>
const int rs = 2, en = 3, d4 = 4, d5 = 5, d6 = 6, d7 = 7;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
const byte TRIGGER_PIN = 8;                    // Broche TRIGGER
const byte ECHO_PIN = 9;                       // Broche ECHO
const unsigned long MEASURE_TIMEOUT = 25000UL; // 25ms = ~8m à 340m/s
const float SOUND_SPEED = 340.0 / 1000;        /* Vitesse du son dans l'air en mm/us */
int passage1 = 0;                              // pour aiguiller la loop
int passage2 = 0;                              // pour aiguiller la loop
unsigned long temps1 = 0;
unsigned long temps2 = 0;
unsigned long temps  = 0;

void setup()
{
  lcd.begin(16, 2);
  analogWrite(8, 15);
  Serial.begin(115200);
  pinMode(TRIGGER_PIN, OUTPUT);
  digitalWrite(TRIGGER_PIN, LOW); // La broche TRIGGER doit être à LOW au repos
  pinMode(ECHO_PIN, INPUT);
  Serial.println("fin setup ");
}

void loop()
{
  digitalWrite(TRIGGER_PIN, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIGGER_PIN, LOW);
  long measure = pulseIn(ECHO_PIN, HIGH, MEASURE_TIMEOUT);
  float distance_mm = measure / 2.0 * SOUND_SPEED;
  if (passage1 == 0)
  {
    if (distance_mm < 80)//l'objet passe
    {
      temps1   = millis();
      passage1 = 1;
      passage2 = 1;
    }
  }
  if (passage2 == 1)
  {
    digitalWrite(TRIGGER_PIN, HIGH);
    delayMicroseconds(10);
    digitalWrite(TRIGGER_PIN, LOW);
    long measure = pulseIn(ECHO_PIN, HIGH, MEASURE_TIMEOUT);
    float distance_mm = measure / 2.0 * SOUND_SPEED;
    if ( distance_mm > 200)
    {
      temps2 = millis();
      temps = temps2 - temps1;
      lcd.clear();
      lcd.print("temps = ");
      lcd.print(temps);
      Serial.println(temps);
      passage1 = 0;
      passage2 = 0;
    }
  }
}

Salut, j'essayerais ça dans le semaine alors !
Je te dirais si ça fonctionne, merci beaucoup.

Très bien, je vais regarde ça alors au cas ou ça ne fonctionne pas avec le mien :slight_smile:

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