Quantcast
Channel: Luis Llamas
Viewing all articles
Browse latest Browse all 1123

Medir distancia con Arduino y sensor de ultrasonidos HC-SR04

$
0
0

arduino-ultrasonidos

arduino-ultrasonidos

¿Que es un sensor de ultrasonidos?

Un sensor de ultra sonidos es un dispositivo para medir distancias. Su funcionamiento se base en el envío de un pulso de alta frecuencia, no audible por el ser humano. Este pulso rebota en los objetos cercanos y es reflejado hacia el sensor, que dispone de un micrófono adecuado para esa frecuencia.

Midiendo el tiempo entre pulsos, conociendo la velocidad del sonido, podemos estimar la distancia del objeto contra cuya superficie impacto el impulso de ultrasonidos

Los sensores de ultrasonidos son sensores baratos, y sencillos de usar. El rango de medición teórico del sensor HC-SR04 es de 2cm a 400 cm, con una resolución de 0.3cm. En la práctica, sin embargo, el rango de medición real es mucho más limitado, en torno a 20cm a 2 metros.

Los sensores de ultrasonidos son sensores de baja precisión. La orientación de la superficie a medir puede provocar que la onda se refleje, falseando la medición. Además, no resultan adecuados en entornos con gran número de objetos, dado que el sonido rebota en las superficies generando ecos y falsas mediciones. Tampoco son apropiados para el funcionamiento en el exterior y al aire libre.

Pese a esta baja precisión, que impide conocer con precisión la distancia a un objeto, los sensores de ultrasonidos son ampliamente empleados. En robótica es habitual montar uno o varios de estos sensiores, por ejemplo, para detección de obstáculos, determinar la posición del robot, crear mapas de entorno, o resolver laberintos. En aplicaciones en que se requiera una precisión superior en la medición de la distancia, suelen acompañarse de medidores de distancia por infrarrojos.

Precio

El sensor de ultrasonidos HC-SR04 es un sensor barato. Podemos encontrar unidades por 0,65€ en AliExpress.

HC-SR04

Teoría y ecuaciones

El sensor se basa simplemente en medir el tiempo entre el envío y la recepción de un pulso sonoro. Sabemos que la velocidad del sonido es 343 m/s en condiciones de temperatura 20 ºC, 50% de humedad, presión atmosférica a nivel del mar. Transformando unidades resulta

343 \frac{m}{s} \cdot{} 100 \frac{cm}{m} \cdot{} \frac{1}{1000000} \frac{s}{\mu s} = \frac{1}{29.2} \frac{cm}{\mu s}

Es decir, el sonido tarda 29,2 microsegundos en recorrer un centímetro. Por tanto, podemos obtener la distancia a partir del tiempo entre la emisión y recepción del pulso mediante la siguiente ecuación.

Distancia(cm)= \frac {Tiempo(\mu s)}{29.2 \cdot 2}

El motivo de divir por dos el tiempo (además de la velociad del sonido en las unidades apropiadas, que hemos calculado antes) es porque hemos medido el tiempo que tarda el pulso en ir y volver, por lo que la distancia recorrida por el pulso es el doble de la que queremos medir.

sensor-ultrasonico-explicacion

Esquema eléctrico

El esquema eléctrico que necesitamos es el siguiente.

arduino-ultrasonidos-esquema-electrico

Montaje

Mientras que el montaje en una protoboard sería el siguiente.

arduino-ultrasonidos-montaje

Ejemplo de código

Para activar el sensor necesitamos generar un pulso eléctrico en el pin Trigger (disparador) de al menos 2ms. Nosotros generaremos un pulso de 5ms. Previamente, pondremos el pin a Low durante 2ms para asegurar un disparo limpio.

Posteriormente usamos la función “pulseIn” para obtener el tiempo requerido por el pulso para volver al sensor. Finalmente, convertirmos el tiempo en distancia mediante la ecuación correspondiente.

const int TriggerPin = 5;
const int EchoPin = 6;
const int LedPin = 13;

void setup() {
	Serial.begin(9600);
	pinMode(LedPin, OUTPUT);
	pinMode(TriggerPin, OUTPUT);
	pinMode(EchoPin, INPUT);
}

void loop() {
	int cm = ping(TriggerPin, EchoPin);
	Serial.print("Distancia: ");
	Serial.println(cm);
	delay(1000);
}

int ping(int TriggerPin, int EchoPin) {
	long duration, distanceCm;
	
	digitalWrite(TriggerPin, LOW);  //para generar un pulso limpio
	delayMicroseconds(2);
	digitalWrite(TriggerPin, HIGH);  //generamos Trigger (disparo) de 5ms
	delayMicroseconds(5);
	digitalWrite(TriggerPin, LOW);
	
	duration = pulseIn(EchoPin, HIGH);  //medimos el tiempo entre pulsos, en microseg
	
	distanceCm = duration * 10 / 292/ 2;   //convertimos a distancia, en cm
	return distanceCm;
}

Observar que intentamos emplear siempre aritmética de enteros, evitando usar números en coma flotante. Esto es debido a que las operaciones en coma flotante ralentizan mucho el procesador, y suponen cargar un gran número de librerías en memoria.

Si te ha gustado esta entrada y quieres leer más puedes consultar el resto de tutoriales de Arduino


Viewing all articles
Browse latest Browse all 1123

Trending Articles