El sensor de ping HC-SR04 se corta a ~3 metros

Tengo algunos sensores ultrasónicos HC-SR04 que compré en eBay no hace mucho. Conecté 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 se hace demasiado grande. Puedo encender el Arduino y escucho el clic del sensor mientras apunta al techo a ~1,5 metros de distancia. Sin embargo, cuando lo giro hacia el otro extremo de la habitación, a unos 3 metros de distancia, el clic se detiene y el método pulsein() se agota y las distancias son de 0 cm. Apuntar el sensor hacia el techo no resuelve el problema, se debe apagar y encender. De hecho, descubrí que mover el sensor a veces también puede hacer que funcione nuevamente, sin encender y apagar. Busqué personas que tenían problemas con el sensor, pero nadie parece tener el problema que yo tengo.

EDITAR: He experimentado un poco 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 apunta a superficies sólidas a una distancia de hasta 3 metros. Deja de funcionar en dos casos: dirigido hacia una puerta o dirigido a una superficie blanda. La documentación del sensor dice que tiene un alcance de 4 metros y no funciona bien en superficies blandas (que absorben el sonido). Supongo que en estos dos casos, no se escucha ningún eco. Entonces, el sensor se atasca esperando un eco. Al moverlo, 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, así que puedo intentar reprogramarlo o reemplazarlo. Se agradecería cualquier aporte al respecto, aunque parece que respondí mi propia pregunta en la medida de lo posible.

Aquí está el código que estoy usando. He comprobado 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);

}
Puede usar el pulseIn(pin, value, timeout)formulario para especificar un tiempo máximo para escuchar un eco para que su boceto no se bloquee en una situación fuera de rango.
Estoy usando un tiempo de espera en mi boceto de arduino, y se está agotando. Sospecho que hay un microcontrolador en la placa del sensor que no se agota, por lo que se atasca (no envía clics) hasta que golpeo la placa, lo que crea un eco artificial.
El código que publicó está usando la versión sin tiempo de espera de pulseIn () Si eso no es lo que está usando, entonces debe actualizar su pregunta.
El tiempo de espera predeterminado es un segundo. Sin embargo, lo agregaré para mayor claridad.
La sugerencia de @ Samee87 estuvo bien. No estoy seguro de por qué se eliminó.
¿Cuál es tu pregunta de EE?

Respuestas (2)

Probablemente esté funcionando "lo suficientemente bien".

En la actualidad, su código NO debe bloquearse, sino que debe repetirse cada 1,5 segundos: 1 segundo para el tiempo de espera de entrada de impulsos mediado por Arduino y 500 ms debido a la demora (500). Nada de lo que haga el módulo SR04 debería poder evitar que su código se reproduzca cada ~= 1.5s. Si, por ejemplo, enciende el LED integrado durante el período de retraso (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 objetivos suaves en rangos más grandes, según el manual, agotando el tiempo en 1 segundo, retrasando 500 mS y luego repitiendo.

El retraso 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 se ha "rendido" mucho antes.

SI lo anterior es correcto, una especie de prueba sería mover el sensor SOLO COMO/DESPUÉS de que se apague el LED de latido del corazón agregado. Esto debería funcionar siempre si eres lo suficientemente rápido. Mientras que moverlo, por ejemplo, cuando el LED de latido del corazón se enciende, no ayudaría.

Y/o apuntarlo a un objeto cercano durante al menos 1,54 segundos debería restablecer el funcionamiento.


Prima:

No creo que explique el comportamiento, PERO el pulso 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 digitalWrite se cancelarán. PERO intentaría un retraso de 10 uS, y también miraría el pulso en un osciloscopio, si está disponible. |

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, así que está bien) y reiniciarlo cuando PulseIn me devuelva 0. Pero debería haber una solución permanente para solucionar esto... Gracias, Fardenco

EDITAR: He encontrado una solución: ¡solo necesita poner el pin de eco en modo SALIDA y enviarle un pulso BAJO, volver a ponerlo en modo ENTRADA y aquí tiene! http://forum.arduino.cc/index.php?topic=55119.15

Las respuestas son solo para respuestas. Debería editar su respuesta para que sea solo la solución que encontró, y quizás elaborar un poco más.