Sensor de ping HC-SR04 cortando a ~ 3 metros

2

Tengo algunos sensores ultrasónicos HC-SR04 que compré en eBay no hace mucho. Enganché uno a un Arduino y escribí un boceto rápido para probarlos, y descubrí que ninguno de ellos funciona de manera consistente.

Parece que todos dejan de funcionar cuando la distancia es demasiado grande. Puedo encender el Arduino y escucho el clic del sensor mientras apunta al techo a una distancia de 1.5 metros. Sin embargo, cuando lo giro hacia el otro extremo de la sala, a unos 3 metros, el clic se detiene y el método pulsein () se agota y las distancias se leen a 0 cm. Apuntar el sensor hacia el techo no resuelve el problema, se debe reiniciar la alimentación. En realidad, descubrí que mover el sensor a veces puede hacer que vuelva a funcionar también, sin cambiar la potencia. Busqué personas que tienen problemas con el sensor, pero nadie parece tener el problema que tengo.

EDITAR: He realizado algunos experimentos más y ahora creo que no debe haber un tiempo de espera interno cuando se envía un "clic" y no se recibe. El sensor funciona cuando se dirige a superficies sólidas hasta 3 metros de distancia. Deja de funcionar en dos casos: apuntando hacia una puerta o apuntando a una superficie blanda. La documentación del sensor dice que tiene un alcance de 4 metros y no funciona bien en superficies suaves (que absorben el sonido). Mi conjetura es que en estos dos casos, un eco no se escucha en absoluto. El sensor se queda atascado esperando un eco. Al hacer clic, se crea el eco que estaba esperando y se reanuda hasta que se pierde otro eco.

Hay tres circuitos integrados en la placa: un amplificador, un cambiador de nivel max3232 y uno no identificable. Supongo que el tercero es una especie de microcontrolador, por lo que puedo intentar reprogramarlo o reemplazarlo. Cualquier comentario sobre eso sería apreciado, aunque parece que respondí mi propia pregunta en la medida de lo posible.

Aquí está el código que estoy usando. He revisado tres veces todas las conexiones y el hecho de que funcione brevemente sugiere que son correctas.


const int trig = 3;
const int echo = 4;

float elapsed, distance;

void setup() {

  pinMode(trig, OUTPUT);
  pinMode(echo, INPUT);

  Serial.begin(9600);

}

void loop() {

  digitalWrite(trig, HIGH);
  delayMicroseconds(20);
  digitalWrite(trig, LOW);

  elapsed = pulseIn(echo, HIGH, 1000000);
 // timeout in microseconds

  distance = elapsed / 58;

  Serial.println((String)(distance) + " cm");

  delay(500);

}
    
pregunta Keith

2 respuestas

2

Probablemente esté funcionando "suficientemente bien".

En este momento, su código NO debe bloquearse, pero debe realizar un bucle cada 1.5 segundos - 1 segundo para el tiempo de espera de pulso mediado por Arduino y 500 ms debido a la demora (500). Nada de lo que hace el módulo SR04 debería poder prevenir su bucle de código cada ~ = 1.5s. Si, por ejemplo, enciende el LED a bordo durante el período de demora (500), debería poder ver que se está produciendo el bucle.

Lo más probable es que su sistema no esté "escuchando" el retorno de los objetivos blandos en rangos más grandes, según el manual, el tiempo de espera en 1 s, el retraso de 500 mS y luego la repetición.

El retardo de 500 mS no es necesario (pero ayuda si se usa un LED de latido), ya que el tiempo de espera de pulso de 1 segundo es independiente del SR04 que tiene mucho antes de "darse por vencido".

SI lo anterior es correcto, entonces una prueba de tipo estaría activando el sensor JUSTO COMO / DESPUÉS de que se apague el LED del latido del corazón. Esto debería funcionar cada vez que seas lo suficientemente rápido. Mientras que encenderlo, por ejemplo, cuando el LED de latido del corazón se enciende, no sería útil.

Y / o apuntarlo a un objeto cercano durante al menos 1,54 segundos debe restaurar la operación.

Bonus:

No creo que explique el comportamiento, PERO el impulso de activación debe ser de 10 uS, no de 20 uS más. El procesador agregará un tiempo finito a ese retraso, pero 'con suerte' los retrasos de bajo a alto y de alto a bajo de la escritura digital se cancelarán. PERO probaría un retraso de 10 uS, y también vería el pulso en un alcance, si está disponible. |

    
respondido por el Russell McMahon
1

Tengo exactamente el mismo problema. ¿Alguien encontró una solución de trabajo? Mi única solución es alimentar el sensor con una salida digital (la corriente de trabajo es de 15 mA, por lo que está bien) y restablecerlo cuando pulseIn me devuelva 0. Pero debería haber una solución permanente para solucionar este problema ... Gracias, Fardenco

EDITAR: He encontrado una solución: Solo tiene que poner el pin de eco en el modo SALIDA y enviarlo un pulso BAJO, volver a ponerlo en el modo ENTRADA y aquí está. enlace

    
respondido por el Fardenco

Lea otras preguntas en las etiquetas