Está en la página 1de 1

!

Select Page

Sensor ultrasónico
HC-SR04 y Arduino
by Admin | May 16, 2014 | Tutoriales Arduino
| 56 comments

En este tutorial explicaremos como utilizar un


sensor ultrasónico HC-SR04 y arduino para
la medición de distancia. Ya hemos
explicado con anterioridad como se realiza la
instalación de una librería para poder
controlar algún periférico con nuestro
arduino, en esta ocasión utilizaremos lo
aprendido en aquel tutorial para ayudarnos a
poner en funcionamiento un
sensor ultrasónico HC-SR04.

El sensor HC-SR04 es un módulo que


incorpora un par de transductores de
ultrasonido que se utilizan de manera
conjunta para determinar la distancia del
sensor con un objeto colocado enfrente de
este. 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 muy popular. Afortunadamente el
módulo HC-SR04 es bastante fácil de utilizar
a pesar de su bajo precio y no demanda grán
cantidad de trabajo ponerlo a funcionar,
mucho menos si utilizamos una librería para
sensores ultrasónicos.

Como todas las cosas en el mundo de la


programación, poner en marcha este sensor
es una meta a la cual se puede llegar de mil
maneras distintas. En este artículo te
enseñaremos a hacerlo funcionar de la forma
que consideramos más rápida y sencilla:
Utilizando una librería ya hecha para este fin
que esta accesible en internet.

En la foto de portada observamos el


sensor ultrasónico HC-SR04 y Arduino UNO
con los que hemos montado el circuito de
prueba.

Conceptos Básicos.
Primeramente debemos armar el circuito de
prueba para el sensor, el cual consiste
únicamente en proveer alimentación al
módulo y asignarle 2 pines de interfaz con el
Arduino (echo y trigger). Este tipo de módulos
para medición de distancia por
ultrasonidos se divide en 2 grandes grupos:
Interfaz mediante pulso de eco e interfaz
serial (I2C o UART). El HC-SR04 cae dentro
del primer grupo, por lo que explicaremos su
funcionamiento brevemente en las siguientes
lineas.

La interfaz digital se logra mediante 2


pines digitales: el pin de trigger (disparo) y
echo (eco).

El primero recibe un pulso de habilitación


de parte del microcontrolador, mediante el
cual se le indica al módulo que comience a
realizar la medición de distancia.
A través de un segundo pin (echo) el sensor
“muestra” al microcontrolador un puso
cuyo ancho es proporcional al tiempo que
tarda el sonido en viajar del transductor al
obstaculo y luego de vuelta al módulo.

Mediante una sencilla formula puede


estimarse entonces la distancia entre el
sensor y el obstáculo si se conoce el tiempo
de viaje del sonido así como la velocidad de
propagación de la onda sonora. La siguiente
imagen muestra los pulsos recibidos y
enviados por el sensor, de acuerdo a la hoja
de datos elaborada por Itead Studio.

Como se puede observar, el HC-SR04 genera


un pulso en el pin marcado como “echo”
cuya duración es proporcional a la distancia
medida por el sensor. Para obtener la
distancia en centímetros, solamente
debemos dividir el tiempo en microsegundos
entre 58 o para obtener la distancia.

Materiales Necesarios.
Tarjeta Arduino UNO R3
Módulo sensor ultrasónico HC-SR04
Cables tipo dupont para conexiones
Protoboard (opcional)

En la foto del artículo vemos los materiales


que hemos utilizado y que tenemos
disponibles en nuestra tienda virtual.
Nosotros utilizamos nuestro 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.

Diagrama de conexiones para el HC-


SR04 y arduino
El siguiente circuito es el mínimo necesario
para hacer funcionar el sensor
ultrasonido HC-SR04 y Arduino. Podemos
utilizar cables Dupont o bien utilizar un
protoboard y alambres.

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.

El sketch para sensor ultrasónico HC-


SR04 y Arduino.
El primer paso es descargar e instalar la
librería newPing desde el playground de
Arduino. El proceso de instalación de una
librería ya lo hemos cubierto en un tutorial
anterior y no lo expondremos
nuevamente en esta entrada. El enlace de
descarga de la librería y su documentación se
encuentran en esta web:

