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
Mon delta t est faux et je ne comprend pas pourquoi.
Merci d'avance pour votre aide !
#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;
}
}
}
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.
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.
J'ai peut être mal expliqué
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 !