This forum uses cookies
This forum makes use of cookies to store your login information if you are registered, and your last visit if you are not. Cookies are small text documents stored on your computer; the cookies set by this forum can only be used on this website and pose no security risk. Cookies on this forum also track the specific topics you have read and when you last read them. Please confirm whether you accept or reject these cookies being set.

A cookie will be stored in your browser regardless of choice to prevent you being asked this question again. You will be able to change your cookie settings at any time using the link in the footer.

  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
[HC-SR04] Medidor de distancias por ultrasonidos
#1
El HC-SR04 es uno de los sensores de distancia más sencillos y baratos (Menos de 3€) que suelen usarse en multitud de proyectos de electrónica o robótica. Con el podremos medir la distancia hasta un objeto, en teoría, desde 2cm hasta 450cm con una resolución de +- 0.3cm. Se alimenta con una corriente de 5v y tiene un consumo muy bajo (alrededor de 2mA);

[Imagen: 2qxn5et.jpg]

¿Cómo funciona?
El funcionamiento es muy simple, un 'disparador' emite un sonido (trigger) y el otro (echo) lo recoge contabilizando el tiempo transcurrido hasta recibir el 'rebote'. Al multiplicar este tiempo por la velocidad del sonido (340ms) y dividirlo entre 2 (ida y vuelta) obtendremos la distancia hasta el objeto.

Un código muy simple para ayudar a comprender el funcionamiento:
https://github.com/hectorri/Bioloid/tree...ing/HCSR04
Código:
#define trigPin 13
#define echoPin 12

int timeOut = 3000; //50m Max.

void setup(){
  Serial.begin (9600);
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
}

void loop(){
  long time, distance;
  // Inicio
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  // Disparo
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  // Fin de disparo
  digitalWrite(trigPin, LOW);
  // Capturamos retorno
  time = pulseIn(echoPin, HIGH, timeOut);
  // Calculamos distancia
  distance = time/29/2;
  if(time==0 || time==timeOut){
    Serial.println("Fuera de rango");
  }else{
    Serial.print(distance);
    Serial.println(" cm");
  }
  delay(500);
}
En consola obtendréis una salida como (En el ejemplo he ido alejando progresivamente un objeto hasta superar el máximo establecido en el timeout del sketch):

Código:
4 cm
5 cm
7 cm
11 cm
13 cm
16 cm
19 cm
22 cm
25 cm
32 cm
40 cm
44 cm
Fuera de rango
El siguiente paso, para trabajar cómodamente e integrarlo en nuestros proyectos fácilmente sería extraer esta lógica a una librería externa.
  Responder
#2
Gracias por el aporte compañero, tengo muchos frentes abiertos, entre ellos aprender a usar todos estos sensores
  Responder
#3
Yo es la primera vez que trabajo con ellos y parecen más sencillos de usar de lo esperado.
  Responder
#4
Yo... por ser un poco mosca cojonera Guiño
No entiendo muy bien lo que pone en la línea 26

if(time==0 || time==timeOut)

En las primeras líneas pone: int timeOut = 3000; //50m Max.

creo que es un error, time nunca va a ser igual a 3000, y creo que el timeOut no tiene que ver con la distancia, el comentario dice que esto equivaldría a 50 metros y no tiene nada que ver.

Cuando se cumple el if es porque está fuera de rango y time vale cero, pero no creo que nunca valga 3000.
El timeOut de la función pulseIn se usa para que si no viene el pulso no se quede colgado el programa esperando, pero no tiene que ver luego con la medida de ese pulso.
O por lo menos yo lo entiendo así.

De todos modos muy buen aporte, a ver si entre todos nos curtimos con el uso de los sensores. Mola
Cuando un hombre planta un árbol bajo cuya sombra sabe que no se sentará ha comenzado a comprender el sentido de la vida... o lo que es lo mismo... comparte!!!
  Responder
#5
DiegoLale escribió:Yo... por ser un poco mosca cojonera Guiño
No entiendo muy bien lo que pone en la línea 26

if(time==0 || time==timeOut)

En las primeras líneas pone: int timeOut = 3000; //50m Max.

creo que es un error, time nunca va a ser igual a 3000, y creo que el timeOut no tiene que ver con la distancia, el comentario dice que esto equivaldría a 50 metros y no tiene nada que ver.

