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?
arduino-uno
sensors
pulsein
shajib0o
la source
la source
How can i do this code in assembly languaje
- qu'est-ce que cela a à voir avec cette question?Réponses:
De la documentation:
Donc, dans ce cas,
pulseIn(echoPin, HIGH)
commence à compter le nombre de microsecondes jusqu'à ce qu'ilechoPin
passe à HIGH et le stockeduration
.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
echoPin
monte 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'
pulseIn
appel ne l'affecte en aucune façon.La façon dont vous obtenez la distance à partir de cette heure est l'équation suivante:
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.
la source
pulseIn(echoPin, HIGH)
mesure le temps jusqu'à ce que la broche ECHO devienne FAIBLE.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:
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.la source
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.la source
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.
la source