domingo, 1 de diciembre de 2013

Sensor de distancia usando HC-SR04 y LEDs de aviso


 













El proyecto que presentamos a continuación pretende generar aviso visuales  de colisión a medida que nuestro robot vaya avanzando. Para ello haremos uso de un par de LEDs de distinto color, por ejemplo uno rojo y otro verde, de modo que encenderemos el LED rojo cuando estemos a punto de colisionar, y el LED verde cuando no detectemos obstáculos.


Para su construcción necesitaremos los siguientes elementos:


REFERENCIA
CANTIDAD
FOTO


Resistencias 220 ohms


2







LEDs






2






Sensor ultrasónico HC-SR04





1






Protoboard





1







Cables colores






10








Arduino






1


El funcionamiento de un LED,  de las resistencias de protección y del sensor ultrasónico HC-SR04, lo vimos en entradas anteriores, y el programa está comentado para permitirnos entender las instrucciones que le estamos dando a nuestro microcontrolador.

Si queréis descargaros el sketch y usarlo directamente en vuestra placa, el fichero os lo dejo aquí, aunque es mejor que intentemos siempre copiarlo a mano, de este modo nos vamos familiarizando con las estructuras de programación, sus funciones y los modos más comunes de error que cometeremos a medida que vayamos desarrollando programas más complejos.

Y ya sabéis, si tenéis alguna sugerencia o duda, no tenéis más que mandarnos un correo a



e intentaremos responder a vuestra pregunta lo antes que podamos.


 
 
