¿Cuál es el trabajo de pulseIn?

9

Tengo un código para un sensor ultrasónico que encontré en un sitio. Aquí está el código:

#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);
}

Sin embargo, no entiendo el trabajo de la pulseIn()función. Quiero decir, quiero saber cuándo comienza el recuento de tiempo y cuándo termina. Por ejemplo, en este código, ¿comienza la hora en digitalWrite(trigPin, HIGH);o comienza en la pulseIn()función?

Si es el segundo, cuando se detiene, ¿cómo nos da el tiempo la distancia de un obstáculo cuando ya estoy retrasando 1000 microsegundos después de enviar un ping en el aire?

shajib0o
fuente
El retraso de 100us para el pin del gatillo me parece un poco largo. Depende de la marca de su sensor, pero un valor típico (lo uso con HC-SR04) es de alrededor de 10us .
jfpoilpret
¿Cómo puedo hacer este código en lenguaje ensamblador ???? Por favor ayuda.
1
How can i do this code in assembly languaje¿Qué tiene que ver eso con esta pregunta?
Nick Gammon

Respuestas:

8

De los documentos:

Lee un pulso (ALTO o BAJO) en un pin. Por ejemplo, si el valor es ALTO, pulseIn()espera a que el pin pase a ALTO, comienza a cronometrar, luego espera a que el pin pase a BAJO y detiene el cronometraje. Devuelve la longitud del pulso en microsegundos. pulso

Entonces, en este caso, pulseIn(echoPin, HIGH)comienza a contar el número de microsegundos hasta que echoPinse ALTA y lo almacena duration.

Comienza y termina en esa línea, es lo que se conoce como función de bloqueo. Realmente se quedará allí hasta que echoPinsuba y le diga cuánto tiempo tomó (a menos que especifique un tiempo de espera).

Eso también significa que cualquier retraso que tenga antes o después de la pulseInllamada no lo afectará de ninguna manera.

La forma de obtener la distancia desde este momento es mediante la siguiente ecuación:

distance = (duration/2) / 29.1;

Se divide por dos porque sale y retrocede, por lo que el tiempo sería el doble que el de un viaje de ida. El 29.1 es la velocidad del sonido (que es 343.5 m / s => 1 / 0.03435 = 29.1). Tenga en cuenta que el resultado está en CM, no en pulgadas. Probablemente podría resolverlo mirando la hoja de datos del sensor o simplemente obteniendo muchas muestras que relacionen la duración con la distancia (mediría la distancia manualmente) y obtenga una ecuación que es muy similar.

Sachleen
fuente
1
¡He sido abatido! En realidad, el 29.1 es la velocidad del sonido. Además, solo una adición rápida: IIRC, la razón por la que hay un pulso para leer es que el módulo ultrasónico produce una señal ALTA hasta que el sonido regresa al módulo.
Anonymous Penguin
1
No entendí el cuarto párrafo. Porque si envío un pulso de sonido en el aire y espero 2 segundos, viajará una gran distancia. Entonces, cuando empiezo a contar, llegaré 2 segundos tarde. Entonces, ¿por qué no hay ningún problema si doy retrasos antes de pulseIn? @ Sachleen. Y gracias Annonomus Penguin y Sachlee
shajib0o
@ shajib0o "pulseIn () espera a que el pin se ponga ALTO, comienza a cronometrar, luego espera a que el pin se ponga BAJO y detiene el cronometraje".
sachleen
3
@ shajib0o Por lo que puedo decir, es que el sensor ultrasónico hace que el pin vaya ALTO cuando se envía la señal y luego BAJO cuando vuelve la señal.
Anonymous Penguin
1
En realidad, esto está mal. pulseIn(echoPin, HIGH)mide el tiempo hasta que el pin ECHO baja.
Dmitry Grigoryev
2

De hecho, sería un problema si comenzaras a medir la longitud del pulso 1000 microsegundos después de que comience. Sin embargo, no es así como funciona el sensor HC-SR04:

ingrese la descripción de la imagen aquí

  • el sensor se activa por el flanco descendente de TRIG, endigitalWrite(trigPin, LOW);

  • el pulso ECHO comienza aproximadamente 0.3 ms después del disparador

Es por eso que un retraso de 1 ms no afecta el resultado de la medición. pulseIn(echoPin, HIGH)en realidad esperará a que el pin ECHO llegue a ALTO, luego comenzará a medir la longitud del pulso hasta que vuelva a BAJAR. Como tal, la duración del pulso TRIG se puede reducir a 10 microsegundos (duración mínima de TRIG para HC-SR04), para que las mediciones sean más rápidas.

Dmitry Grigoryev
fuente
0

Es importante saber que no mide el tiempo desde el inicio del disparo, configurando el pin del disparador ALTO, hasta la señal de eco.

El sensor HC-SR04 comienza la medición al recibir un ALTO en la entrada del disparador y luego envía, poco tiempo después, el tiempo codificado como la longitud del nivel ALTO en el pin de eco.

Si usa pulseIn()2 ms, es decir, 2000 μs, después de disparar, debería funcionar bien.

ANK55
fuente
1
No estoy seguro de cuánto agrega o difiere esto a la respuesta aceptada.
Greenonline
0

No se confunda, ya que el módulo ultrasónico tiene una forma particular de trabajar. Primero estableces un pulso en el gatillo. Cuando finaliza, el módulo envía 8 ráfagas de pulsos de 40 kHz (y eso es realmente lo que se usa para medir la distancia, no su pulso en el gatillo, que no va a ninguna parte). En el momento exacto en que se envía la primera ráfaga, el pin de eco se coloca en ALTO. Cuando esto sucede, el programa está en la línea de pulseIn, y dado que la echopin está en ALTO, comienza a cronometrarse (porque pulseIN (echopin, HIGH) espera que la echopina sea ALTA para comenzar a cronometrar). Cuando el primer pulso de los 40 kHz rebota en el objeto y vuelve al receptor, la echopina se establece en BAJA. Luego, la función pulseIn detiene el tiempo y lo devuelve. Entonces el programa continúa ejecutándose. Este módulo es un poco complicado para aprender la forma de trabajar de pulseIn.

JoshFMX
fuente