Sensor de ultrasonidos HC-SR04

El sensor de ultrasonidos se enmarca dentro de los sensores para medir distancias o superar obstáculos, entre otras posibles funciones.


Un sensor de ultra sonidos es un dispositivo para medir distancias. Su funcionamiento se base en el envío de un pulso de alta frecuencia, no audible por el ser humano. Este pulso rebota en los objetos cercanos y es reflejado hacia el sensor, que dispone de un micrófono adecuado para esa frecuencia

Los sensores de ultrasonidos son sensores baratos, y sencillos de usar. Este sensor en concreto tiene un rango de distancias sensible entre 1,7 cm y 4,5 m con una precisión de 3mm.

Los sensores de ultrasonidos son sensores de baja precisión. La orientación de la superficie a medir puede provocar que la onda se refleje, falseando la medición. Además, no resultan adecuados en entornos con gran número de objetos, dado que el sonido rebota en las superficies generando ecos y falsas mediciones. Tampoco son apropiados para el funcionamiento en el exterior y al aire libre. 

Pese a esta baja precisión, que impide conocer con precisión la distancia a un objeto, los sensores de ultrasonidos son ampliamente empleados. En robótica es habitual montar uno o varios de estos sensores, por ejemplo, para detección de obstáculos, determinar la posición del robot, crear mapas de entorno, o resolver laberinto.

Características
  • Dimensiones del circuito: 43 x 20 x 17 mm
  • Tensión de alimentación: 5 Vcc
  • Frecuencia de trabajo: 40 KHz
  • Rango máximo: 4.5 m
  • Rango mínimo: 1.7 cm
  • Duración mínima del pulso de disparo (nivel TTL): 10 μS.
  • Duración del pulso eco de salida (nivel TTL): 100-25000 μS.
  • Tiempo mínimo de espera entre una medida y el inicio de otra 20 mS.
¿Qué recibimos en el sensor?

El tiempo que transcurre entre el envío y la recepción de un pulso sonoro.

¿Cómo vamos a traducir dicho tiempo en distancia?

Aprovechando que la velocidad de dicho ultrasonido en el aire es de valor 340 m/s, o 0,034 cm/microseg (ya que trabajaremos con centímetros y microsegundos). Para calcular la distancia, recordaremos que v=d/t (definición de velocidad: distancia recorrida en un determinado tiempo).

De la fórmula anterior despejamos d, obteniendo d=v·t, siendo v la constante anteriormente citada y t el valor devuelto por el sensor a la placa Arduino.


También habrá que dividir el resultado entre 2 dado que el tiempo recibido es el tiempo de ida y vuelta.


Pines de conexión
  • Vcc.
  • Trig (Disparo ultrasonido).
  • Echo (Recepción de ultrasonido)
  • GND
 Montaje en una protoboard




Programa

Para activar el sensor necesitamos generar un pulso eléctrico en el pin Trigger (disparador) de al menos 10us. Previamente, pondremos el pin a Low durante 4us para asegurar un disparo limpio. 

Posteriormente usamos la función “pulseIn” para obtener el tiempo requerido por el pulso para volver al sensor. Finalmente, convertimos el tiempo en distancia mediante la ecuación correspondiente. 

Observar que intentamos emplear siempre aritmética de enteros, evitando usar números en coma flotante. Esto es debido a que las operaciones en coma flotante ralentizan mucho el procesador, y suponen cargar un gran número de librerías en memoria.

Empezamos a programar nuestro sketch, explicaremos paso a paso el código para sea más comprensible:

Primero configuramos los pines y la comunicación serial a 9600 baudios

const int EchoPin = 5;
const int TriggerPin =6;
long distancia;
long tiempo;

void setup(){

Serial.begin(9600);
pinMode(TriggerPin, OUTPUT); /*activación del pin 9 como salida: para el pulso ultrasónico*/
pinMode(EchoPin, INPUT); /*activación del pin 8 como entrada: tiempo del rebote del ultrasonido*/
}

Ahora en el bucle void loop() empezamos enviando un pulso de 5 us al Trigger del sensor para estabilizar el sensor:


digitalWrite(TriggerPin,LOW); /* Por cuestión de estabilización del sensor*/
delayMicroseconds(5);


A continuación enviaremos un pulso de 10 us al Trigger del sensor para al Trigger del sensor:


delayMicroseconds(10);
digitalWrite(TriggerPin, LOW);

Seguidamente recibimos el pulso de respuesta del sensor por el pin Echo, para medir el pulso usamos la función pulseIn(pin, value)

tiempo=pulseIn(EchoPin, HIGH); /* Función para medir la longitud del pulso entrante. Mide el tiempo que transcurrido entre el envío del pulso ultrasónico y cuando el sensor recibe el rebote, es decir: desde que el pin 12 empieza a recibir el rebote, HIGH, hasta que deja de hacerlo, LOW, la longitud del pulso entrante*/

La variable t, almacena el tiempo que tarda en llegar el eco del ultrasonido, el siguiente paso  es calcular la distancia entre el sensor de ultrasonidos 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 al monitor serie el valor de la distancia y terminamos estableciendo una pausa de 100ms, que es superior a los 60ms  recomendado por los datos técnicos del sensor.




const int EchoPin = 5;
const int TriggerPin =6;
long distancia;
long tiempo;

void setup(){

Serial.begin(9600);
pinMode(TriggerPin, OUTPUT); /*activación del pin 9 como salida: para el pulso ultrasónico*/
pinMode(EchoPin, INPUT); /*activación del pin 8 como entrada: tiempo del rebote del ultrasonido*/
}

void loop(){

digitalWrite(TriggerPin,LOW); /* Por cuestión de estabilización del sensor*/
delayMicroseconds(5);
digitalWrite(TriggerPin, HIGH); /* envío del pulso ultrasónico*/
delayMicroseconds(10);
digitalWrite(TriggerPin, LOW);

tiempo=pulseIn(EchoPin, HIGH); /* Función para medir la longitud del pulso entrante. Mide el tiempo que transcurrido entre el envío del pulso ultrasónico y cuando el sensor recibe el rebote, es decir: desde que el pin 12 empieza a recibir el rebote, HIGH, hasta que deja de hacerlo, LOW, la longitud del pulso entrante*/
distancia= tiempo/59; /*fórmula para calcular la distancia obteniendo un valor entero*/
/*Monitorización en centímetros por el monitor serial*/
Serial.println("Distancia ");
Serial.println(distancia);
Serial.println(" cm");
delay(100);
}

Para resumir el código y no tener que repetir tantas instrucciones cada vez que queramos realizar una medida vamos a escribir el sketch utilizando una función:

Vamos a crear una función medirDistancia(), la cual nos devolverá la distancia.

Como ejemplo práctico hemos diseñado un circuito que incorpora un sensor y su finalidad será la de controlar el funcionamiento de un motor, de tal manera que cuando se encuentre un objeto en una distancia menor a 20 cm del sensor, el motor dejará de girar, si la distancia es mayor de 20 cm el motor girará.

Circuito eléctrico


Sketch

#define E1 13 // Enable Pin para el motor 1
#define I1 12 // Control pin 1 para el motor 1
#define I2 11 // Control pin 2 para el motor 1

const int EchoPin = 2;
const int TriggerPin =3;
long distanciaAlObjeto;

void setup()
{
  pinMode (E1, OUTPUT);
  pinMode (I1, OUTPUT);
  pinMode (I2, OUTPUT);
  pinMode (EchoPin,INPUT);
  pinMode (TriggerPin,OUTPUT);
  Serial.begin(9600);
 }

void loop()
{
  distanciaAlObjeto=medirDistancia();
  if(distanciaAlObjeto>20)
  {
   girarMotor();
  }
  else
  {
    digitalWrite (E1, LOW); //Parar el motor 1
  }
}
long medirDistancia()
{
long distancia;
long tiempo;
digitalWrite(TriggerPin,LOW); /* Por cuestión de estabilización del sensor*/
delayMicroseconds(5);
digitalWrite(TriggerPin, HIGH); /* envío del pulso ultrasónico*/
delayMicroseconds(10);
digitalWrite(TriggerPin, LOW);
tiempo=pulseIn(EchoPin, HIGH); /* Función para medir la longitud del pulso entrante. Mide el tiempo que transcurrido entre el envío del pulso ultrasónico y cuando el sensor recibe el rebote, es decir: desde que el pin 12 empieza a recibir el rebote, HIGH, hasta que deja de hacerlo, LOW, la longitud del pulso entrante*/
distancia= tiempo/59; /*fórmula para calcular la distancia */
/*Monitorización en centímetros por el monitor serial*/
Serial.println("Distancia ");
Serial.println(distancia);
Serial.println(" cm");
return(distancia);
}