Cuando se cumple el if es porque está fuera de rango y time vale cero, pero no creo que nunca valga 3000.
El timeOut de la función pulseIn se usa para que si no viene el pulso no se quede colgado el programa esperando, pero no tiene que ver luego con la medida de ese pulso.
O por lo menos yo lo entiendo así.

De todos modos muy buen aporte, a ver si entre todos nos curtimos con el uso de los sensores. Mola

Eso parece, porque el limite esta en 3000, por tanto jamas devolvera ese valor, a lo sumo 2999, si llega a 3000 devuelve 0 por llegar al limite de espera de tiempo.

De todas formas me imagino que seran 50cm no 50metros. La cosa seria ver si cuando llega a 3000 manda ya 0, o es cuando es mayor de 3000.

Para el maximo, 45CM cual es el tiempo que tarda en retornar?, 3 segundos de espera para la ejecucion de me hacen muy largo.

Nada, que el valor devuelto esta en microsegundos....vamos 3 milisegundos jajajaja.
  Responder
#6
Pues si, teneis razon. Al pasarle a la funcion pulseIn un timeout de espera, si este se sobrepasa devolverá 0 por lo que nunca llegará ahí con ese valor.
  Responder
#7
Es un sensor curioso y algo falsete porque induce a creer que el timeout de pulseIn funciona de una manera diferente a la que realmente lo hace.
Me explico...
Pongamos otro ejemplo, si queremos leer un pulso de una salida de servo de un receptor de rc, se supone que el pulso se repite cada 20ms y tiene una duración de entre 900ms y 2100ms aproximadamente (depende del fabricante) entonces le deberíamos meter un timeout de, por ejemplo 20ms porque si en ese tiempo no apareció el pulso es que algo va mal y podríamos por ejemplo llamar a una función de error o un failsafe( en radiocontrol el fail safe es un dispositivo que hace que cuando no hay comunicación entre emisora y receptor poner los servos en una posición conocida para evitar un desastre mientras no se vuelve a tener comunicación, por si alguien no lo sabía Guiño ).
Ahí se ve que el tiemeout no tiene que ver con lo que hace el sensor, si no con el tiempo de espera que le damos al pulso para aparecer, si sabemos que tiene que tardar un tiempo y tarda más es que algo va mal y evitamos que esté eternamente esperando un pulso que no llega, aunque no es del todo cierto porque si no se pone el timeout por defecto espera un segundo si no estoy equivocado. En el caso del pulso del receptor no es lo mismo darse cuenta de que algo va mal a los 20ms que esperar un segudo completo con el programa colgado.
El el caso de los sensores de ultrasonidos pasa algo curioso, cuando lo activamos con los 10us en el trigger manda una señal de ultrasonidos que tarda un tiempo en volver directamente proporcional a la distancia del objeto que esté delante del sensor. Y luego por el pin echo replica ese tiempo que es lo que se mide, en este caso es lo mismo, o casi, porque aunque no tengo ni idea, seguramente hace falta un tiempo mayor para que el sensor procese las señales por lo que el timeout de 3000 debería dar una lectura un pelín inferior como máximo.
Perdón por el tocho pero es la mejor forma de aprender a usar arduino, coger cada una de las funciones posibles y desgranarla hasta dominarla bien, y así... quien sabe que maldades se pueden llegar a hacer con arduino. :twisted:
Cuando un hombre planta un árbol bajo cuya sombra sabe que no se sentará ha comenzado a comprender el sentido de la vida... o lo que es lo mismo... comparte!!!
  Responder


Posibles temas similares…
Tema Autor Respuestas Vistas Último mensaje
  APORTE TUTORIAL: Construir un Medidor de CO2 casero con ESP8266 contra la COVID-19 Mariete 0 1,112 30-01-2021, 08:34 AM
Último mensaje: Mariete
  medidor de distancia a con bluetooth o wiffi homer32 4 3,107 28-10-2017, 11:28 AM
Último mensaje: homer32
  Arduino + Sensor Ultrasonido HC-SR04 + LCD Electromecánico 16 9,319 03-06-2014, 07:38 PM
Último mensaje: Roberto
  Arduino UNO + Servo + HC-SR04 Electromecánico 1 14,341 28-04-2014, 09:14 AM
Último mensaje: Triggerr