Libreria para Arduino del modulo Ultrasonic Ranging HC-SR04

72 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: , , , , , , , , , , ,

72 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!!

oye una preguntota!!!
cuando compilo el programa me marca un error, y me dice que “ranging” no existe en mi libreria, tmbien hace lo mismo con el comando “timing”, como puedo solucionar este problema??
ayuda por favor!!

hola soy nuevo en esto pero estoy trabajando en un robot zumo y me gustaría implementar 3 HC-sr04 pero tengo bastantes dudas como hago para que el sensor solo me lea en una rango de 2 cm a 100cm yo se que lo máximo es de 450 cm.

Descarga la ultima versión de la librería y mira que este copiada en la carpeta “…\libraries\Ultrasonic\Ultrasonic.h” y el resto de archivos.

Puedes editar la distancia maxima del sensor, sustituye esta linea:

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

Por esta:

Ultrasonic ultrasonic(9,8,3000); // (Trig PIN,Echo PIN, Max.TimeOut in µsec )

Luego sustituye los 3000 microsegundos con el tiempo máximo de timeout que tu necesites. La formula para calcularlo es: centímetros * 58 = Max.TimeOut

Un saludo ;)

Hola que tal disculpa, en que pines de la placa conectas el el Trig y el Echo del Sensor?

Saludos

Los defines en esta línea de código:

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

El primer numero seria el Trig y el segundo el Echo.

Hola tengo una duda !! :/ la cosa es que quiero prender tres leds verde, amarillo y rojo cada uno se va a prender conforme se va acercando un objeto, bueno la cosa es que declare una variable, int val = ultrasonic.Ranging(CM); , y pues esta la puse en unos if para verificar se se cumplen y tambien deje lo del serial para que imprimiera la distancia… las luces si prender pues bueno yo supongo que si sirven porque el encendido cumplia con la logica la cosa es que en el serial monitor solo imprimia o 0 m o 51 m -.- !! luego quito lo de los if y el int val, y vuelve a imprimir el serial monitor de forma normal ! nose si me puedas ayudar con esta duda, creo que no deberia de usar el int val = ultrasonic.Ranging(CM); pero entonces como almaceno el valor de la distancia :/?? Gracias

hola, se pueden enviar estos datos a matlab? si es asi , ¿como lo harias para que este ultimo obtenga los datos de manera instantanea? saludos

Amigo hay alguna libreria para medir en mm?? Con el ultrasonico

Esta librería tiene el ejemplo de “Timing”, es un ejemplo básico de como obtener el tiempo (en ms) que tarda el sonido en ir y volver. Utilizando el tiempo y una pequeña formula obtendrás la distancia en mm.

  long medida_en_mm; 
  medida_en_mm = (((ultrasonic.Timing()*10)/29)/2);

hola buenas tardes quisiera saber como seria la librería en decimetros y soy nuevo en esto de Arduino ademas que solo tengo 13 años lo cumpli hace una semana pero mi padre es ingeniero y sabe mucho de estas cosas quiero que entienda que no conosco mucho del tema quisiera que me pudiera decir cuales son las bases y demas librerias por que es que apenas entiendo alguna cosas voy en 1ro de secundaria y pues me interesa mucho el tema pero no se que apartados podria ver de la web de arduino en español quisiera que me recomendaria algunas cosas y que asi por lo menos sepa de que me estan hablando en clase gracias

buenos aportes, necesito un código para este mismo sensor que mida de un metro y 50cm y que al detectar la proximida vibre un motor

¿cual es la distancia maxima de medicion?, Es que cuando no detecta un objeto me marca 51cm

Siento el retraso en contestarles pero he estado un tiempo bastante liado.

@Trey: Te recomiendo buscar tutoriales o libros de cómo empezar con Arduino.

@saul lopez & jeronimo: En este comentario explico cómo modificar la medida máxima de mi librería, ya que esta capada a 51 cm para que procese más rápido el programa, también a partir de 51 cm no mide igual de bien.

Hola buena tarde a todos si fueran tan amables de indicarme como poder leer distancias de 15 mts con algún sensor?

muchas gracias de antemano
saludos

Se puede utilizar este sensor para medir distancias dentro de un tubo PVC de 1.5 pulgadas de diámetro

que tipo de display utilizas ?

It’ll also save a lot of cash and time for those on a restricted budget who efbbgkdgcgce

me marca error en ranging D; nose por que podrias ayudarme

como puedo conectar el motor shiel en el arduino

necesito la libreria para el sensor utrasonico