void girarMotor()
{
  digitalWrite (E1, HIGH); //Activar el motor 1
  digitalWrite (I1, HIGH);  //Iniciar el giro
  digitalWrite (I2, LOW);
}

Placa de pruebas (Protoboard)

El protoboard: Es una especie de tablero con orificios, en la cual se pueden insertar componentes electrónicos y cables para montar circuitos. Como su nombre lo indica, esta tableta sirve para experimentar con circuitos electrónicos, con lo que se asegura el buen funcionamiento del mismo.


Así pues, con una protoboard, nos olvidamos del trabajo de soldar, y sólo nos limitamos a introducir los terminales de nuestros componentes electrónicos en las perforaciones que trae.

Estas placas están agujereadas con conexiones internas dispuestas en hileras, de modo que forman una matriz de taladros a los que podemos directamente insertar componentes y formar el circuito deseado.


Como el nombre indica, se trata de montar prototipos, de forma eventual, por lo que probamos y volvemos a desmontar los componentes, quedando la protoboard lista para el próximo experimento. 

En estos tableros montaremos los circuitos formados por resistencias, condensadores, transistores, Leds, displays, pulsadores y circuitos integrados principalmente. Hay que tener en cuenta que para realizar las conexiones entre componentes utilizaremos cables, que tienen que ser de un hilo rígido de 0,5 a 0,75 mm de diámetro aproximadamente. Estos cables también se venden preparados para los protoboard. Se trata de unos cables de longitud fija, los cuales tienen en los extremos unos contactos que facilitan ese trabajo de “pinchar” en la placa.
Básicamente un protoboard se divide en tres partes:


La central: Es la región localizada en el medio ldel protoboard, se utiliza para colocar los circuitos integrados.

A los lados de la central: En ella van los buses y se localizan en ambos extremos del protoboard.

Parte exterior de la placa. Hay dos filas de contactos a cada lado de la placa para poner la alimentación del circuito.

  • La línea azul siempre sera negativo, también llamada: tierra

  • Por otro lado, la línea roja siempre será positivo.

Esta disposición de conexiones nos ayuda a la hora de organizarnos, siguiendo algunas premisas que nos llevarán a un diseño limpio, sin problemas y efectivo:

  • Emplearemos las conexiones laterales para la alimentación.

  • Utilizaremos cables de distintos colores para cada “canal” de alimentación, rojo para el positivo y negro para el negativo (GND).

  • Coloca los circuitos integrados en una sola dirección, de derecha a izquierda o viceversa.

  • Se deberá de utilizar cables lo más cortos posibles, evitando así interferencias/ruidos y/o resistencias inesperadas.
  • Procuraremos mantener siempre un orden dentro de lo posible. Un diseño bien organizado dice mucho más que una maraña de cables.
  • Por último, si necesitas más espacio, siempre puedes acoplar más protoboard por cualquiera de los 4 lados con las pestañas que trae.
  • Algunos protoboards tienen separada la parte media de los buses, es por eso que se realiza esta conexión para darle continuidad a la corriente.
Limitaciones
  • Estos prototipos que montemos no pueden trabajar a frecuencias mayores de 20 Mhz. ya que entre las filas para la inserción de componentes hay capacidades parásitas que nos afectarían el funcionamiento del circuito.
  • También hay que tener cuidado de no usar intensidades de corriente muy altas por las conexiones de la placa.

Ordinogramas

También denominados diagramas de flujo de programas. Son representaciones gráficas que muestran la secuencia lógica y detallada de las operaciones que se van a realizar en la ejecución de un programa.

Ejemplo:

Diseñar un algoritmo que calcule el área de un triángulo utilizando como método de representación el ordinograma.


El diseño de todo ordinograma debe de reflejar :
  • Un principio o inicio que marca el comienzo de ejecución del programa y que viene determinado por la palabra "INICIO"
  •  La secuencia de operaciones, lo más detallada posible y siguiendo siempre el orden en el que se deberán ejecutar ( de arriba-abajo y de izquierda-derecha).
  • Un fin que marca la finalización de ejecución del programa y que viene determinado por la palabra "FIN".
