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?
arduino-uno
sensors
pulsein
shajib0o
fuente
fuente
How can i do this code in assembly languaje
¿Qué tiene que ver eso con esta pregunta?Respuestas:
De los documentos:
Entonces, en este caso,
pulseIn(echoPin, HIGH)
comienza a contar el número de microsegundos hasta queechoPin
se ALTA y lo almacenaduration
.Comienza y termina en esa línea, es lo que se conoce como función de bloqueo. Realmente se quedará allí hasta que
echoPin
suba 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
pulseIn
llamada no lo afectará de ninguna manera.La forma de obtener la distancia desde este momento es mediante la siguiente ecuación:
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.
fuente
pulseIn(echoPin, HIGH)
mide el tiempo hasta que el pin ECHO baja.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:
el sensor se activa por el flanco descendente de TRIG, en
digitalWrite(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.fuente
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.fuente
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.
fuente