Libreria para Arduino del modulo Ultrasonic Ranging HC-SR04

18 comments Escrito el 4 de marzo del 2011 por
Categorias: Arduino, Library, Teensy 2.0

Medidor de distancias a través de ultrasonidos HC-SR04. Si estas buscando un modulo para medir distancias mediante ultrasonidos, este modulo HC-SR04 tiene muy buen precio en eBay (±3€), tiene una buena calidad/precio, tan solo 4 pines de conexión, un código de programación muy simple y un tamaño no muy grande de 4,5 x 2 cm (sin medir los pines de conexión).

En esta entrada publico una librería compatible con todas las placas Arduino y Teensy, siempre que se utilice la versión 0022 o superior del IDE de arduino.

Características

  • Voltaje: 5 VDC
  • Corriente en reposo: < 2 mA
  • Salida: High 5V/Low 0V
  • Angulo: < 15º
  • Distancia: 2 a 450 cm
  • Resolución: 0,3 cm

Pins de conexión

  • VCC
  • Trig (Disparo del ultrasonido)
  • Echo (Recepción del ultrasonido)
  • GND

Formula para medir la distancia

Distancia = {(Tiempo entre Trig y el Echo) * (V.Sonido 340 m/s)}/2

Prueba de medida con la placa teensy (ATmega32u4)

Código de Ejemplo - Medir distancia mediante el puerto serie con el modulo HC-RS04 (Serial.ino)

// Ultrasonic - Library for HR-SC04 Ultrasonic Ranging Module.
// Rev.4 (06/2012)
// J.Rodrigo ( www.jra.so )
// more info at www.ardublog.com

#include <Ultrasonic.h>

Ultrasonic ultrasonic(9,8); // (Trig PIN,Echo PIN)

void setup() {
  Serial.begin(9600); 
}

void loop()
{
  Serial.print(ultrasonic.Ranging(CM)); // CM or INC
  Serial.println(" cm" );
  delay(100);
}

Código de Ejemplo - Mostrar distancia del modulo HC-SR04 en un display LCD (LCD.ino)

// Ultrasonic - Library for HR-SC04 Ultrasonic Ranging Module.
// Rev.4 (06/2012)
// J.Rodrigo ( www.jra.so )
// more info at www.ardublog.com

#include <Ultrasonic.h>
#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // LCD arduino library

Ultrasonic ultrasonic(9,8); // (Trig PIN,Echo PIN)

void setup() {
lcd.begin(16, 2);
}

void loop()
{
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(ultrasonic.Ranging(CM)); // CM or INC
  lcd.print("cm");
  delay(100);
}

Código de Ejemplo - Obtener tiempo (en ms) que tarda el sonido en ir y volver (Timing.ino)

// Ultrasonic - Library for HR-SC04 Ultrasonic Ranging Module.
// Rev.4 (06/2012)
// J.Rodrigo ( www.jra.so )
// more info at www.ardublog.com

#include <Ultrasonic.h>

Ultrasonic ultrasonic(9,8); // (Trig PIN,Echo PIN)

void setup() {
  Serial.begin(9600); 
}

void loop()
{
  Serial.print(ultrasonic.Timing());
  Serial.println(" ms" ); // milliseconds
  delay(100);
}

Código de Ejemplo - Utilizar dos módulos HC-SR04 a la vez  (TwoOrMore.ino)

// Ultrasonic - Library for HR-SC04 Ultrasonic Ranging Module.
// Rev.4 (06/2012)
// J.Rodrigo ( www.jra.so )
// more info at www.ardublog.com

#include <Ultrasonic.h>

Ultrasonic ultraleft(9,8);   // (Trig PIN,Echo PIN)
Ultrasonic ultraright(6,7);  // (Trig PIN,Echo PIN)

void setup() {
  Serial.begin(9600); 
}

void loop()
{
  Serial.print("Left: ");
  Serial.print(ultraleft.Ranging(CM)); // CM or INC
  Serial.print(" cm     " );
  delay(50);
  Serial.print("Right: ");
  Serial.print(ultraright.Ranging(CM)); // CM or INC
  Serial.println(" cm" );
  delay(50);
}

Updated & Fixed - rev.2 (6/2011)

Tras probarla, me di cuenta que había un problema en la librería, que si el obstáculo estaba muy lejos se quedaba esperando el PulseIn del rebote del sonido 1 segundo y eso hacia que la programación de Arduino fuese muy lenta si no había obstáculos cercanos (se paraba 1 segundo a esperar la señal), la nueva versión esta limitado el PulseIn a 30 ms ( ± 5 metros) de esa manera cada vez que queramos medir la distancia solo perderemos como mucho 30 ms. ¡ATENCIÓN! Para que funcione la ultima actualización de esta librería requiere la ultima versión del software de Arduino ( 0022 o superior).

 Updated & Fixed - rev.3 (6/2012)

 Añado la compatibilidad con arduino IDE 1.0.1 y anteriores (gracias a @cbolanos79) y la posibilidad de añadir más de un sensor. También he añadido dos ejemplos nuevos.

 Updated & Fixed - GitHub (7/2012)

 He decidido mover la librería a GitHub, para así distribuirla de mejor manera y mantenerla más actualizada.

Library

04/2011: Ultrasonic.zip (2 KB)