http://playground.arduino.cc/Code/NewPin
g

Ya que tengamos la librería NewPing


instalada, copiamos el siguiente código para
probar su funcionamiento. Hay que recordar
que si cambiamos los pines de conexión
con el sensor, es necesario retocar las
primeras lineas para que las señales
puedan llegar a los pines
correspondientes.

Los pines de conexión deben coincidir


perfectamente para que el sensor HC-SR04 y
Arduino puedan funcionar en conjunto, de lo
contrario, podemos causar daños y
sobrecalentamiento a cualquiera de las dos
placas: Arduino o sensor.

Arduino
1 #include <NewPing.h>
2
3 /*Aqui se configuran los pines donde debemo
4 #define TRIGGER_PIN 12
5 #define ECHO_PIN 11
6 #define MAX_DISTANCE 200
7
8 /*Crear el objeto de la clase NewPing*/
9 NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DI
10
11 void setup() {
12 Serial.begin(9600);
13 }
14
15 void loop() {
16 // Esperar 1 segundo entre mediciones
17 delay(1000);
18 // Obtener medicion de tiempo de viaje de
19 int uS = sonar.ping_median();
20 // Imprimir la distancia medida a la cons
21 Serial.print("Distancia: ");
22 // Calcular la distancia con base en una
23 Serial.print(uS / US_ROUNDTRIP_CM);
24 Serial.println("cm");
25 }

El código realizado con la librería NewPing


queda bastante sencillo y además de aceptar
el sensor ultrasónico HC-SR04 permite
utilizar la gran mayoría de los sensores que
utilizan interfaz del tipo Interfaz “con
pulsos” con 3 y 4 pines.

Programación para usar el HC-SR04 sin


librería
Puede resultarnos util, al menos para
satisfacer la curiosidad, poner a funcionar el
sensor HC-SR04 sin la necesidad de usar una
librería. El programa que mostramos a
continuación permite hacer justamente eso:

1 /**
2 GeekFactory - "Construye tu propia tecno
3 Distribucion de materiales para el desar
4 www.geekfactory.mx
5
6 EJEMPLO SENSOR ULTRASONICO 1
7
8 REALIZA LA MEDICION DE DISTANCIA CON UN
9 AL ARDUINO. ESTE EJEMPLO NO UTILIZA LIBR
10 SE UTILIZA LA FUNCION "PULSEIN" PARA MED
11
12 */
13 // DECLARACION DE VARIABLES PARA PINES
14 const int pinecho = 8;
15 const int pintrigger = 9;
16 const int pinled = 13;
17
18 // VARIABLES PARA CALCULOS
19 unsigned int tiempo, distancia;
20
21 void setup() {
22 // PREPARAR LA COMUNICACION SERIAL
23 Serial.begin(9600);
24 // CONFIGURAR PINES DE ENTRADA Y SALIDA
25 pinMode(pinecho, INPUT);
26 pinMode(pintrigger, OUTPUT);
27 pinMode(13, OUTPUT);
28 }
29
30 void loop() {
31 // ENVIAR PULSO DE DISPARO EN EL PIN "TRI
32 digitalWrite(pintrigger, LOW);
33 delayMicroseconds(2);
34 digitalWrite(pintrigger, HIGH);
35 // EL PULSO DURA AL MENOS 10 uS EN ESTADO
36 delayMicroseconds(10);
37 digitalWrite(pintrigger, LOW);
38
39 // MEDIR EL TIEMPO EN ESTADO ALTO DEL PIN
40 tiempo = pulseIn(ECHO, HIGH);
41
42 // LA VELOCIDAD DEL SONIDO ES DE 340 M/S
43 // DIVIDIMOS EL TIEMPO DEL PULSO ENTRE 58
44 distancia = tiempo / 58;
45
46 // ENVIAR EL RESULTADO AL MONITOR SERIAL
47 Serial.print(distancia);
48 Serial.println(" cm");
49 delay(200);
50
51 // ENCENDER EL LED CUANDO SE CUMPLA CON C
52 if (distancia <= 15) {
53 digitalWrite(13, HIGH);
54 delay(500);
55 } else {
56 digitalWrite(13, LOW);
57 }
58 }