hola, quisiera hacer un consulta, primero debo realizar un proyecto y necesito utilizar el sensor ultrasonico junto con 2 servo motores, tienes alguna idea de como podria hacerlo?

Hola, quiero hacer funcionar un micro servo con SR04, y no encuentro un código que funcione.
Si me pueden pasar uno se los agradezco.

buena noche ‘class Ultrasonic’ has no member named ‘Ranging’ tengo este error como lo soluciono

oye tengo un comentario..
estoy poniendo los codigos de prueba en la Aplicacion Arduino UNO y no se pueden realizar y algunos estan incorrectos….

Se que tengo 11 años pero es un experimento para entrar en el Campus Party Ecuatoriano

Hola tengo un problema , si me reconoce la libreria ya que se pone de color anaranjado pero el ranging y el timing no lo hacen es decir cuando escribo

Serial.print(ultraleft.Ranging(CM)); // CM or INC
el Ranging no cambia de color y una vez que lo compilo me marca error en esta parte que puedo hacer tengo arduin 1.0.6 ya lo cambir al 1.0.5 y sigue igual

Que tal
Alguien sabe o ha experimentado, poner un objeto transparente en frente del sensor y verificar si funciona igual? algo asi como cristal o plastico transparente

saludos

Podrían decirme como se conectan las partes en la protoboard..algun dibujo.. gracias!!

woow!! Muchisimas gracias!!!

Gracias.

grasias

will

quisiera saber como obtener la variable que calcula la medida para utilizarla en otras funciones

help con mi progracion quiero programar varios sensores ultrasonido para q cumplan distintos comandos pero no funciona
#include
Servo servo1;
#include
int disparo=7;
int eco=6;
int disparo1=5;
int eco1=4;
int disparo2=3;
int eco2=2;
int disparo3=1;
int eco3=0;

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

servo1.attach(9);
pinMode(8,OUTPUT);
pinMode(9,OUTPUT);
pinMode(10,OUTPUT);
pinMode(11,OUTPUT);
}
void adelante(){
digitalWrite(8,HIGH);
digitalWrite(9,LOW);
digitalWrite(10,HIGH);
digitalWrite(11,LOW);
}

void atras(){
digitalWrite(8,LOW);
digitalWrite(9,HIGH);
digitalWrite(10,LOW);
digitalWrite(11,HIGH);
}

void derecha(){
digitalWrite(8,HIGH);
digitalWrite(9,LOW);
digitalWrite(10,LOW);
digitalWrite(11,HIGH);
}

void izquierda(){
digitalWrite(8,LOW);
digitalWrite(9,HIGH);
digitalWrite(10,HIGH);
digitalWrite(11,LOW);
}

void detener(){
digitalWrite(8,LOW);
digitalWrite(9,LOW);
digitalWrite(10,LOW);
digitalWrite(11,LOW);
}

void loop() {
long duracion, cm;

if(160>cm && cm>7){
pinMode(disparo,OUTPUT);
digitalWrite(disparo,LOW);
delayMicroseconds(2);
digitalWrite(disparo,HIGH);
delayMicroseconds(5);
digitalWrite(disparo,LOW);

pinMode(eco,INPUT);
duracion = pulseIn(eco,HIGH);
cm = microsecondsToCentimeters(duracion);
void adelante();

}
if(7>cm && cm>0){
pinMode(disparo,OUTPUT);
digitalWrite(disparo,LOW);
delayMicroseconds(2);
digitalWrite(disparo,HIGH);
delayMicroseconds(5);
digitalWrite(disparo,LOW);

pinMode(eco,INPUT);
duracion = pulseIn(eco,HIGH);
cm = microsecondsToCentimeters(duracion);
void adelante();
servo1.write(180);
}
if(160>cm && cm>0){

pinMode(disparo1,OUTPUT);
digitalWrite(disparo1,LOW);
delayMicroseconds(2);
digitalWrite(disparo1,HIGH);
delayMicroseconds(5);
digitalWrite(disparo1,LOW);

pinMode(eco1,INPUT);
duracion = pulseIn(eco1,HIGH);
cm = microsecondsToCentimeters(duracion);
void izquierda();
delay(6000);

}
if(160>cm && cm>0){

pinMode(disparo2,OUTPUT);
digitalWrite(disparo2,LOW);
delayMicroseconds(2);
digitalWrite(disparo2,HIGH);
delayMicroseconds(5);
digitalWrite(disparo2,LOW);

pinMode(eco2,INPUT);
duracion = pulseIn(eco2,HIGH);
long duracion, cm;
cm = microsecondsToCentimeters(duracion);
void derecha();
delay(6000);

}
if(160>cm && cm>0){

pinMode(disparo3,OUTPUT);
digitalWrite(disparo,LOW);
delayMicroseconds(2);
digitalWrite(disparo3,HIGH);
delayMicroseconds(5);
digitalWrite(disparo3,LOW);

pinMode(eco3,INPUT);
duracion = pulseIn(eco3,HIGH);
cm = microsecondsToCentimeters(duracion);
void derecha();
delay(6000);

}
int sensor1 = analogRead (A0);
int sensor2 = analogRead (A1);

if(sensor1>800){
void detener();
void adelante();
delay(4000);

}

if(sensor2>800){
void detener();
void atras();
delay(4000);

}
}
long microsecondsToCentimeters(long microseconds){
return microseconds / 29 / 2;
}