06/2011: Ultrasonic_rev2.zip (3 KB)

06/2012: Ultrasonic_rev3.zip (4 KB)

11/2012: Ultrasonic-HC-SR04.zip (6 KB) (GitHub)

Ultrasonic-HC-SR04 GitHub Repo page.

Tags: , , , , , , , , , , ,

18 comments “Libreria para Arduino del modulo Ultrasonic Ranging HC-SR04”

Yo he adquirido este sensor hace poco, y probandolo, me doy cuenta que me falla mucho a distancias de menos de 5cm, puede ser por el sensor? lo conecto a los 5v de Arduino y aún así me fuincinoa bien..

Otro problema que tengo es que lo estoy intentando meter en un coche. Si no conecto los motores, el sensor mide bien, sin ninguna fluctuación de la señal, el problema es cuando conecto el motor, que las mediciones me fluctuan bastante y no me da la medición correcta, puede ser que las ruedas hacen mucho ruido?? e interfieren en la medición?¿

i love your blog, i have it in my rss reader and always like new things coming up from it.

Hola Santiago, siento haber tardado tanto en contestarte pero he estado fuera todo el mes de agosto y sin Internet!! =/

Yo lo estoy utilizando en un proyecto mio ( Mobility Shield 4WD ) y el único problema que me da es como tu as dicho en distancias muy cortas que no me detecta con mucha precisión, así que no se que puede ser, te recomiendo que preguntes en los foros en español de arduino donde seguro te pueden ayudar!

Un saludo!

Sólo quería escribirle unas líneas para decirle a su sitio realmente genial! He estado buscando esta solución durante mucho tiempo… thx

Disculpa de casualidad tendras el codigo para el sensor con puerto USB.agradezco el foro y la informacion, esperando tu cordial respuesta. Gracias!

Hola Zamora, a que sensor te refieres? ya que este no tiene puerto USB =|

hola, te cuento q tengo todos lo materiales para realizar el sensor, pero copio los codigos en mi programa de arduino y no me funciona, soy un poco nulo en placas arduino asi q agradeceria la ayuda, saludos

Hola Claudio, creo que te podremos ayudar mejor en el foro de Arduino en español, Un saludo!

Hola alguien a hecho la libreria para medir en mm.

Hola Fernando, tienes el ejemplo de “Timing” que es más preciso que los cm, tendré en cuenta tu sugerencia para la próxima actualización de la librería.

Efectivamente esos “fallos” son debidos al sensor, pues estás fuera de su rango de actuación. Todo sensor posé un rango de medidas, en el cual estas son buenas. En este caso se debe a la separación entre el generador de ondas ultrasónicas y el receptor, que generan un triángulo con el objeto. Al bajar la distancia del objeto de una distancia umbral las ondas ya no son capaces de llegar al receptor.
Por otro lado, en el caso de los motores, creo que estas a utilizar la misma fuente de alimentación para motores y sensores. Es recomendable separar la alimentación de alta potencia y de baja potencia, ya sea con fuentes independientes o con otro tipo de dispositivos o barreras como pueden ser los optoacoplador.

hay alguna libreria que permita medir mas de 1 metro??
he probado esta , y solo me permite 51cm… es lo maximo que mide…

Hola Lisergio, la librería viene “capada” a 3000 microsegundos para hacer medidas más rápidas, por que a partir de esa distancia ya empieza a cometer muchos errores este sensor, pero puedes poner la distancia máxima que necesites aquí te dice como: Sensor ultrasonico HC-SR04 medir más de 51 cm
Un saludo!

Perfecto!!!
Muchas gracias….
Necesitaba entre en 60 y 130 cm… ahora una maravilla!
asin si!!!

el sensor a distancias cortas falla por la zona de incertidumbre, todos los ultrazonicos tienen un rango al inicio de falla, esto se debe a que en esa zona se produce ruido y no son confiables los valores por la cercania, chocan las señales

Estimados, les comento que estoy intentando un proyecto con este sensor pero tengo el problema que no detecta nada mas alla de 1.2 mts aproximadamente. El proyecto lo estoy realizando con un PIC18F452 y el codigo de inicio y lectura es el siguiente:

void iniciar_sr04_h() //Funcion para enviar el pulso al trigger del ultrasonico
{
dist_h=0;

output_high(sr04_o_h);
delay_us(20); //retardo de 20 us mayor a los 10 us fijado por el fabricante
output_low(sr04_o_h);
}

void distancia_h()
{
//En esta funcion se leera el sensor de distancia horizontal
while(!input(sr04_i_h)); //Esperar a que en el PA3 entre un nivel alto (inicio de medicion)

while(input(sr04_i_h) && dist_h<420) //Esperar a que en el PA3 entre un nivel bajo o la distancia sea mayor a 4 mts (final de medicion)
{
//Comienza la medicion de la distancia. Se usa un ciclo while que incrementa cada 60us la variable dist_h mientras el pin
//de eco sea = 1. Los 58us es el tiempo aproximado que tarda en viajar el sonido 2cm osea 1cm ida y vuelta (VS=343m/s a 20°C)
dist_h++;
delay_us(58); //retardo de 58 us
}

delay_ms(50);
}

Cualquier comentario es bienvenido. muchas gracias

exelente blog me sirvio de mucho, todo bn!!


Leave a Reply