Introducción
En este tutorial explicaremos cómo utilizar un sensor ultrasónico HC-SR04 con Arduino para la medición de distancia y detección de obstáculos.
Quizá la característica más destacada del HC-SR04 es que puede ser adquirido por una baja suma de dinero y esto mismo lo ha hecho un sensor muy popular. Sin embargo, la baja cantidad de dinero que invertimos en el producto, no demerita demasiado en la exactitud del sensor ni en su facilidad de uso, por lo que su relación costo / beneficio es muy buena.
Existen una buena cantidad de proyectos que se pueden realizar con el sensor ultrasónico de distancia y Arduino, por lo que este tutorial te dará las bases para realizar tus propios proyectos dando rienda suelta a tu creatividad.
Materiales
Para realizar las prácticas con este sensor requerimos los siguientes materiales:
- Tarjeta Arduino Uno R3 (también funciona con otras tarjetas de la gama Arduino)
- Sensor de distancia ultrasónico HC-SR04
- Cables tipo dupont para interconexión
- Protoboard (opcional)
Nosotros utilizamos el protoboard, pero vale cualquier otra forma de montar y conectar los componentes. Incluso un simple juego de cables dupont funciona perfecto, con la ventaja de resultar mucho más compacto.
Conexión de sensor ultrasónico HC-SR04 con Arduino
La conexión del sensor con Arduino es muy sencilla. Podemos realizarla utilizando un protoboard, o directamente con alambres. Para lograr que el sensor funcione, son necesarias 4 señales:
- VCC – Alimentación de 5 volts
- GND – Tierra o común del circuito
- TRIG – Señal de disparo
- ECHO – Señal de eco
La siguiente imagen muestra como queda conectado el sensor utilizando solamente cables:

