Tutorial de Arduino con Sensor ultrasónico HC-SR04
Sensor ultrasónico HC-SR04
El sensor HC-SR04 es un sensor de distancia de bajo costo que utiliza ultrasonido para determinar la distancia de un objeto en un rango de 2 a 450 cm. Destaca por su pequeño tamaño, bajo consumo energético, buena precisión y excelente precio. El sensor HC-SR04 es el más utilizado dentro de los sensores de tipo ultrasonido, principalmente por la cantidad de información y proyectos disponibles en la web. De igual forma es el más empleado en proyectos de robótica como robots laberinto o sumo, y en proyectos de automatización como sistemas de medición de nivel o distancia.
¿Cómo funciona el sensor HC-SR04?
El sensor HC-SR04 posee dos transductores: un emisor y un receptor piezoeléctricos, además de la electrónica necesaria para su operación. El funcionamiento del sensor es el siguiente: el emisor piezoeléctrico emite 8 pulsos de ultrasonido(40KHz) luego de recibir la orden en el pin TRIG, las ondas de sonido viajan en el aire y rebotan al encontrar un objeto, el sonido de rebote es detectado por el receptor piezoeléctrico, luego el pin ECHO cambia a Alto (5V) por un tiempo igual al que demoró la onda desde que fue emitida hasta que fue detectada, el tiempo del pulso ECO es medido por el microcontrolador y asi se puede calcular la distancia al objeto. El funcionamiento del sensor no se ve afectado por la luz solar o material de color negro (aunque los materiales blandos acústicamente como tela o lana pueden llegar a ser difíciles de detectar).
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 micro segundos entre 58 o para obtener la distancia en centímetros (148 para pulgadas).
La distancia se puede calcular utilizando la siguiente formula:
Distancia(m) = {(Tiempo del pulso ECO) * (Velocidad del sonido=340m/s)}/2
Especificaciones Técnicas
- Voltaje de Operación: 5V DC
- Corriente de reposo: < 2mA
- Corriente de trabajo: 15mA
- Rango de medición: 2cm a 450cm
- Precisión: +- 3mm
- Ángulo de apertura: 15°
- Frecuencia de ultrasonido: 40KHz
- Duración mínima del pulso de disparo TRIG (nivel TTL): 10 μS
- Duración del pulso ECO de salida (nivel TTL): 100-25000 μS
- Dimensiones: 45mm x 20mm x 15mm
- Tiempo mínimo de espera entre una medida y el inicio de otra 20ms (recomendable 50ms)
Pinout o Pines de conexión del sensor HC-SR04
- VCC (+5V DC)
- TRIG (Disparo del ultrasonido)
- ECHO (Recepción del ultrasonido)
- GND (0V)
Recomendamos revisar siempre la serigrafía del PCB cuando estemos realizando conexiones para evitar errores.
Protocolo de comunicación
La interfaz del sensor HC-SR04 y Arduino se logra mediante 2 pines digitales: el pin de disparo (trigger) y eco (echo). La función de cada uno de estos pines es la siguiente:
- El pin trigger 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.
- En el pin echo el sensor devuelve al microcontrolador un puso cuyo ancho es proporcional al tiempo que tarda el sonido en viajar del transductor al obstáculo 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 del sensor que colocamos más arriba para su descarga.
Hoja de datos o datasheet sensor HC-SR04
El documento “Original” donde se describe la funcionalidad del sensor ultrasónico HC-SR04 es su hoja de datos o datasheet. Podemos descargar dicho documento en el siguiente enlace.
Descarga Aquí>>Datasheet HC-SR04
Tutorial de Arduino con Sensor ultrasónico HC-SR04
En muchos de nuestros proyectos, tenemos la necesidad de sensar nuestro entorno, saber si en frente hay un obstáculo y a que distancia se encuentra, el sensor HC-SR04 nos permite hacer eso.
Materiales necesarios para las prácticas
Para esta experiencia requerimos los siguientes materiales, los cuales puedes adquirir en nuestra Tienda virtual:
- Arduino UNO R3 o tarjeta compatible con Arduino Uno
- HC-SR04 sensor de distancia ultrasónico
- Cables tipo dupont para conexiones
- Protoboard (opcional)
Conexión de sensor HC-SR04 con Arduino
Para empezar a utilizar el sensor HC-SR04 solo necesitas una placa Arduino, en este tutorial utilizaremos un Arduino Uno R3, pero puedes utilizar cualquier placa de Arduino, el procedimiento es el mismo. Empezamos insertando el sensor ultrasónico en un protoboard y con cables hacemos las siguientes conexiones:
- Alimentación de 5 volts.
- Tierra o común del circuito.
- Señal de disparo (trig)- Trigger del sensor al pin 2 del arduino
- Señal de eco (echo)- Echo del sensor al pin 3 del arduino
También puedes conectar el modulo directamente al Arduino sin usar el protoboard.
Todas las conexiones se realizan con el Arduino Apagado (desconectado de la PC o de cualquier fuente externa):
Ahora abrimos el entorno de programación de Arduino, en Herramientas ->Tarjeta, y seleccionamos el modelo de placa Arduino que estemos utilizando. Nosotros seleccionaremos Arduino Uno.
Una vez configurado el IDE, empezamos a programar nuestro sketch, explicaremos paso a paso el código para sea más comprensible:
Programación de sensor ultrasónico HC-SR04 con 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 (ver tutorial Aqui) 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:
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.
Primero configuramos los pines y la comunicación serial a 9800 baudios
const int Trigger = 2; //Pin digital 2 para el Trigger del sensor const int Echo = 3; //Pin digital 3 para el echo del sensor void setup() { Serial.begin(9600);//iniciailzamos la comunicación pinMode(Trigger, OUTPUT); //pin como salida pinMode(Echo, INPUT); //pin como entrada digitalWrite(Trigger, LOW);//Inicializamos el pin con 0 }
Ahora en el bucle void loop() empezamos enviando un pulso de 10us al Trigger del sensor
digitalWrite(Trigger, HIGH); delayMicroseconds(10); //Enviamos un pulso de 10us digitalWrite(Trigger, LOW);
Seguidamente recibimos el pulso de respuesta del sensor por el pin Echo, para medir el pulso usamos la función pulseIn(pin, value)
t = pulseIn(Echo, HIGH); //obtenemos el ancho del pulso
La variable t, tiene el tiempo que dura en llegar el eco del ultrasonido, el siguiente paso es calcular la distancia entre el sensor ultrasónico y el objeto
Partimos de la siguiente formula:
Donde Velocidad es la velocidad del sonido 340m/s, pero usaremos las unidades en cm/us pues trabajaremos en centímetros y microsegundos, tiempo es el tiempo que demora en llegar el ultrasonido al objeto y regresar al sensor, y la distancia recorrida es dos veces la distancia hacia el objeto, reemplazando en la formula tenemos:
Finalmente enviamos serialmente el valor de la distancia y terminamos poniendo una pausa de 100ms, que es superior a los 60ms recomendado por los datos técnicos del sensor
A continuación se muestra el código completo del programa.
const int Trigger = 2; //Pin digital 2 para el Trigger del sensor const int Echo = 3; //Pin digital 3 para el Echo del sensor void setup() { Serial.begin(9600);//iniciailzamos la comunicación pinMode(Trigger, OUTPUT); //pin como salida pinMode(Echo, INPUT); //pin como entrada digitalWrite(Trigger, LOW);//Inicializamos el pin con 0 } void loop() { long t; //timepo que demora en llegar el eco long d; //distancia en centimetros digitalWrite(Trigger, HIGH); delayMicroseconds(10); //Enviamos un pulso de 10us digitalWrite(Trigger, LOW); t = pulseIn(Echo, HIGH); //obtenemos el ancho del pulso d = t/59; //escalamos el tiempo a una distancia en cm Serial.print("Distancia: "); Serial.print(d); //Enviamos serialmente el valor de la distancia Serial.print("cm"); Serial.println(); delay(100); //Hacemos una pausa de 100ms }
Conecte el Arduino Uno y cargue el programa.
Después de esto el Arduino y sensor ya deben estar trabajando, para poder visualizar los datos vaya a herramientas y habrá el monitor serial
En el monitor serial le aparecerán los valores de la distancia que sensa el HC-SR04, ponga un objeto al frente y varíe su distancia respecto al sensor y verifique que la distancia mostrada en el monitor serial sea la correcta.
Declaración de Copyright Todas las ilustraciones, marcas y productos mencionados en este artículo pertenecen a sus respectivos propietarios, como también cualquier otra forma de propiedad intelectual, siendo usadas estrictamente en carácter educativo. Para más información visita https://arduino.cc/ - Todos los derechos reservados.
#define LEDVERDE 2 #define LEDAMARILLO 3 #define TRIGGER 5 #define ECHO 6 #define BUZZER 9 const float sonido = 34300.0; // Velocidad del sonido en cm/s const float umbral1 = 30.0; const float umbral2 = 20.0; const float umbral3 = 10.0; void setup() { Serial.begin(9600); pinMode(LEDVERDE, OUTPUT); pinMode(LEDAMARILLO, OUTPUT); pinMode(ECHO, INPUT); pinMode(TRIGGER, OUTPUT); pinMode(BUZZER, OUTPUT); apagarLEDs(); } void loop() { iniciarTrigger(); float distancia = calcularDistancia(); apagarLEDs(); if (distancia < umbral1) { alertas(distancia); } } void apagarLEDs() { digitalWrite(LEDVERDE, LOW); digitalWrite(LEDAMARILLO, LOW); } void alertas(float distancia) { if (distancia < umbral1 && distancia >= umbral2) { // Encendemos el LED verde digitalWrite(LEDVERDE, HIGH); tone(BUZZER, 2000, 200); } else if (distancia < umbral2 && distancia > umbral3) { // Encendemos el LED amarillo digitalWrite(LEDAMARILLO, HIGH); tone(BUZZER, 2500, 200); } } float calcularDistancia() { // La función pulseIn obtiene el tiempo que tarda en cambiar entre estados, en este caso a HIGH unsigned long tiempo = pulseIn(ECHO, HIGH); // Obtenemos la distancia en cm, hay que convertir el tiempo en segudos ya que está en microsegundos // por eso se multiplica por 0.000001 float distancia = tiempo * 0.000001 * sonido / 2.0; Serial.print(distancia); Serial.print("cm"); Serial.println(); delay(500); return distancia; } void iniciarTrigger() { digitalWrite(TRIGGER, LOW); delayMicroseconds(2); digitalWrite(TRIGGER, HIGH); delayMicroseconds(10); digitalWrite(TRIGGER, LOW); }
Etiqueta:Arduino, Arduino UNO, De, Electrónica, Protoboard, Proximidad, Sensor, Sensores de Proximidad, Simuladores, Tutoriales, Ultrasónico, Ultrasonido