hola, me podrian ayudar por favor.. como cargo el archivo al proteus o al arduino para que funcione. ya que corro el programa con el #include y me sale este error…Can’t copy Arduino library Ultrasonic
make[1]: *** No rule to make target `Ultrasonic.l’, needed by `libraries’. Stop.
make: *** [main.cpp] Error 2.. Gracias

Hola ARDUINOS!

Soy un aprendiz de arduino, estoy tratando de hacer correr un lector de RFID, Solo necesito dos librerias para trabajar. Me figura en el software marcada con color naranja el SPI.h , pero el RFID.h no esta con naranja, como podría integrar la libreria? Espero entiendan mi pregunta.

Saludos!

No sirve para lecturas rápidas no recomendado para nada….

hola estoy haciendolo con un gsm shield m95 pero a la hora de leerlo con el envio de texto lo lee como 0 no se que puedo hacer

Hola, hasta cuantos sensores de ultrasonido hc sr04 soporta el arduino UNO y sobre cuales.

hi santiago
thanks for the library. i get the error message when compiling though. basically, it cant find the library, but i placed it into my library file in arduino directory. here is what it says:

Arduino: 1.6.4 (Mac OS X), Board: “Arduino Nano, ATmega328″

Build options changed, rebuilding all

/Users/mizu/Library/Arduino15/packages/arduino/tools/avr-gcc/4.9.2-atmel3.5.3-arduino2/bin/avr-g++ -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -MMD -flto -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10604 -DARDUINO_AVR_NANO -DARDUINO_ARCH_AVR -I/Users/mizu/Library/Arduino15/packages/arduino/hardware/avr/1.6.17/cores/arduino -I/Users/mizu/Library/Arduino15/packages/arduino/hardware/avr/1.6.17/variants/eightanaloginputs /var/folders/xm/cj_yyy3x43xcp2gd49r60n2h0000gp/T/build3388150986468540770.tmp/PlugAndPlay.cpp -o /var/folders/xm/cj_yyy3x43xcp2gd49r60n2h0000gp/T/build3388150986468540770.tmp/PlugAndPlay.cpp.o
PlugAndPlay.ino:7:24: fatal error: Ultrasonic.h: No such file or directory
compilation terminated.
Error compiling.

——-
any ideas?
thanks a lot

disculpa yo tengo problema con esta parte de el programa ya que no me permite o no me reonoce el “Ranging”

serial.print(ultrasonic.Ranging(CM));

Buenas noches.

Necesito ayuda con un proyecto de robot sumo. Estoy usando el arduino mega 2560 para tomar medidas con 4 sensores HC-SR04, entonces con la librería ultrasonic puedo ir tomando las distancias con los 4 sensores al tiempo, pero necesito que mi algoritmo tenga 4 condicionales en los cuales dependiendo de cual sensor detecte algo al frente los motores que mueven mi robot hagan cierta acción y esto no me lo permite.

Estoy tratando de poner 4 if en los cuales si la distancia que mide x sensor es menor a tanto, mi robot se dirija en esa dirección.

Alguien que me ayude a resolver este problema porfavor, de antemano gracias por su atención.

Realmente necesito esa librería. gracias

gracias desdeya

preciso muito desta biblioteca ultrasonic ranging

estoy por verificarlo

hola amigo, e copiado el programa que tienes de ejemplo par aprobar la libreria pero al momento de copilarlo me sale un error que me dice que la libreria Ultrasonic no contiene Rangin. Me puedes ayudar?. por cierto, Rangin me aparese en letras negras no anaranjadas

yo tengo el mismo problema ayuda por favor

tengo un problema con el programa que subiste, la parabra RANGING no cambia de color y aparece un error

The items you accumulate may be used to get awards along with the money
you produce.

GRACIAS POR EL APOYO

Game online FREE


Leave a Reply