Cabe aclarar que nosotros hemos utilizado los pines 11 y 12, pero vale cualquier otra combinación de pines.
No hay mucho más que decir, ya que es bastante fácil de conectar, solamente tener cuidado con la polaridad y posición de las señales.
Programación de sensor ultrasónico HC-SR04 con Arduino
Librería de Arduino
La librería de Arduino que recomendamos para usarse con el sensor HC-SR04 se llama NewPing. Esta librería tiene una buena cantidad de características para sacarle el máximo provecho a nuestro sensor.
También recomendamos la librería GFUltrasonic que ha elaborado nuestro equipo de ingenieros y que provee una alternativa de muy bajo uso de recursos.
Código básico sin librería
El primer programa muestra el resultado de la medición de distancia efectuada por el sensor en el monitor serial de Arduino. Nos servirá para validar que el sensor y las conexiones funcionan correctamente y puede servir como punto de partida para programas más complejos.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | /** Geek Factory - "Dale vuelo a tus proyectos" Tienda de electrónica, Arduino, Raspberry Pi, IoT www.geekfactory.mx GEEK FACTORY INVIERTE TIEMPO Y RECURSOS EN DESARROLLAR ESTOS EJEMPLOS Y TUTORIALES. SI ENCUENTRAS ÚTIL ESTE CÓDIGO, CONSIDERA REALIZAR UNA COMPRA CON NOSOTROS. EJEMPLO SENSOR ULTRASÓNICO HC-SR04 1 Descripción: Realiza la medición de distancia con un sensor ultrasónico HC-SR04. El resultado se muestra en el monitor serial. Este ejemplo NO utiliza librerías especiales para el sensor, solamente se utiliza la función "pulseIn" incluida en el IDE de Arduino para medir la longitud del pulso de eco que devuelve el sensor ultrasónico. */ // declaración de variables para pines // aquí indicamos a donde se conectan las señales del sensor const int pinecho = 11; const int pintrigger = 12; // variables para calculos unsigned long tiempo, distancia; /** Función setup: se ejecuta una vez cuando encendemos el arduino */ void setup() { // preparar la comunicación serial Serial.begin(115200); // configurar los pines utilizados por el sensor pinMode(pinecho, INPUT); pinMode(pintrigger, OUTPUT); // mostrar mensaje inicial Serial.println(F("----------------------------------------------------")); Serial.println(F("EJEMPLO SENSOR ULTRASONICO CON ARDUINO SIN LIBRERIA ")); Serial.println(F(" https://www.geekfactory.mx ")); Serial.println(F("----------------------------------------------------")); } /** Función loop: se ejecuta continuamente mientras el arduino permanece encendido */ void loop() { // asegurarnos que el pin trigger se encuentra en estado bajo digitalWrite(pintrigger, LOW); delayMicroseconds(2); // comenzamos pulso alto, debe durar 10 uS // luego regresamos a estado bajo digitalWrite(pintrigger, HIGH); delayMicroseconds(10); digitalWrite(pintrigger, LOW); // medimos el tiempo en estado alto del pin "echo" // el tiempo en estado alto es proporcional a la distancia medida tiempo = pulseIn(pinecho, HIGH); // LA VELOCIDAD DEL SONIDO ES DE 340 M/S O 29 MICROSEGUNDOS POR CENTIMETRO // DIVIDIMOS EL TIEMPO DEL PULSO ENTRE 58, TIEMPO QUE TARDA RECORRER IDA Y // VUELTA UN CENTIMETRO LA ONDA SONORA distancia = tiempo / 58; // imprimir la distancia medida al monitor serial Serial.print(F("Distancia: ")); Serial.print(distancia); Serial.println(F(" cm")); // esperar un segundo antes de realizar otra medición delay(1000); } |
Código básico con librería NewPing
Al utilizar una librería para programar el sensor HC-SR04, podemos ahorrar algunos pasos y el código queda más compacto. Por ejemplo, el siguiente programa utiliza la librería NewPing la cual deberemos tener instalada en nuestro IDE.
Debido a que este programa realiza un promedio de las mediciones del sensor es probable que notemos que la operación del sensor mejora al utilizar este código.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | /** Geek Factory - "Dale vuelo a tus proyectos" Tienda de electrónica, Arduino, Raspberry Pi, IoT www.geekfactory.mx GEEK FACTORY INVIERTE TIEMPO Y RECURSOS EN DESARROLLAR ESTOS EJEMPLOS Y TUTORIALES. SI ENCUENTRAS ÚTIL ESTE CÓDIGO, CONSIDERA REALIZAR UNA COMPRA CON NOSOTROS. EJEMPLO SENSOR ULTRASÓNICO HC-SR04 2 Descripción: Realiza la medición de distancia con un sensor ultrasónico HC-SR04. El resultado se muestra en el monitor serial. Este ejemplo utiliza la libería NewPing, que deberá estar instalada en nuestro IDE para que se pueda compilar de formma satisfactoria. */ // incluir la librería en nuestro programa #include <NewPing.h> // declaración de variables para pines // aquí indicamos a donde se conectan las señales del sensor const int pinecho = 11; const int pintrigger = 12; // variables para calculos unsigned long tiempo, distancia; // declaramos un objeto de la clase NewPing llamado sonar // debemos indicarle los pines que se utilizaran para las señales NewPing sonar(pintrigger, pinecho); /** Función setup: se ejecuta una vez cuando encendemos el arduino */ void setup() { // preparar la comunicación serial Serial.begin(115200); // mostrar mensaje inicial Serial.println(F("----------------------------------------------------")); Serial.println(F(" EJEMPLO SENSOR ULTRASONICO CON LIBRERIA NEWPING ")); Serial.println(F(" https://www.geekfactory.mx ")); Serial.println(F("----------------------------------------------------")); } /** Función loop: se ejecuta continuamente mientras el arduino permanece encendido */ void loop() { // medir el tiempo que tarda en viajar el sonido y almacenarlo en una variable // esta medición se realiza con la librería NewPing a través del objeto sonar tiempo = sonar.ping_median(); // calcular la distancia utilizando la constante proporcionada en la librería distancia = tiempo / US_ROUNDTRIP_CM; // imprimir la distancia medida al monitor serial Serial.print(F("Distancia: ")); Serial.print(distancia); Serial.println(F(" cm")); // esperar un segundo antes de realizar otra medición delay(1000); } |
Enlaces y lecturas recomendadas
- Pagina de producto sensor ultrasónico HC-SR04
- Tutorial externo para este sensor
- Tutorial externo en inglés
- Repositorio de la librería NewPing
- Repositorio de nuestra librería GFUltrasonic
Conclusión
En este tutorial aprendimos a conectar el sensor HC-SR04 con una tarjeta Arduino Uno y realizamos la medición de distancia partiendo de una programación básica.
Realizamos la programación de un sensor ultrasónico utilizando las funciones nativas de Arduino y luego aprendimos que se puede utilizar la librería NewPing para obtener mediciones más precisas y sacar el mayor provecho al sensor.
Realizamos código que permite efectuar alguna acción cuando se detecta una medición por debajo o por arriba de cierto umbral, lo que nos permitirá realizar otras acciones en programas posteriores, como por ejemplo cambiar el rumbo de un robot para evitar una colisión.
Revisamos las características de un sensor HC-SR04 y su funcionamiento, pero para una descripción más detallada del mismo recomendamos visitar la página del producto en nuestra tienda.











