[Résolu] Problème de réponse à un calcul

Bonjour,

J'ai utiliser le code du lien suivant : https://www.gotronic.fr/pj2-35191-vma306-ultrasonic-1512.pdf afin de mesurer la distance à un obstacle d'une "voiture" ainsi que sa vitesse selon différentes unités. Voici le code modifié :

// Définition des ports
int trig = 13;
int echo = 12;

// Variables
long duree;  // duree echo
int D;  //distance à l'obstacle
float V; //vitesse par cm/µs
float Vk; //vitesse en km/h
float Vm; //vitesse en m/s
float prevD; // distance précedente


void setup() {

  // put your setup code here, to run once:
  Serial.begin (9600);
  pinMode(trig, OUTPUT);
  digitalWrite(trig, LOW);
  pinMode(echo, INPUT);
}

void vitesse () {

  V = (prevD - D ) /  duree ;  // calcul de la vitesse en cm/µs

  Serial.print(V * 1000000);
  Serial.print("cm/s :");
  Serial.print(" ");

  Vm = V * 0.01; // calcul de la vitesse en m/s

  Serial.print(Vm);
  Serial.print("m/s :");
  Serial.print(" ");

  Vk = V * 0.036;    // calcul de la vitesse en km/h

  Serial.print(Vk);
  Serial.print("km/h");
  Serial.print(" ");

}
void loop() {
  prevD = D; // on donne la valeur précedente

  digitalWrite(trig, LOW);
  delayMicroseconds(5);
  digitalWrite(trig, HIGH);
  delayMicroseconds(10);
  digitalWrite(trig, LOW);

  duree = pulseIn(echo, HIGH); // Echo

  Serial.print("durée: ");
  Serial.print(duree);
  Serial.print("µs;");

  D = duree * 0.034 / 2; // calcule de la distance (le son parcourt environ 340 mètre par seconde soit 0.034 centimètre par microsecondes)

  // Affichage
  Serial.print("Distance : ");
  Serial.print(D);
  Serial.println("cm");
  vitesse();

}

J'obtiens une bonne distance ainsi qu'une vitesse en cm/s mais le programme me donne une vitesse nul en m/s et en km/h.

16:35:43.718 -> -843.17cm/s : -0.00m/s : -0.00km/h durée: 1301µs;Distance : 22cm
16:35:43.812 -> -1537.28cm/s : -0.00m/s : -0.00km/h durée: 1439µs;Distance : 24cm
16:35:43.858 -> -1389.85cm/s : -0.00m/s : -0.00km/h durée: 1637µs;Distance : 27cm
16:35:43.951 -> -1832.62cm/s : -0.00m/s : -0.00km/h durée: 1867µs;Distance : 31cm
16:35:43.998 -> -2142.47cm/s : -0.00m/s : -0.00km/h durée: 2076µs;Distance : 35cm
16:35:44.091 -> -1926.78cm/s : -0.00m/s : -0.00km/h durée: 2277µs;Distance : 38cm
16:35:44.138 -> -1317.52cm/s : -0.00m/s : -0.00km/h durée: 2593µs;Distance : 44cm
16:35:44.232 -> -2313.92cm/s : -0.00m/s : -0.00km/h durée: 2604µs;Distance : 44cm
16:35:44.278 -> 0.00cm/s : 0.00m/s : 0.00km/h durée: 2596µs;Distance : 44cm
16:35:44.372 -> 0.00cm/s : 0.00m/s : 0.00km/h durée: 2610µs;Distance : 44cm
16:35:44.419 -> 0.00cm/s : 0.00m/s : 0.00km/h durée: 2590µs;Distance : 44cm
16:35:44.511 -> 0.00cm/s : 0.00m/s : 0.00km/h durée: 2580µs;Distance : 43cm
16:35:44.558 -> 387.60cm/s : 0.00m/s : 0.00km/h durée: 2204µs;Distance : 37cm
16:35:44.652 -> 2722.32cm/s : 0.00m/s : 0.00km/h durée: 1918µs;Distance : 32cm
16:35:44.699 -> 2606.88cm/s : 0.00m/s : 0.00km/h durée: 1679µs;Distance : 28cm
16:35:44.746 -> 2382.37cm/s : 0.00m/s : 0.00km/h durée: 1470µs;Distance : 24cm
16:35:44.840 -> 2721.09cm/s : 0.00m/s : 0.00km/h durée: 1328µs;Distance : 22cm
16:35:44.885 -> 1506.02cm/s : 0.00m/s : 0.00km/h durée: 1165µs;Distance : 19cm
16:35:44.978 -> 2575.11cm/s : 0.00m/s : 0.00km/h durée: 1094µs;Distance : 18cm
16:35:45.025 -> 914.08cm/s : 0.00m/s : 0.00km/h durée: 1056µs;Distance : 17cm
16:35:45.119 -> 946.97cm/s : 0.00m/s : 0.00km/h durée: 1032µs;Distance : 17cm
16:35:45.165 -> 0.00cm/s : 0.00m/s : 0.00km/h durée: 1049µs;Distance : 17cm

Je ne sais pas si c'est un problème de programmation ou si la carte arduino ne peut pas traiter le calcul.

Merci pour votre aide.

Bonjour,

Tu ne calcules pas V en cm/s, tu affiches juste cette vitesse.
V est toujours en cm/µs. Calcules V en cm/s avant de faire les calculs de conversion.

1 - D doit être un float, pas un int.
2- D doit être initialisé à la distance ... initiale

essais Serial.print(Vm,6);

Ah oui effectivement, c'est une erreur bête. Ceci résout un problème de taille... merci @kamill

1- Si D est en "float" avec la faible précision de capteur, il y a un changement régulier de position et donc de vitesse. Je vais donc garder D en "int"

2- Effectivement, cela évite la valeur de vitesse négative au départ, merci @biggil .

Une astuce en plus pour avoir plus de chiffres significatifs, merci @LFRED .

Ce n'est pas de la bonne programmation. En faisant cela, tu scelles en dur deux problèmes distincts:

  • la représentation de l'information distance. C'est une grandeur continue, son contenant naturel est donc un float. C'est le meilleur contenant : tu gardes le maximum d'information sur cette grandeur.
  • Des problèmes de tolérance au bruit, qui sont très spécifiques à l'usage que tu fais de cette mesure. Dans ton cas, si tu veux que le bruit ne fasse pas changer la vitesse, tu appliques un seuil sur le calcul de changement - ou pas - de vitesse.

Séparer les problèmes, ne pas les sceller ensemble dans un coffre (c-à-d choisir un int parce qu'il résoud le second problème) est une meilleure programmation.