/*
Sensor de distancia con un HC-SR04 notificando
mediante el uso de un par de LEDs, uno para aviso de colisión
y el segundo (verde) para aviso de falta de obstaculos
VCC conectado al pin de 5v del Arduino y
GND conectado al pin GND del Arduino
Echo conectado al pin 13 del Arduino y
Trig conectado al pin 12 del Arduino
Notificacion de proximidad en pin 10
Creado el 17 de agosto de 2015
por M.Dominguez
*/
// Vamos a empezar definiendo las variables que vamos a usar en nuestro Sketch
#define trigPin 13 // Aqui le estamos diciendo que de ahora en adelante
// el sketch debe traducir trigPin por el numero 13
// este numero se correspondera al pin que vamos a usar para
// disparar (trigger en ingles) nuestra señal
// si mas adelante queremos redefinir el pin solo tenemos que
// hacer el cambio en esta parte del programa
#define echoPin 12 // Aqui le estamos diciendo que de ahora en adelante
// el sketch debe traducir echoPin por el numero 12
// este numero se correspondera al pin que vamos a usar para
// escuchar el eco (echo en ingles) de la señal que habiamos disparado
// desde el pin que hayamos definido como trigPin
// si mas adelante queremos redefinir el pin solo tenemos que
// hacer el cambio en esta parte del programa
#define lEDinPin 10 // Aqui le estamos diciendo que de ahora en adelante
// el sketch debe traducir lEDinPin por el numero 10
// este numero se correspondera al pin que vamos a usar para
// encender un LED de aviso de proximidad de obstaculo
// segun recibamos un ECO valido
#define lEDoutPin 9 // Aqui le estamos diciendo que de ahora en adelante
// el sketch debe traducir lEDoutPin por el numero 9
// este numero se correspondera al pin que vamos a usar para
// encender un LED de aviso de que si hay obstaculos estan fuera del rango definido
// segun la distancia que calculemos con el eco recibido
#define rangoAlcance 200 // Aqui le estamos definiendo el alcance de proximidad
// para encender el pin de proximidad lEDinPin
// o para encender el pin de no deteccion de obstaculo lEDoutPin
// el sketch debe traducir rangoAlcance
// por el numero la distancia en la que queremos detectar obstaculos
// Ahora configuramos el bloque setup
// que es la parte del sketch donde decimos que pines vamos a usar
// y si son analogicos (ANALOG) o digitales (DIGITAL)
// si son de recepcion (INPUT) o (OUTPUT)
// si vamos a comunicarnos por el puerto serie o no
// (y asi poder ver leer por el monitor los resultados)
// etc
void setup()
{
Serial.begin (9600);
// Gracias al puerto serie, podemos leer lo que Arduino recibe por sus canales
// Abre un puerto de comunicacion serie
// y espera a que se abra
// y le estable la velocidad de transmision
// de esta informacion en baudios
// un baudio es un bit por segundo
// En este caso a 9600 baudios
pinMode(trigPin, OUTPUT); // aqui le decimos a nuestro Arduino
//que el disparador, es un pin tipo OUTPUT (salida en ingles)
pinMode(echoPin, INPUT); // aqui le decimos a nuestro Arduino
//que el eco, lo recibimos en un pin tipo INPUT
//(entrada en ingles)
pinMode(lEDinPin, OUTPUT); // aqui le decimos a nuestro Arduino
//que el pin lEDinPIN es un PIN de salida
pinMode(lEDoutPin, OUTPUT); // aqui le decimos a nuestro Arduino
// que el pin lEDoutPIN es un PIN de salida
}
// Configuramos el bloque loop
// Es la parte principal de nuestro programa pues en el tendremos
// que poner el código para que el microcontrolador lo ejecute las ordenes que le demos
// lo ejecute de manera repetitiva, mientras la placa Arduino tenga energía
void loop()
{
int duracion, distancia; // aqui lo que hacemos es definir dos variables
// locales, esto es que solo se utilizan
// en esta parte del codigo
// y le dice al microcontrolador que tanto la
// duracion como la distancia, van a ser numeros enteros (INT)
digitalWrite(trigPin, HIGH); // ahora le dice que dispare (HIGH) por el pin de disparo
// o sea que el el pin del trigger emita un pulso (digitalWrite)
// cuando esto sucede, nuestro sensor emite pulsos
// rapidos a 40KHz (frecuencia no audible por
// los humanos) y espera el eco
delayMicroseconds(1000); // Esta orden hace que retrase (delay)
// 1000 milisegundos (Microseconds)
// la ejecucion de la siguiente orden del programa
digitalWrite(trigPin, LOW); // transcurridos un tiempo (1000) le dice que
// no se apague (LOW),
// o lo que es lo mismo que escriba (Write) un pulso (digital) bajo (LOW)
duracion = pulseIn(echoPin, HIGH);
// Para calcular la duracion se definimos una variable con
// una funcion que calcula el tiempo
// que ha tardado un pulso en cambiar
// de Alto a Bajo o viceversa.
// Esta funcion concreta (pulseIn)
// devuelve la anchura del pulso
// en microsegundos.
distancia = (duracion/2) / 29.1; // aplicando la formula de la
// distancia= velocidad del sonido cm/us por
// el la duracion en calculada con el PulseIn
// obtendremos la distancia en centimetros
if (distancia >= rangoAlcance || distancia <= 0)
{
// ahora para verificar que no se nos
// queda esperando ecos de objetos muy alejados
// le decimos que si el objeto esta a
// más del rango de alcance definido por rangoAlcance a una distancia
// negativa (por errores de calculo) que alerte con un mensaje de aviso
Serial.println("Fuera de rango");
// y este es el mensaje que hemos definido
// para que lo escriba en la consola
Serial.println("enciendo el led rojo");
// te avisa que va a encender el pin de lejania
digitalWrite (lEDoutPin, HIGH);
delayMicroseconds (500);
digitalWrite (lEDoutPin, LOW);
}
else
{
// en caso de que no este fuera de rango, entonces
Serial.print(distancia); // te pinta la distancia
Serial.println(" cm"); // y le suma la coletilla de las unidades
// que ha usado, en este caso centimetros
Serial.println("enciendo el led verde");
// te avisa que va a encender el pin de proximidad
digitalWrite(lEDinPin, HIGH);
delayMicroseconds (500);
digitalWrite(lEDinPin, LOW);
}
delay(500);
// esperamos medio segundo (o sea 500 milisegundos) y volvemos a empezar
}

No hay comentarios:

Publicar un comentario