La simbología utilizada en la construcción de ordinogramas es la siguiente:






Las reglas que hay que seguir para la confección de un ordinograma son las siguientes:
  1. Todos los símbolos utilizados en el diseño deben estar conectados por medio de líneas de conexión o líneas de flujo de datos.
  2. Queda terminantemente prohibido el cruce de líneas de conexión, pues ello nos indica que el ordinograma no está correctamente diseñado.
  3.  A un símbolo de proceso pueden llegarle varias líneas de conexión o flujo, pero del él solo puede salir una.
  4.  A un símbolo de decisión puede llegarle varias líneas de conexión o flujo de datos, pero de él solo puede salir una línea de entra las dos posibilidades existentes (verdadero o falso).
  5. A un símbolo de inicio  de proceso no llega ninguna línea de conexión o flujo y de él solo puede partir una línea de conexión.
  6. A un símbolo de proceso o ejecución pueden llegar muchas líneas de conexión, pero de él no puede partir ninguna.
 Ejemplo



Robot con 2 motores de CC y L293D

Propuesta

Aprender a controlar motores de corriente continua utilizando controladores basados en puentes H.

Material necesario

  • Cables para protoboard

  • Plataforma para robot móvil


  • Arduino Uno o similar. Esta sesión acepta cualquier otro modelo de Arduino. 
  • Placa Protoboard.

Esquema eléctrico
l293d_arduino_bb 
   
Programa para conseguir que el móvil se desplace hacia delante durante 1 s.
 
#define E1 8 // Enable Pin for motor 1 
#define I1 9 // Control pin 1 for motor 1
#define I2 10 // Control pin 2 for motor 1
#define E2 7 //Enable Pin for motor 2 
#define I3 6 //Control sentido de giro motor 2
#define I4 5 //Control sentido de giro motor 2 


void setup()
{
    pinMode( E1,OUTPUT);
    pinMode( I1,OUTPUT);
    pinMode( I2,OUTPUT);
    pinMode( E2,OUTPUT);
    pinMode( I3,OUTPUT);
    pinMode( I4,OUTPUT);


 pinMode( i, OUTPUT);
  }
}

void loop()
{
digitalWrite(E1, HIGH); // Activamos Motor1
digitalWrite(I1, HIGH); // Arrancamos el motor 1 
digitalWrite(I2, LOW);

digitalWrite(E2, HIGH);  // Activamos Motor2
digitalWrite(I3, HIGH); //Arrancamos el motor 2
digitalWrite(I4, LOW);
delay(1000);

digitalWrite(E1, LOW); // Paramos Motor 1
digitalWrite(E2, LOW);  // Paramos Motor 1
delay(500); }

Cable para protoboard

Un cable puente para prototipos (o simplemente puente para prototipos), es un cable con un conector en cada punta (o a veces sin ellos), que se usa normalmente para interconectar entre sí los componentes en una placa de pruebas. P.E.: se utilizan de forma general para transferir señales eléctricas de cualquier parte de la placa de prototipos a los pines de entrada/salida de un microcontrolador.
Los cables puente se fijan mediante la inserción de sus extremos en los agujeros previstos a tal efecto en las ranuras de la placa de pruebas, la cual debajo de su superficie tiene unas planchas interiores paralelas que conectan las ranuras en grupos de filas o columnas según la zona. Los conectores se insertan en la placa de prototipos, sin necesidad de soldar, en los agujeros que convengan para el conexionado del diseño.

Tipos

Hay distintos tipos de cables puente por ejemplo:
  • Con pinzas cocodrilo los hay que llevan pinzas cocodrilo en lugar de conectores terminales que entre otras aplicaciones, se utilizan temporalmente para puentear los sensores, botones y otros elementos de los prototipos entre sí y con los microcontroladores. 

  • Con terminales aislados En el tipo con terminales aislados la disposición de los elementos y la facilidad de insertar los "conectores aislados" de los "cables puente" sobre la placa de pruebas permite el incremento de la densidad de montaje de ambos (componentes y puentes) sin temor a los cortocircuitos. Los cables puente varían en tamaño y color para distinguir las señales con las que se está trabajando.
Variación de cables puente con terminales esmaltados, según las combinaciones macho-hembra: 
  • Macho - macho 


  • Macho - hembra 

  • Hembra - hembra