Quel est le travail de pulseIn?

9

J'ai le code d'un capteur à ultrasons que j'ai trouvé sur un site. Voici le code:

#define trigPin 12
#define echoPin 13

void setup() {
  Serial.begin (9600);
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
}

void loop() {
  int duration, distance;
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(1000);
  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH);
  distance = (duration/2) / 29.1;
  if (distance >= 200 || distance <= 0){
    Serial.println("Out of range");
  }
  else {
    Serial.print(distance);
    Serial.println(" cm");
  }
  delay(500);
}

Cependant, je ne comprends pas le travail de la pulseIn()fonction. Je veux dire, je veux savoir quand le décompte du temps commence et quand il se termine. Par exemple, dans ce code, l'heure commence digitalWrite(trigPin, HIGH);-t-elle à l'heure ou commence-t-elle à la pulseIn()fonction?

Si c'est le deuxième, quand il s'arrête, alors comment le temps nous donne-t-il la distance d'un obstacle alors que je retarde déjà 1000 microsecondes après avoir envoyé un ping dans l'air?

shajib0o
la source
Le délai de 100us pour la goupille de déclenchement me semble un peu long. Cela dépend de la marque de votre capteur, mais une valeur typique (je l'utilise avec HC-SR04) est d'environ 10us .
jfpoilpret
Comment puis-je faire ce code dans l'assembly languaje ???? Veuillez aider.
1
How can i do this code in assembly languaje- qu'est-ce que cela a à voir avec cette question?
Nick Gammon

Réponses:

8

De la documentation:

Lit une impulsion (haute ou basse) sur une broche. Par exemple, si la valeur est HIGH, pulseIn()attend que la broche passe à HIGH, démarre le chronométrage, puis attend que la broche passe à LOW et arrête le chronométrage. Renvoie la longueur de l'impulsion en microsecondes. pulsin

Donc, dans ce cas, pulseIn(echoPin, HIGH)commence à compter le nombre de microsecondes jusqu'à ce qu'il echoPinpasse à HIGH et le stocke duration.

Il commence et se termine sur cette ligne, c'est ce qu'on appelle une fonction de blocage. Il restera vraiment là jusqu'à ce qu'il echoPinmonte et vous indique le temps qu'il a fallu (sauf si vous spécifiez un délai d'attente).

Cela signifie également que tout retard que vous avez avant ou après l' pulseInappel ne l'affecte en aucune façon.

La façon dont vous obtenez la distance à partir de cette heure est l'équation suivante:

distance = (duration/2) / 29.1;

Vous divisez par deux, car il va et vient donc le temps serait le double de celui d'un aller simple. Le 29,1 est la vitesse du son (qui est de 343,5 m / s => 1 / 0,03435 = 29,1). Notez donc que le résultat est en CM, pas en pouces. Vous pourriez probablement le découvrir en regardant la fiche technique du capteur ou simplement obtenir de nombreux échantillons reliant la durée à la distance (vous mesureriez la distance manuellement) et obtenir une équation très similaire.

sachleen
la source
1
J'ai été skeeted! En fait, le 29.1 est la vitesse du son. Aussi, juste un ajout rapide: IIRC la raison pour laquelle il y a une impulsion à lire est que le module à ultrasons produit un signal HIGH jusqu'à ce que le son retourne au module.
Anonymous Penguin
1
Je n'ai pas compris le quatrième paragraphe. Parce que si j'envoie une impulsion sonore dans l'air et que j'attends 2 secondes, cela parcourra beaucoup de distance. Donc, quand je commencerai à compter, j'aurai 2 secondes de retard. Alors pourquoi n'y a-t-il pas de problème si je donne des délais avant pulseIn? @ sachleen. Et merci Annonomus Penguin et sachlee
shajib0o
@ shajib0o "pulseIn () attend que la broche passe à HIGH, démarre le chronométrage, puis attend que la broche passe à LOW et arrête le chronométrage."
sachleen
3
@ shajib0o Pour autant que je sache, c'est que le capteur à ultrasons fait passer la broche à HAUT lorsque le signal est envoyé, puis à BAS quand le signal revient.
Anonymous Penguin
1
En fait, c'est faux. pulseIn(echoPin, HIGH)mesure le temps jusqu'à ce que la broche ECHO devienne FAIBLE.
Dmitry Grigoryev
2

En effet, ce serait un problème si vous commenciez à mesurer la durée d'impulsion 1000 microsecondes après son démarrage. Cependant, ce n'est pas ainsi que fonctionne le capteur HC-SR04:

entrez la description de l'image ici

  • le capteur est déclenché par le front descendant de TRIG, àdigitalWrite(trigPin, LOW);

  • l'impulsion ECHO démarre environ 0,3 ms après le déclenchement

C'est pourquoi un retard de 1 ms n'affecte pas le résultat de la mesure. pulseIn(echoPin, HIGH)attendra réellement que la broche ECHO passe à HIGH, puis commence à mesurer la longueur d'impulsion jusqu'à ce qu'elle redevienne LOW. Ainsi, la durée de l'impulsion TRIG peut être réduite à 10 microsecondes (durée TRIG minimale pour HC-SR04), pour accélérer les mesures.

Dmitry Grigoryev
la source
0

Il est important de savoir que vous ne mesurez pas le temps entre le déclenchement et le déclenchement - en réglant la goupille de déclenchement HAUT - jusqu'au signal d'écho.

Le capteur HC-SR04 démarre la mesure en recevant un HIGH sur l'entrée Trigger puis envoie, peu de temps après, le temps codé comme la longueur du niveau HIGH sur la broche Echo.

Si vous utilisez pulseIn()2 ms, soit 2000 μs, après le déclenchement, cela devrait fonctionner correctement.

ANK55
la source
1
Je ne sais pas dans quelle mesure cela ajoute ou diffère de la réponse acceptée.
Greenonline
0

Ne vous trompez pas, car le module à ultrasons a une façon particulière de fonctionner. D'abord, vous définissez une impulsion dans le trigpin. À la fin, le module envoie 8 rafales d'impulsions de 40 kHz (et c'est en fait ce qui est utilisé pour mesurer la distance, pas votre impulsion dans le trigpin, qui ne va nulle part). Au moment précis où la première salve est envoyée, la broche d'écho se positionne sur HIGH. Lorsque cela se produit, le programme est dans la ligne de pulseIn, et puisque echopin est à HIGH, il commence le chronométrage (car pulseIN (echopin, HIGH) attend que echopin soit HAUT pour le chronométrage de démarrage). Lorsque la première impulsion des 40 kHz rebondit dans l'objet et revient au récepteur, l'echopin se met en BAS. Ensuite, la fonction pulseIn arrête le temps et le renvoie. Ensuite, le programme continue de fonctionner. Ce module est un peu délicat pour apprendre le fonctionnement de pulseIn.

JoshFMX
la source