Conclusión
Como hemos visto a lo largo de este artículo,
utilizar el sensor HC-SR04 y arduino es
bastante sencillo. Con el uso de una librería
se facilita en gran medida el desarrollo de
aplicaciones. Sin embargo, podemos
desarrollar también nuestro propio código
que optimice el uso del tiempo del CPU,
utilizando incluso interrupciones y eventos. Si
eres de esas personas curiosas que siempre
quieren saber como funcionan las cosas, en
otra ocasión desarrollamos un programa
para microcontroladores PIC en lenguaje C
que puedes revisar para ver como funciona el
algoritmo de comunicación con este tipo de
sensores.

56 Comments
Maite on 10 mayo, 2018 at 13:00
Hola buenas tardes, se puede
programar ese mismo para contar
cuantas interrupciones tiene cada 10
segundos. El límite de interrupciones
es de 10.

Reply

Miguel Angel on 5 mayo, 2018 at


17:21

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

Reply

carlos on 4 mayo, 2018 at 8:58


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

Reply

Pablo Sanchez on 10 abril, 2018 at


8:02

lo conecto al arduino en el de %v y se
apaga el la placa

Reply

Sergio on 27 marzo, 2018 at 8:49


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

Reply

fernando on 13 marzo, 2018 at


19:06

ya hice todo y nada

me marca o cm

que hago?

Reply

Marco on 19 marzo, 2018 at


19:37

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

Reply

Cristhian on 12 marzo, 2018 at 20:21


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.

Reply

Brais on 27 febrero, 2018 at 6:18


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?.

Reply

Adriana on 12 marzo, 2018 at


21:07

en vez de ECHO es pinecho

Reply

Geras_do on 5 diciembre, 2017 at


15:01

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

Reply

Sergio on 27 marzo, 2018 at 8:54


En la línea 23, supongo que esa
constante US_ROUNDTRIP_CM si
la imprimieras te mostraría ese
valor de 58 que mencionas

Reply

Susy on 2 diciembre, 2017 at 6:33


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

Reply

Miguel Gonzalez on 22 noviembre,


2017 at 14:40

se puede usar el sonar hc-sr04 con un


esp32?

Reply

ELGRANLORD on 6 enero, 2018


at 15:16

SI

Reply

angélica on 21 noviembre, 2017 at


13:58

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?

Reply

Santiago on 27 noviembre, 2017


at 3:52

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

Reply

Daniel on 10 octubre, 2017 at 21:41


Si deseo que encienda un led cuando
la distancia sea menor de 10 cm,
¿como podira modificar el codigo?

Reply

Jesus Ruben Santa Anna


Zamudio
on 11 octubre, 2017 at 11:25

Hola.

Tendrias que poner una condicion


if(distancia <10) digitalWrite(13,
HIGH); else digitalWrite(13, LOW);

Reply

Javier on 28 julio, 2017 at 21:15


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

Reply

Ruben on 15 agosto, 2017 at


14:57

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.

Reply

Mario montaño on 10
septiembre, 2017 at 9:07

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.
}

Reply

mario montano on 10
septiembre, 2017 at 9:10

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
}

Reply

Funes Moeri on 16 julio, 2017 at


20:50

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..

Reply

Ruben on 18 julio, 2017 at 12:13


Hola desafortunadamente no
tengo experiencia con el tema.
Ojala alguien te pudiera orientar o
si sabes de algo lo pudieras
compartir. Un saludos.

Reply

john galindo on 18 junio, 2017 at


23:01

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.

Reply

Ruben on 20 junio, 2017 at 23:33


¿Podrías poner el código?

Reply

Michael Carpintero on 17 abril,


2017 at 15:09

buen dia como hacer para que dos o


mas sensores trabajen al tiempo

Reply

Ruben on 17 abril, 2017 at 15:38


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

También podría gustarte