Documentos de Académico
Documentos de Profesional
Documentos de Cultura
La distancia es uno de los parámetros físicos más importantes dentro del campo de la Computación Física y más
en la Robótica, por lo tanto aprender el uso de sensores que permitan a nuestro Arduino tener un conocimiento
de este parámetro externo es muy importante. Existen diversos sensores en el mercado que nos permiten conocer
la distancia de un objeto o un obstáculo frente al sensor, en esta sección estudiaremos el sensor ultrasónico HC-
SR04, de bajo costo y fácil manejo, ver figura 18-1.
Sensor HC-SR04
Este es un sensor medidor de distancias por señales ultrasónicas, también llamado Ranger, de tipo Digital cuya
salida es un tren de pulsos con información sobre la distancia de un posible obstáculo frente a él. De la figura 18-
1 se aprecia que el sensor HC-SR04 está constituido por dos dispositivos ultrasónicos, emisor y receptor, esto es
porque su principio de funcionamiento se basa en la emisión de una señal ultrasónica hacia al frente del sensor,
luego el rebote de la señal en un obstáculo es capturara por el receptor del sensor, y así la electrónica interna
calcula la distancia a objeto por medio del tiempo que se tarda en rebotar la señal ultrasónica; al final en el pin
de salida del sensor se obtiene una señal digital que contiene información sobre la distancia calculada. En la tabla
siguiente se puede ver algunas características técnicas de funcionamiento de este sensor, cabe destacar que este
sensor posee 4 terminales, dos de ellas para alimentación de voltaje, y las otras dos para interactuar con Arduino.
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
El sensor HC-SR04 es de muy fácil conexión y uso con tarjetas Arduino, además con el uso de la librería especial
el firmware se hace sencillo, como primer punto veamos la conexión en hardware entre el sensor y nuestra tarjeta
Arduino, de la figura 18-2 se puede apreciar que solo se requieren dos pines digitales de Arduino para la conexión
con el sensor (pines Trigger y Echo), pueden usarse cualesquiera, además se debe asegurar la conexión de voltaje
para el HC-SR04.
El software de aplicación en Arduino para manejar este tipo de sensor es sencillo y requiere el uso de una librería
especial llamada Ultrasonic.h la cual puede ser descargada de:
https://github.com/elrodri/Ultrasonic-HC-SR04/archive/master.zip, además debe instalarse
en el IDE Arduino antes de incluirla en nuestros Sketches. Esta librería contiene las funciones necesarias para que
Arduino pueda interactuar con el sensor HC-SR04, a continuación se describirá las utilización de cada función
dentro de la librería, para luego realizar algunos ejemplos de aplicación.
Ultrasonic miRanger(trigPin, echoPin): esta función se debe incluir al inicio del Sketch antes de la función
setup(), permite la creación de un objeto llamado miRanger (este nombre puede ser cualquiera), para que pueda
ser manipulado más adelante dentro del Sketch. Como parámetro recibe los números de pines Arduino usados
para la conexión con el sensor, pin Trigger y pin Echo.
miRanger.Ranging(CM): Activa el sensor y captura su salida, retornando como resultado el valor de la distancia
a un objeto al frente, por lo tanto debe ser asignada a una variable previamente declarada. El valor retornado esta
expresado en centímetros si se usa el parámetro CM y se retornara la distancia en pulgadas si se usa el parámetro
INC. – La distancia máxima a leer es 5 metros, por lo que esta función devolverá 51 cm si no hay algún objeto
frente a él.
EJEMPLO.HC01: Con este ejemplo se demostrara el uso básico la librería Ultrasonic.h y sus funciones para
capturar la distancia medida por un sensor HC-SR04 conectado a Arduino, la lectura de la distancia se enviara
por Monitor Serial para su visualización. El sensor se conecta según la imagen superior de la figura 18-2.
/* Ejemplo HC-SR04
Demostración del uso de un sensor HC-SR04
Conectado a Arduino asi:
Pin Trigger al Pin 12 Arduino
Pin Echo al Pin 11 Arduino
Se usa el Monitor Serial para visualizar la distancia
Leida por el sensor.
void setup()
{
//habilitar la comunicación serial
Serial.begin(9600);
}
void loop()
{
//leer el sensor y asignar a la variable distancia
distancia = ultrasonic.Ranging(CM); // CM o INC
//enviar el contenido de la variable al Monitor Serial
Serial.print("La distancia medida es: ");
Serial.print(distancia);
Serial.println(" cm" );
delay(500);
}
//Fin del sketch
EJEMPLO.HC02: En este ejemplo se usara la pantalla LCD KEYPAD SHIELD para visualizar la distancia de un
obstáculo frente al sensor, se mostrara la distancia en formato Centímetros y Pulgadas, el sensor se conecta a los
pines digitales 12 y 13 de Arduino.
// Librerias a utilizar
#include <Ultrasonic.h>
#include <LiquidCrystal.h>
void setup()
{
//configura el tamaño del LCD
lcd.begin(16, 2);
}
void loop()
{
//lcd.clear();
lcd.setCursor(3, 0);
lcd.print("Dist = ");
lcd.print(ultrasonic.Ranging(CM));
lcd.print(" cm");
delay(100);
lcd.setCursor(3, 1);
lcd.print("Dist = ");
lcd.print(ultrasonic.Ranging(INC));
lcd.print(" pulg");
delay(250);
}
//Fin del sketch
EJEMPLO.HC03: En este ejemplo se usaran 2 sensores HC-SR04 y se mostrara cada medición en el Monitor Serial
del IDE, se mostrara la distancia en formato Centímetros. Un sensor se conecta en los pines digitales 13 y 12,
mientras que el segundo sensor se conecta a los pines 3 y 2 de Arduino.
/* Ejemplo HC-SR04
Medicion de DOS sensores HC-SR04
con visualizacion via Monitor Serial
//Incluir la libreria
#include <Ultrasonic.h>
long distanciaDer = 0;
void setup()
{
Serial.begin(9600);
}
void loop()
{
distanciaIzq = sensorIzq.Ranging(CM);
distanciaDer = sensorDer.Ranging(CM);
Serial.print("Izquierda: ");
Serial.print(distanciaIzq);
Serial.print(" cm " );
delay(50);
Serial.print("Derecha: ");
Serial.print(distanciaDer);
Serial.println(" cm" );
delay(500);
}
//Fin del sketch
EJEMPLO.HC04: En ocaciones no es obligatorio el uso de una “libreria” para leer el sensor ULtrasonico, basta con
activar el pin TRIGER del sensor y esperar una respuesta en el pin ECHO del sensor. Calcular el tiempo entre la
activacion y la recepcion y via calculo amtematico se obtiene la distancia. En este ejemplo se decmuestra lo
anterior, se implementa un Sistema que indica por medio de una escala de leds la distacia detectada por el sensor.
El circuito a construer se puede observer en la figura 18-7
/* Ejemplo HC04
Medicion de un sensor con escala
indicative de LEDS y Monitor Serial
Modificado: otoniel.flores@mail.utec.edu.sv
// definicion de variables
int distanceThreshold = 0; // distancia limite
int cm = 0; // distancia en centimetros
int inches = 0; // distancia en pulgadas
//***definicion de Funcion
//***activa y leer el sensor ultrasonico
//***retorna un valor long
long readUltrasonicDistance(int triggerPin, int echoPin)
{
pinMode(triggerPin, OUTPUT); // pin TRG apagado
digitalWrite(triggerPin, LOW);
delayMicroseconds(2);
// Activar pin TRG por 10us
digitalWrite(triggerPin, HIGH);
delayMicroseconds(10);
digitalWrite(triggerPin, LOW);
pinMode(echoPin, INPUT);
// leer el pin ECHO por la respuesta
return pulseIn(echoPin, HIGH);
}
// configuracion de pines
void setup()
{
Serial.begin(9600);
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
}
void loop()
{
// definer el limite de distancia para activar escala de LEDs
distanceThreshold = 350;
// utilizar la function definida para leer la distancia en CM
cm = 0.01723 * readUltrasonicDistance(7, 6);
// convertirla en pulgadas
inches = (cm / 2.54);
Serial.print(cm);
Serial.print("cm, ");
Serial.print(inches);
Serial.println("in");
// activar escala de LEDs
if (cm > distanceThreshold)
{
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
}
if (cm <= distanceThreshold - 100 && cm > distanceThreshold - 250)
{
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(4, LOW);
}
if (cm <= distanceThreshold - 250 && cm > distanceThreshold - 350)
{
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
}
if (cm <= distanceThreshold - 350) {
digitalWrite(2, HIGH);digitalWrite(3, HIGH); digitalWrite(4, HIGH);
}
delay(100); // Wait for 100 millisecond(s)
}
// fin del codigo