Hola, me podrías ayudar, estoy armando un sensor de aparcamiento, pero ya he buscado muchas maneras de conectar mi sensor ultrasónico, y a mi manera de ver parece estar bien conectado, pero simplemente no funciona, el buzzer y los leds si funcionan pero el sensor es el que no emite ninguna señal, lo cual creo que interfiere con la lógica de mi código
Hola, me gusto mucho como insertaste el Código de Arduino, con colores, números y la barra de copiado aquí en tu web. Como lo lograste, me gustaría hacer lo mismo en mi blog.
se puede clasificar objetos con ultrasonido como ser arandelas y tornillos haciendo prender un led de color cuando detecta una arandela y otro led cuando es tornillo
como se hace?
No, un sensor ultrasónico carece de la precisión necesaria para tal requerimiento, para ello podrías recurrir a los sensores ópticos, los cuales mediante emisiones de luz infrarroja podrían ser interpretados para detectar los objetos.
Hola, podrias decirme que es un Sensor ultrasonico Hc-sr04 configuracion
amiga, ahí arriba está la info…. lee bien
El código sin librería tiene mal definidos los pines, usó 8 y 9 en lugar de 11 y 12
La configuración de los pines no debería interferir con el funcionamiento
puedo usar este tipo de sensor en un robot seguidor de luz y si es asi como haria para conectar ambas partes?
pdta: el robot es sin integrado
como puedo medir la velocidad de un carro con el sensor ultrasónico? alguien me puede decir
No se me ocurre ninguna manera de medir velocidad con ese sensor, estoy muy seguro de que no obtendrías ninguna lectura coherente y con que modelo matemático lo harías? te recomiendo que busques otro tipo de sensor. saludos!
Velocidad = (Distancia final-Distancia inicial)/(Tiempo final-Tiempo inicial).
Esa sería la velocidad promedio, creo que él se refiere a la velocidad instantánea.
creo que puedes usar un sensor atrás y otro adelante
Hola, podrías decirme cuál es el modelo matemático para saber el tiempo que tarda el sensor para detectar el objeto.
Tiempo= 2 * (Dist:Velocidad)
Distancia= (Velocidad*Tiempo) : 2
Buenísimo tu comment
necesito un código para saber si una caja esta en una posición debajo del sensor en una cinta transportadora pero como seria para que no lea la cinta cuando no este la caja?
Conociendo la distancia a la cinta, cuando sea menor a esa distancia es porque hay una caja. Debes tener en cuenta un margen porque a veces varía midiendo a la misma distancia.
necesito codigo para hacer mover dos motores cc con sensor ultrasonico y l293d gracias por su atencion buenos dias
disculpa ocupo un programa que utiliza el puente h l293d y el sensor ultrasonico.
NO ME SIRVIO ESTE TUTORIAL DEBERIAN DE ADJUNTAR LA LIBRERIA CORRECTA
¿Cual es el error que te marca?
Viene el ejemplo sin librería. Hay que aprender a leer para que un libro te pueda “servir”.
cuantos sensores puedes conectar a la placa?
no lo se rick
Puedes conectar los que soporte tu arduino, depende de las DIGITALES que tenga. En mi caso ocupe un NANO para conectar 4 sensores, 1 controlador de RELE y un sensor PIR y me sobro 1 digital
Puedes conectar tantos como digitales tengas, en mi caso en un NANO conecte 4 ultrasonicos, un PIR y una controladora de relees
Hola, soy principiante en esto de la programacion me prodrias ayuda a ver como le puedo poner al sensor un vibrador para la hora que detecte un obstaculo mande la alerta con el vibrador
Bueno al sensor no le puedes agregar un vibrador. Al MCU si se le puede agregar, solo reemplaza el LED indicador por el vibrador.
Para detectar las Horas requieres un reloj de tiempo real, o el reloj interno del mcu, ten en cuenta que 1 hora = (60*60*1000*1000) uSegs
Hola, estoy haciendo un proyecto y tengo que hacer un puente que se levante cuando el barco se aproxime, sabes como seria el código para que el puente detecte el barco y así se pueda levantar el puente?
Claro, nada más fácil, hasta las cajas de cereal traen esa receta.
Hola, estoy haciendo un proyecto y tengo que hacer un puente que se levante cuando detecte al barco si se apro
solo me marca 0cm
guevon
Hola podrias ayudarme quiero hacer un vibrometro con el sensor ultrasonica para qe con el arduino pueda ver como osila osea quisiera ver sus ondaas mediante un objeto se vaya acercando
se puede aplicar para un sensor de mayor potencia QT50ULBQ6 pongo el numero de serie me gustaría de su ayuda para este proyecto estoy usando fuente de 25 volts para ese sensor.
Hola.
Al parecer el sensor que mencionas tiene una salida con un loop de corriente y voltaje de 0 a 10 volts. Si se puede leer directamente con el convertidor AD del arduino (requieres divisor resistivo) o bien, a través de un módulo convertidor de corriente a voltaje.
Saludos.
me da error de compilacion, exit status 1
Hola.
Si ya nos avisaron de un error, lo corregiremos cuanto antes :D
Saludos.
tenés que borrar la primera línea donde está el asterisco
Hola buenas tardes, se puede programar ese mismo para contar cuantas interrupciones tiene cada 10 segundos. El límite de interrupciones es de 10.
Se puede programar cualquier cosa. Tu creatividad es el limite.
hola necesito ayuda con el ultrsonico como le agregaria un servo , quiero que este en estado base 0 grados y cuando detecte algo este se mueva a 90 ,despues de unos cuantos segundos regrese a 0
buen tutorial solo es es cambiar la linea 40 y si quieren mas sensibilidad cambien el tipo de variable de int a float linea 19
lo conecto al arduino en el de %v y se apaga el la placa
Tengo los tres sensores conectados a un carrito (aún sin conectar) ya tengo ocupada mi salida de 5 volts de arduino para alimentar la parte lógica de un Puente H(L298N). La salida de 3.3 v la ocupa un módulo bluetooth. Mi duda sería acerca de cómo podría conectar estos 3 sensores ultrasónicos a mi arduino, supongo que puenteando la misma salida de 5v, pero si es así ¿cuanto voltaje necesitaría de entrada a mi arduino ya que actualmente la alimento con una pila de 9v
Ahi que conectarlo en el puerto que dice VIN(Al lado derecho de GND)
viva españa
El voltaje no cambia. Como sabes si la salida de 5v esta ocupada? no veo que menciones la corriente que ocupan los dispositivos que ya conectaste, por ello es imposible saber si esta dentro de las capacidades de potencia en tu Arduino.
ya hice todo y nada
me marca o cm
que hago?
yo acabo de probar el segundo programa y funciono perfecto solo modifique la linea 40 a la cual donde dice ECHO, le puse pinecho.
esta funcionando ok
en la programacion dice sonar was not in this cope
Estudiar
Hola, Ruben, tengo una duda. En el segundo programa que muestras, la velocidad del sonido en el aire es aproximadamente 340 m/s lo cual sería equivalente a 34 cm/us, no entiendo porque en la línea 42 del segundo programa comentas que la velocidad es 29 us/cm y además lo divides entre 58. Según lo que entiendo el tiempo que obtenemos de la función pulseIn(), deberíamos multiplicarlo por la velocidad del sonido (en el aire) y dividirlo entre 2 (Ya que la onda viaja el mismo espacio 2 veces), quedando algo así:
distancia=tiempo*34/2
Obteniendo de este modo la distancia en cm.
Bastaba con preguntar, pues desarrollas tu solución partiendo de datos incorrectos. La conversión de unidades de medida va así:
340 mts/seg
entre 1000 = 34cmt/mSec
entre 1000 = 0.034cmt/uSec ó 34mm/uSec
Hasta ahí vemos con seguridad que en microsegundos la velocidad es 0.034 mm por microsegundo.
Me PARECE que el factor 29.nn tiene que ver con la unidad de medida del valor devuelto por el detector:
1000 / 34 = 29.41
Por ello: ValorDectado * 29 = ValorDetectadoEnCentimetros
Podría investigar todo acerca del factor 29, tal vez el fin de semana que hago servicio a la comunidad discapacitada laboralmente. Aunque si lo necesito saber antes, pues lo estudio y ya.
“Hasta ahí vemos con seguridad que en microsegundos la velocidad es 0.034 mm por microsegundo.”
Aquí me equivoqué, la cantidad correcta esta en el párrafo anterior
Hola,
Se produce el siguiente error con el código del sensor sin necesidad de librería:
‘ECHO’ was not declared in this scope
tiempo = pulseIn(ECHO, HIGH);
¿Puedes ayudarme?.
en vez de ECHO es pinecho
El código que utiliza la librería ya imprime la distancia?, porque no encuentro ninguna variable para ello, ni la division /58
Gracias a quien pueda responder
En la línea 23, supongo que esa constante US_ROUNDTRIP_CM si la imprimieras te mostraría ese valor de 58 que mencionas
Buenas este sensor quisiera manejar con pic18f4550 pero la verdad me equivoco enseguir la pared yo quiero que siga a la pared y no se como
Echale ganas!
se puede usar el sonar hc-sr04 con un esp32?
SI
Tengo una duda, soy princiupiante en este tema, pero en la programación habrá que este sensor transmita la información en al celular y del celular se tramita la información en lenguaje humano?
tendras que conectar el arduino (donde se conecta o con quien habla el sensor) a una plataforma Iot (Middleware), usando Wi-Fi o SIGFOX.
La Pltaforma tiene dos REST API, una para hablar con Arduino y los sensores (comonentes HW) y otra que habla o se comunica con el celular ó con un plataforma de BI o con un repositorio de datos o con una aplicación. Incluso puedes configurar para que que envie un SMS o un email con los datos recibidos del HW
Espero haber ayudado
Si deseo que encienda un led cuando la distancia sea menor de 10 cm, ¿como podira modificar el codigo?
Hola.
Tendrias que poner una condicion if(distancia <10) digitalWrite(13, HIGH); else digitalWrite(13, LOW);
te consulto, como hago si quiero que se encienda un led despues que la medicion se mantuvo en 1 m durante 50 segundos? gracias por tu tiempo
Hola.
Te aconsejo que revises los siguientes temas> flags, maquinas de estados, funcion mills en arduino. No es tán dificil de implementar lo que requieres.
Saludos.
hola, si quieres asegurarte de que el evento se mantuvo durante un segundo puedes usar un for loop y decirle que vaya sumando mientras la variable se mantenga en el valor que tu le des ejemplo
for(dist < 20: dist <=20: i++) //cuando la distancia sea menor a 20, mientras se mantenga menor a 20, suma 1
{
delay(1000); // esta espera hara que cada suma sea de 1 segundo cuando i=60 tendras tu minuto.
}
for(dist <20: dist <20: i++) //cuando la distancia sea menor a 20, mientras sea menor a 20, suma 1
{
delay(1000); //cada suma sera 1 segundo
int tiempo = i; //almacenas el tiempo en una variable
}
Hola, podrias decirme como hacerlo funcionar en Labview? Ya lo intente de varias formas y no funciona. Descargue la libreria linux, markhub etc y nada.. :(
Hola desafortunadamente no tengo experiencia con el tema. Ojala alguien te pudiera orientar o si sabes de algo lo pudieras compartir. Un saludos.
hola es que tengo un problema hago la programación de un sensor y me funciona pero necesito poner 4 y cuando los declaro no me funciona que debo hacer
gracias.
¿Podrías poner el código?
buen dia como hacer para que dos o mas sensores trabajen al tiempo
Hola.
Puedes crear varias instamcias de la clase NewPing:
NewPing sonar1(8, 9 MAX_DISTANCE);
NewPing sonar2(10, 11, MAX_DISTANCE);
Despues accedes a los métodos para obtener la distancia:
sonar1.ping_median();
sonar2.ping_median();
También hay un ejemplo en la librería de NewPing para varios sensores que puedes revisar en el menú de Archivo=>Ejemplos.
Espero que te sirva, saludos.
Hola, tengo una duda, estos sensores, dan vibracion en cuanto a la distancia del objeto? o debo unirlo aun motor de vibracion?
Hola debes unirlo a la electronica de procesamiento y control de motor, por si solos no funcionan como quieres.
Por favor!
Hola… Como se hace para conectar 3 leds pero con 3 foto resistencias y que cada uno interactúe con una?…
Me podrían ayudar con el sketch?
Hola, me parece que te equivocaste de entrada, de cualquier forma te comento que para hacer eso puedes utilizar el mismo codigo como base pero cambiando el numero de pin analógico y el numero de pin digital. Es relativamente sencillo.
Y como sería la conexión de 3 leds a 3 foto resistencias… Y que cada uno interactúe con su foto resistencia? Como debo hacer las conexiones
Seria una fotoresistencia por pin analogico. A0, A1, A2, etc.
Gracias. Lo intentaré.
amigo buenos noches, que puedo hacer para que mi sensor lea los valores con decimales
Puedes probar a hacer el programa utilizando variables de tipo float o aplicando casting y promoción de tipos de datos segun sea el caso de tu programa.
Obviamente no puedes, de otra forma no harías la pregunta.
Por otro lado, tu sensor nunca va a leer decimales, el sensor “leera” una señal analógica y me parece generará un pulso proporcional a la distancia. Este tutorial te dice como llegar hasta ahi, e incluso te dice como obtener un número entero equivalente a la lectura.
Solo tienes que convertir el entero en float antes de aplicarle los factores.
se pueden conectar varios triggers en un pin
Si se puede.
se pueden usar en cualquiera de los pines de arduino, es decir el echo ha de estar en un pwm o no importa ?
Se puede usar cualquier pin e incluso varios sensores al mismo tiempo.
porque hay que dividir entre 58? Gracias y un saludo!
la velocidad del sonido es 340 m/s aproximadamente, lo cual es 0,034 cm/ms (cm por milisegundo), como estamos midiendo el tiempo que tarda el sonido en ir y volver habría que dividirlo entre 2 lo cual nos daría 0,017 si multiplicas esto por el tiempo medido te da la distancia (multiplicar por 0,017 es lo mismo que dividir entre 58)
Hola.
Muchas gracias por aclararlo!
Saludos.
Muchas gracias por aclararlo. Saludos.
hola se puede usar para detectar baches y pequeños pozos, saludos
Si podrías, si la profundidad de estos es claramente mayor al margen de error del sensor.
Hola, si el sensor tiene sig y nc en vez de trigg y echo, cual equivale a cual?
En este caso las señales de echo y trigger comparten el mismo pin, seguramente si proporcionas el modelo del sensor te puedo confirmar. En esta página encuentras más información para conectarte con este tipo de sensores.
https://bitbucket.org/teckel12/arduino-new-ping/wiki/Home
Hola, necesito hacer este circuito pero hacerlo en una baquelita no en protoboad.
Ayuda!!
Hola, tuve un problema y es que cuando cargo el programa solo me devuelve la distancia de 0cm…Probre con un programa propio y el codigo de ejemplo que hay aqui. Ayuda!
Hola has probado que los pines de echo y trig no vayan invertidos en sus conexiones? esto puede pasar si inviertes los pines.
me gusto
MUCHAS GRACIAS.
Te agradeceríamos si nos das un like en Facebook o tu red social favorita.
Saludos.