Problema con sensor de ultrasonido HC-SR04

Buenas noches a todos.

El problema que tengo es el siguiente:

Al enviar un pulso algunas veces cuando sucede lo de la imagen pierdo la vuelta del pulso y me da un tiempo = 0.

Supongo que habrá alguna forma de arreglar esto mediante programación pero no consigo averiguar cómo...
Os dejo el código para que le echéis un vistazo si queréis.

long distancia; //definimos un valor long distancia
long tiempo; //definimos un valor long tiempo
const float velocidad = 0.03432; //definimos un valor float velocidad constante.

int echo = 2;
int trig = 3;

 
void setup() {
	  pinMode(echo,INPUT);
          pinMode(trig,OUTPUT);
          Serial.begin(9600);
}
 
void loop() {
  

  digitalWrite(trig, LOW);
  delayMicroseconds(10);
  digitalWrite(trig, HIGH); // Ponemos a 1 el pin de disparo.
  delayMicroseconds(10); //Espera 10 microsegundos para afianzar el disparo.
  digitalWrite(trig, LOW); // Ponemos el pin de disparo a 0.
  

      
  tiempo=pulseIn(echo, HIGH)/2; //Utilizamos esta función para medir el tiempo que tarda desde que envia el pulso trigger, momento en el que echo se pone en HIGH, hasta que el pin echo se pone en low, momento en el que recibe la vuelta del echo.

      delay(50);
   
    if(valorecho==HIGH)
    digitalWrite(echo,LOW);   
    distancia = (velocidad*tiempo); // Calculamos la distancia teniendo en cuenta que la velocidad a la que se desplaza el sonido en el aire es de 0.034 cm/microseg.
  
  Serial.print("Distancia: ");
  Serial.print(distancia);
  Serial.println(" cm");
  
  delay(500);

}

A ver si alguien puede echarme una mano.

Gracias :slight_smile:

Tu solución es montar el sensor en un servo que este barriendo un ángulo determinado.
Por software no puedes solucionar algo que es de física simple: La reflexión del rayo será perpendicular a la pared incidente.
Si el sensor ultrasónico tuviera una salida que indicara la intensidad de salida, podrías ir corrigiendo el ángulo.

surbyte:
Tu solución es montar el sensor en un servo que este barriendo un ángulo determinado.
Por software no puedes solucionar algo que es de física simple: La reflexión del rayo será perpendicular a la pared incidente.
Si el sensor ultrasónico tuviera una salida que indicara la intensidad de salida, podrías ir corrigiendo el ángulo.

Según la hoja de datos de este sensor el ángulo efectivo es de 15°. Entiendo que el servo debería moverse 15° con el sensor encima para que no perdiese la reflexión del sonido no?

Lo que no veo posible solucionar es si el sonido incide en una superficie no perpendicular al sensor... Para eso no existe ninguna solución verdad?

Gracias por tu respuesta surbyte :slight_smile:

En todas tus afirmaciones tienes razón.
Si tienes nivel electrónico como para hacer algo novedoso, te recomiendo este hackeo del HC SR04 reemplazando el chip CHINO por un ATiny24 que soluciona muchos inconvenientes pero que además dispone de un pin MidPoint que relaciona el circuito de recepción del recpetor de manera que podrias saber si la señal se esta apagando.

Hola.

Próximamente tengo que utilizar un sensor de este tipo para un proyecto y como en tu caso, la superficie contra la que haré la medición no estará perfectamente perpendicular al sensor.

Hace bastante tiempo lo estuve probando, pero recuerdo que se volvía bastante inconsistente según se alejaba de la perpendicular, sin embargo no recuerdo el grado de tolerancia.

Me interesaría bastante si al final reduces el tema a números.

Muchas gracias.
Un saludo.

Mira esa página que sugiero BajaTecnología porque usa un ATtiny24 para mejorar ciertos aspectos fallidos del modelo CHINO. y lo que comprobé que el Threshold se hace por software en el ATiny24, por ende si lo lees puedes tmb detectar que te estas alejando de la perpendicular, no te parece?
MidPoint llega a ADC1 del ATtiny24 y tambien Theshold a ADC0. Tienes control total de la situación.

Muchas gracias, surbyte.

Voy a echarle un vistazo, desde luego merece la pena.

De entrada pensaba ver si con la tolerancia del sensor me es suficiente, si no lo es, desde luego tendré que ver soluciones más drásticas.

Un saludo.

Yo creo que tienes varios enfoques:

  1. Montar el sensor en un servo que le agregue la capacidad de girar y con la modificación tendrías la posibilidad de medir la perpendicularidad del objeto. Estoy suponiéndolo, claro.
  2. Me olvido de todo esto y monto un servo que barre un ángulo y donde detecta detecta y asunto terminado.
    Claro que esta es la opción mas simple.

Pero puede ser que la opción 1. modificando el sensor sea últil en determinada situación que claro está ya evaluarás.